@haven-fi/solauto-sdk 1.0.25 → 1.0.26
Sign up to get free protection for your applications and to get access to all the features.
- 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 +83 -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.js +8 -8
- 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/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 +88 -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 +8 -8
- package/src/transactions/transactionsManager.ts +8 -6
- package/src/types/solauto.ts +14 -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 +28 -25
- package/tests/unit/lookupTables.ts +4 -3
@@ -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
|
},
|
@@ -76,12 +76,12 @@ function getWSolUsage(
|
|
76
76
|
);
|
77
77
|
if (supplyIsWsol && usingSupplyTaAction) {
|
78
78
|
return {
|
79
|
-
wSolTokenAccount: client.
|
79
|
+
wSolTokenAccount: client.signerSupplyTa,
|
80
80
|
solautoAction: usingSupplyTaAction,
|
81
81
|
};
|
82
82
|
} else if (debtIsWsol && usingDebtTaAction) {
|
83
83
|
return {
|
84
|
-
wSolTokenAccount: client.
|
84
|
+
wSolTokenAccount: client.signerDebtTa,
|
85
85
|
solautoAction: usingDebtTaAction,
|
86
86
|
};
|
87
87
|
} else {
|
@@ -120,7 +120,7 @@ async function transactionChoresBefore(
|
|
120
120
|
undefined
|
121
121
|
);
|
122
122
|
if (wSolUsage !== undefined) {
|
123
|
-
if (
|
123
|
+
if (await getSolanaAccountCreated(client.umi, wSolUsage.wSolTokenAccount)) {
|
124
124
|
client.log(`Closing signer wSol TA`);
|
125
125
|
chores = chores.add(
|
126
126
|
closeTokenAccountUmiIx(
|
@@ -133,17 +133,17 @@ async function transactionChoresBefore(
|
|
133
133
|
|
134
134
|
let amountToTransfer = BigInt(0);
|
135
135
|
if (isSolautoAction("Deposit", wSolUsage.solautoAction)) {
|
136
|
-
amountToTransfer
|
136
|
+
amountToTransfer = BigInt(wSolUsage.solautoAction.fields[0]);
|
137
137
|
} else if (
|
138
138
|
isSolautoAction("Repay", wSolUsage.solautoAction) &&
|
139
139
|
wSolUsage.solautoAction.fields[0].__kind === "Some"
|
140
140
|
) {
|
141
|
-
amountToTransfer
|
141
|
+
amountToTransfer = BigInt(wSolUsage.solautoAction.fields[0].fields[0]);
|
142
142
|
} else if (
|
143
143
|
initiatingDcaIn &&
|
144
144
|
client.debtMint.toString() === NATIVE_MINT.toString()
|
145
145
|
) {
|
146
|
-
amountToTransfer
|
146
|
+
amountToTransfer = initiatingDcaIn;
|
147
147
|
}
|
148
148
|
|
149
149
|
if (amountToTransfer > 0) {
|
@@ -176,8 +176,8 @@ async function transactionChoresBefore(
|
|
176
176
|
}
|
177
177
|
|
178
178
|
const tokenAccount = isSolautoAction("Withdraw", solautoAction)
|
179
|
-
? client.
|
180
|
-
: client.
|
179
|
+
? client.signerSupplyTa
|
180
|
+
: client.signerDebtTa;
|
181
181
|
if (accountsGettingCreated.includes(tokenAccount.toString())) {
|
182
182
|
continue;
|
183
183
|
}
|
@@ -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
|
+
}
|
@@ -88,7 +88,9 @@ export async function getAllMarginfiAccountsByAuthority(
|
|
88
88
|
umi: Umi,
|
89
89
|
authority: PublicKey,
|
90
90
|
compatibleWithSolauto?: boolean
|
91
|
-
): Promise<
|
91
|
+
): Promise<
|
92
|
+
{ marginfiAccount: PublicKey; supplyMint?: PublicKey; debtMint?: PublicKey }[]
|
93
|
+
> {
|
92
94
|
const marginfiAccounts = await umi.rpc.getProgramAccounts(
|
93
95
|
MARGINFI_PROGRAM_ID,
|
94
96
|
{
|
@@ -123,9 +125,15 @@ export async function getAllMarginfiAccountsByAuthority(
|
|
123
125
|
);
|
124
126
|
return positionStates
|
125
127
|
.filter((x) => x.state !== undefined)
|
126
|
-
.map((x) =>
|
128
|
+
.map((x) => ({
|
129
|
+
marginfiAccount: toWeb3JsPublicKey(x.publicKey),
|
130
|
+
supplyMint: toWeb3JsPublicKey(x.state!.supply.mint),
|
131
|
+
debtMint: toWeb3JsPublicKey(x.state!.debt.mint),
|
132
|
+
}));
|
127
133
|
} else {
|
128
|
-
return marginfiAccounts.map((x) =>
|
134
|
+
return marginfiAccounts.map((x) => ({
|
135
|
+
marginfiAccount: toWeb3JsPublicKey(x.publicKey),
|
136
|
+
}));
|
129
137
|
}
|
130
138
|
}
|
131
139
|
|
@@ -27,6 +27,10 @@ import {
|
|
27
27
|
getAllMarginfiAccountsByAuthority,
|
28
28
|
getMarginfiAccountPositionState,
|
29
29
|
} from "../marginfiUtils";
|
30
|
+
import {
|
31
|
+
SelfManagedPositionDetails,
|
32
|
+
SolautoPositionDetails,
|
33
|
+
} from "../../types/solauto";
|
30
34
|
|
31
35
|
function newPeriodsPassed(
|
32
36
|
automation: AutomationSettings,
|
@@ -278,12 +282,6 @@ export async function getReferralsByUser(
|
|
278
282
|
return accounts.map((x) => toWeb3JsPublicKey(x.publicKey));
|
279
283
|
}
|
280
284
|
|
281
|
-
export interface SolautoPositionDetails {
|
282
|
-
positionId: number;
|
283
|
-
lendingPlatform: LendingPlatform;
|
284
|
-
protocolAccount?: PublicKey;
|
285
|
-
}
|
286
|
-
|
287
285
|
export async function getAllPositionsByAuthority(
|
288
286
|
umi: Umi,
|
289
287
|
user: PublicKey
|
@@ -295,16 +293,27 @@ export async function getAllPositionsByAuthority(
|
|
295
293
|
...solautoManagedPositions.map((x) => ({
|
296
294
|
positionId: x.positionId,
|
297
295
|
lendingPlatform: x.lendingPlatform,
|
296
|
+
selfManaged: false,
|
298
297
|
}))
|
299
298
|
);
|
300
299
|
|
301
|
-
const marginfiPositions = await getAllMarginfiAccountsByAuthority(
|
300
|
+
const marginfiPositions = await getAllMarginfiAccountsByAuthority(
|
301
|
+
umi,
|
302
|
+
user,
|
303
|
+
true
|
304
|
+
);
|
302
305
|
allPositions.push(
|
303
|
-
...marginfiPositions.map(
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
306
|
+
...marginfiPositions.map(
|
307
|
+
(x) =>
|
308
|
+
({
|
309
|
+
positionId: 0,
|
310
|
+
selfManaged: true,
|
311
|
+
lendingPlatform: LendingPlatform.Marginfi,
|
312
|
+
protocolAccount: x.marginfiAccount,
|
313
|
+
supplyMint: x.supplyMint,
|
314
|
+
debtMint: x.debtMint,
|
315
|
+
}) as SelfManagedPositionDetails
|
316
|
+
)
|
308
317
|
);
|
309
318
|
|
310
319
|
// TODO support other platforms
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
2
|
import { SolautoClient } from "../../clients/solautoClient";
|
3
|
-
import { PositionTokenUsage } from "../../generated";
|
3
|
+
import { FeeType, PositionTokenUsage } from "../../generated";
|
4
4
|
import {
|
5
5
|
eligibleForNextAutomationPeriod,
|
6
6
|
getAdjustedSettingsFromAutomation,
|
@@ -188,7 +188,7 @@ export function getRebalanceValues(
|
|
188
188
|
if (increasingLeverage) {
|
189
189
|
adjustmentFeeBps = getSolautoFeesBps(
|
190
190
|
client.referredByState !== undefined,
|
191
|
-
client.solautoPositionData
|
191
|
+
client.solautoPositionData?.feeType ?? FeeType.Small
|
192
192
|
).total;
|
193
193
|
}
|
194
194
|
|
@@ -25,7 +25,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
25
25
|
|
26
26
|
const payForTransactions = false;
|
27
27
|
const useJitoBundle = false;
|
28
|
-
const positionId =
|
28
|
+
const positionId = 0;
|
29
29
|
|
30
30
|
it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
|
31
31
|
const client = new SolautoMarginfiClient(process.env.HELIUS_API_KEY!, true);
|
@@ -45,6 +45,9 @@ describe("Solauto Marginfi tests", async () => {
|
|
45
45
|
{
|
46
46
|
signer,
|
47
47
|
positionId,
|
48
|
+
marginfiAccount: new PublicKey("4nNvUXF5YqHFcH2nGweSiuvy1ct7V5FXfoCLKFYUN36z"),
|
49
|
+
supplyMint: NATIVE_MINT,
|
50
|
+
debtMint: new PublicKey(USDC_MINT)
|
48
51
|
}
|
49
52
|
);
|
50
53
|
|
@@ -58,29 +61,29 @@ describe("Solauto Marginfi tests", async () => {
|
|
58
61
|
targetBoostToBps: none(),
|
59
62
|
};
|
60
63
|
|
61
|
-
if (client.solautoPositionData === null) {
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
64
|
+
// if (client.solautoPositionData === null) {
|
65
|
+
// transactionItems.push(
|
66
|
+
// new TransactionItem(async () => {
|
67
|
+
// return {
|
68
|
+
// tx: client.openPosition(),
|
69
|
+
// };
|
70
|
+
// }, "open position")
|
71
|
+
// );
|
69
72
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
}
|
73
|
+
// const initialSupplyUsd = 50;
|
74
|
+
// transactionItems.push(
|
75
|
+
// new TransactionItem(async () => {
|
76
|
+
// const [supplyPrice] = await getTokenPrices([supply]);
|
77
|
+
// return {
|
78
|
+
// tx: client.protocolInteraction(
|
79
|
+
// solautoAction("Deposit", [
|
80
|
+
// toBaseUnit(initialSupplyUsd / supplyPrice, supplyDecimals),
|
81
|
+
// ])
|
82
|
+
// ),
|
83
|
+
// };
|
84
|
+
// }, "deposit")
|
85
|
+
// );
|
86
|
+
// }
|
84
87
|
|
85
88
|
// transactionItems.push(
|
86
89
|
// new TransactionItem(
|
@@ -104,7 +107,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
104
107
|
transactionItems.push(
|
105
108
|
new TransactionItem(
|
106
109
|
async (attemptNum) =>
|
107
|
-
await buildSolautoRebalanceTransaction(client,
|
110
|
+
await buildSolautoRebalanceTransaction(client, 5000, attemptNum),
|
108
111
|
"rebalance"
|
109
112
|
)
|
110
113
|
);
|
@@ -141,7 +144,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
141
144
|
transactionItems,
|
142
145
|
undefined,
|
143
146
|
!payForTransactions,
|
144
|
-
useJitoBundle
|
147
|
+
useJitoBundle
|
145
148
|
).send();
|
146
149
|
});
|
147
150
|
});
|
@@ -1,14 +1,15 @@
|
|
1
1
|
import { describe, it } from 'mocha';
|
2
|
-
import { PublicKey } from "@solana/web3.js";
|
2
|
+
import { clusterApiUrl, Connection, PublicKey } from "@solana/web3.js";
|
3
3
|
import {
|
4
4
|
MARGINFI_ACCOUNTS,
|
5
5
|
MARGINFI_ACCOUNTS_LOOKUP_TABLE,
|
6
6
|
} from "../../src/constants/marginfiAccounts";
|
7
|
-
|
7
|
+
|
8
|
+
const conn = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
|
8
9
|
|
9
10
|
describe("Assert lookup tables up-to-date", async () => {
|
10
11
|
it("marginfi accounts LUT should have everything", async () => {
|
11
|
-
const lookupTable = await
|
12
|
+
const lookupTable = await conn.getAddressLookupTable(
|
12
13
|
new PublicKey(MARGINFI_ACCOUNTS_LOOKUP_TABLE)
|
13
14
|
);
|
14
15
|
if (lookupTable === null) {
|