@haven-fi/solauto-sdk 1.0.26 → 1.0.28
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/solautoMarginfiClient.d.ts +1 -0
- package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/clients/solautoMarginfiClient.js +9 -0
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +112 -15
- package/dist/utils/jupiterUtils.d.ts.map +1 -1
- package/dist/utils/jupiterUtils.js +1 -0
- package/package.json +1 -1
- package/src/clients/solautoMarginfiClient.ts +10 -0
- package/src/transactions/transactionUtils.ts +147 -30
- package/src/utils/jupiterUtils.ts +1 -0
- package/tests/transactions/solautoMarginfi.ts +18 -2
@@ -27,6 +27,7 @@ export declare class SolautoMarginfiClient extends SolautoClient {
|
|
27
27
|
initialize(args: SolautoMarginfiClientArgs): Promise<void>;
|
28
28
|
defaultLookupTables(): string[];
|
29
29
|
lutAccountsToAdd(): PublicKey[];
|
30
|
+
marginfiAccountInitialize(): TransactionBuilder;
|
30
31
|
openPosition(settingParams?: SolautoSettingsParametersInpArgs, dca?: DCASettingsInpArgs): TransactionBuilder;
|
31
32
|
private marginfiOpenPositionIx;
|
32
33
|
refresh(): TransactionBuilder;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAGL,SAAS,EAEV,MAAM,iBAAiB,CAAC;AACzB,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;AAOnE,OAAO,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAEhF,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,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,mBAAmB,CAAC,EAAE,SAAS,GAC9B,yBAAyB,CAe3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IAC/C,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,0BAA0B,EAAG,qBAAqB,CAAC;IACnD,wBAAwB,EAAG,qBAAqB,CAAC;IAGjD,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,6BAA6B,EAAG,SAAS,CAAC;IAC1C,2BAA2B,CAAC,EAAE,eAAe,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE,yBAAyB;IAoEhD,mBAAmB,IAAI,MAAM,EAAE;IAI/B,gBAAgB,IAAI,SAAS,EAAE;IAQ/B,YAAY,CACV,aAAa,CAAC,EAAE,gCAAgC,EAChD,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA2C9B,OAAO,IAAI,kBAAkB;IAc7B,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUhE,OAAO,CAAC,6BAA6B;
|
1
|
+
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAGL,SAAS,EAEV,MAAM,iBAAiB,CAAC;AACzB,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;AAOnE,OAAO,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAEhF,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,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,mBAAmB,CAAC,EAAE,SAAS,GAC9B,yBAAyB,CAe3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IAC/C,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,0BAA0B,EAAG,qBAAqB,CAAC;IACnD,wBAAwB,EAAG,qBAAqB,CAAC;IAGjD,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,6BAA6B,EAAG,SAAS,CAAC;IAC1C,2BAA2B,CAAC,EAAE,eAAe,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE,yBAAyB;IAoEhD,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;IA2C9B,OAAO,IAAI,kBAAkB;IAc7B,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUhE,OAAO,CAAC,6BAA6B;IAsDrC,OAAO,CAAC,oCAAoC;IA8D5C,SAAS,CACP,aAAa,EAAE,GAAG,GAAG,GAAG,EACxB,WAAW,EAAE,cAAc,EAC3B,aAAa,EAAE,wBAAwB,EACvC,2BAA2B,CAAC,EAAE,MAAM,EACpC,WAAW,CAAC,EAAE,MAAM,GACnB,kBAAkB;IA8CrB,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"}
|
@@ -80,6 +80,14 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
80
80
|
this.intermediaryMarginfiAccountPk,
|
81
81
|
];
|
82
82
|
}
|
83
|
+
marginfiAccountInitialize() {
|
84
|
+
return (0, marginfi_sdk_1.marginfiAccountInitialize)(this.umi, {
|
85
|
+
marginfiAccount: this.marginfiAccount,
|
86
|
+
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
87
|
+
authority: this.signer,
|
88
|
+
feePayer: this.signer,
|
89
|
+
});
|
90
|
+
}
|
83
91
|
openPosition(settingParams, dca) {
|
84
92
|
return super
|
85
93
|
.openPosition(settingParams, dca)
|
@@ -147,6 +155,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
147
155
|
marginfiProtocolInteractionIx(args) {
|
148
156
|
switch (args.__kind) {
|
149
157
|
case "Deposit": {
|
158
|
+
console.log(args.fields[0]);
|
150
159
|
return (0, marginfi_sdk_1.lendingAccountDeposit)(this.umi, {
|
151
160
|
amount: args.fields[0],
|
152
161
|
signer: this.signer,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAGL,OAAO,IAAI,eAAe,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,aAAa,EAQd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
1
|
+
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAGL,OAAO,IAAI,eAAe,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,aAAa,EAQd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqMzD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAgE7B;AAgKD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA0BnD;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CACN;IACE,EAAE,EAAE,kBAAkB,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC,GACD,SAAS,CACZ,CA2GA;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,eAAe,GAC5B,OAAO,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,CA8BzC"}
|
@@ -13,6 +13,7 @@ const generalUtils_1 = require("../utils/generalUtils");
|
|
13
13
|
const numberUtils_1 = require("../utils/numberUtils");
|
14
14
|
const generalUtils_2 = require("../utils/solauto/generalUtils");
|
15
15
|
const accountUtils_1 = require("../utils/accountUtils");
|
16
|
+
const marginfi_sdk_1 = require("../marginfi-sdk");
|
16
17
|
function getWSolUsage(client, solautoActions, initiatingDcaIn, cancellingDcaIn) {
|
17
18
|
const supplyIsWsol = client.supplyMint.equals(spl_token_1.NATIVE_MINT);
|
18
19
|
const debtIsWsol = client.debtMint.equals(spl_token_1.NATIVE_MINT);
|
@@ -52,8 +53,15 @@ async function transactionChoresBefore(client, solautoActions, initiatingDcaIn)
|
|
52
53
|
(0, umi_1.publicKey)(web3_js_1.PublicKey.default))) {
|
53
54
|
chores = chores.add(client.updateReferralStatesIx());
|
54
55
|
}
|
55
|
-
if (client.selfManaged
|
56
|
-
|
56
|
+
if (client.selfManaged) {
|
57
|
+
if (client.solautoPositionData === undefined) {
|
58
|
+
chores = chores.add(client.openPosition());
|
59
|
+
}
|
60
|
+
else if (client.lendingPlatform === generated_1.LendingPlatform.Marginfi &&
|
61
|
+
!(await (0, generalUtils_1.getSolanaAccountCreated)(client.umi, client.marginfiAccountPk))) {
|
62
|
+
chores = chores.add(client.marginfiAccountInitialize());
|
63
|
+
}
|
64
|
+
// TODO: support other platforms
|
57
65
|
}
|
58
66
|
const wSolUsage = getWSolUsage(client, solautoActions, initiatingDcaIn, undefined);
|
59
67
|
if (wSolUsage !== undefined) {
|
@@ -148,22 +156,111 @@ function transactionChoresAfter(client, solautoActions, cancellingDcaIn) {
|
|
148
156
|
function getSolautoActions(tx) {
|
149
157
|
let solautoActions = [];
|
150
158
|
tx.getInstructions().forEach((x) => {
|
151
|
-
if (x.programId
|
152
|
-
|
159
|
+
if (x.programId === generated_1.SOLAUTO_PROGRAM_ID) {
|
160
|
+
try {
|
161
|
+
const serializer = (0, generated_1.getMarginfiProtocolInteractionInstructionDataSerializer)();
|
162
|
+
const discriminator = serializer
|
163
|
+
.serialize({
|
164
|
+
solautoAction: (0, generated_1.solautoAction)("Deposit", [BigInt(0)]),
|
165
|
+
})
|
166
|
+
.slice(0, 1)[0];
|
167
|
+
const [data, _] = serializer.deserialize(x.data);
|
168
|
+
if (data.discriminator === discriminator) {
|
169
|
+
solautoActions?.push(data.solautoAction);
|
170
|
+
}
|
171
|
+
}
|
172
|
+
catch { }
|
153
173
|
}
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
.
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
174
|
+
if (x.programId === marginfi_sdk_1.MARGINFI_PROGRAM_ID) {
|
175
|
+
try {
|
176
|
+
const serializer = (0, marginfi_sdk_1.getLendingAccountDepositInstructionDataSerializer)();
|
177
|
+
const discriminator = (0, numberUtils_1.uint8ArrayToBigInt)(serializer
|
178
|
+
.serialize({
|
179
|
+
amount: 0,
|
180
|
+
})
|
181
|
+
.slice(0, 8));
|
182
|
+
const [data, _] = serializer.deserialize(x.data);
|
183
|
+
if ((0, numberUtils_1.uint8ArrayToBigInt)(new Uint8Array(data.discriminator)) ===
|
184
|
+
discriminator) {
|
185
|
+
solautoActions?.push({
|
186
|
+
__kind: "Deposit",
|
187
|
+
fields: [data.amount],
|
188
|
+
});
|
189
|
+
}
|
190
|
+
}
|
191
|
+
catch { }
|
192
|
+
try {
|
193
|
+
const serializer = (0, marginfi_sdk_1.getLendingAccountBorrowInstructionDataSerializer)();
|
194
|
+
const discriminator = (0, numberUtils_1.uint8ArrayToBigInt)(serializer
|
195
|
+
.serialize({
|
196
|
+
amount: 0,
|
197
|
+
})
|
198
|
+
.slice(0, 8));
|
199
|
+
const [data, _] = serializer.deserialize(x.data);
|
200
|
+
if ((0, numberUtils_1.uint8ArrayToBigInt)(new Uint8Array(data.discriminator)) ===
|
201
|
+
discriminator) {
|
202
|
+
solautoActions?.push({
|
203
|
+
__kind: "Borrow",
|
204
|
+
fields: [data.amount],
|
205
|
+
});
|
206
|
+
}
|
207
|
+
}
|
208
|
+
catch { }
|
209
|
+
try {
|
210
|
+
const serializer = (0, marginfi_sdk_1.getLendingAccountWithdrawInstructionDataSerializer)();
|
211
|
+
const discriminator = (0, numberUtils_1.uint8ArrayToBigInt)(serializer
|
212
|
+
.serialize({
|
213
|
+
amount: 0,
|
214
|
+
withdrawAll: false,
|
215
|
+
})
|
216
|
+
.slice(0, 8));
|
217
|
+
const [data, _] = serializer.deserialize(x.data);
|
218
|
+
if ((0, numberUtils_1.uint8ArrayToBigInt)(new Uint8Array(data.discriminator)) ===
|
219
|
+
discriminator) {
|
220
|
+
solautoActions?.push({
|
221
|
+
__kind: "Withdraw",
|
222
|
+
fields: [
|
223
|
+
data.withdrawAll
|
224
|
+
? {
|
225
|
+
__kind: "All",
|
226
|
+
}
|
227
|
+
: {
|
228
|
+
__kind: "Some",
|
229
|
+
fields: [data.amount],
|
230
|
+
},
|
231
|
+
],
|
232
|
+
});
|
233
|
+
}
|
234
|
+
}
|
235
|
+
catch { }
|
236
|
+
try {
|
237
|
+
const serializer = (0, marginfi_sdk_1.getLendingAccountRepayInstructionDataSerializer)();
|
238
|
+
const discriminator = (0, numberUtils_1.uint8ArrayToBigInt)(serializer
|
239
|
+
.serialize({
|
240
|
+
amount: 0,
|
241
|
+
repayAll: false,
|
242
|
+
})
|
243
|
+
.slice(0, 8));
|
244
|
+
const [data, _] = serializer.deserialize(x.data);
|
245
|
+
if ((0, numberUtils_1.uint8ArrayToBigInt)(new Uint8Array(data.discriminator)) ===
|
246
|
+
discriminator) {
|
247
|
+
solautoActions?.push({
|
248
|
+
__kind: "Repay",
|
249
|
+
fields: [
|
250
|
+
data.repayAll
|
251
|
+
? {
|
252
|
+
__kind: "All",
|
253
|
+
}
|
254
|
+
: {
|
255
|
+
__kind: "Some",
|
256
|
+
fields: [data.amount],
|
257
|
+
},
|
258
|
+
],
|
259
|
+
});
|
260
|
+
}
|
164
261
|
}
|
262
|
+
catch { }
|
165
263
|
}
|
166
|
-
catch { }
|
167
264
|
// TODO support other platforms
|
168
265
|
});
|
169
266
|
return solautoActions;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"jupiterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jupiterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA0B,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,aAAa,CAAC;AAKrB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgBD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,GAC1B,OAAO,CAAC,kBAAkB,CAAC,
|
1
|
+
{"version":3,"file":"jupiterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jupiterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA0B,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,aAAa,CAAC;AAKrB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgBD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAkE7B"}
|
@@ -30,6 +30,7 @@ async function getJupSwapTransaction(signer, swapDetails) {
|
|
30
30
|
: swapDetails.exactIn
|
31
31
|
? "ExactIn"
|
32
32
|
: undefined,
|
33
|
+
slippageBps: 10
|
33
34
|
});
|
34
35
|
const finalPriceSlippageBps = Math.round(Math.max(quoteResponse.slippageBps ?? 10, Math.round((0, numberUtils_1.toBps)(parseFloat(quoteResponse.priceImpactPct)))) *
|
35
36
|
(1 + (swapDetails.slippageBpsIncFactor ?? 0)));
|
package/package.json
CHANGED
@@ -188,6 +188,15 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
188
188
|
];
|
189
189
|
}
|
190
190
|
|
191
|
+
marginfiAccountInitialize(): TransactionBuilder {
|
192
|
+
return marginfiAccountInitialize(this.umi, {
|
193
|
+
marginfiAccount: this.marginfiAccount as Signer,
|
194
|
+
marginfiGroup: publicKey(this.marginfiGroup),
|
195
|
+
authority: this.signer,
|
196
|
+
feePayer: this.signer,
|
197
|
+
});
|
198
|
+
}
|
199
|
+
|
191
200
|
openPosition(
|
192
201
|
settingParams?: SolautoSettingsParametersInpArgs,
|
193
202
|
dca?: DCASettingsInpArgs
|
@@ -267,6 +276,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
267
276
|
private marginfiProtocolInteractionIx(args: SolautoActionArgs) {
|
268
277
|
switch (args.__kind) {
|
269
278
|
case "Deposit": {
|
279
|
+
console.log(args.fields[0]);
|
270
280
|
return lendingAccountDeposit(this.umi, {
|
271
281
|
amount: args.fields[0],
|
272
282
|
signer: this.signer,
|
@@ -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;
|
@@ -109,8 +117,21 @@ async function transactionChoresBefore(
|
|
109
117
|
chores = chores.add(client.updateReferralStatesIx());
|
110
118
|
}
|
111
119
|
|
112
|
-
if (client.selfManaged
|
113
|
-
|
120
|
+
if (client.selfManaged) {
|
121
|
+
if (client.solautoPositionData === undefined) {
|
122
|
+
chores = chores.add(client.openPosition());
|
123
|
+
} else if (
|
124
|
+
client.lendingPlatform === LendingPlatform.Marginfi &&
|
125
|
+
!(await getSolanaAccountCreated(
|
126
|
+
client.umi,
|
127
|
+
(client as SolautoMarginfiClient).marginfiAccountPk
|
128
|
+
))
|
129
|
+
) {
|
130
|
+
chores = chores.add(
|
131
|
+
(client as SolautoMarginfiClient).marginfiAccountInitialize()
|
132
|
+
);
|
133
|
+
}
|
134
|
+
// TODO: support other platforms
|
114
135
|
}
|
115
136
|
|
116
137
|
const wSolUsage = getWSolUsage(
|
@@ -235,10 +256,7 @@ export async function rebalanceChoresBefore(
|
|
235
256
|
let chores = transactionBuilder();
|
236
257
|
|
237
258
|
if (checkReferralSupplyTa && !rpcAccountCreated(referredBySupplyTa)) {
|
238
|
-
client.log(
|
239
|
-
"Creating referred-by TA for ",
|
240
|
-
client.supplyMint.toString()
|
241
|
-
);
|
259
|
+
client.log("Creating referred-by TA for ", client.supplyMint.toString());
|
242
260
|
chores = chores.add(
|
243
261
|
createAssociatedTokenAccountUmiIx(
|
244
262
|
client.signer,
|
@@ -249,10 +267,7 @@ export async function rebalanceChoresBefore(
|
|
249
267
|
}
|
250
268
|
|
251
269
|
if (checkSolautoFeesTa && !rpcAccountCreated(solautoFeesSupplyTa)) {
|
252
|
-
client.log(
|
253
|
-
"Creating Solauto fees TA for ",
|
254
|
-
client.supplyMint.toString()
|
255
|
-
);
|
270
|
+
client.log("Creating Solauto fees TA for ", client.supplyMint.toString());
|
256
271
|
chores = chores.add(
|
257
272
|
createAssociatedTokenAccountUmiIx(
|
258
273
|
client.signer,
|
@@ -304,25 +319,127 @@ function getSolautoActions(tx: TransactionBuilder): SolautoAction[] {
|
|
304
319
|
let solautoActions: SolautoAction[] = [];
|
305
320
|
|
306
321
|
tx.getInstructions().forEach((x) => {
|
307
|
-
if (x.programId
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
const serializer =
|
313
|
-
getMarginfiProtocolInteractionInstructionDataSerializer();
|
314
|
-
const discriminator = uint8ArrayToBigInt(
|
315
|
-
serializer
|
322
|
+
if (x.programId === SOLAUTO_PROGRAM_ID) {
|
323
|
+
try {
|
324
|
+
const serializer =
|
325
|
+
getMarginfiProtocolInteractionInstructionDataSerializer();
|
326
|
+
const discriminator = serializer
|
316
327
|
.serialize({
|
317
328
|
solautoAction: solautoAction("Deposit", [BigInt(0)]),
|
318
329
|
})
|
319
|
-
.slice(0,
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
}
|
325
|
-
}
|
330
|
+
.slice(0, 1)[0];
|
331
|
+
const [data, _] = serializer.deserialize(x.data);
|
332
|
+
if (data.discriminator === discriminator) {
|
333
|
+
solautoActions?.push(data.solautoAction);
|
334
|
+
}
|
335
|
+
} catch {}
|
336
|
+
}
|
337
|
+
|
338
|
+
if (x.programId === MARGINFI_PROGRAM_ID) {
|
339
|
+
try {
|
340
|
+
const serializer = getLendingAccountDepositInstructionDataSerializer();
|
341
|
+
const discriminator = uint8ArrayToBigInt(
|
342
|
+
serializer
|
343
|
+
.serialize({
|
344
|
+
amount: 0,
|
345
|
+
})
|
346
|
+
.slice(0, 8)
|
347
|
+
);
|
348
|
+
const [data, _] = serializer.deserialize(x.data);
|
349
|
+
if (
|
350
|
+
uint8ArrayToBigInt(new Uint8Array(data.discriminator)) ===
|
351
|
+
discriminator
|
352
|
+
) {
|
353
|
+
solautoActions?.push({
|
354
|
+
__kind: "Deposit",
|
355
|
+
fields: [data.amount],
|
356
|
+
});
|
357
|
+
}
|
358
|
+
} catch {}
|
359
|
+
|
360
|
+
try {
|
361
|
+
const serializer = getLendingAccountBorrowInstructionDataSerializer();
|
362
|
+
const discriminator = uint8ArrayToBigInt(
|
363
|
+
serializer
|
364
|
+
.serialize({
|
365
|
+
amount: 0,
|
366
|
+
})
|
367
|
+
.slice(0, 8)
|
368
|
+
);
|
369
|
+
const [data, _] = serializer.deserialize(x.data);
|
370
|
+
if (
|
371
|
+
uint8ArrayToBigInt(new Uint8Array(data.discriminator)) ===
|
372
|
+
discriminator
|
373
|
+
) {
|
374
|
+
solautoActions?.push({
|
375
|
+
__kind: "Borrow",
|
376
|
+
fields: [data.amount],
|
377
|
+
});
|
378
|
+
}
|
379
|
+
} catch {}
|
380
|
+
|
381
|
+
try {
|
382
|
+
const serializer = getLendingAccountWithdrawInstructionDataSerializer();
|
383
|
+
const discriminator = uint8ArrayToBigInt(
|
384
|
+
serializer
|
385
|
+
.serialize({
|
386
|
+
amount: 0,
|
387
|
+
withdrawAll: false,
|
388
|
+
})
|
389
|
+
.slice(0, 8)
|
390
|
+
);
|
391
|
+
const [data, _] = serializer.deserialize(x.data);
|
392
|
+
if (
|
393
|
+
uint8ArrayToBigInt(new Uint8Array(data.discriminator)) ===
|
394
|
+
discriminator
|
395
|
+
) {
|
396
|
+
solautoActions?.push({
|
397
|
+
__kind: "Withdraw",
|
398
|
+
fields: [
|
399
|
+
data.withdrawAll
|
400
|
+
? {
|
401
|
+
__kind: "All",
|
402
|
+
}
|
403
|
+
: {
|
404
|
+
__kind: "Some",
|
405
|
+
fields: [data.amount],
|
406
|
+
},
|
407
|
+
],
|
408
|
+
});
|
409
|
+
}
|
410
|
+
} catch {}
|
411
|
+
|
412
|
+
try {
|
413
|
+
const serializer = getLendingAccountRepayInstructionDataSerializer();
|
414
|
+
const discriminator = uint8ArrayToBigInt(
|
415
|
+
serializer
|
416
|
+
.serialize({
|
417
|
+
amount: 0,
|
418
|
+
repayAll: false,
|
419
|
+
})
|
420
|
+
.slice(0, 8)
|
421
|
+
);
|
422
|
+
const [data, _] = serializer.deserialize(x.data);
|
423
|
+
if (
|
424
|
+
uint8ArrayToBigInt(new Uint8Array(data.discriminator)) ===
|
425
|
+
discriminator
|
426
|
+
) {
|
427
|
+
solautoActions?.push({
|
428
|
+
__kind: "Repay",
|
429
|
+
fields: [
|
430
|
+
data.repayAll
|
431
|
+
? {
|
432
|
+
__kind: "All",
|
433
|
+
}
|
434
|
+
: {
|
435
|
+
__kind: "Some",
|
436
|
+
fields: [data.amount],
|
437
|
+
},
|
438
|
+
],
|
439
|
+
});
|
440
|
+
}
|
441
|
+
} catch {}
|
442
|
+
}
|
326
443
|
|
327
444
|
// TODO support other platforms
|
328
445
|
});
|
@@ -483,7 +600,7 @@ export async function buildSolautoRebalanceTransaction(
|
|
483
600
|
export async function convertReferralFeesToDestination(
|
484
601
|
umi: Umi,
|
485
602
|
referralState: ReferralState,
|
486
|
-
tokenAccount: SplTokenAccount
|
603
|
+
tokenAccount: SplTokenAccount
|
487
604
|
): Promise<[TransactionBuilder, string[]]> {
|
488
605
|
const { lookupTableAddresses, setupInstructions, swapIx } =
|
489
606
|
await getJupSwapTransaction(umi.identity, {
|
@@ -45,9 +45,11 @@ describe("Solauto Marginfi tests", async () => {
|
|
45
45
|
{
|
46
46
|
signer,
|
47
47
|
positionId,
|
48
|
-
marginfiAccount: new PublicKey(
|
48
|
+
marginfiAccount: new PublicKey(
|
49
|
+
"4nNvUXF5YqHFcH2nGweSiuvy1ct7V5FXfoCLKFYUN36z"
|
50
|
+
),
|
49
51
|
supplyMint: NATIVE_MINT,
|
50
|
-
debtMint: new PublicKey(USDC_MINT)
|
52
|
+
debtMint: new PublicKey(USDC_MINT),
|
51
53
|
}
|
52
54
|
);
|
53
55
|
|
@@ -104,6 +106,20 @@ describe("Solauto Marginfi tests", async () => {
|
|
104
106
|
// )
|
105
107
|
// );
|
106
108
|
|
109
|
+
// const initialSupplyUsd = 50;
|
110
|
+
// transactionItems.push(
|
111
|
+
// new TransactionItem(async () => {
|
112
|
+
// const [supplyPrice] = await getTokenPrices([supply]);
|
113
|
+
// return {
|
114
|
+
// tx: client.protocolInteraction(
|
115
|
+
// solautoAction("Deposit", [
|
116
|
+
// toBaseUnit(initialSupplyUsd / supplyPrice, supplyDecimals),
|
117
|
+
// ])
|
118
|
+
// ),
|
119
|
+
// };
|
120
|
+
// }, "deposit")
|
121
|
+
// );
|
122
|
+
|
107
123
|
transactionItems.push(
|
108
124
|
new TransactionItem(
|
109
125
|
async (attemptNum) =>
|