@haven-fi/solauto-sdk 1.0.25 → 1.0.27
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.
- package/dist/clients/solautoClient.d.ts +4 -4
- package/dist/clients/solautoClient.d.ts.map +1 -1
- package/dist/clients/solautoClient.js +25 -23
- package/dist/clients/solautoMarginfiClient.d.ts +1 -0
- package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/clients/solautoMarginfiClient.js +84 -23
- package/dist/generated/instructions/closePosition.d.ts +4 -4
- package/dist/generated/instructions/closePosition.d.ts.map +1 -1
- package/dist/generated/instructions/closePosition.js +8 -8
- package/dist/generated/instructions/marginfiProtocolInteraction.d.ts +2 -2
- package/dist/generated/instructions/marginfiProtocolInteraction.d.ts.map +1 -1
- package/dist/generated/instructions/marginfiProtocolInteraction.js +4 -4
- package/dist/generated/instructions/marginfiRebalance.d.ts +2 -0
- package/dist/generated/instructions/marginfiRebalance.d.ts.map +1 -1
- package/dist/generated/instructions/marginfiRebalance.js +17 -7
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +111 -21
- package/dist/transactions/transactionsManager.d.ts.map +1 -1
- package/dist/transactions/transactionsManager.js +6 -2
- package/dist/types/solauto.d.ts +13 -0
- package/dist/types/solauto.d.ts.map +1 -0
- package/dist/types/solauto.js +2 -0
- package/dist/utils/jupiterUtils.d.ts.map +1 -1
- package/dist/utils/jupiterUtils.js +1 -0
- package/dist/utils/marginfiUtils.d.ts +5 -1
- package/dist/utils/marginfiUtils.d.ts.map +1 -1
- package/dist/utils/marginfiUtils.js +8 -2
- package/dist/utils/solauto/generalUtils.d.ts +1 -5
- package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
- package/dist/utils/solauto/generalUtils.js +6 -2
- package/dist/utils/solauto/rebalanceUtils.js +2 -1
- package/package.json +1 -1
- package/src/clients/solautoClient.ts +33 -31
- package/src/clients/solautoMarginfiClient.ts +89 -31
- package/src/generated/instructions/closePosition.ts +12 -12
- package/src/generated/instructions/marginfiProtocolInteraction.ts +6 -6
- package/src/generated/instructions/marginfiRebalance.ts +19 -7
- package/src/transactions/transactionUtils.ts +140 -36
- package/src/transactions/transactionsManager.ts +8 -6
- package/src/types/solauto.ts +14 -0
- package/src/utils/jupiterUtils.ts +1 -0
- package/src/utils/marginfiUtils.ts +11 -3
- package/src/utils/solauto/generalUtils.ts +21 -12
- package/src/utils/solauto/rebalanceUtils.ts +2 -2
- package/tests/transactions/solautoMarginfi.ts +44 -25
- package/tests/unit/lookupTables.ts +4 -3
|
@@ -11,9 +11,10 @@ import {
|
|
|
11
11
|
transactionBuilder,
|
|
12
12
|
createSignerFromKeypair,
|
|
13
13
|
AccountMeta,
|
|
14
|
-
createUmi,
|
|
15
14
|
} from "@metaplex-foundation/umi";
|
|
15
|
+
import { createUmi } from "@metaplex-foundation/umi-bundle-defaults";
|
|
16
16
|
import {
|
|
17
|
+
clusterApiUrl,
|
|
17
18
|
Keypair,
|
|
18
19
|
PublicKey,
|
|
19
20
|
SYSVAR_INSTRUCTIONS_PUBKEY,
|
|
@@ -42,9 +43,11 @@ import {
|
|
|
42
43
|
MARGINFI_PROGRAM_ID,
|
|
43
44
|
MarginfiAccount,
|
|
44
45
|
lendingAccountBorrow,
|
|
46
|
+
lendingAccountDeposit,
|
|
45
47
|
lendingAccountEndFlashloan,
|
|
46
48
|
lendingAccountRepay,
|
|
47
49
|
lendingAccountStartFlashloan,
|
|
50
|
+
lendingAccountWithdraw,
|
|
48
51
|
marginfiAccountInitialize,
|
|
49
52
|
safeFetchAllMarginfiAccount,
|
|
50
53
|
safeFetchMarginfiAccount,
|
|
@@ -73,16 +76,14 @@ export function newSolautoMarginfiPositionArgs(
|
|
|
73
76
|
debtMint: PublicKey,
|
|
74
77
|
referredByAuthority?: PublicKey
|
|
75
78
|
): SolautoMarginfiClientArgs {
|
|
79
|
+
const umi = createUmi(clusterApiUrl("mainnet-beta"));
|
|
76
80
|
return {
|
|
77
81
|
positionId,
|
|
78
82
|
signer,
|
|
79
83
|
wallet,
|
|
80
84
|
marginfiAccount:
|
|
81
85
|
positionId === 0
|
|
82
|
-
? createSignerFromKeypair(
|
|
83
|
-
createUmi(),
|
|
84
|
-
fromWeb3JsKeypair(Keypair.generate())
|
|
85
|
-
)
|
|
86
|
+
? createSignerFromKeypair(umi, umi.eddsa.generateKeypair())
|
|
86
87
|
: undefined,
|
|
87
88
|
marginfiAccountSeedIdx: positionId > 0 ? generateRandomU64() : undefined,
|
|
88
89
|
supplyMint: supplyMint,
|
|
@@ -151,7 +152,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
151
152
|
const emptyMarginfiAccounts = (
|
|
152
153
|
await safeFetchAllMarginfiAccount(
|
|
153
154
|
this.umi,
|
|
154
|
-
existingMarginfiAccounts.map((x) => publicKey(x))
|
|
155
|
+
existingMarginfiAccounts.map((x) => publicKey(x.marginfiAccount))
|
|
155
156
|
)
|
|
156
157
|
).filter(
|
|
157
158
|
(x) =>
|
|
@@ -166,10 +167,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
166
167
|
this.intermediaryMarginfiAccountSigner =
|
|
167
168
|
emptyMarginfiAccounts.length > 0
|
|
168
169
|
? undefined
|
|
169
|
-
: createSignerFromKeypair(
|
|
170
|
-
this.umi,
|
|
171
|
-
fromWeb3JsKeypair(Keypair.generate())
|
|
172
|
-
);
|
|
170
|
+
: createSignerFromKeypair(this.umi, this.umi.eddsa.generateKeypair());
|
|
173
171
|
this.intermediaryMarginfiAccountPk =
|
|
174
172
|
emptyMarginfiAccounts.length > 0
|
|
175
173
|
? toWeb3JsPublicKey(emptyMarginfiAccounts[0].publicKey)
|
|
@@ -203,9 +201,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
203
201
|
settingParams?: SolautoSettingsParametersInpArgs,
|
|
204
202
|
dca?: DCASettingsInpArgs
|
|
205
203
|
): TransactionBuilder {
|
|
206
|
-
let
|
|
204
|
+
let signerDebtTa: UmiPublicKey | undefined = undefined;
|
|
207
205
|
if (dca) {
|
|
208
|
-
|
|
206
|
+
signerDebtTa = publicKey(this.signerDebtTa);
|
|
209
207
|
}
|
|
210
208
|
|
|
211
209
|
return marginfiOpenPosition(this.umi, {
|
|
@@ -228,11 +226,11 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
228
226
|
: (this.marginfiAccount as Signer),
|
|
229
227
|
supplyMint: publicKey(this.supplyMint),
|
|
230
228
|
supplyBank: publicKey(this.marginfiSupplyBankAccounts.bank),
|
|
231
|
-
positionSupplyTa: publicKey(this.
|
|
229
|
+
positionSupplyTa: publicKey(this.positionSupplyTa),
|
|
232
230
|
debtMint: publicKey(this.debtMint),
|
|
233
231
|
debtBank: publicKey(this.marginfiDebtBankAccounts.bank),
|
|
234
|
-
positionDebtTa: publicKey(this.
|
|
235
|
-
signerDebtTa:
|
|
232
|
+
positionDebtTa: publicKey(this.positionDebtTa),
|
|
233
|
+
signerDebtTa: signerDebtTa,
|
|
236
234
|
positionData: {
|
|
237
235
|
positionId: this.positionId!,
|
|
238
236
|
settingParams: settingParams ?? null,
|
|
@@ -257,22 +255,80 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
257
255
|
}
|
|
258
256
|
|
|
259
257
|
protocolInteraction(args: SolautoActionArgs): TransactionBuilder {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
258
|
+
let tx = super.protocolInteraction(args);
|
|
259
|
+
|
|
260
|
+
if (this.selfManaged) {
|
|
261
|
+
return tx.add(this.marginfiProtocolInteractionIx(args));
|
|
262
|
+
} else {
|
|
263
|
+
return tx.add(this.marginfiSolautoProtocolInteractionIx(args));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private marginfiProtocolInteractionIx(args: SolautoActionArgs) {
|
|
268
|
+
switch (args.__kind) {
|
|
269
|
+
case "Deposit": {
|
|
270
|
+
console.log(args.fields[0]);
|
|
271
|
+
return lendingAccountDeposit(this.umi, {
|
|
272
|
+
amount: args.fields[0],
|
|
273
|
+
signer: this.signer,
|
|
274
|
+
signerTokenAccount: publicKey(this.signerSupplyTa),
|
|
275
|
+
marginfiAccount: publicKey(this.marginfiAccountPk),
|
|
276
|
+
marginfiGroup: publicKey(this.marginfiGroup),
|
|
277
|
+
bank: publicKey(this.marginfiSupplyBankAccounts.bank),
|
|
278
|
+
bankLiquidityVault: publicKey(this.marginfiSupplyBankAccounts.liquidityVault),
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
case "Borrow": {
|
|
282
|
+
return lendingAccountBorrow(this.umi, {
|
|
283
|
+
amount: args.fields[0],
|
|
284
|
+
signer: this.signer,
|
|
285
|
+
destinationTokenAccount: publicKey(this.signerDebtTa),
|
|
286
|
+
marginfiAccount: publicKey(this.marginfiAccountPk),
|
|
287
|
+
marginfiGroup: publicKey(this.marginfiGroup),
|
|
288
|
+
bank: publicKey(this.marginfiDebtBankAccounts.bank),
|
|
289
|
+
bankLiquidityVault: publicKey(this.marginfiDebtBankAccounts.liquidityVault),
|
|
290
|
+
bankLiquidityVaultAuthority: publicKey(this.marginfiDebtBankAccounts.vaultAuthority),
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
case "Repay": {
|
|
294
|
+
return lendingAccountRepay(this.umi, {
|
|
295
|
+
amount: args.fields[0].__kind === "Some" ? args.fields[0].fields[0] : 0,
|
|
296
|
+
repayAll: args.fields[0].__kind === "All" ? true : false,
|
|
297
|
+
signer: this.signer,
|
|
298
|
+
signerTokenAccount: publicKey(this.signerDebtTa),
|
|
299
|
+
marginfiAccount: publicKey(this.marginfiAccountPk),
|
|
300
|
+
marginfiGroup: publicKey(this.marginfiGroup),
|
|
301
|
+
bank: publicKey(this.marginfiDebtBankAccounts.bank),
|
|
302
|
+
bankLiquidityVault: publicKey(this.marginfiDebtBankAccounts.liquidityVault),
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
case "Withdraw": {
|
|
306
|
+
return lendingAccountWithdraw(this.umi, {
|
|
307
|
+
amount: args.fields[0].__kind === "Some" ? args.fields[0].fields[0] : 0,
|
|
308
|
+
withdrawAll: args.fields[0].__kind === "All" ? true : false,
|
|
309
|
+
signer: this.signer,
|
|
310
|
+
destinationTokenAccount: publicKey(this.signerSupplyTa),
|
|
311
|
+
marginfiAccount: publicKey(this.marginfiAccountPk),
|
|
312
|
+
marginfiGroup: publicKey(this.marginfiGroup),
|
|
313
|
+
bank: publicKey(this.marginfiSupplyBankAccounts.bank),
|
|
314
|
+
bankLiquidityVault: publicKey(this.marginfiSupplyBankAccounts.liquidityVault),
|
|
315
|
+
bankLiquidityVaultAuthority: publicKey(this.marginfiSupplyBankAccounts.vaultAuthority),
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
263
319
|
}
|
|
264
320
|
|
|
265
|
-
private
|
|
321
|
+
private marginfiSolautoProtocolInteractionIx(
|
|
266
322
|
args: SolautoActionArgs
|
|
267
323
|
): TransactionBuilder {
|
|
268
|
-
let
|
|
324
|
+
let positionSupplyTa: UmiPublicKey | undefined = undefined;
|
|
269
325
|
let vaultSupplyTa: UmiPublicKey | undefined = undefined;
|
|
270
326
|
let supplyVaultAuthority: UmiPublicKey | undefined = undefined;
|
|
271
327
|
if (args.__kind === "Deposit" || args.__kind === "Withdraw") {
|
|
272
|
-
|
|
328
|
+
positionSupplyTa = publicKey(
|
|
273
329
|
args.__kind === "Withdraw" || this.selfManaged
|
|
274
|
-
? this.
|
|
275
|
-
: this.
|
|
330
|
+
? this.signerSupplyTa
|
|
331
|
+
: this.positionSupplyTa
|
|
276
332
|
);
|
|
277
333
|
vaultSupplyTa = publicKey(this.marginfiSupplyBankAccounts.liquidityVault);
|
|
278
334
|
supplyVaultAuthority = publicKey(
|
|
@@ -280,14 +336,14 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
280
336
|
);
|
|
281
337
|
}
|
|
282
338
|
|
|
283
|
-
let
|
|
339
|
+
let positionDebtTa: UmiPublicKey | undefined = undefined;
|
|
284
340
|
let vaultDebtTa: UmiPublicKey | undefined = undefined;
|
|
285
341
|
let debtVaultAuthority: UmiPublicKey | undefined = undefined;
|
|
286
342
|
if (args.__kind === "Borrow" || args.__kind === "Repay") {
|
|
287
|
-
|
|
343
|
+
positionDebtTa = publicKey(
|
|
288
344
|
args.__kind === "Borrow" || this.selfManaged
|
|
289
|
-
? this.
|
|
290
|
-
: this.
|
|
345
|
+
? this.signerDebtTa
|
|
346
|
+
: this.positionDebtTa
|
|
291
347
|
);
|
|
292
348
|
vaultDebtTa = publicKey(this.marginfiDebtBankAccounts.liquidityVault);
|
|
293
349
|
debtVaultAuthority = publicKey(
|
|
@@ -312,12 +368,12 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
312
368
|
marginfiAccount: publicKey(this.marginfiAccountPk),
|
|
313
369
|
supplyBank: publicKey(this.marginfiSupplyBankAccounts.bank),
|
|
314
370
|
supplyPriceOracle,
|
|
315
|
-
|
|
371
|
+
positionSupplyTa,
|
|
316
372
|
vaultSupplyTa,
|
|
317
373
|
supplyVaultAuthority,
|
|
318
374
|
debtBank: publicKey(this.marginfiDebtBankAccounts.bank),
|
|
319
375
|
debtPriceOracle,
|
|
320
|
-
|
|
376
|
+
positionDebtTa,
|
|
321
377
|
vaultDebtTa,
|
|
322
378
|
debtVaultAuthority,
|
|
323
379
|
solautoAction: args,
|
|
@@ -356,14 +412,16 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
356
412
|
),
|
|
357
413
|
supplyBank: publicKey(this.marginfiSupplyBankAccounts.bank),
|
|
358
414
|
supplyPriceOracle: publicKey(this.marginfiSupplyBankAccounts.priceOracle),
|
|
359
|
-
positionSupplyTa: publicKey(this.
|
|
415
|
+
positionSupplyTa: publicKey(this.positionSupplyTa),
|
|
416
|
+
signerSupplyTa: this.selfManaged ? publicKey(this.signerSupplyTa) : undefined,
|
|
360
417
|
vaultSupplyTa: publicKey(this.marginfiSupplyBankAccounts.liquidityVault),
|
|
361
418
|
supplyVaultAuthority: publicKey(
|
|
362
419
|
this.marginfiSupplyBankAccounts.vaultAuthority
|
|
363
420
|
),
|
|
364
421
|
debtBank: publicKey(this.marginfiDebtBankAccounts.bank),
|
|
365
422
|
debtPriceOracle: publicKey(this.marginfiDebtBankAccounts.priceOracle),
|
|
366
|
-
positionDebtTa: publicKey(this.
|
|
423
|
+
positionDebtTa: publicKey(this.positionDebtTa),
|
|
424
|
+
signerDebtTa: this.selfManaged ? publicKey(this.signerDebtTa) : undefined,
|
|
367
425
|
vaultDebtTa: publicKey(this.marginfiDebtBankAccounts.liquidityVault),
|
|
368
426
|
debtVaultAuthority: publicKey(
|
|
369
427
|
this.marginfiDebtBankAccounts.vaultAuthority
|
|
@@ -33,11 +33,11 @@ export type ClosePositionInstructionAccounts = {
|
|
|
33
33
|
tokenProgram?: PublicKey | Pda;
|
|
34
34
|
ataProgram?: PublicKey | Pda;
|
|
35
35
|
solautoPosition: PublicKey | Pda;
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
signerSupplyTa: PublicKey | Pda;
|
|
37
|
+
positionSupplyTa: PublicKey | Pda;
|
|
38
38
|
positionSupplyCollateralTa?: PublicKey | Pda;
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
positionDebtTa: PublicKey | Pda;
|
|
40
|
+
signerDebtTa: PublicKey | Pda;
|
|
41
41
|
};
|
|
42
42
|
|
|
43
43
|
// Data.
|
|
@@ -102,30 +102,30 @@ export function closePosition(
|
|
|
102
102
|
isWritable: true as boolean,
|
|
103
103
|
value: input.solautoPosition ?? null,
|
|
104
104
|
},
|
|
105
|
-
|
|
105
|
+
signerSupplyTa: {
|
|
106
106
|
index: 5,
|
|
107
107
|
isWritable: true as boolean,
|
|
108
|
-
value: input.
|
|
108
|
+
value: input.signerSupplyTa ?? null,
|
|
109
109
|
},
|
|
110
|
-
|
|
110
|
+
positionSupplyTa: {
|
|
111
111
|
index: 6,
|
|
112
112
|
isWritable: true as boolean,
|
|
113
|
-
value: input.
|
|
113
|
+
value: input.positionSupplyTa ?? null,
|
|
114
114
|
},
|
|
115
115
|
positionSupplyCollateralTa: {
|
|
116
116
|
index: 7,
|
|
117
117
|
isWritable: true as boolean,
|
|
118
118
|
value: input.positionSupplyCollateralTa ?? null,
|
|
119
119
|
},
|
|
120
|
-
|
|
120
|
+
positionDebtTa: {
|
|
121
121
|
index: 8,
|
|
122
122
|
isWritable: true as boolean,
|
|
123
|
-
value: input.
|
|
123
|
+
value: input.positionDebtTa ?? null,
|
|
124
124
|
},
|
|
125
|
-
|
|
125
|
+
signerDebtTa: {
|
|
126
126
|
index: 9,
|
|
127
127
|
isWritable: true as boolean,
|
|
128
|
-
value: input.
|
|
128
|
+
value: input.signerDebtTa ?? null,
|
|
129
129
|
},
|
|
130
130
|
} satisfies ResolvedAccountsWithIndices;
|
|
131
131
|
|
|
@@ -45,12 +45,12 @@ export type MarginfiProtocolInteractionInstructionAccounts = {
|
|
|
45
45
|
marginfiAccount: PublicKey | Pda;
|
|
46
46
|
supplyBank: PublicKey | Pda;
|
|
47
47
|
supplyPriceOracle?: PublicKey | Pda;
|
|
48
|
-
|
|
48
|
+
positionSupplyTa?: PublicKey | Pda;
|
|
49
49
|
vaultSupplyTa?: PublicKey | Pda;
|
|
50
50
|
supplyVaultAuthority?: PublicKey | Pda;
|
|
51
51
|
debtBank: PublicKey | Pda;
|
|
52
52
|
debtPriceOracle?: PublicKey | Pda;
|
|
53
|
-
|
|
53
|
+
positionDebtTa?: PublicKey | Pda;
|
|
54
54
|
vaultDebtTa?: PublicKey | Pda;
|
|
55
55
|
debtVaultAuthority?: PublicKey | Pda;
|
|
56
56
|
};
|
|
@@ -157,10 +157,10 @@ export function marginfiProtocolInteraction(
|
|
|
157
157
|
isWritable: false as boolean,
|
|
158
158
|
value: input.supplyPriceOracle ?? null,
|
|
159
159
|
},
|
|
160
|
-
|
|
160
|
+
positionSupplyTa: {
|
|
161
161
|
index: 11,
|
|
162
162
|
isWritable: true as boolean,
|
|
163
|
-
value: input.
|
|
163
|
+
value: input.positionSupplyTa ?? null,
|
|
164
164
|
},
|
|
165
165
|
vaultSupplyTa: {
|
|
166
166
|
index: 12,
|
|
@@ -182,10 +182,10 @@ export function marginfiProtocolInteraction(
|
|
|
182
182
|
isWritable: false as boolean,
|
|
183
183
|
value: input.debtPriceOracle ?? null,
|
|
184
184
|
},
|
|
185
|
-
|
|
185
|
+
positionDebtTa: {
|
|
186
186
|
index: 16,
|
|
187
187
|
isWritable: true as boolean,
|
|
188
|
-
value: input.
|
|
188
|
+
value: input.positionDebtTa ?? null,
|
|
189
189
|
},
|
|
190
190
|
vaultDebtTa: {
|
|
191
191
|
index: 17,
|
|
@@ -52,11 +52,13 @@ export type MarginfiRebalanceInstructionAccounts = {
|
|
|
52
52
|
supplyBank: PublicKey | Pda;
|
|
53
53
|
supplyPriceOracle?: PublicKey | Pda;
|
|
54
54
|
positionSupplyTa: PublicKey | Pda;
|
|
55
|
+
signerSupplyTa?: PublicKey | Pda;
|
|
55
56
|
vaultSupplyTa?: PublicKey | Pda;
|
|
56
57
|
supplyVaultAuthority?: PublicKey | Pda;
|
|
57
58
|
debtBank: PublicKey | Pda;
|
|
58
59
|
debtPriceOracle?: PublicKey | Pda;
|
|
59
60
|
positionDebtTa: PublicKey | Pda;
|
|
61
|
+
signerDebtTa?: PublicKey | Pda;
|
|
60
62
|
vaultDebtTa?: PublicKey | Pda;
|
|
61
63
|
debtVaultAuthority?: PublicKey | Pda;
|
|
62
64
|
};
|
|
@@ -192,38 +194,48 @@ export function marginfiRebalance(
|
|
|
192
194
|
isWritable: true as boolean,
|
|
193
195
|
value: input.positionSupplyTa ?? null,
|
|
194
196
|
},
|
|
195
|
-
|
|
197
|
+
signerSupplyTa: {
|
|
196
198
|
index: 15,
|
|
197
199
|
isWritable: true as boolean,
|
|
200
|
+
value: input.signerSupplyTa ?? null,
|
|
201
|
+
},
|
|
202
|
+
vaultSupplyTa: {
|
|
203
|
+
index: 16,
|
|
204
|
+
isWritable: true as boolean,
|
|
198
205
|
value: input.vaultSupplyTa ?? null,
|
|
199
206
|
},
|
|
200
207
|
supplyVaultAuthority: {
|
|
201
|
-
index:
|
|
208
|
+
index: 17,
|
|
202
209
|
isWritable: true as boolean,
|
|
203
210
|
value: input.supplyVaultAuthority ?? null,
|
|
204
211
|
},
|
|
205
212
|
debtBank: {
|
|
206
|
-
index:
|
|
213
|
+
index: 18,
|
|
207
214
|
isWritable: true as boolean,
|
|
208
215
|
value: input.debtBank ?? null,
|
|
209
216
|
},
|
|
210
217
|
debtPriceOracle: {
|
|
211
|
-
index:
|
|
218
|
+
index: 19,
|
|
212
219
|
isWritable: false as boolean,
|
|
213
220
|
value: input.debtPriceOracle ?? null,
|
|
214
221
|
},
|
|
215
222
|
positionDebtTa: {
|
|
216
|
-
index:
|
|
223
|
+
index: 20,
|
|
217
224
|
isWritable: true as boolean,
|
|
218
225
|
value: input.positionDebtTa ?? null,
|
|
219
226
|
},
|
|
227
|
+
signerDebtTa: {
|
|
228
|
+
index: 21,
|
|
229
|
+
isWritable: true as boolean,
|
|
230
|
+
value: input.signerDebtTa ?? null,
|
|
231
|
+
},
|
|
220
232
|
vaultDebtTa: {
|
|
221
|
-
index:
|
|
233
|
+
index: 22,
|
|
222
234
|
isWritable: true as boolean,
|
|
223
235
|
value: input.vaultDebtTa ?? null,
|
|
224
236
|
},
|
|
225
237
|
debtVaultAuthority: {
|
|
226
|
-
index:
|
|
238
|
+
index: 23,
|
|
227
239
|
isWritable: true as boolean,
|
|
228
240
|
value: input.debtVaultAuthority ?? null,
|
|
229
241
|
},
|
|
@@ -40,11 +40,19 @@ import {
|
|
|
40
40
|
rpcAccountCreated,
|
|
41
41
|
} from "../utils/generalUtils";
|
|
42
42
|
import { SolautoMarginfiClient } from "../clients/solautoMarginfiClient";
|
|
43
|
-
import { getMaxLiqUtilizationRate, uint8ArrayToBigInt } from "../utils/numberUtils";
|
|
44
43
|
import {
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
getMaxLiqUtilizationRate,
|
|
45
|
+
uint8ArrayToBigInt,
|
|
46
|
+
} from "../utils/numberUtils";
|
|
47
|
+
import { eligibileForRebalance } from "../utils/solauto/generalUtils";
|
|
47
48
|
import { getTokenAccount } from "../utils/accountUtils";
|
|
49
|
+
import {
|
|
50
|
+
getLendingAccountBorrowInstructionDataSerializer,
|
|
51
|
+
getLendingAccountDepositInstructionDataSerializer,
|
|
52
|
+
getLendingAccountRepayInstructionDataSerializer,
|
|
53
|
+
getLendingAccountWithdrawInstructionDataSerializer,
|
|
54
|
+
MARGINFI_PROGRAM_ID,
|
|
55
|
+
} from "../marginfi-sdk";
|
|
48
56
|
|
|
49
57
|
interface wSolTokenUsage {
|
|
50
58
|
wSolTokenAccount: PublicKey;
|
|
@@ -76,12 +84,12 @@ function getWSolUsage(
|
|
|
76
84
|
);
|
|
77
85
|
if (supplyIsWsol && usingSupplyTaAction) {
|
|
78
86
|
return {
|
|
79
|
-
wSolTokenAccount: client.
|
|
87
|
+
wSolTokenAccount: client.signerSupplyTa,
|
|
80
88
|
solautoAction: usingSupplyTaAction,
|
|
81
89
|
};
|
|
82
90
|
} else if (debtIsWsol && usingDebtTaAction) {
|
|
83
91
|
return {
|
|
84
|
-
wSolTokenAccount: client.
|
|
92
|
+
wSolTokenAccount: client.signerDebtTa,
|
|
85
93
|
solautoAction: usingDebtTaAction,
|
|
86
94
|
};
|
|
87
95
|
} else {
|
|
@@ -120,7 +128,7 @@ async function transactionChoresBefore(
|
|
|
120
128
|
undefined
|
|
121
129
|
);
|
|
122
130
|
if (wSolUsage !== undefined) {
|
|
123
|
-
if (
|
|
131
|
+
if (await getSolanaAccountCreated(client.umi, wSolUsage.wSolTokenAccount)) {
|
|
124
132
|
client.log(`Closing signer wSol TA`);
|
|
125
133
|
chores = chores.add(
|
|
126
134
|
closeTokenAccountUmiIx(
|
|
@@ -133,17 +141,17 @@ async function transactionChoresBefore(
|
|
|
133
141
|
|
|
134
142
|
let amountToTransfer = BigInt(0);
|
|
135
143
|
if (isSolautoAction("Deposit", wSolUsage.solautoAction)) {
|
|
136
|
-
amountToTransfer
|
|
144
|
+
amountToTransfer = BigInt(wSolUsage.solautoAction.fields[0]);
|
|
137
145
|
} else if (
|
|
138
146
|
isSolautoAction("Repay", wSolUsage.solautoAction) &&
|
|
139
147
|
wSolUsage.solautoAction.fields[0].__kind === "Some"
|
|
140
148
|
) {
|
|
141
|
-
amountToTransfer
|
|
149
|
+
amountToTransfer = BigInt(wSolUsage.solautoAction.fields[0].fields[0]);
|
|
142
150
|
} else if (
|
|
143
151
|
initiatingDcaIn &&
|
|
144
152
|
client.debtMint.toString() === NATIVE_MINT.toString()
|
|
145
153
|
) {
|
|
146
|
-
amountToTransfer
|
|
154
|
+
amountToTransfer = initiatingDcaIn;
|
|
147
155
|
}
|
|
148
156
|
|
|
149
157
|
if (amountToTransfer > 0) {
|
|
@@ -176,8 +184,8 @@ async function transactionChoresBefore(
|
|
|
176
184
|
}
|
|
177
185
|
|
|
178
186
|
const tokenAccount = isSolautoAction("Withdraw", solautoAction)
|
|
179
|
-
? client.
|
|
180
|
-
: client.
|
|
187
|
+
? client.signerSupplyTa
|
|
188
|
+
: client.signerDebtTa;
|
|
181
189
|
if (accountsGettingCreated.includes(tokenAccount.toString())) {
|
|
182
190
|
continue;
|
|
183
191
|
}
|
|
@@ -235,10 +243,7 @@ export async function rebalanceChoresBefore(
|
|
|
235
243
|
let chores = transactionBuilder();
|
|
236
244
|
|
|
237
245
|
if (checkReferralSupplyTa && !rpcAccountCreated(referredBySupplyTa)) {
|
|
238
|
-
client.log(
|
|
239
|
-
"Creating referred-by TA for ",
|
|
240
|
-
client.supplyMint.toString()
|
|
241
|
-
);
|
|
246
|
+
client.log("Creating referred-by TA for ", client.supplyMint.toString());
|
|
242
247
|
chores = chores.add(
|
|
243
248
|
createAssociatedTokenAccountUmiIx(
|
|
244
249
|
client.signer,
|
|
@@ -249,10 +254,7 @@ export async function rebalanceChoresBefore(
|
|
|
249
254
|
}
|
|
250
255
|
|
|
251
256
|
if (checkSolautoFeesTa && !rpcAccountCreated(solautoFeesSupplyTa)) {
|
|
252
|
-
client.log(
|
|
253
|
-
"Creating Solauto fees TA for ",
|
|
254
|
-
client.supplyMint.toString()
|
|
255
|
-
);
|
|
257
|
+
client.log("Creating Solauto fees TA for ", client.supplyMint.toString());
|
|
256
258
|
chores = chores.add(
|
|
257
259
|
createAssociatedTokenAccountUmiIx(
|
|
258
260
|
client.signer,
|
|
@@ -304,25 +306,127 @@ function getSolautoActions(tx: TransactionBuilder): SolautoAction[] {
|
|
|
304
306
|
let solautoActions: SolautoAction[] = [];
|
|
305
307
|
|
|
306
308
|
tx.getInstructions().forEach((x) => {
|
|
307
|
-
if (x.programId
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
const serializer =
|
|
313
|
-
getMarginfiProtocolInteractionInstructionDataSerializer();
|
|
314
|
-
const discriminator = uint8ArrayToBigInt(
|
|
315
|
-
serializer
|
|
309
|
+
if (x.programId === SOLAUTO_PROGRAM_ID) {
|
|
310
|
+
try {
|
|
311
|
+
const serializer =
|
|
312
|
+
getMarginfiProtocolInteractionInstructionDataSerializer();
|
|
313
|
+
const discriminator = serializer
|
|
316
314
|
.serialize({
|
|
317
315
|
solautoAction: solautoAction("Deposit", [BigInt(0)]),
|
|
318
316
|
})
|
|
319
|
-
.slice(0,
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
}
|
|
325
|
-
}
|
|
317
|
+
.slice(0, 1)[0];
|
|
318
|
+
const [data, _] = serializer.deserialize(x.data);
|
|
319
|
+
if (data.discriminator === discriminator) {
|
|
320
|
+
solautoActions?.push(data.solautoAction);
|
|
321
|
+
}
|
|
322
|
+
} catch {}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
if (x.programId === MARGINFI_PROGRAM_ID) {
|
|
326
|
+
try {
|
|
327
|
+
const serializer = getLendingAccountDepositInstructionDataSerializer();
|
|
328
|
+
const discriminator = uint8ArrayToBigInt(
|
|
329
|
+
serializer
|
|
330
|
+
.serialize({
|
|
331
|
+
amount: 0,
|
|
332
|
+
})
|
|
333
|
+
.slice(0, 8)
|
|
334
|
+
);
|
|
335
|
+
const [data, _] = serializer.deserialize(x.data);
|
|
336
|
+
if (
|
|
337
|
+
uint8ArrayToBigInt(new Uint8Array(data.discriminator)) ===
|
|
338
|
+
discriminator
|
|
339
|
+
) {
|
|
340
|
+
solautoActions?.push({
|
|
341
|
+
__kind: "Deposit",
|
|
342
|
+
fields: [data.amount],
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
} catch {}
|
|
346
|
+
|
|
347
|
+
try {
|
|
348
|
+
const serializer = getLendingAccountBorrowInstructionDataSerializer();
|
|
349
|
+
const discriminator = uint8ArrayToBigInt(
|
|
350
|
+
serializer
|
|
351
|
+
.serialize({
|
|
352
|
+
amount: 0,
|
|
353
|
+
})
|
|
354
|
+
.slice(0, 8)
|
|
355
|
+
);
|
|
356
|
+
const [data, _] = serializer.deserialize(x.data);
|
|
357
|
+
if (
|
|
358
|
+
uint8ArrayToBigInt(new Uint8Array(data.discriminator)) ===
|
|
359
|
+
discriminator
|
|
360
|
+
) {
|
|
361
|
+
solautoActions?.push({
|
|
362
|
+
__kind: "Borrow",
|
|
363
|
+
fields: [data.amount],
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
} catch {}
|
|
367
|
+
|
|
368
|
+
try {
|
|
369
|
+
const serializer = getLendingAccountWithdrawInstructionDataSerializer();
|
|
370
|
+
const discriminator = uint8ArrayToBigInt(
|
|
371
|
+
serializer
|
|
372
|
+
.serialize({
|
|
373
|
+
amount: 0,
|
|
374
|
+
withdrawAll: false,
|
|
375
|
+
})
|
|
376
|
+
.slice(0, 8)
|
|
377
|
+
);
|
|
378
|
+
const [data, _] = serializer.deserialize(x.data);
|
|
379
|
+
if (
|
|
380
|
+
uint8ArrayToBigInt(new Uint8Array(data.discriminator)) ===
|
|
381
|
+
discriminator
|
|
382
|
+
) {
|
|
383
|
+
solautoActions?.push({
|
|
384
|
+
__kind: "Withdraw",
|
|
385
|
+
fields: [
|
|
386
|
+
data.withdrawAll
|
|
387
|
+
? {
|
|
388
|
+
__kind: "All",
|
|
389
|
+
}
|
|
390
|
+
: {
|
|
391
|
+
__kind: "Some",
|
|
392
|
+
fields: [data.amount],
|
|
393
|
+
},
|
|
394
|
+
],
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
} catch {}
|
|
398
|
+
|
|
399
|
+
try {
|
|
400
|
+
const serializer = getLendingAccountRepayInstructionDataSerializer();
|
|
401
|
+
const discriminator = uint8ArrayToBigInt(
|
|
402
|
+
serializer
|
|
403
|
+
.serialize({
|
|
404
|
+
amount: 0,
|
|
405
|
+
repayAll: false,
|
|
406
|
+
})
|
|
407
|
+
.slice(0, 8)
|
|
408
|
+
);
|
|
409
|
+
const [data, _] = serializer.deserialize(x.data);
|
|
410
|
+
if (
|
|
411
|
+
uint8ArrayToBigInt(new Uint8Array(data.discriminator)) ===
|
|
412
|
+
discriminator
|
|
413
|
+
) {
|
|
414
|
+
solautoActions?.push({
|
|
415
|
+
__kind: "Repay",
|
|
416
|
+
fields: [
|
|
417
|
+
data.repayAll
|
|
418
|
+
? {
|
|
419
|
+
__kind: "All",
|
|
420
|
+
}
|
|
421
|
+
: {
|
|
422
|
+
__kind: "Some",
|
|
423
|
+
fields: [data.amount],
|
|
424
|
+
},
|
|
425
|
+
],
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
} catch {}
|
|
429
|
+
}
|
|
326
430
|
|
|
327
431
|
// TODO support other platforms
|
|
328
432
|
});
|
|
@@ -483,7 +587,7 @@ export async function buildSolautoRebalanceTransaction(
|
|
|
483
587
|
export async function convertReferralFeesToDestination(
|
|
484
588
|
umi: Umi,
|
|
485
589
|
referralState: ReferralState,
|
|
486
|
-
tokenAccount: SplTokenAccount
|
|
590
|
+
tokenAccount: SplTokenAccount
|
|
487
591
|
): Promise<[TransactionBuilder, string[]]> {
|
|
488
592
|
const { lookupTableAddresses, setupInstructions, swapIx } =
|
|
489
593
|
await getJupSwapTransaction(umi.identity, {
|
|
@@ -282,16 +282,18 @@ export class TransactionsManager {
|
|
|
282
282
|
choresBefore.prepend(updateLookupTable.updateLutTx);
|
|
283
283
|
}
|
|
284
284
|
if (choresBefore.getInstructions().length > 0) {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
"create account(s)"
|
|
289
|
-
)
|
|
285
|
+
const chore = new TransactionItem(
|
|
286
|
+
async () => ({ tx: choresBefore }),
|
|
287
|
+
"create account(s)"
|
|
290
288
|
);
|
|
289
|
+
await chore.initialize();
|
|
290
|
+
this.items.unshift(chore);
|
|
291
291
|
this.client.log("Chores before: ", choresBefore.getInstructions().length);
|
|
292
292
|
}
|
|
293
293
|
if (choresAfter.getInstructions().length > 0) {
|
|
294
|
-
|
|
294
|
+
const chore = new TransactionItem(async () => ({ tx: choresAfter }));
|
|
295
|
+
await chore.initialize();
|
|
296
|
+
this.items.push(chore);
|
|
295
297
|
this.client.log("Chores after: ", choresAfter.getInstructions().length);
|
|
296
298
|
}
|
|
297
299
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
|
2
|
+
import { LendingPlatform } from "../generated";
|
|
3
|
+
|
|
4
|
+
export interface SolautoPositionDetails {
|
|
5
|
+
positionId: number;
|
|
6
|
+
selfManaged: boolean;
|
|
7
|
+
lendingPlatform: LendingPlatform;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface SelfManagedPositionDetails extends SolautoPositionDetails {
|
|
11
|
+
protocolAccount: PublicKey;
|
|
12
|
+
supplyMint: PublicKey;
|
|
13
|
+
debtMint: PublicKey;
|
|
14
|
+
}
|