@haven-fi/solauto-sdk 1.0.761 → 1.0.763
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/marginfiFlProvider.d.ts.map +1 -1
- package/dist/services/flashLoans/marginfiFlProvider.js +1 -1
- package/dist/services/rebalance/rebalanceSwapManager.d.ts.map +1 -1
- package/dist/services/rebalance/rebalanceSwapManager.js +0 -13
- package/dist/services/rebalance/rebalanceTxBuilder.js +1 -1
- package/dist/services/rebalance/solautoFees.d.ts.map +1 -1
- package/dist/services/rebalance/solautoFees.js +6 -1
- package/dist/services/solauto/solautoMarginfiClient.d.ts +1 -1
- package/dist/services/solauto/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/services/solauto/solautoMarginfiClient.js +12 -3
- package/dist/solautoPosition/marginfiSolautoPositionEx.js +1 -1
- package/dist/solautoPosition/positionUtils.js +1 -1
- package/dist/utils/generalUtils.d.ts.map +1 -1
- package/dist/utils/generalUtils.js +0 -2
- package/dist/utils/marginfi/general.d.ts +1 -0
- package/dist/utils/marginfi/general.d.ts.map +1 -1
- package/dist/utils/marginfi/general.js +7 -0
- package/dist/utils/numberUtils.d.ts +3 -0
- package/dist/utils/numberUtils.d.ts.map +1 -1
- package/dist/utils/numberUtils.js +16 -0
- package/local/.env +1 -1
- package/local/txSandbox.ts +18 -71
- package/package.json +1 -1
- package/src/services/flashLoans/marginfiFlProvider.ts +2 -1
- package/src/services/rebalance/rebalanceSwapManager.ts +0 -14
- package/src/services/rebalance/rebalanceTxBuilder.ts +1 -1
- package/src/services/rebalance/solautoFees.ts +5 -1
- package/src/services/solauto/solautoMarginfiClient.ts +21 -4
- package/src/solautoPosition/marginfiSolautoPositionEx.ts +1 -1
- package/src/solautoPosition/positionUtils.ts +1 -1
- package/src/utils/generalUtils.ts +0 -7
- package/src/utils/marginfi/general.ts +13 -0
- package/src/utils/numberUtils.ts +31 -0
- package/tests/transactions/shared.ts +5 -2
- package/tests/transactions/solautoMarginfi.ts +7 -3
@@ -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;AAkBlD,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,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS;IAI7C,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"}
|
@@ -198,7 +198,7 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
|
|
198
198
|
.add((0, marginfi_1.lendingAccountEndFlashloan)(this.umi, {
|
199
199
|
marginfiAccount: (0, umi_1.publicKey)(iMfiAccount.accountPk),
|
200
200
|
signer: this.signer,
|
201
|
-
}).addRemainingAccounts(remainingAccounts));
|
201
|
+
}).addRemainingAccounts((0, utils_1.composeRemainingAccounts)(remainingAccounts)));
|
202
202
|
}
|
203
203
|
closeBalance(marginfiAccount, bank, marginfiGroup) {
|
204
204
|
return (0, umi_1.transactionBuilder)().add((0, marginfi_1.lendingAccountCloseBalance)(this.umi, {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rebalanceSwapManager.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceSwapManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkB,UAAU,EAAa,MAAM,SAAS,CAAC;AAChE,OAAO,EAA0B,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAY3E,qBAAa,oBAAoB;IAS7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC;IAZb,UAAU,EAAG,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAAU;gBAGrB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,qBAAqB,YAAA,EACtC,2BAA2B,CAAC,EAAE,MAAM,YAAA,EACpC,SAAS,CAAC,EAAE,SAAS,YAAA;IAU/B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,kCAAkC;
|
1
|
+
{"version":3,"file":"rebalanceSwapManager.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceSwapManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkB,UAAU,EAAa,MAAM,SAAS,CAAC;AAChE,OAAO,EAA0B,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAY3E,qBAAa,oBAAoB;IAS7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC;IAZb,UAAU,EAAG,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAAU;gBAGrB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,qBAAqB,YAAA,EACtC,2BAA2B,CAAC,EAAE,MAAM,YAAA,EACpC,SAAS,CAAC,EAAE,SAAS,YAAA;IAU/B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,kCAAkC;YAwD5B,mBAAmB;IA4CjC,OAAO,CAAC,mBAAmB;IAIrB,aAAa,CAAC,UAAU,EAAE,MAAM;IAuEhC,aAAa;;;;;;CAWpB"}
|
@@ -74,19 +74,6 @@ class RebalanceSwapManager {
|
|
74
74
|
flashLoan: this.flRequirements?.flFeeBps ?? 0,
|
75
75
|
lpBorrow: this.client.pos.state.debt.borrowFeeBps,
|
76
76
|
});
|
77
|
-
// if (isMarginfiPosition(this.client.pos)) {
|
78
|
-
// console.log(res.newPos.supplyUsd, res.newPos.debtUsd);
|
79
|
-
// console.log(
|
80
|
-
// res.newPos.supplyUsd *
|
81
|
-
// bytesToI80F48(
|
82
|
-
// this.client.pos.supplyBank!.config.assetWeightInit.value
|
83
|
-
// ),
|
84
|
-
// res.newPos.debtUsd *
|
85
|
-
// bytesToI80F48(
|
86
|
-
// this.client.pos.debtBank!.config.liabilityWeightInit.value
|
87
|
-
// )
|
88
|
-
// );
|
89
|
-
// }
|
90
77
|
return (0, utils_1.getLiqUtilzationRateBps)(res.newPos.supplyUsd, res.newPos.debtUsd, this.client.pos.state.liqThresholdBps ?? 0);
|
91
78
|
}
|
92
79
|
async findSufficientQuote(swapInput, criteria) {
|
@@ -18,7 +18,7 @@ class RebalanceTxBuilder {
|
|
18
18
|
this.priceType = generated_1.PriceType.Realtime;
|
19
19
|
}
|
20
20
|
shouldProceedWithRebalance() {
|
21
|
-
if (this.client.pos.selfManaged &&
|
21
|
+
if (this.client.pos.selfManaged && this.targetLiqUtilizationRateBps === undefined) {
|
22
22
|
throw new Error("A target rate must be provided for self managed position rebalances");
|
23
23
|
}
|
24
24
|
return (this.client.pos.supplyUsd() > 0 &&
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoFees.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/solautoFees.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,qBAAa,cAAc;IAEvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,2BAA2B;IACnC,OAAO,CAAC,mBAAmB;gBAFnB,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,mBAAmB,EAAE,MAAM;IAGrC,MAAM,CAAC,MAAM,CACX,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,WAAW,EAAE,MAAM;IASrB,iBAAiB,CAAC,kBAAkB,EAAE,kBAAkB;;;;;
|
1
|
+
{"version":3,"file":"solautoFees.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/solautoFees.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,qBAAa,cAAc;IAEvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,2BAA2B;IACnC,OAAO,CAAC,mBAAmB;gBAFnB,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,mBAAmB,EAAE,MAAM;IAGrC,MAAM,CAAC,MAAM,CACX,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,WAAW,EAAE,MAAM;IASrB,iBAAiB,CAAC,kBAAkB,EAAE,kBAAkB;;;;;CAyCzD"}
|
@@ -20,7 +20,12 @@ class SolautoFeesBps {
|
|
20
20
|
const k = 1.5;
|
21
21
|
let feeBps = 0;
|
22
22
|
if (this.targetLiqUtilizationRateBps !== undefined) {
|
23
|
-
|
23
|
+
if (this.targetLiqUtilizationRateBps === 0) {
|
24
|
+
feeBps = 15;
|
25
|
+
}
|
26
|
+
else {
|
27
|
+
feeBps = 10;
|
28
|
+
}
|
24
29
|
}
|
25
30
|
else if (rebalanceDirection === generated_1.RebalanceDirection.Repay) {
|
26
31
|
feeBps = 25;
|
@@ -9,7 +9,7 @@ export declare class SolautoMarginfiClient extends SolautoClient {
|
|
9
9
|
mfiAccounts: MarginfiProgramAccounts;
|
10
10
|
marginfiAccount: PublicKey | Signer;
|
11
11
|
marginfiAccountPk: PublicKey;
|
12
|
-
healthCheckRemainingAccounts
|
12
|
+
healthCheckRemainingAccounts: AccountMeta[];
|
13
13
|
marginfiGroup: PublicKey;
|
14
14
|
marginfiSupplyAccounts: MarginfiAssetAccounts;
|
15
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,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;
|
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,EAAG,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;IA8ExC,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,CAAC,EAAE,SAAS,GAAG,kBAAkB;IAepD,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUlE,OAAO,CAAC,6BAA6B;IAiGrC,OAAO,CAAC,oCAAoC;IA0D5C,WAAW,CACT,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CA4EtB"}
|
@@ -21,6 +21,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
21
21
|
await super.initialize(args);
|
22
22
|
this.mfiAccounts = (0, constants_1.getMarginfiAccounts)(this.lpEnv);
|
23
23
|
this.marginfiGroup = this.pos.lpPoolAccount;
|
24
|
+
this.healthCheckRemainingAccounts = [];
|
24
25
|
if (this.pos.selfManaged) {
|
25
26
|
this.marginfiAccount =
|
26
27
|
args.lpUserAccount ??
|
@@ -155,6 +156,14 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
155
156
|
marginfiProtocolInteractionIx(args) {
|
156
157
|
switch (args.__kind) {
|
157
158
|
case "Deposit": {
|
159
|
+
if (!this.healthCheckRemainingAccounts
|
160
|
+
.map((x) => x.pubkey.toString())
|
161
|
+
.includes(this.marginfiSupplyAccounts.bank)) {
|
162
|
+
this.healthCheckRemainingAccounts.push(...[
|
163
|
+
(0, utils_1.getAccountMeta)(new web3_js_1.PublicKey(this.marginfiSupplyAccounts.bank)),
|
164
|
+
(0, utils_1.getAccountMeta)(this.supplyPriceOracle),
|
165
|
+
]);
|
166
|
+
}
|
158
167
|
return (0, marginfi_1.lendingAccountDeposit)(this.umi, {
|
159
168
|
signer: this.signer,
|
160
169
|
signerTokenAccount: (0, umi_1.publicKey)(this.signerSupplyTa),
|
@@ -167,7 +176,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
167
176
|
});
|
168
177
|
}
|
169
178
|
case "Borrow": {
|
170
|
-
const remainingAccounts = this.healthCheckRemainingAccounts
|
179
|
+
const remainingAccounts = this.healthCheckRemainingAccounts;
|
171
180
|
if (!remainingAccounts.find((x) => x.pubkey.toString() === this.marginfiDebtAccounts.bank.toString())) {
|
172
181
|
remainingAccounts.push(...[
|
173
182
|
(0, utils_1.getAccountMeta)(new web3_js_1.PublicKey(this.marginfiDebtAccounts.bank)),
|
@@ -183,7 +192,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
183
192
|
bank: (0, umi_1.publicKey)(this.marginfiDebtAccounts.bank),
|
184
193
|
bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiDebtAccounts.liquidityVault),
|
185
194
|
bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiDebtAccounts.vaultAuthority),
|
186
|
-
}).addRemainingAccounts(remainingAccounts);
|
195
|
+
}).addRemainingAccounts((0, utils_1.composeRemainingAccounts)(remainingAccounts));
|
187
196
|
}
|
188
197
|
case "Repay": {
|
189
198
|
return (0, marginfi_1.lendingAccountRepay)(this.umi, {
|
@@ -208,7 +217,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
208
217
|
bank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
|
209
218
|
bankLiquidityVault: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.liquidityVault),
|
210
219
|
bankLiquidityVaultAuthority: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.vaultAuthority),
|
211
|
-
}).addRemainingAccounts(this.healthCheckRemainingAccounts
|
220
|
+
}).addRemainingAccounts((0, utils_1.composeRemainingAccounts)(this.healthCheckRemainingAccounts));
|
212
221
|
}
|
213
222
|
}
|
214
223
|
}
|
@@ -79,7 +79,7 @@ class MarginfiSolautoPositionEx extends solautoPositionEx_1.SolautoPositionEx {
|
|
79
79
|
get supplyUsdWithdrawable() {
|
80
80
|
const deposits = (0, utils_1.fromBaseUnit)((0, utils_1.getBankLiquidityUsedBaseUnit)(this.supplyBank, true), this.supplyMintInfo.decimals);
|
81
81
|
const borrows = (0, utils_1.fromBaseUnit)((0, utils_1.getBankLiquidityUsedBaseUnit)(this.supplyBank, false), this.supplyMintInfo.decimals);
|
82
|
-
return Math.min(
|
82
|
+
return Math.min(deposits - borrows, this.totalSupply) * this.supplyPrice();
|
83
83
|
}
|
84
84
|
async refreshPositionState(priceType) {
|
85
85
|
if (!this.canRefreshPositionState()) {
|
@@ -19,7 +19,7 @@ function createSolautoSettings(settings) {
|
|
19
19
|
};
|
20
20
|
}
|
21
21
|
async function getPositionExBulk(umi, publicKeys) {
|
22
|
-
const batches = (0, utils_1.getBatches)(publicKeys,
|
22
|
+
const batches = (0, utils_1.getBatches)(publicKeys, 100);
|
23
23
|
const data = (await Promise.all(batches.map(async (pubkeys) => {
|
24
24
|
return (0, utils_1.retryWithExponentialBackoff)(async () => await (0, generated_1.safeFetchAllSolautoPosition)(umi, pubkeys.map((x) => (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(x))));
|
25
25
|
}))).flat();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,eAAe,EAEf,GAAG,EACH,SAAS,IAAI,YAAY,EAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAc,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,UAE3D;AAED,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAI/C;AAED,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAErD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAW1D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,yBAQ/C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAMlE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAS1D;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACvD,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,
|
1
|
+
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,eAAe,EAEf,GAAG,EACH,SAAS,IAAI,YAAY,EAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAc,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,UAE3D;AAED,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAI/C;AAED,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAErD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAW1D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,yBAQ/C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAMlE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAS1D;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACvD,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA8BZ;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC1C,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,MAAM,GACZ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAUxB;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,gBAuBzE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAU5D;AAED,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,WAErE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,CAAC,EAAE,GACV,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAInB"}
|
@@ -116,8 +116,6 @@ function retryWithExponentialBackoff(fn, retries = 5, delay = 150, errorsToThrow
|
|
116
116
|
.then(resolve)
|
117
117
|
.catch((error) => {
|
118
118
|
attemptNum++;
|
119
|
-
console.log(error.name, error.message);
|
120
|
-
console.log(errorsToThrow?.length, (errorsToThrow ?? []).some((errorType) => error instanceof errorType));
|
121
119
|
if (errorsToThrow?.length &&
|
122
120
|
errorsToThrow.some((errorType) => error instanceof errorType)) {
|
123
121
|
reject(error);
|
@@ -23,5 +23,6 @@ export declare function findMarginfiAccounts(bank: PublicKey): AllMarginfiAssetA
|
|
23
23
|
export declare function getRemainingAccountsForMarginfiHealthCheck(umi: Umi, balance: Balance): Promise<AccountMeta[]>;
|
24
24
|
export declare function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank: Bank, debtBank: Bank, supplyPrice: number): [number, number];
|
25
25
|
export declare function marginfiAccountEmpty(marginfiAccount: MarginfiAccount): boolean;
|
26
|
+
export declare function composeRemainingAccounts(accs: AccountMeta[]): AccountMeta[];
|
26
27
|
export {};
|
27
28
|
//# sourceMappingURL=general.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../../src/utils/marginfi/general.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAKhF,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAGL,uBAAuB,EAExB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,OAAO,EACP,IAAI,EAIJ,eAAe,EAGhB,MAAM,6BAA6B,CAAC;AASrC,wBAAgB,4BAA4B,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CActE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,UAAU,OASxE;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,GAAG,EACR,eAAe,EAAE,uBAAuB,GACvC,OAAO,CAAC,SAAS,EAAE,CAAC,CAkCtB;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS;;;;;GAanE;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,IAAI,EAAE;IAAE,EAAE,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,sBAgBtC;AAED,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GACd,wBAAwB,CAyB1B;AAED,wBAAsB,0CAA0C,CAC9D,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAWxB;AAED,wBAAgB,oCAAoC,CAClD,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,WASpE"}
|
1
|
+
{"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../../src/utils/marginfi/general.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAKhF,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAGL,uBAAuB,EAExB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,OAAO,EACP,IAAI,EAIJ,eAAe,EAGhB,MAAM,6BAA6B,CAAC;AASrC,wBAAgB,4BAA4B,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CActE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,UAAU,OASxE;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,GAAG,EACR,eAAe,EAAE,uBAAuB,GACvC,OAAO,CAAC,SAAS,EAAE,CAAC,CAkCtB;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS;;;;;GAanE;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,IAAI,EAAE;IAAE,EAAE,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,sBAgBtC;AAED,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GACd,wBAAwB,CAyB1B;AAED,wBAAsB,0CAA0C,CAC9D,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAWxB;AAED,wBAAgB,oCAAoC,CAClD,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,WASpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAW3E"}
|
@@ -9,6 +9,7 @@ exports.findMarginfiAccounts = findMarginfiAccounts;
|
|
9
9
|
exports.getRemainingAccountsForMarginfiHealthCheck = getRemainingAccountsForMarginfiHealthCheck;
|
10
10
|
exports.calcMarginfiMaxLtvAndLiqThresholdBps = calcMarginfiMaxLtvAndLiqThresholdBps;
|
11
11
|
exports.marginfiAccountEmpty = marginfiAccountEmpty;
|
12
|
+
exports.composeRemainingAccounts = composeRemainingAccounts;
|
12
13
|
const web3_js_1 = require("@solana/web3.js");
|
13
14
|
const umi_1 = require("@metaplex-foundation/umi");
|
14
15
|
const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
|
@@ -144,3 +145,9 @@ function marginfiAccountEmpty(marginfiAccount) {
|
|
144
145
|
((0, numberUtils_1.bytesToI80F48)(x.assetShares.value) > 0.000001 ||
|
145
146
|
(0, numberUtils_1.bytesToI80F48)(x.liabilityShares.value) > 0.000001)) === undefined);
|
146
147
|
}
|
148
|
+
function composeRemainingAccounts(accs) {
|
149
|
+
const banksAndOracles = accs.reduce((acc, _, i) => i % 2 === 0 ? [...acc, [accs[i], accs[i + 1]]] : acc, []);
|
150
|
+
return banksAndOracles
|
151
|
+
.sort((a, b) => b[0].pubkey.toString().localeCompare(a[0].pubkey.toString()))
|
152
|
+
.flat();
|
153
|
+
}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
2
|
import { PositionState } from "../generated";
|
3
3
|
import { RoundAction } from "../types";
|
4
|
+
import { StrategyType } from "./stringUtils";
|
4
5
|
export declare function calcNetWorthUsd(state?: PositionState): number;
|
5
6
|
export declare function calcSupplyUsd(state?: PositionState): number;
|
6
7
|
export declare function calcDebtUsd(state?: PositionState): number;
|
@@ -25,4 +26,6 @@ export declare function maxRepayFromBps(maxLtvBps: number, liqThresholdBps: numb
|
|
25
26
|
export declare function maxRepayToBps(maxLtvBps: number, liqThresholdBps: number): number;
|
26
27
|
export declare function maxBoostToBps(maxLtvBps: number, liqThresholdBps: number): number;
|
27
28
|
export declare function realtimeUsdToEmaUsd(realtimeAmountUsd: number, mint: PublicKey): number;
|
29
|
+
export declare function boostSettingToLeverageFactor(supplyMint: PublicKey, debtMint: PublicKey, boostToBps: number, liqThresholdBps: number): number;
|
30
|
+
export declare function getLeverageFactor(strategyType: StrategyType, supplyUsd: number, debtUsd: number): number;
|
28
31
|
//# sourceMappingURL=numberUtils.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO5C,OAAO,EAAE,aAAa,EAAa,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
1
|
+
{"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO5C,OAAO,EAAE,aAAa,EAAa,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;AAG3D,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAEpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,aAAa,UAIhD;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,aAAa,UAKjD;AAED,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAKpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAKlD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,aAAa,UAK3D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE,aAAa,UAI9D;AAED,wBAAgB,0BAA0B,CAAC,KAAK,CAAC,EAAE,aAAa,UAK/D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,UAEjD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,UAE/C;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,MAAM,CAMR;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,WAAqB,GACjC,MAAM,CAKR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,KAAK,CACnB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,WAAqB,GACjC,MAAM,CAGR;AAUD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAqBrD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAejE;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAKR;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UASzE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE;AAED,wBAAgB,mBAAmB,CACjC,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE,SAAS,UAMhB;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,UAUxB;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CAOR"}
|
@@ -24,9 +24,13 @@ exports.maxRepayFromBps = maxRepayFromBps;
|
|
24
24
|
exports.maxRepayToBps = maxRepayToBps;
|
25
25
|
exports.maxBoostToBps = maxBoostToBps;
|
26
26
|
exports.realtimeUsdToEmaUsd = realtimeUsdToEmaUsd;
|
27
|
+
exports.boostSettingToLeverageFactor = boostSettingToLeverageFactor;
|
28
|
+
exports.getLeverageFactor = getLeverageFactor;
|
27
29
|
const constants_1 = require("../constants");
|
28
30
|
const generated_1 = require("../generated");
|
29
31
|
const priceUtils_1 = require("./priceUtils");
|
32
|
+
const stringUtils_1 = require("./stringUtils");
|
33
|
+
const services_1 = require("../services");
|
30
34
|
function calcNetWorthUsd(state) {
|
31
35
|
return fromRoundedUsdValue(state?.netWorth.baseAmountUsdValue ?? BigInt(0));
|
32
36
|
}
|
@@ -138,3 +142,15 @@ function realtimeUsdToEmaUsd(realtimeAmountUsd, mint) {
|
|
138
142
|
return ((realtimeAmountUsd / (0, priceUtils_1.safeGetPrice)(mint, generated_1.PriceType.Realtime)) *
|
139
143
|
(0, priceUtils_1.safeGetPrice)(mint, generated_1.PriceType.Ema));
|
140
144
|
}
|
145
|
+
function boostSettingToLeverageFactor(supplyMint, debtMint, boostToBps, liqThresholdBps) {
|
146
|
+
const strategy = (0, stringUtils_1.strategyType)(supplyMint, debtMint);
|
147
|
+
const supplyUsd = 100;
|
148
|
+
const debtUsd = (0, services_1.getDebtAdjustment)(liqThresholdBps, { supplyUsd: 100, debtUsd: 0 }, boostToBps).debtAdjustmentUsd;
|
149
|
+
return getLeverageFactor(strategy, supplyUsd + debtUsd, debtUsd);
|
150
|
+
}
|
151
|
+
function getLeverageFactor(strategyType, supplyUsd, debtUsd) {
|
152
|
+
return ((strategyType === "Long" || strategyType === "Ratio"
|
153
|
+
? supplyUsd
|
154
|
+
: debtUsd) /
|
155
|
+
(supplyUsd - debtUsd));
|
156
|
+
}
|
package/local/.env
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ADDRESS_WHITELIST=5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe,He4ka5Q3N1UvZikZvykdi47xyk5PoVP2tcQL5sVp31Sz,E5BBsR1sUToPc3jXVwhrK5ttSiy6xhWJDMdQLvkgNppe,DRP5cgM1JpnMySvwg3jqRP2VA2DXSWUjo6VGLkNZ2etb
|
1
|
+
ADDRESS_WHITELIST=5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe,He4ka5Q3N1UvZikZvykdi47xyk5PoVP2tcQL5sVp31Sz,E5BBsR1sUToPc3jXVwhrK5ttSiy6xhWJDMdQLvkgNppe,DRP5cgM1JpnMySvwg3jqRP2VA2DXSWUjo6VGLkNZ2etb,FtwMsLNn4kBy2kpawC4izM8oUPbmfmbjjKNTcTUUDPzN
|
package/local/txSandbox.ts
CHANGED
@@ -2,40 +2,27 @@ import { Keypair, PublicKey } from "@solana/web3.js";
|
|
2
2
|
import { createSignerFromKeypair, publicKey } from "@metaplex-foundation/umi";
|
3
3
|
import { fromWeb3JsKeypair } from "@metaplex-foundation/umi-web3js-adapters";
|
4
4
|
import {
|
5
|
-
bytesToI80F48,
|
6
5
|
ClientTransactionsManager,
|
7
6
|
consoleLog,
|
8
|
-
fetchBank,
|
9
|
-
fetchMarginfiAccount,
|
10
|
-
fromBaseUnit,
|
11
|
-
getBankLiquidityAvailableBaseUnit,
|
12
7
|
getBatches,
|
13
8
|
getClient,
|
14
|
-
getMarginfiAccounts,
|
15
9
|
getPositionExBulk,
|
16
10
|
getSolanaRpcConnection,
|
17
11
|
getSolautoManagedPositions,
|
18
|
-
lendingAccountDeposit,
|
19
12
|
LendingPlatform,
|
20
13
|
LOCAL_IRONFORGE_API_URL,
|
21
14
|
PriceType,
|
22
15
|
PriorityFeeSetting,
|
23
16
|
ProgramEnv,
|
24
17
|
rebalance,
|
25
|
-
SOLAUTO_MANAGER,
|
26
18
|
SOLAUTO_PROD_PROGRAM,
|
27
19
|
SOLAUTO_TEST_PROGRAM,
|
28
20
|
SolautoClient,
|
29
|
-
toBaseUnit,
|
30
21
|
TransactionItem,
|
31
|
-
TransactionsManager,
|
32
|
-
TxHandler,
|
33
|
-
USDC,
|
34
22
|
} from "../src";
|
35
23
|
import { getSecretKey } from "./shared";
|
36
|
-
import { getTokenAccount, tokenInfo } from "../dist";
|
37
24
|
|
38
|
-
const payForTransaction =
|
25
|
+
const payForTransaction = false;
|
39
26
|
const testProgram = false;
|
40
27
|
const lpEnv: ProgramEnv = "Prod";
|
41
28
|
|
@@ -51,66 +38,26 @@ const signer = createSignerFromKeypair(
|
|
51
38
|
);
|
52
39
|
|
53
40
|
export async function main() {
|
54
|
-
const
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
const bank = await fetchBank(umi, publicKey(accounts.bank));
|
62
|
-
|
63
|
-
const assets =
|
64
|
-
bytesToI80F48(bank.totalAssetShares.value) *
|
65
|
-
bytesToI80F48(bank.assetShareValue.value);
|
66
|
-
const liabs =
|
67
|
-
bytesToI80F48(bank.totalLiabilityShares.value) *
|
68
|
-
bytesToI80F48(bank.liabilityShareValue.value);
|
69
|
-
|
70
|
-
console.log(fromBaseUnit(BigInt(Math.round(assets)), 6));
|
71
|
-
console.log(fromBaseUnit(BigInt(Math.round(liabs)), 6));
|
72
|
-
const missingLiquidity = getBankLiquidityAvailableBaseUnit(bank, false);
|
73
|
-
console.log(fromBaseUnit(missingLiquidity, 6));
|
41
|
+
const client = getClient(LendingPlatform.Marginfi, {
|
42
|
+
signer,
|
43
|
+
showLogs: true,
|
44
|
+
rpcUrl: LOCAL_IRONFORGE_API_URL,
|
45
|
+
programId: testProgram ? SOLAUTO_TEST_PROGRAM : SOLAUTO_PROD_PROGRAM,
|
46
|
+
lpEnv,
|
47
|
+
});
|
74
48
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
) * bytesToI80F48(bank.assetShareValue.value);
|
83
|
-
console.log(fromBaseUnit(BigInt(Math.round(managerAssets)), 6));
|
49
|
+
await client.initializeExistingSolautoPosition({
|
50
|
+
positionId: 1,
|
51
|
+
authority: new PublicKey("5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe"),
|
52
|
+
// lpUserAccount: new PublicKey(
|
53
|
+
// "GEokw9jqbh6d1xUNA3qaeYFFetbSR5Y1nt7C3chwwgSz"
|
54
|
+
// ),
|
55
|
+
});
|
84
56
|
|
85
|
-
const
|
86
|
-
missingLiquidity * BigInt(-1) + BigInt(toBaseUnit(620 + 20, 6));
|
87
|
-
console.log("Depositing", fromBaseUnit(depositAmt, 6));
|
88
|
-
const transactionItems = [
|
89
|
-
new TransactionItem(
|
90
|
-
async () => ({
|
91
|
-
tx: lendingAccountDeposit(umi, {
|
92
|
-
signer,
|
93
|
-
signerTokenAccount: publicKey(
|
94
|
-
getTokenAccount(SOLAUTO_MANAGER, USDC_MINT)
|
95
|
-
),
|
96
|
-
marginfiAccount: marginfiAccount.publicKey,
|
97
|
-
marginfiGroup: publicKey(group),
|
98
|
-
bank: bank.publicKey,
|
99
|
-
bankLiquidityVault: publicKey(accounts.liquidityVault),
|
100
|
-
amount: depositAmt,
|
101
|
-
depositUpToLimit: true,
|
102
|
-
}),
|
103
|
-
}),
|
104
|
-
"deposit"
|
105
|
-
),
|
106
|
-
];
|
57
|
+
const transactionItems = [rebalance(client)];
|
107
58
|
|
108
|
-
const txManager = new
|
109
|
-
txHandler:
|
110
|
-
signer,
|
111
|
-
rpcUrl: LOCAL_IRONFORGE_API_URL,
|
112
|
-
showLogs: true,
|
113
|
-
}),
|
59
|
+
const txManager = new ClientTransactionsManager({
|
60
|
+
txHandler: client,
|
114
61
|
txRunType: payForTransaction ? "normal" : "only-simulate",
|
115
62
|
priorityFeeSetting: PriorityFeeSetting.Default,
|
116
63
|
retryConfig: { totalRetries: 2 },
|
package/package.json
CHANGED
@@ -23,6 +23,7 @@ import {
|
|
23
23
|
import { FlProviderBase } from "./flProviderBase";
|
24
24
|
import {
|
25
25
|
bytesToI80F48,
|
26
|
+
composeRemainingAccounts,
|
26
27
|
consoleLog,
|
27
28
|
fetchTokenPrices,
|
28
29
|
findMarginfiAccounts,
|
@@ -342,7 +343,7 @@ export class MarginfiFlProvider extends FlProviderBase {
|
|
342
343
|
lendingAccountEndFlashloan(this.umi, {
|
343
344
|
marginfiAccount: publicKey(iMfiAccount.accountPk),
|
344
345
|
signer: this.signer,
|
345
|
-
}).addRemainingAccounts(remainingAccounts)
|
346
|
+
}).addRemainingAccounts(composeRemainingAccounts(remainingAccounts))
|
346
347
|
);
|
347
348
|
}
|
348
349
|
|
@@ -134,20 +134,6 @@ export class RebalanceSwapManager {
|
|
134
134
|
}
|
135
135
|
);
|
136
136
|
|
137
|
-
// if (isMarginfiPosition(this.client.pos)) {
|
138
|
-
// console.log(res.newPos.supplyUsd, res.newPos.debtUsd);
|
139
|
-
// console.log(
|
140
|
-
// res.newPos.supplyUsd *
|
141
|
-
// bytesToI80F48(
|
142
|
-
// this.client.pos.supplyBank!.config.assetWeightInit.value
|
143
|
-
// ),
|
144
|
-
// res.newPos.debtUsd *
|
145
|
-
// bytesToI80F48(
|
146
|
-
// this.client.pos.debtBank!.config.liabilityWeightInit.value
|
147
|
-
// )
|
148
|
-
// );
|
149
|
-
// }
|
150
|
-
|
151
137
|
return getLiqUtilzationRateBps(
|
152
138
|
res.newPos.supplyUsd,
|
153
139
|
res.newPos.debtUsd,
|
@@ -53,7 +53,7 @@ export class RebalanceTxBuilder {
|
|
53
53
|
) {}
|
54
54
|
|
55
55
|
private shouldProceedWithRebalance() {
|
56
|
-
if (this.client.pos.selfManaged &&
|
56
|
+
if (this.client.pos.selfManaged && this.targetLiqUtilizationRateBps === undefined) {
|
57
57
|
throw new Error(
|
58
58
|
"A target rate must be provided for self managed position rebalances"
|
59
59
|
);
|
@@ -29,7 +29,11 @@ export class SolautoFeesBps {
|
|
29
29
|
|
30
30
|
let feeBps: number = 0;
|
31
31
|
if (this.targetLiqUtilizationRateBps !== undefined) {
|
32
|
-
|
32
|
+
if (this.targetLiqUtilizationRateBps === 0) {
|
33
|
+
feeBps = 15;
|
34
|
+
} else {
|
35
|
+
feeBps = 10;
|
36
|
+
}
|
33
37
|
} else if (rebalanceDirection === RebalanceDirection.Repay) {
|
34
38
|
feeBps = 25;
|
35
39
|
} else if (this.positionNetWorthUsd <= minSize) {
|
@@ -37,6 +37,7 @@ import {
|
|
37
37
|
hasFirstRebalance,
|
38
38
|
getRemainingAccountsForMarginfiHealthCheck,
|
39
39
|
getAccountMeta,
|
40
|
+
composeRemainingAccounts,
|
40
41
|
} from "../../utils";
|
41
42
|
import {
|
42
43
|
Bank,
|
@@ -61,7 +62,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
61
62
|
|
62
63
|
public marginfiAccount!: PublicKey | Signer;
|
63
64
|
public marginfiAccountPk!: PublicKey;
|
64
|
-
public healthCheckRemainingAccounts
|
65
|
+
public healthCheckRemainingAccounts!: AccountMeta[];
|
65
66
|
public marginfiGroup!: PublicKey;
|
66
67
|
|
67
68
|
public marginfiSupplyAccounts!: MarginfiAssetAccounts;
|
@@ -76,6 +77,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
76
77
|
this.mfiAccounts = getMarginfiAccounts(this.lpEnv);
|
77
78
|
|
78
79
|
this.marginfiGroup = this.pos.lpPoolAccount;
|
80
|
+
this.healthCheckRemainingAccounts = [];
|
79
81
|
|
80
82
|
if (this.pos.selfManaged) {
|
81
83
|
this.marginfiAccount =
|
@@ -258,6 +260,18 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
258
260
|
private marginfiProtocolInteractionIx(args: SolautoActionArgs) {
|
259
261
|
switch (args.__kind) {
|
260
262
|
case "Deposit": {
|
263
|
+
if (
|
264
|
+
!this.healthCheckRemainingAccounts
|
265
|
+
.map((x) => x.pubkey.toString())
|
266
|
+
.includes(this.marginfiSupplyAccounts.bank)
|
267
|
+
) {
|
268
|
+
this.healthCheckRemainingAccounts.push(
|
269
|
+
...[
|
270
|
+
getAccountMeta(new PublicKey(this.marginfiSupplyAccounts.bank)),
|
271
|
+
getAccountMeta(this.supplyPriceOracle),
|
272
|
+
]
|
273
|
+
);
|
274
|
+
}
|
261
275
|
return lendingAccountDeposit(this.umi, {
|
262
276
|
signer: this.signer,
|
263
277
|
signerTokenAccount: publicKey(this.signerSupplyTa),
|
@@ -272,7 +286,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
272
286
|
});
|
273
287
|
}
|
274
288
|
case "Borrow": {
|
275
|
-
const remainingAccounts = this.healthCheckRemainingAccounts
|
289
|
+
const remainingAccounts = this.healthCheckRemainingAccounts;
|
276
290
|
if (
|
277
291
|
!remainingAccounts.find(
|
278
292
|
(x) =>
|
@@ -286,6 +300,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
286
300
|
]
|
287
301
|
);
|
288
302
|
}
|
303
|
+
|
289
304
|
return lendingAccountBorrow(this.umi, {
|
290
305
|
amount: args.fields[0],
|
291
306
|
signer: this.signer,
|
@@ -299,7 +314,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
299
314
|
bankLiquidityVaultAuthority: publicKey(
|
300
315
|
this.marginfiDebtAccounts.vaultAuthority
|
301
316
|
),
|
302
|
-
}).addRemainingAccounts(remainingAccounts);
|
317
|
+
}).addRemainingAccounts(composeRemainingAccounts(remainingAccounts));
|
303
318
|
}
|
304
319
|
case "Repay": {
|
305
320
|
return lendingAccountRepay(this.umi, {
|
@@ -332,7 +347,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
332
347
|
bankLiquidityVaultAuthority: publicKey(
|
333
348
|
this.marginfiSupplyAccounts.vaultAuthority
|
334
349
|
),
|
335
|
-
}).addRemainingAccounts(
|
350
|
+
}).addRemainingAccounts(
|
351
|
+
composeRemainingAccounts(this.healthCheckRemainingAccounts)
|
352
|
+
);
|
336
353
|
}
|
337
354
|
}
|
338
355
|
}
|
@@ -138,7 +138,7 @@ export class MarginfiSolautoPositionEx extends SolautoPositionEx {
|
|
138
138
|
getBankLiquidityUsedBaseUnit(this.supplyBank, false),
|
139
139
|
this.supplyMintInfo.decimals
|
140
140
|
);
|
141
|
-
return Math.min(
|
141
|
+
return Math.min(deposits - borrows, this.totalSupply) * this.supplyPrice()!;
|
142
142
|
}
|
143
143
|
|
144
144
|
async refreshPositionState(priceType?: PriceType): Promise<void> {
|
@@ -126,13 +126,6 @@ export function retryWithExponentialBackoff<T>(
|
|
126
126
|
.catch((error: Error) => {
|
127
127
|
attemptNum++;
|
128
128
|
|
129
|
-
console.log(error.name, error.message);
|
130
|
-
console.log(
|
131
|
-
errorsToThrow?.length,
|
132
|
-
(errorsToThrow ?? []).some(
|
133
|
-
(errorType) => error instanceof errorType
|
134
|
-
)
|
135
|
-
);
|
136
129
|
if (
|
137
130
|
errorsToThrow?.length &&
|
138
131
|
errorsToThrow.some((errorType) => error instanceof errorType)
|
@@ -224,3 +224,16 @@ export function marginfiAccountEmpty(marginfiAccount: MarginfiAccount) {
|
|
224
224
|
) === undefined
|
225
225
|
);
|
226
226
|
}
|
227
|
+
|
228
|
+
export function composeRemainingAccounts(accs: AccountMeta[]): AccountMeta[] {
|
229
|
+
const banksAndOracles: [AccountMeta, AccountMeta][] = accs.reduce(
|
230
|
+
(acc: [AccountMeta, AccountMeta][], _, i) =>
|
231
|
+
i % 2 === 0 ? [...acc, [accs[i], accs[i + 1]]] : acc,
|
232
|
+
[]
|
233
|
+
);
|
234
|
+
return banksAndOracles
|
235
|
+
.sort((a, b) =>
|
236
|
+
b[0].pubkey.toString().localeCompare(a[0].pubkey.toString())
|
237
|
+
)
|
238
|
+
.flat();
|
239
|
+
}
|
package/src/utils/numberUtils.ts
CHANGED
@@ -8,6 +8,8 @@ import {
|
|
8
8
|
import { PositionState, PriceType } from "../generated";
|
9
9
|
import { RoundAction } from "../types";
|
10
10
|
import { safeGetPrice } from "./priceUtils";
|
11
|
+
import { StrategyType, strategyType } from "./stringUtils";
|
12
|
+
import { getDebtAdjustment } from "../services";
|
11
13
|
|
12
14
|
export function calcNetWorthUsd(state?: PositionState) {
|
13
15
|
return fromRoundedUsdValue(state?.netWorth.baseAmountUsdValue ?? BigInt(0));
|
@@ -215,3 +217,32 @@ export function realtimeUsdToEmaUsd(
|
|
215
217
|
safeGetPrice(mint, PriceType.Ema)!
|
216
218
|
);
|
217
219
|
}
|
220
|
+
|
221
|
+
export function boostSettingToLeverageFactor(
|
222
|
+
supplyMint: PublicKey,
|
223
|
+
debtMint: PublicKey,
|
224
|
+
boostToBps: number,
|
225
|
+
liqThresholdBps: number
|
226
|
+
) {
|
227
|
+
const strategy = strategyType(supplyMint, debtMint);
|
228
|
+
const supplyUsd = 100;
|
229
|
+
const debtUsd = getDebtAdjustment(
|
230
|
+
liqThresholdBps,
|
231
|
+
{ supplyUsd: 100, debtUsd: 0 },
|
232
|
+
boostToBps
|
233
|
+
).debtAdjustmentUsd;
|
234
|
+
return getLeverageFactor(strategy, supplyUsd + debtUsd, debtUsd);
|
235
|
+
}
|
236
|
+
|
237
|
+
export function getLeverageFactor(
|
238
|
+
strategyType: StrategyType,
|
239
|
+
supplyUsd: number,
|
240
|
+
debtUsd: number
|
241
|
+
): number {
|
242
|
+
return (
|
243
|
+
(strategyType === "Long" || strategyType === "Ratio"
|
244
|
+
? supplyUsd
|
245
|
+
: debtUsd) /
|
246
|
+
(supplyUsd - debtUsd)
|
247
|
+
);
|
248
|
+
}
|
@@ -22,6 +22,7 @@ import {
|
|
22
22
|
closeSolautoPosition,
|
23
23
|
getMarginfiAccounts,
|
24
24
|
ClientTransactionsManager,
|
25
|
+
ProgramEnv,
|
25
26
|
} from "../../src";
|
26
27
|
|
27
28
|
export async function e2eTransactionTest(
|
@@ -29,13 +30,15 @@ export async function e2eTransactionTest(
|
|
29
30
|
testProgram: boolean,
|
30
31
|
lendingPlatform: LendingPlatform,
|
31
32
|
withFlashLoan: boolean,
|
32
|
-
showLogs?: boolean
|
33
|
+
showLogs?: boolean,
|
34
|
+
lpEnv?: ProgramEnv
|
33
35
|
) {
|
34
36
|
const client = getClient(lendingPlatform, {
|
35
37
|
signer,
|
36
38
|
showLogs,
|
37
39
|
rpcUrl: LOCAL_IRONFORGE_API_URL,
|
38
40
|
programId: testProgram ? SOLAUTO_TEST_PROGRAM : SOLAUTO_PROD_PROGRAM,
|
41
|
+
lpEnv,
|
39
42
|
});
|
40
43
|
|
41
44
|
const supplyMint = new PublicKey(NATIVE_MINT);
|
@@ -43,7 +46,7 @@ export async function e2eTransactionTest(
|
|
43
46
|
|
44
47
|
await client.initializeNewSolautoPosition({
|
45
48
|
positionId: 1,
|
46
|
-
lpPoolAccount: getMarginfiAccounts().defaultGroup,
|
49
|
+
lpPoolAccount: getMarginfiAccounts(lpEnv).defaultGroup,
|
47
50
|
supplyMint,
|
48
51
|
debtMint,
|
49
52
|
});
|
@@ -1,11 +1,13 @@
|
|
1
1
|
import { describe, it } from "mocha";
|
2
|
-
import { LendingPlatform } from "../../src";
|
2
|
+
import { LendingPlatform, ProgramEnv } from "../../src";
|
3
3
|
import { setupTest } from "../shared";
|
4
4
|
import { e2eTransactionTest } from "./shared";
|
5
5
|
|
6
6
|
describe("Solauto Marginfi tests", async () => {
|
7
7
|
const signer = setupTest();
|
8
8
|
const testProgram = false;
|
9
|
+
const showLogs = false;
|
10
|
+
const lpEnv: ProgramEnv = "Prod";
|
9
11
|
|
10
12
|
it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
|
11
13
|
await e2eTransactionTest(
|
@@ -13,7 +15,8 @@ describe("Solauto Marginfi tests", async () => {
|
|
13
15
|
testProgram,
|
14
16
|
LendingPlatform.Marginfi,
|
15
17
|
false,
|
16
|
-
|
18
|
+
showLogs,
|
19
|
+
lpEnv
|
17
20
|
);
|
18
21
|
});
|
19
22
|
|
@@ -23,7 +26,8 @@ describe("Solauto Marginfi tests", async () => {
|
|
23
26
|
testProgram,
|
24
27
|
LendingPlatform.Marginfi,
|
25
28
|
true,
|
26
|
-
|
29
|
+
showLogs,
|
30
|
+
lpEnv
|
27
31
|
);
|
28
32
|
});
|
29
33
|
});
|