@haven-fi/solauto-sdk 1.0.662 → 1.0.663
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/services/flashLoans/flProviderAggregator.d.ts.map +1 -1
- package/dist/services/flashLoans/marginfiFlProvider.d.ts +2 -0
- package/dist/services/flashLoans/marginfiFlProvider.d.ts.map +1 -1
- package/dist/services/flashLoans/marginfiFlProvider.js +14 -31
- package/dist/services/solauto/solautoClient.d.ts.map +1 -1
- package/dist/services/solauto/solautoClient.js +0 -3
- package/dist/services/solauto/solautoMarginfiClient.d.ts +2 -1
- package/dist/services/solauto/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/services/solauto/solautoMarginfiClient.js +20 -7
- package/dist/utils/marginfiUtils.d.ts +3 -2
- package/dist/utils/marginfiUtils.d.ts.map +1 -1
- package/dist/utils/marginfiUtils.js +14 -0
- package/dist/utils/solanaUtils.d.ts +2 -1
- package/dist/utils/solanaUtils.d.ts.map +1 -1
- package/dist/utils/solanaUtils.js +4 -0
- package/local/txSandbox.ts +13 -7
- package/package.json +1 -1
- package/src/services/flashLoans/flProviderAggregator.ts +3 -1
- package/src/services/flashLoans/marginfiFlProvider.ts +28 -38
- package/src/services/solauto/solautoClient.ts +0 -3
- package/src/services/solauto/solautoMarginfiClient.ts +50 -9
- package/src/utils/marginfiUtils.ts +19 -1
- package/src/utils/solanaUtils.ts +10 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"flProviderAggregator.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/flProviderAggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,OAAO,CAAC,kBAAkB,CAAsB;gBAG9C,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,UAAU,CAAC,EAAE,UAAU;IAanB,UAAU;IAMV,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIvD,YAAY,IAAI,MAAM,EAAE;IAKxB,gBAAgB,IAAI,SAAS,EAAE;IAS/B,OAAO,CAAC,UAAU;IAKlB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAI9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAOrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;
|
1
|
+
{"version":3,"file":"flProviderAggregator.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/flProviderAggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,OAAO,CAAC,kBAAkB,CAAsB;gBAG9C,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,UAAU,CAAC,EAAE,UAAU;IAanB,UAAU;IAMV,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIvD,YAAY,IAAI,MAAM,EAAE;IAKxB,gBAAgB,IAAI,SAAS,EAAE;IAS/B,OAAO,CAAC,UAAU;IAKlB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAI9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAOrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;CAK5D"}
|
@@ -9,6 +9,8 @@ export declare class MarginfiFlProvider extends FlProviderBase {
|
|
9
9
|
private debtBankLiquiditySource;
|
10
10
|
private supplyImfiAccount;
|
11
11
|
private debtImfiAccount;
|
12
|
+
private supplyRemainingAccounts;
|
13
|
+
private debtRemainingAccounts;
|
12
14
|
initialize(): Promise<void>;
|
13
15
|
private setAvailableBanks;
|
14
16
|
private setIntermediaryAccount;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"marginfiFlProvider.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/marginfiFlProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAML,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAclC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
1
|
+
{"version":3,"file":"marginfiFlProvider.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/marginfiFlProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAML,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAclC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAiBlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,uBAAuB,CAAQ;IAEvC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,uBAAuB,CAAiB;IAChD,OAAO,CAAC,qBAAqB,CAAiB;IAExC,UAAU;YAiBF,iBAAiB;YA6CjB,sBAAsB;IAsD9B,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyC3D,gBAAgB,IAAI,SAAS,EAAE;IAY/B,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAMnB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAc9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAoCrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;IAgD3D,YAAY,CACV,eAAe,EAAE,SAAS,EAC1B,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,SAAS;CAW3B"}
|
@@ -15,11 +15,11 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
|
|
15
15
|
this.existingMarginfiAccounts = await (0, utils_1.getEmptyMarginfiAccountsByAuthority)(this.umi, (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey));
|
16
16
|
if (this.liquidityBank(generated_1.TokenType.Supply).group.toString() !==
|
17
17
|
this.liquidityBank(generated_1.TokenType.Debt).group.toString()) {
|
18
|
-
this.setIntermediaryAccount([generated_1.TokenType.Supply]);
|
19
|
-
this.setIntermediaryAccount([generated_1.TokenType.Debt]);
|
18
|
+
await this.setIntermediaryAccount([generated_1.TokenType.Supply]);
|
19
|
+
await this.setIntermediaryAccount([generated_1.TokenType.Debt]);
|
20
20
|
}
|
21
21
|
else {
|
22
|
-
this.setIntermediaryAccount([generated_1.TokenType.Supply, generated_1.TokenType.Debt]);
|
22
|
+
await this.setIntermediaryAccount([generated_1.TokenType.Supply, generated_1.TokenType.Debt]);
|
23
23
|
}
|
24
24
|
}
|
25
25
|
async setAvailableBanks() {
|
@@ -52,7 +52,7 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
|
|
52
52
|
this.supplyBankLiquiditySource = supplyBanks[0][1];
|
53
53
|
this.debtBankLiquiditySource = debtBanks[0][1];
|
54
54
|
}
|
55
|
-
setIntermediaryAccount(sources) {
|
55
|
+
async setIntermediaryAccount(sources) {
|
56
56
|
const compatibleMarginfiAccounts = this.existingMarginfiAccounts.filter((x) => x.group.toString() == this.liquidityBank(sources[0]).group);
|
57
57
|
const signer = compatibleMarginfiAccounts.length > 0
|
58
58
|
? undefined
|
@@ -66,6 +66,9 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
|
|
66
66
|
if (signer) {
|
67
67
|
this.flSigners.push(signer);
|
68
68
|
}
|
69
|
+
const remainingAccounts = accountData
|
70
|
+
? (await Promise.all(accountData.lendingAccount.balances.map((balance) => (0, utils_1.getRemainingAccountsForMarginfiHealthCheck)(this.umi, balance)))).flat()
|
71
|
+
: [];
|
69
72
|
for (const s of sources) {
|
70
73
|
const data = {
|
71
74
|
signer,
|
@@ -75,9 +78,11 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
|
|
75
78
|
const supply = s === generated_1.TokenType.Supply;
|
76
79
|
if (supply) {
|
77
80
|
this.supplyImfiAccount = data;
|
81
|
+
this.supplyRemainingAccounts = remainingAccounts;
|
78
82
|
}
|
79
83
|
else {
|
80
84
|
this.debtImfiAccount = data;
|
85
|
+
this.debtRemainingAccounts = remainingAccounts;
|
81
86
|
}
|
82
87
|
(0, utils_1.consoleLog)(`${supply ? "Supply" : "Debt"} iMfi account:`, accountPk.toString());
|
83
88
|
}
|
@@ -172,36 +177,14 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
|
|
172
177
|
const associatedBankAccs = (0, utils_1.findMarginfiAccounts)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.publicKey));
|
173
178
|
const marginfiGroup = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.liquidityBank(flashLoan.liquiditySource).group);
|
174
179
|
const iMfiAccount = this.iMfiAccount(flashLoan.liquiditySource);
|
175
|
-
const remainingAccounts =
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
if (x.active) {
|
180
|
-
if (x.bankPk.toString() === bank.publicKey.toString()) {
|
181
|
-
flBankHadPrevBalance = true;
|
182
|
-
}
|
183
|
-
const priceOracle = (0, umi_1.publicKey)(await (0, utils_1.getMarginfiPriceOracle)(this.umi, {
|
184
|
-
pk: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(x.bankPk),
|
185
|
-
}));
|
186
|
-
remainingAccounts.push(...[
|
187
|
-
{
|
188
|
-
pubkey: x.bankPk,
|
189
|
-
isSigner: false,
|
190
|
-
isWritable: false,
|
191
|
-
},
|
192
|
-
{
|
193
|
-
pubkey: priceOracle,
|
194
|
-
isSigner: false,
|
195
|
-
isWritable: false,
|
196
|
-
},
|
197
|
-
]);
|
198
|
-
}
|
199
|
-
});
|
200
|
-
}
|
180
|
+
const remainingAccounts = flashLoan.liquiditySource === generated_1.TokenType.Supply
|
181
|
+
? this.supplyRemainingAccounts
|
182
|
+
: this.debtRemainingAccounts;
|
183
|
+
let iMfiAccountHadPrevFlBalance = remainingAccounts.find((x) => x.pubkey.toString() === bank.publicKey.toString());
|
201
184
|
return (0, umi_1.transactionBuilder)()
|
202
185
|
.add((0, marginfi_sdk_1.lendingAccountRepay)(this.umi, {
|
203
186
|
amount: flashLoan.baseUnitAmount,
|
204
|
-
repayAll: !
|
187
|
+
repayAll: !iMfiAccountHadPrevFlBalance,
|
205
188
|
bank: bank.publicKey,
|
206
189
|
bankLiquidityVault: (0, umi_1.publicKey)(associatedBankAccs.liquidityVault),
|
207
190
|
marginfiAccount: (0, umi_1.publicKey)(iMfiAccount.accountPk),
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoClient.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,gCAAgC,EAEhC,sBAAsB,EAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAML,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,8BAAsB,aAAc,SAAQ,oBAAoB;IACvD,eAAe,EAAG,eAAe,CAAC;IAClC,KAAK,EAAG,UAAU,CAAC;IAEnB,SAAS,EAAG,SAAS,CAAC;IAEtB,GAAG,EAAG,iBAAiB,CAAC;IAExB,gBAAgB,EAAG,SAAS,CAAC;IAC7B,cAAc,EAAG,SAAS,CAAC;IAE3B,cAAc,EAAG,SAAS,CAAC;IAC3B,YAAY,EAAG,SAAS,CAAC;IAEzB,mBAAmB,EAAG,SAAS,CAAC;IAChC,iBAAiB,EAAG,SAAS,CAAC;IAE9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,UAAU,EAAG,oBAAoB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAwB;IAE7D,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAqB;IAExC,UAAU,CAAC,IAAI,EAAE,iBAAiB;
|
1
|
+
{"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoClient.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,gCAAgC,EAEhC,sBAAsB,EAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAML,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,8BAAsB,aAAc,SAAQ,oBAAoB;IACvD,eAAe,EAAG,eAAe,CAAC;IAClC,KAAK,EAAG,UAAU,CAAC;IAEnB,SAAS,EAAG,SAAS,CAAC;IAEtB,GAAG,EAAG,iBAAiB,CAAC;IAExB,gBAAgB,EAAG,SAAS,CAAC;IAC7B,cAAc,EAAG,SAAS,CAAC;IAE3B,cAAc,EAAG,SAAS,CAAC;IAC3B,YAAY,EAAG,SAAS,CAAC;IAEzB,mBAAmB,EAAG,SAAS,CAAC;IAChC,iBAAiB,EAAG,SAAS,CAAC;IAE9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,UAAU,EAAG,oBAAoB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAwB;IAE7D,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAqB;IAExC,UAAU,CAAC,IAAI,EAAE,iBAAiB;IA4ExC,kBAAkB,IAAI,SAAS,GAAG,SAAS;IAO3C,gBAAgB,IAAI,SAAS,GAAG,SAAS;IAOnC,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO;IAkB1C,mBAAmB,IAAI,MAAM,EAAE;IAS/B,gBAAgB,IAAI,SAAS,EAAE;IAezB,iCAAiC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAUzD,iBAAiB,IAAI,OAAO,CAC9B;QACE,EAAE,EAAE,kBAAkB,CAAC;QACvB,GAAG,EAAE,OAAO,CAAC;QACb,aAAa,EAAE,SAAS,EAAE,CAAC;KAC5B,GACD,SAAS,CACZ;IAgEK,cAAc,IAAI,OAAO,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAgBF,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IA0BrB,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB;IAsDlE,QAAQ,CAAC,eAAe,IAAI,kBAAkB;IAE9C,WAAW,IAAI,kBAAkB;IAgCjC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB;IAE5D,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAqFlE,QAAQ,CAAC,WAAW,CAClB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CACtB"}
|
@@ -19,9 +19,6 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
|
|
19
19
|
async initialize(args) {
|
20
20
|
await super.initialize(args);
|
21
21
|
const positionId = args.positionId ?? 0;
|
22
|
-
if (positionId === 0 && !args.lpUserAccount) {
|
23
|
-
throw new Error("Self managed position is missing arguments");
|
24
|
-
}
|
25
22
|
this.pos = await (0, solautoPosition_1.getOrCreatePositionEx)(this.umi, this.authority, positionId, this.programId, {
|
26
23
|
supplyMint: args.supplyMint,
|
27
24
|
debtMint: args.debtMint,
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
|
-
import { Signer, TransactionBuilder } from "@metaplex-foundation/umi";
|
2
|
+
import { Signer, TransactionBuilder, AccountMeta } from "@metaplex-foundation/umi";
|
3
3
|
import { MarginfiAssetAccounts, RebalanceDetails } from "../../types";
|
4
4
|
import { MarginfiProgramAccounts } from "../../constants";
|
5
5
|
import { DCASettingsInpArgs, LendingPlatform, PriceType, RebalanceStep, SolautoActionArgs, SolautoSettingsParametersInpArgs } from "../../generated";
|
@@ -9,6 +9,7 @@ export declare class SolautoMarginfiClient extends SolautoClient {
|
|
9
9
|
mfiAccounts: MarginfiProgramAccounts;
|
10
10
|
marginfiAccount: PublicKey | Signer;
|
11
11
|
marginfiAccountPk: PublicKey;
|
12
|
+
healthCheckRemainingAccounts?: AccountMeta[];
|
12
13
|
marginfiGroup: PublicKey;
|
13
14
|
marginfiSupplyAccounts: MarginfiAssetAccounts;
|
14
15
|
marginfiDebtAccounts: MarginfiAssetAccounts;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoMarginfiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,MAAM,EACN,kBAAkB,
|
1
|
+
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoMarginfiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,MAAM,EACN,kBAAkB,EAIlB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAuB,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EAEf,SAAS,EAET,aAAa,EACb,iBAAiB,EAEjB,gCAAgC,EAOjC,MAAM,iBAAiB,CAAC;AAoBzB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAMnE,qBAAa,qBAAsB,SAAQ,aAAa;IAC/C,eAAe,kBAA4B;IAE3C,WAAW,EAAG,uBAAuB,CAAC;IAEtC,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,4BAA4B,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7C,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAE7B,UAAU,CAAC,IAAI,EAAE,iBAAiB;IA6ExC,mBAAmB,IAAI,MAAM,EAAE;IAO/B,gBAAgB,IAAI,SAAS,EAAE;IAI/B,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,kBAAkB;IAStE,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA0C9B,eAAe,IAAI,kBAAkB;IAYrC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB;IAenD,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUlE,OAAO,CAAC,6BAA6B;IAiFrC,OAAO,CAAC,oCAAoC;IA0D5C,WAAW,CACT,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CA4EtB"}
|
@@ -9,6 +9,9 @@ const generated_1 = require("../../generated");
|
|
9
9
|
const utils_1 = require("../../utils");
|
10
10
|
const marginfi_sdk_1 = require("../../marginfi-sdk");
|
11
11
|
const solautoClient_1 = require("./solautoClient");
|
12
|
+
function isSigner(account) {
|
13
|
+
return "publicKey" in account;
|
14
|
+
}
|
12
15
|
class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
13
16
|
constructor() {
|
14
17
|
super(...arguments);
|
@@ -38,13 +41,16 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
38
41
|
: (0, umi_1.createSignerFromKeypair)(this.umi, this.umi.eddsa.generateKeypair());
|
39
42
|
}
|
40
43
|
}
|
41
|
-
this.marginfiAccountPk =
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
if ("publicKey" in this.marginfiAccount) {
|
44
|
+
this.marginfiAccountPk = isSigner(this.marginfiAccount)
|
45
|
+
? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.marginfiAccount.publicKey)
|
46
|
+
: this.marginfiAccount;
|
47
|
+
if (isSigner(this.marginfiAccount)) {
|
46
48
|
this.otherSigners.push(this.marginfiAccount);
|
47
49
|
}
|
50
|
+
else if (this.pos.selfManaged) {
|
51
|
+
const accountData = await (0, marginfi_sdk_1.fetchMarginfiAccount)(this.umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(this.marginfiAccount));
|
52
|
+
this.healthCheckRemainingAccounts = (await Promise.all(accountData.lendingAccount.balances.map((balance) => (0, utils_1.getRemainingAccountsForMarginfiHealthCheck)(this.umi, balance)))).flat();
|
53
|
+
}
|
48
54
|
this.marginfiSupplyAccounts =
|
49
55
|
this.mfiAccounts.bankAccounts[this.marginfiGroup.toString()][this.pos.supplyMint.toString()];
|
50
56
|
this.marginfiDebtAccounts =
|
@@ -160,6 +166,13 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
160
166
|
});
|
161
167
|
}
|
162
168
|
case "Borrow": {
|
169
|
+
const remainingAccounts = this.healthCheckRemainingAccounts ?? [];
|
170
|
+
if (!remainingAccounts.find((x) => x.pubkey.toString() === this.marginfiDebtAccounts.bank.toString())) {
|
171
|
+
remainingAccounts.push(...[
|
172
|
+
(0, utils_1.getAccountMeta)(new web3_js_1.PublicKey(this.marginfiDebtAccounts.bank)),
|
173
|
+
(0, utils_1.getAccountMeta)(this.debtPriceOracle),
|
174
|
+
]);
|
175
|
+
}
|
163
176
|
return (0, marginfi_sdk_1.lendingAccountBorrow)(this.umi, {
|
164
177
|
amount: args.fields[0],
|
165
178
|
signer: this.signer,
|
@@ -169,7 +182,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
169
182
|
bank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
|
170
183
|
bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiDebtAccounts.liquidityVault),
|
171
184
|
bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiDebtAccounts.vaultAuthority),
|
172
|
-
});
|
185
|
+
}).addRemainingAccounts(remainingAccounts);
|
173
186
|
}
|
174
187
|
case "Repay": {
|
175
188
|
return (0, marginfi_sdk_1.lendingAccountRepay)(this.umi, {
|
@@ -194,7 +207,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
194
207
|
bank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
|
195
208
|
bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.liquidityVault),
|
196
209
|
bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.vaultAuthority),
|
197
|
-
});
|
210
|
+
}).addRemainingAccounts(this.healthCheckRemainingAccounts ?? []);
|
198
211
|
}
|
199
212
|
}
|
200
213
|
}
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
|
-
import { Program, Umi } from "@metaplex-foundation/umi";
|
2
|
+
import { AccountMeta, Program, Umi } from "@metaplex-foundation/umi";
|
3
3
|
import { ProgramEnv, MarginfiAssetAccounts } from "../types";
|
4
4
|
import { PositionState, PriceType } from "../generated";
|
5
5
|
import { MarginfiBankAccountsMap } from "../constants";
|
6
|
-
import { Bank, MarginfiAccount } from "../marginfi-sdk";
|
6
|
+
import { Balance, Bank, MarginfiAccount } from "../marginfi-sdk";
|
7
7
|
import { ContextUpdates } from "./solautoUtils";
|
8
8
|
export declare function createDynamicMarginfiProgram(env?: ProgramEnv): Program;
|
9
9
|
export declare function umiWithMarginfiProgram(umi: Umi, marginfiEnv?: ProgramEnv): Umi;
|
@@ -22,6 +22,7 @@ interface AllMarginfiAssetAccounts extends MarginfiAssetAccounts {
|
|
22
22
|
mint: PublicKey;
|
23
23
|
}
|
24
24
|
export declare function findMarginfiAccounts(bank: PublicKey): AllMarginfiAssetAccounts;
|
25
|
+
export declare function getRemainingAccountsForMarginfiHealthCheck(umi: Umi, balance: Balance): Promise<AccountMeta[]>;
|
25
26
|
export declare function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank: Bank, debtBank: Bank, supplyPrice: number): [number, number];
|
26
27
|
export declare function getMarginfiMaxLtvAndLiqThresholdBps(umi: Umi, marginfiGroup: PublicKey, supply: {
|
27
28
|
mint: 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,EAAE,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;
|
1
|
+
{"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"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"}
|
@@ -6,6 +6,7 @@ exports.getAllBankRelatedAccounts = getAllBankRelatedAccounts;
|
|
6
6
|
exports.fetchBankAddresses = fetchBankAddresses;
|
7
7
|
exports.getMarginfiPriceOracle = getMarginfiPriceOracle;
|
8
8
|
exports.findMarginfiAccounts = findMarginfiAccounts;
|
9
|
+
exports.getRemainingAccountsForMarginfiHealthCheck = getRemainingAccountsForMarginfiHealthCheck;
|
9
10
|
exports.calcMarginfiMaxLtvAndLiqThresholdBps = calcMarginfiMaxLtvAndLiqThresholdBps;
|
10
11
|
exports.getMarginfiMaxLtvAndLiqThresholdBps = getMarginfiMaxLtvAndLiqThresholdBps;
|
11
12
|
exports.getEmptyMarginfiAccountsByAuthority = getEmptyMarginfiAccountsByAuthority;
|
@@ -25,6 +26,7 @@ const generalUtils_1 = require("./generalUtils");
|
|
25
26
|
const numberUtils_1 = require("./numberUtils");
|
26
27
|
const accountUtils_1 = require("./accountUtils");
|
27
28
|
const pythUtils_1 = require("./pythUtils");
|
29
|
+
const solanaUtils_1 = require("./solanaUtils");
|
28
30
|
function createDynamicMarginfiProgram(env) {
|
29
31
|
return {
|
30
32
|
name: "marginfi",
|
@@ -119,6 +121,18 @@ function findMarginfiAccounts(bank) {
|
|
119
121
|
}
|
120
122
|
throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
|
121
123
|
}
|
124
|
+
async function getRemainingAccountsForMarginfiHealthCheck(umi, balance) {
|
125
|
+
if (!balance.active) {
|
126
|
+
return [];
|
127
|
+
}
|
128
|
+
const priceOracle = await getMarginfiPriceOracle(umi, {
|
129
|
+
pk: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(balance.bankPk),
|
130
|
+
});
|
131
|
+
return [
|
132
|
+
(0, solanaUtils_1.getAccountMeta)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(balance.bankPk)),
|
133
|
+
(0, solanaUtils_1.getAccountMeta)(priceOracle),
|
134
|
+
];
|
135
|
+
}
|
122
136
|
function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank, debtBank, supplyPrice) {
|
123
137
|
let maxLtv = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightInit.value) /
|
124
138
|
(0, numberUtils_1.bytesToI80F48)(debtBank.config.liabilityWeightInit.value);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { Connection, PublicKey, TransactionInstruction } from "@solana/web3.js";
|
2
|
-
import { AddressLookupTableInput, Signer, TransactionBuilder, Umi, WrappedInstruction } from "@metaplex-foundation/umi";
|
2
|
+
import { AccountMeta, AddressLookupTableInput, Signer, TransactionBuilder, Umi, WrappedInstruction } from "@metaplex-foundation/umi";
|
3
3
|
import { PriorityFeeSetting, ProgramEnv, TransactionRunType } from "../types";
|
4
4
|
export declare function getSolanaRpcConnection(rpcUrl: string, programId?: PublicKey, lpEnv?: ProgramEnv): [Connection, Umi];
|
5
5
|
export declare function getWrappedInstruction(signer: Signer, ix: TransactionInstruction): WrappedInstruction;
|
@@ -9,6 +9,7 @@ export declare function createAssociatedTokenAccountUmiIx(signer: Signer, wallet
|
|
9
9
|
export declare function systemTransferUmiIx(signer: Signer, destination: PublicKey, lamports: bigint): WrappedInstruction;
|
10
10
|
export declare function closeTokenAccountUmiIx(signer: Signer, tokenAccount: PublicKey, authority: PublicKey): WrappedInstruction;
|
11
11
|
export declare function splTokenTransferUmiIx(signer: Signer, fromTa: PublicKey, toTa: PublicKey, authority: PublicKey, amount: bigint): WrappedInstruction;
|
12
|
+
export declare function getAccountMeta(pubkey: PublicKey, isSigner?: boolean, isWritable?: boolean): AccountMeta;
|
12
13
|
export declare function getWalletSplBalances(conn: Connection, wallet: PublicKey, tokenMints: PublicKey[]): Promise<bigint[]>;
|
13
14
|
export declare function getAddressLookupInputs(umi: Umi, lookupTableAddresses: string[]): Promise<AddressLookupTableInput[]>;
|
14
15
|
export declare function addTxOptimizations(umi: Umi, tx: TransactionBuilder, computeUnitPrice?: number, computeUnitLimit?: number): TransactionBuilder;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,UAAU,EACV,SAAS,EAKT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACL,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;
|
1
|
+
{"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"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"}
|
@@ -11,6 +11,7 @@ exports.createAssociatedTokenAccountUmiIx = createAssociatedTokenAccountUmiIx;
|
|
11
11
|
exports.systemTransferUmiIx = systemTransferUmiIx;
|
12
12
|
exports.closeTokenAccountUmiIx = closeTokenAccountUmiIx;
|
13
13
|
exports.splTokenTransferUmiIx = splTokenTransferUmiIx;
|
14
|
+
exports.getAccountMeta = getAccountMeta;
|
14
15
|
exports.getWalletSplBalances = getWalletSplBalances;
|
15
16
|
exports.getAddressLookupInputs = getAddressLookupInputs;
|
16
17
|
exports.addTxOptimizations = addTxOptimizations;
|
@@ -75,6 +76,9 @@ function closeTokenAccountUmiIx(signer, tokenAccount, authority) {
|
|
75
76
|
function splTokenTransferUmiIx(signer, fromTa, toTa, authority, amount) {
|
76
77
|
return getWrappedInstruction(signer, (0, spl_token_1.createTransferInstruction)(fromTa, toTa, authority, amount));
|
77
78
|
}
|
79
|
+
function getAccountMeta(pubkey, isSigner = false, isWritable = false) {
|
80
|
+
return { pubkey: (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(pubkey), isSigner, isWritable };
|
81
|
+
}
|
78
82
|
async function getWalletSplBalances(conn, wallet, tokenMints) {
|
79
83
|
return await Promise.all(tokenMints.map(async (mint) => {
|
80
84
|
try {
|
package/local/txSandbox.ts
CHANGED
@@ -2,6 +2,7 @@ import { Keypair, PublicKey } from "@solana/web3.js";
|
|
2
2
|
import { createSignerFromKeypair } from "@metaplex-foundation/umi";
|
3
3
|
import { fromWeb3JsKeypair } from "@metaplex-foundation/umi-web3js-adapters";
|
4
4
|
import {
|
5
|
+
borrow,
|
5
6
|
consoleLog,
|
6
7
|
getClient,
|
7
8
|
getSolanaRpcConnection,
|
@@ -12,7 +13,10 @@ import {
|
|
12
13
|
rebalance,
|
13
14
|
SOLAUTO_PROD_PROGRAM,
|
14
15
|
SOLAUTO_TEST_PROGRAM,
|
16
|
+
toBaseUnit,
|
17
|
+
tokenInfo,
|
15
18
|
TransactionsManager,
|
19
|
+
USDC,
|
16
20
|
} from "../src";
|
17
21
|
import { getSecretKey } from "./shared";
|
18
22
|
|
@@ -29,7 +33,7 @@ export async function main() {
|
|
29
33
|
|
30
34
|
const signer = createSignerFromKeypair(
|
31
35
|
umi,
|
32
|
-
fromWeb3JsKeypair(Keypair.fromSecretKey(getSecretKey(
|
36
|
+
fromWeb3JsKeypair(Keypair.fromSecretKey(getSecretKey()))
|
33
37
|
);
|
34
38
|
|
35
39
|
const client = getClient(LendingPlatform.Marginfi, {
|
@@ -41,14 +45,16 @@ export async function main() {
|
|
41
45
|
});
|
42
46
|
|
43
47
|
await client.initialize({
|
44
|
-
positionId:
|
45
|
-
authority: new PublicKey("5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe"),
|
46
|
-
|
47
|
-
|
48
|
-
|
48
|
+
positionId: 0,
|
49
|
+
// authority: new PublicKey("5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe"),
|
50
|
+
lpUserAccount: new PublicKey(
|
51
|
+
"GEokw9jqbh6d1xUNA3qaeYFFetbSR5Y1nt7C3chwwgSz"
|
52
|
+
),
|
49
53
|
});
|
50
54
|
|
51
|
-
const transactionItems = [
|
55
|
+
const transactionItems = [
|
56
|
+
rebalance(client, 300),
|
57
|
+
];
|
52
58
|
|
53
59
|
const txManager = new TransactionsManager(
|
54
60
|
client,
|
package/package.json
CHANGED
@@ -76,6 +76,8 @@ export class FlProviderAggregator extends FlProviderBase {
|
|
76
76
|
}
|
77
77
|
|
78
78
|
flashRepay(flashLoan: FlashLoanDetails): TransactionBuilder {
|
79
|
-
return this.flProvider(flashLoan.liquiditySource).flashRepay(
|
79
|
+
return this.flProvider(flashLoan.liquiditySource).flashRepay(
|
80
|
+
flashLoan
|
81
|
+
);
|
80
82
|
}
|
81
83
|
}
|
@@ -30,6 +30,7 @@ import {
|
|
30
30
|
getBankLiquidityAvailableBaseUnit,
|
31
31
|
getEmptyMarginfiAccountsByAuthority,
|
32
32
|
getMarginfiPriceOracle,
|
33
|
+
getRemainingAccountsForMarginfiHealthCheck,
|
33
34
|
getTokenAccount,
|
34
35
|
rpcAccountCreated,
|
35
36
|
safeGetPrice,
|
@@ -49,8 +50,11 @@ export class MarginfiFlProvider extends FlProviderBase {
|
|
49
50
|
private existingMarginfiAccounts!: MarginfiAccount[];
|
50
51
|
private supplyBankLiquiditySource!: Bank;
|
51
52
|
private debtBankLiquiditySource!: Bank;
|
53
|
+
|
52
54
|
private supplyImfiAccount!: IMFIAccount;
|
53
55
|
private debtImfiAccount!: IMFIAccount;
|
56
|
+
private supplyRemainingAccounts!: AccountMeta[];
|
57
|
+
private debtRemainingAccounts!: AccountMeta[];
|
54
58
|
|
55
59
|
async initialize() {
|
56
60
|
await this.setAvailableBanks();
|
@@ -62,10 +66,10 @@ export class MarginfiFlProvider extends FlProviderBase {
|
|
62
66
|
this.liquidityBank(TokenType.Supply).group.toString() !==
|
63
67
|
this.liquidityBank(TokenType.Debt).group.toString()
|
64
68
|
) {
|
65
|
-
this.setIntermediaryAccount([TokenType.Supply]);
|
66
|
-
this.setIntermediaryAccount([TokenType.Debt]);
|
69
|
+
await this.setIntermediaryAccount([TokenType.Supply]);
|
70
|
+
await this.setIntermediaryAccount([TokenType.Debt]);
|
67
71
|
} else {
|
68
|
-
this.setIntermediaryAccount([TokenType.Supply, TokenType.Debt]);
|
72
|
+
await this.setIntermediaryAccount([TokenType.Supply, TokenType.Debt]);
|
69
73
|
}
|
70
74
|
}
|
71
75
|
|
@@ -114,7 +118,7 @@ export class MarginfiFlProvider extends FlProviderBase {
|
|
114
118
|
this.debtBankLiquiditySource = debtBanks[0][1];
|
115
119
|
}
|
116
120
|
|
117
|
-
private setIntermediaryAccount(sources: TokenType[]) {
|
121
|
+
private async setIntermediaryAccount(sources: TokenType[]) {
|
118
122
|
const compatibleMarginfiAccounts = this.existingMarginfiAccounts.filter(
|
119
123
|
(x) => x.group.toString() == this.liquidityBank(sources[0]).group
|
120
124
|
);
|
@@ -136,6 +140,16 @@ export class MarginfiFlProvider extends FlProviderBase {
|
|
136
140
|
this.flSigners.push(signer);
|
137
141
|
}
|
138
142
|
|
143
|
+
const remainingAccounts = accountData
|
144
|
+
? (
|
145
|
+
await Promise.all(
|
146
|
+
accountData.lendingAccount.balances.map((balance) =>
|
147
|
+
getRemainingAccountsForMarginfiHealthCheck(this.umi, balance)
|
148
|
+
)
|
149
|
+
)
|
150
|
+
).flat()
|
151
|
+
: [];
|
152
|
+
|
139
153
|
for (const s of sources) {
|
140
154
|
const data: IMFIAccount = {
|
141
155
|
signer,
|
@@ -146,8 +160,10 @@ export class MarginfiFlProvider extends FlProviderBase {
|
|
146
160
|
const supply = s === TokenType.Supply;
|
147
161
|
if (supply) {
|
148
162
|
this.supplyImfiAccount = data;
|
163
|
+
this.supplyRemainingAccounts = remainingAccounts;
|
149
164
|
} else {
|
150
165
|
this.debtImfiAccount = data;
|
166
|
+
this.debtRemainingAccounts = remainingAccounts;
|
151
167
|
}
|
152
168
|
consoleLog(
|
153
169
|
`${supply ? "Supply" : "Debt"} iMfi account:`,
|
@@ -292,45 +308,19 @@ export class MarginfiFlProvider extends FlProviderBase {
|
|
292
308
|
);
|
293
309
|
const iMfiAccount = this.iMfiAccount(flashLoan.liquiditySource)!;
|
294
310
|
|
295
|
-
const remainingAccounts: AccountMeta[] =
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
flBankHadPrevBalance = true;
|
303
|
-
}
|
304
|
-
|
305
|
-
const priceOracle = publicKey(
|
306
|
-
await getMarginfiPriceOracle(this.umi, {
|
307
|
-
pk: toWeb3JsPublicKey(x.bankPk),
|
308
|
-
})
|
309
|
-
);
|
310
|
-
|
311
|
-
remainingAccounts.push(
|
312
|
-
...[
|
313
|
-
{
|
314
|
-
pubkey: x.bankPk,
|
315
|
-
isSigner: false,
|
316
|
-
isWritable: false,
|
317
|
-
},
|
318
|
-
{
|
319
|
-
pubkey: priceOracle,
|
320
|
-
isSigner: false,
|
321
|
-
isWritable: false,
|
322
|
-
},
|
323
|
-
]
|
324
|
-
);
|
325
|
-
}
|
326
|
-
});
|
327
|
-
}
|
311
|
+
const remainingAccounts: AccountMeta[] =
|
312
|
+
flashLoan.liquiditySource === TokenType.Supply
|
313
|
+
? this.supplyRemainingAccounts
|
314
|
+
: this.debtRemainingAccounts;
|
315
|
+
let iMfiAccountHadPrevFlBalance = remainingAccounts.find(
|
316
|
+
(x) => x.pubkey.toString() === bank.publicKey.toString()
|
317
|
+
);
|
328
318
|
|
329
319
|
return transactionBuilder()
|
330
320
|
.add(
|
331
321
|
lendingAccountRepay(this.umi, {
|
332
322
|
amount: flashLoan.baseUnitAmount,
|
333
|
-
repayAll: !
|
323
|
+
repayAll: !iMfiAccountHadPrevFlBalance,
|
334
324
|
bank: bank.publicKey,
|
335
325
|
bankLiquidityVault: publicKey(associatedBankAccs.liquidityVault),
|
336
326
|
marginfiAccount: publicKey(iMfiAccount.accountPk),
|
@@ -78,9 +78,6 @@ export abstract class SolautoClient extends ReferralStateManager {
|
|
78
78
|
await super.initialize(args);
|
79
79
|
|
80
80
|
const positionId = args.positionId ?? 0;
|
81
|
-
if (positionId === 0 && !args.lpUserAccount) {
|
82
|
-
throw new Error("Self managed position is missing arguments");
|
83
|
-
}
|
84
81
|
this.pos = await getOrCreatePositionEx(
|
85
82
|
this.umi,
|
86
83
|
this.authority,
|
@@ -5,8 +5,12 @@ import {
|
|
5
5
|
publicKey,
|
6
6
|
PublicKey as UmiPublicKey,
|
7
7
|
createSignerFromKeypair,
|
8
|
+
AccountMeta,
|
8
9
|
} from "@metaplex-foundation/umi";
|
9
|
-
import {
|
10
|
+
import {
|
11
|
+
fromWeb3JsPublicKey,
|
12
|
+
toWeb3JsPublicKey,
|
13
|
+
} from "@metaplex-foundation/umi-web3js-adapters";
|
10
14
|
import { MarginfiAssetAccounts, RebalanceDetails } from "../../types";
|
11
15
|
import { getMarginfiAccounts, MarginfiProgramAccounts } from "../../constants";
|
12
16
|
import {
|
@@ -31,18 +35,26 @@ import {
|
|
31
35
|
marginfiAccountEmpty,
|
32
36
|
getTokenAccount,
|
33
37
|
hasFirstRebalance,
|
38
|
+
getRemainingAccountsForMarginfiHealthCheck,
|
39
|
+
getAccountMeta,
|
34
40
|
} from "../../utils";
|
35
41
|
import {
|
36
42
|
Bank,
|
43
|
+
fetchMarginfiAccount,
|
37
44
|
lendingAccountBorrow,
|
38
45
|
lendingAccountDeposit,
|
39
46
|
lendingAccountRepay,
|
40
47
|
lendingAccountWithdraw,
|
41
48
|
marginfiAccountInitialize,
|
42
49
|
safeFetchAllMarginfiAccount,
|
50
|
+
safeFetchMarginfiAccount,
|
43
51
|
} from "../../marginfi-sdk";
|
44
52
|
import { SolautoClient, SolautoClientArgs } from "./solautoClient";
|
45
53
|
|
54
|
+
function isSigner(account: PublicKey | Signer): account is Signer {
|
55
|
+
return "publicKey" in account;
|
56
|
+
}
|
57
|
+
|
46
58
|
export class SolautoMarginfiClient extends SolautoClient {
|
47
59
|
public lendingPlatform = LendingPlatform.Marginfi;
|
48
60
|
|
@@ -50,6 +62,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
50
62
|
|
51
63
|
public marginfiAccount!: PublicKey | Signer;
|
52
64
|
public marginfiAccountPk!: PublicKey;
|
65
|
+
public healthCheckRemainingAccounts?: AccountMeta[];
|
53
66
|
public marginfiGroup!: PublicKey;
|
54
67
|
|
55
68
|
public marginfiSupplyAccounts!: MarginfiAssetAccounts;
|
@@ -97,13 +110,25 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
97
110
|
);
|
98
111
|
}
|
99
112
|
}
|
100
|
-
this.marginfiAccountPk =
|
101
|
-
"publicKey" in this.marginfiAccount
|
102
|
-
? toWeb3JsPublicKey(this.marginfiAccount.publicKey)
|
103
|
-
: this.marginfiAccount;
|
104
113
|
|
105
|
-
|
114
|
+
this.marginfiAccountPk = isSigner(this.marginfiAccount)
|
115
|
+
? toWeb3JsPublicKey(this.marginfiAccount.publicKey)
|
116
|
+
: this.marginfiAccount;
|
117
|
+
|
118
|
+
if (isSigner(this.marginfiAccount)) {
|
106
119
|
this.otherSigners.push(this.marginfiAccount);
|
120
|
+
} else if (this.pos.selfManaged) {
|
121
|
+
const accountData = await fetchMarginfiAccount(
|
122
|
+
this.umi,
|
123
|
+
fromWeb3JsPublicKey(this.marginfiAccount as PublicKey)
|
124
|
+
);
|
125
|
+
this.healthCheckRemainingAccounts = (
|
126
|
+
await Promise.all(
|
127
|
+
accountData.lendingAccount.balances.map((balance) =>
|
128
|
+
getRemainingAccountsForMarginfiHealthCheck(this.umi, balance)
|
129
|
+
)
|
130
|
+
)
|
131
|
+
).flat();
|
107
132
|
}
|
108
133
|
|
109
134
|
this.marginfiSupplyAccounts =
|
@@ -247,6 +272,20 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
247
272
|
});
|
248
273
|
}
|
249
274
|
case "Borrow": {
|
275
|
+
const remainingAccounts = this.healthCheckRemainingAccounts ?? [];
|
276
|
+
if (
|
277
|
+
!remainingAccounts.find(
|
278
|
+
(x) =>
|
279
|
+
x.pubkey.toString() === this.marginfiDebtAccounts.bank.toString()
|
280
|
+
)
|
281
|
+
) {
|
282
|
+
remainingAccounts.push(
|
283
|
+
...[
|
284
|
+
getAccountMeta(new PublicKey(this.marginfiDebtAccounts.bank)),
|
285
|
+
getAccountMeta(this.debtPriceOracle),
|
286
|
+
]
|
287
|
+
);
|
288
|
+
}
|
250
289
|
return lendingAccountBorrow(this.umi, {
|
251
290
|
amount: args.fields[0],
|
252
291
|
signer: this.signer,
|
@@ -260,7 +299,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
260
299
|
bankLiquidityVaultAuthority: publicKey(
|
261
300
|
this.marginfiDebtAccounts.vaultAuthority
|
262
301
|
),
|
263
|
-
});
|
302
|
+
}).addRemainingAccounts(remainingAccounts);
|
264
303
|
}
|
265
304
|
case "Repay": {
|
266
305
|
return lendingAccountRepay(this.umi, {
|
@@ -293,7 +332,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
293
332
|
bankLiquidityVaultAuthority: publicKey(
|
294
333
|
this.marginfiSupplyAccounts.vaultAuthority
|
295
334
|
),
|
296
|
-
});
|
335
|
+
}).addRemainingAccounts(this.healthCheckRemainingAccounts ?? []);
|
297
336
|
}
|
298
337
|
}
|
299
338
|
}
|
@@ -408,7 +447,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
408
447
|
? publicKey(getTokenAccount(this.authority, this.pos.supplyMint))
|
409
448
|
: undefined,
|
410
449
|
vaultSupplyTa: publicKey(this.marginfiSupplyAccounts.liquidityVault),
|
411
|
-
supplyVaultAuthority: publicKey(
|
450
|
+
supplyVaultAuthority: publicKey(
|
451
|
+
this.marginfiSupplyAccounts.vaultAuthority
|
452
|
+
),
|
412
453
|
debtBank: publicKey(this.marginfiDebtAccounts.bank),
|
413
454
|
debtPriceOracle: publicKey(this.debtPriceOracle),
|
414
455
|
positionDebtTa: publicKey(this.positionDebtTa),
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
|
-
import { Program, publicKey, Umi } from "@metaplex-foundation/umi";
|
2
|
+
import { AccountMeta, Program, publicKey, Umi } from "@metaplex-foundation/umi";
|
3
3
|
import {
|
4
4
|
fromWeb3JsPublicKey,
|
5
5
|
toWeb3JsPublicKey,
|
@@ -16,6 +16,7 @@ import {
|
|
16
16
|
USD_DECIMALS,
|
17
17
|
} from "../constants";
|
18
18
|
import {
|
19
|
+
Balance,
|
19
20
|
Bank,
|
20
21
|
deserializeMarginfiAccount,
|
21
22
|
fetchBank,
|
@@ -44,6 +45,7 @@ import {
|
|
44
45
|
getMostUpToDatePythOracle,
|
45
46
|
getPythPushOracleAddress,
|
46
47
|
} from "./pythUtils";
|
48
|
+
import { getAccountMeta } from "./solanaUtils";
|
47
49
|
|
48
50
|
export function createDynamicMarginfiProgram(env?: ProgramEnv): Program {
|
49
51
|
return {
|
@@ -179,6 +181,22 @@ export function findMarginfiAccounts(
|
|
179
181
|
throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
|
180
182
|
}
|
181
183
|
|
184
|
+
export async function getRemainingAccountsForMarginfiHealthCheck(
|
185
|
+
umi: Umi,
|
186
|
+
balance: Balance
|
187
|
+
): Promise<AccountMeta[]> {
|
188
|
+
if (!balance.active) {
|
189
|
+
return [];
|
190
|
+
}
|
191
|
+
const priceOracle = await getMarginfiPriceOracle(umi, {
|
192
|
+
pk: toWeb3JsPublicKey(balance.bankPk),
|
193
|
+
});
|
194
|
+
return [
|
195
|
+
getAccountMeta(toWeb3JsPublicKey(balance.bankPk)),
|
196
|
+
getAccountMeta(priceOracle),
|
197
|
+
];
|
198
|
+
}
|
199
|
+
|
182
200
|
export function calcMarginfiMaxLtvAndLiqThresholdBps(
|
183
201
|
supplyBank: Bank,
|
184
202
|
debtBank: Bank,
|
package/src/utils/solanaUtils.ts
CHANGED
@@ -18,6 +18,7 @@ import {
|
|
18
18
|
createTransferInstruction,
|
19
19
|
} from "@solana/spl-token";
|
20
20
|
import {
|
21
|
+
AccountMeta,
|
21
22
|
AddressLookupTableInput,
|
22
23
|
Signer,
|
23
24
|
TransactionBuilder,
|
@@ -28,6 +29,7 @@ import {
|
|
28
29
|
} from "@metaplex-foundation/umi";
|
29
30
|
import {
|
30
31
|
fromWeb3JsInstruction,
|
32
|
+
fromWeb3JsPublicKey,
|
31
33
|
toWeb3JsPublicKey,
|
32
34
|
toWeb3JsTransaction,
|
33
35
|
} from "@metaplex-foundation/umi-web3js-adapters";
|
@@ -154,6 +156,14 @@ export function splTokenTransferUmiIx(
|
|
154
156
|
);
|
155
157
|
}
|
156
158
|
|
159
|
+
export function getAccountMeta(
|
160
|
+
pubkey: PublicKey,
|
161
|
+
isSigner: boolean = false,
|
162
|
+
isWritable: boolean = false
|
163
|
+
): AccountMeta {
|
164
|
+
return { pubkey: fromWeb3JsPublicKey(pubkey), isSigner, isWritable };
|
165
|
+
}
|
166
|
+
|
157
167
|
export async function getWalletSplBalances(
|
158
168
|
conn: Connection,
|
159
169
|
wallet: PublicKey,
|