@haven-fi/solauto-sdk 1.0.24 → 1.0.26
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 +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.d.ts.map +1 -1
- package/dist/utils/solauto/rebalanceUtils.js +2 -2
- 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 -3
- 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
|
|
@@ -208,7 +208,6 @@ export function getRebalanceValues(
|
|
208
208
|
targetRateBps,
|
209
209
|
adjustmentFeeBps
|
210
210
|
);
|
211
|
-
debtAdjustmentUsd *= 500;
|
212
211
|
|
213
212
|
const input = increasingLeverage
|
214
213
|
? client.solautoPositionState!.debt
|
@@ -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) {
|