@haven-fi/solauto-sdk 1.0.668 → 1.0.669
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/rebalance/rebalanceTxBuilder.js +1 -1
- package/dist/solautoPosition/positionUtils.d.ts.map +1 -1
- package/dist/solautoPosition/solautoPositionEx.d.ts +3 -3
- package/dist/solautoPosition/solautoPositionEx.d.ts.map +1 -1
- package/dist/solautoPosition/solautoPositionEx.js +14 -8
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/marginfi/data.d.ts +41 -0
- package/dist/utils/marginfi/data.d.ts.map +1 -0
- package/dist/utils/{marginfiUtils.js → marginfi/data.js} +8 -145
- package/dist/utils/marginfi/general.d.ts +27 -0
- package/dist/utils/marginfi/general.d.ts.map +1 -0
- package/dist/utils/marginfi/general.js +146 -0
- package/dist/utils/marginfi/index.d.ts +3 -0
- package/dist/utils/marginfi/index.d.ts.map +1 -0
- package/dist/utils/marginfi/index.js +18 -0
- package/dist/utils/solanaUtils.js +3 -3
- package/dist/utils/solautoUtils.d.ts.map +1 -1
- package/dist/utils/solautoUtils.js +4 -4
- package/local/txSandbox.ts +3 -3
- package/package.json +1 -1
- package/src/services/rebalance/rebalanceTxBuilder.ts +1 -1
- package/src/solautoPosition/positionUtils.ts +0 -1
- package/src/solautoPosition/solautoPositionEx.ts +24 -9
- package/src/utils/index.ts +1 -1
- package/src/utils/{marginfiUtils.ts → marginfi/data.ts} +10 -220
- package/src/utils/marginfi/general.ts +226 -0
- package/src/utils/marginfi/index.ts +2 -0
- package/src/utils/solanaUtils.ts +2 -2
- package/src/utils/solautoUtils.ts +1 -4
- package/tests/transactions/shared.ts +3 -1
- package/tests/transactions/solautoMarginfi.ts +3 -1
- package/dist/utils/marginfiUtils.d.ts +0 -62
- package/dist/utils/marginfiUtils.d.ts.map +0 -1
@@ -119,7 +119,7 @@ class RebalanceTxBuilder {
|
|
119
119
|
if (!rebalanceValues) {
|
120
120
|
return undefined;
|
121
121
|
}
|
122
|
-
if (!this.client.pos.
|
122
|
+
if (!this.client.pos.rebalance.validRealtimePricesBoost(rebalanceValues.debtAdjustmentUsd)) {
|
123
123
|
this.priceType = generated_1.PriceType.Ema;
|
124
124
|
rebalanceValues = this.getRebalanceValues();
|
125
125
|
if (!rebalanceValues) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"positionUtils.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/positionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAK/C,OAAO,EAEL,aAAa,EAGb,yBAAyB,EACzB,gCAAgC,EACjC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EASf,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,kBAAkB,EAElB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;
|
1
|
+
{"version":3,"file":"positionUtils.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/positionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAK/C,OAAO,EAEL,aAAa,EAGb,yBAAyB,EACzB,gCAAgC,EACjC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EASf,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,kBAAkB,EAElB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAG7B,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,gCAAgC,GACzC,yBAAyB,CAQ3B;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,SAAS,EAAE,GACtB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA4B9B;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,EACpB,UAAU,CAAC,EAAE,kBAAkB,EAC/B,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,iBAAiB,CAAC,CAoC5B;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,aAAa,CAgEf"}
|
@@ -41,7 +41,7 @@ export declare abstract class SolautoPositionEx {
|
|
41
41
|
private readonly firstState;
|
42
42
|
private _supplyPrice?;
|
43
43
|
private _debtPrice?;
|
44
|
-
|
44
|
+
rebalance: PositionRebalanceHelper;
|
45
45
|
constructor(args: PositionExArgs);
|
46
46
|
abstract lendingPool(): Promise<PublicKey>;
|
47
47
|
get exists(): boolean;
|
@@ -83,7 +83,7 @@ export declare abstract class SolautoPositionEx {
|
|
83
83
|
abstract maxLtvAndLiqThresholdBps(): Promise<[number, number]>;
|
84
84
|
abstract priceOracles(): Promise<PublicKey[]>;
|
85
85
|
get memecoinPosition(): boolean | undefined;
|
86
|
-
eligibleForRebalance(bpsDistanceThreshold?: number): RebalanceAction | undefined;
|
86
|
+
eligibleForRebalance(bpsDistanceThreshold?: number, skipExtraChecks?: boolean): RebalanceAction | undefined;
|
87
87
|
eligibleForRefresh(): boolean;
|
88
88
|
abstract refreshPositionState(priceType?: PriceType): Promise<void>;
|
89
89
|
utilizationRateBpsDrift(priceType?: PriceType): Promise<number>;
|
@@ -102,7 +102,7 @@ declare class PositionRebalanceHelper {
|
|
102
102
|
private sufficientLiquidityToBoost;
|
103
103
|
validRealtimePricesBoost(debtAdjustmentUsd: number): boolean;
|
104
104
|
private validBoostFromHere;
|
105
|
-
eligibleForRebalance(bpsDistanceThreshold: number): RebalanceAction | undefined;
|
105
|
+
eligibleForRebalance(bpsDistanceThreshold: number, skipExtraChecks?: boolean): RebalanceAction | undefined;
|
106
106
|
}
|
107
107
|
export {};
|
108
108
|
//# sourceMappingURL=solautoPositionEx.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/solautoPositionEx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAK/C,OAAO,EACL,WAAW,EAEX,eAAe,EACf,aAAa,EACb,SAAS,EACT,eAAe,EACf,yBAAyB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAOL,cAAc,EAkBf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAMvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,UAAU,qBAAsB,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC9D,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,8BAAsB,iBAAiB;IAC9B,GAAG,EAAG,GAAG,CAAC;IACjB,SAAS,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAEnC,SAAS,EAAG,SAAS,CAAC;IACtB,eAAe,EAAG,eAAe,CAAC;IAClC,UAAU,EAAG,MAAM,CAAC;IACpB,SAAS,EAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,KAAK,EAAG,qBAAqB,CAAC;IACxC,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,CAAa;IAC9B,aAAa,CAAC,EAAE,SAAS,CAAa;IAC7C,SAAS,CAAC,KAAK,EAAG,UAAU,CAAC;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAY;IAChC,OAAO,CAAC,SAAS,CAAC,CAAY;IAE9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAE5C,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAS;IAErB,
|
1
|
+
{"version":3,"file":"solautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/solautoPositionEx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAK/C,OAAO,EACL,WAAW,EAEX,eAAe,EACf,aAAa,EACb,SAAS,EACT,eAAe,EACf,yBAAyB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAOL,cAAc,EAkBf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAMvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,UAAU,qBAAsB,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC9D,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,8BAAsB,iBAAiB;IAC9B,GAAG,EAAG,GAAG,CAAC;IACjB,SAAS,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAEnC,SAAS,EAAG,SAAS,CAAC;IACtB,eAAe,EAAG,eAAe,CAAC;IAClC,UAAU,EAAG,MAAM,CAAC;IACpB,SAAS,EAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,KAAK,EAAG,qBAAqB,CAAC;IACxC,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,CAAa;IAC9B,aAAa,CAAC,EAAE,SAAS,CAAa;IAC7C,SAAS,CAAC,KAAK,EAAG,UAAU,CAAC;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAY;IAChC,OAAO,CAAC,SAAS,CAAC,CAAY;IAE9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAE5C,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAS;IAErB,SAAS,EAAG,uBAAuB,CAAC;gBAE/B,IAAI,EAAE,cAAc;IA8BhC,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAE1C,IAAI,MAAM,YAET;IAED,IAAI,WAAW,YAEd;IAED,IAAI,YAAY,oDAEf;IAED,IAAI,YAAY,WAEf;IAED,qBAAqB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM;IAQpD,SAAS,KAAK,IAAI,IAAI,qBAAqB,CAE1C;IAED,IAAI,KAAK,IAAI,aAAa,CAEzB;IAED,IAAI,QAAQ,IAAI,yBAAyB,GAAG,SAAS,CAEpD;IAED,cAAc,CAAC,QAAQ,EAAE,yBAAyB;IAIlD,IAAI,GAAG,IAAI,WAAW,GAAG,SAAS,CAEjC;IAED,SAAS,CAAC,GAAG,EAAE,WAAW;IAI1B,IAAI,UAAU,IAAI,SAAS,CAE1B;IAED,IAAI,cAAc,IAAI,SAAS,CAE9B;IAED,IAAI,QAAQ,IAAI,SAAS,CAExB;IAED,IAAI,YAAY,IAAI,SAAS,CAE5B;IAED,IAAI,UAAU,WAEb;IAED,IAAI,aAAa,WAEhB;IAED,IAAI,YAAY,WAEf;IAED,IAAI,UAAU,WAEb;IAED,IAAI,aAAa,WAEhB;IAED,IAAI,YAAY,WAKf;IAED,IAAI,eAAe,WAElB;IAED,IAAI,QAAQ,WAEX;IAED,WAAW,CAAC,SAAS,CAAC,EAAE,SAAS;IAIjC,IAAI,WAAW,WAEd;IAED,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS;IAO/B,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,SAAS;IAI3C,IAAI,SAAS,WAEZ;IAED,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS;IAO7B,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS;IAIzC,IAAI,0BAA0B,WAE7B;IAED,IAAI,6BAA6B,WAEhC;IAED,IAAI,2BAA2B,WAE9B;IAED,IAAI,sBAAsB,WAEzB;IAED,IAAI,yBAAyB,WAE5B;IAED,QAAQ,KAAK,wBAAwB,IAAI,MAAM,CAAC;IAEhD,QAAQ,CAAC,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,QAAQ,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAE7C,IAAI,gBAAgB,wBAEnB;IAED,oBAAoB,CAClB,oBAAoB,GAAE,MAAU,EAChC,eAAe,CAAC,EAAE,OAAO,GACxB,eAAe,GAAG,SAAS;IAO9B,kBAAkB,IAAI,OAAO;IAQ7B,QAAQ,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAE7D,uBAAuB,CAAC,SAAS,CAAC,EAAE,SAAS;IAiBnD,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IASvD,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAI/B,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IASjD,eAAe,CAAC,KAAK,EAAE,MAAM;IAI7B,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM;IAUnC,wBAAwB,CACtB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,SAAS;IASvB,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,2BAA2B,CAAC,EAAE,MAAM;IA0BhC,mBAAmB;CAM1B;AAED,cAAM,uBAAuB;IACf,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,iBAAiB;IAE1C,OAAO,CAAC,0BAA0B;IA0BlC,wBAAwB,CAAC,iBAAiB,EAAE,MAAM;IAqBlD,OAAO,CAAC,kBAAkB;IAwB1B,oBAAoB,CAClB,oBAAoB,EAAE,MAAM,EAC5B,eAAe,CAAC,EAAE,OAAO,GACxB,eAAe,GAAG,SAAS;CAwB/B"}
|
@@ -27,7 +27,7 @@ class SolautoPositionEx {
|
|
27
27
|
this.lpEnv = args.customArgs?.lpEnv ?? "Prod";
|
28
28
|
this._data = args.data;
|
29
29
|
this.firstState = { ...args.data.state };
|
30
|
-
this.
|
30
|
+
this.rebalance = new PositionRebalanceHelper(this);
|
31
31
|
}
|
32
32
|
get exists() {
|
33
33
|
return this._data.position !== undefined;
|
@@ -143,8 +143,8 @@ class SolautoPositionEx {
|
|
143
143
|
get memecoinPosition() {
|
144
144
|
return (0, utils_1.tokenInfo)(this.supplyMint).isMeme || (0, utils_1.tokenInfo)(this.debtMint).isMeme;
|
145
145
|
}
|
146
|
-
eligibleForRebalance(bpsDistanceThreshold = 0) {
|
147
|
-
return this.
|
146
|
+
eligibleForRebalance(bpsDistanceThreshold = 0, skipExtraChecks) {
|
147
|
+
return this.rebalance.eligibleForRebalance(bpsDistanceThreshold, skipExtraChecks);
|
148
148
|
}
|
149
149
|
eligibleForRefresh() {
|
150
150
|
if (this.selfManaged)
|
@@ -227,14 +227,20 @@ class PositionRebalanceHelper {
|
|
227
227
|
return postRebalanceLiqUtilRate <= this.pos.maxBoostToBps;
|
228
228
|
}
|
229
229
|
validBoostFromHere() {
|
230
|
+
const realtimeSupplyUsd = this.pos.supplyUsd(generated_1.PriceType.Realtime);
|
231
|
+
const realtimeDebtUsd = this.pos.debtUsd(generated_1.PriceType.Realtime);
|
232
|
+
if (realtimeSupplyUsd === this.pos.supplyUsd(generated_1.PriceType.Ema) &&
|
233
|
+
realtimeDebtUsd === this.pos.debtUsd(generated_1.PriceType.Ema)) {
|
234
|
+
return true;
|
235
|
+
}
|
230
236
|
const { debtAdjustmentUsd } = (0, rebalance_1.getDebtAdjustment)(this.pos.state.liqThresholdBps, {
|
231
|
-
supplyUsd:
|
232
|
-
debtUsd:
|
237
|
+
supplyUsd: realtimeSupplyUsd,
|
238
|
+
debtUsd: realtimeDebtUsd,
|
233
239
|
}, this.pos.boostToBps, { solauto: 25, lpBorrow: 0, flashLoan: 0 } // Undershoot fees
|
234
240
|
);
|
235
241
|
return this.validRealtimePricesBoost(debtAdjustmentUsd);
|
236
242
|
}
|
237
|
-
eligibleForRebalance(bpsDistanceThreshold) {
|
243
|
+
eligibleForRebalance(bpsDistanceThreshold, skipExtraChecks) {
|
238
244
|
if (!this.pos.settings || !this.pos.supplyUsd()) {
|
239
245
|
return undefined;
|
240
246
|
}
|
@@ -244,8 +250,8 @@ class PositionRebalanceHelper {
|
|
244
250
|
return "repay";
|
245
251
|
}
|
246
252
|
else if (realtimeLiqUtilRateBps - this.pos.boostFromBps <= bpsDistanceThreshold &&
|
247
|
-
|
248
|
-
|
253
|
+
(!skipExtraChecks ||
|
254
|
+
(this.validBoostFromHere() && this.sufficientLiquidityToBoost()))) {
|
249
255
|
return "boost";
|
250
256
|
}
|
251
257
|
return undefined;
|
package/dist/utils/index.d.ts
CHANGED
@@ -3,7 +3,7 @@ export * from "./generalUtils";
|
|
3
3
|
export * from "./instructionUtils";
|
4
4
|
export * from "./jitoUtils";
|
5
5
|
export * from "./jupiterUtils";
|
6
|
-
export * from "./
|
6
|
+
export * from "./marginfi";
|
7
7
|
export * from "./numberUtils";
|
8
8
|
export * from "./solautoUtils";
|
9
9
|
export * from "./solanaUtils";
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
|
package/dist/utils/index.js
CHANGED
@@ -19,7 +19,7 @@ __exportStar(require("./generalUtils"), exports);
|
|
19
19
|
__exportStar(require("./instructionUtils"), exports);
|
20
20
|
__exportStar(require("./jitoUtils"), exports);
|
21
21
|
__exportStar(require("./jupiterUtils"), exports);
|
22
|
-
__exportStar(require("./
|
22
|
+
__exportStar(require("./marginfi"), exports);
|
23
23
|
__exportStar(require("./numberUtils"), exports);
|
24
24
|
__exportStar(require("./solautoUtils"), exports);
|
25
25
|
__exportStar(require("./solanaUtils"), exports);
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
2
|
+
import { Umi } from "@metaplex-foundation/umi";
|
3
|
+
import { ProgramEnv } from "../../types";
|
4
|
+
import { PositionState, PriceType } from "../../generated";
|
5
|
+
import { Bank, MarginfiAccount } from "../../marginfi-sdk";
|
6
|
+
import { ContextUpdates } from "../solautoUtils";
|
7
|
+
export declare function getMarginfiMaxLtvAndLiqThresholdBps(umi: Umi, marginfiGroup: PublicKey, supply: {
|
8
|
+
mint: PublicKey;
|
9
|
+
bank?: Bank | null;
|
10
|
+
}, debt: {
|
11
|
+
mint: PublicKey;
|
12
|
+
bank?: Bank | null;
|
13
|
+
}, supplyPrice?: number): Promise<[number, number]>;
|
14
|
+
export declare function getEmptyMarginfiAccountsByAuthority(umi: Umi, authority: PublicKey): Promise<MarginfiAccount[]>;
|
15
|
+
export declare function getAllMarginfiAccountsByAuthority(umi: Umi, authority: PublicKey, group?: PublicKey, compatibleWithSolauto?: boolean): Promise<{
|
16
|
+
marginfiAccount: PublicKey;
|
17
|
+
supplyMint?: PublicKey;
|
18
|
+
debtMint?: PublicKey;
|
19
|
+
}[]>;
|
20
|
+
export declare function getBankLiquidityAvailableBaseUnit(bank: Bank | null, availableToDeposit: boolean): bigint;
|
21
|
+
interface BankSelection {
|
22
|
+
mint?: PublicKey;
|
23
|
+
banksCache?: BanksCache;
|
24
|
+
}
|
25
|
+
type BanksCache = {
|
26
|
+
[group: string]: {
|
27
|
+
[mint: string]: Bank;
|
28
|
+
};
|
29
|
+
};
|
30
|
+
export declare function getMarginfiAccountPositionState(umi: Umi, lpUserAccount: {
|
31
|
+
pk?: PublicKey;
|
32
|
+
data?: MarginfiAccount | null;
|
33
|
+
}, marginfiGroup?: PublicKey, supply?: BankSelection, debt?: BankSelection, programEnv?: ProgramEnv, contextUpdates?: ContextUpdates, priceType?: PriceType): Promise<{
|
34
|
+
supplyBank: Bank | null;
|
35
|
+
debtBank: Bank | null;
|
36
|
+
state: PositionState;
|
37
|
+
} | undefined>;
|
38
|
+
export declare function calculateAnnualAPYs(bank: Bank): [number, number];
|
39
|
+
export declare function getUpToDateShareValues(bank: Bank): [number, number];
|
40
|
+
export {};
|
41
|
+
//# sourceMappingURL=data.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/utils/marginfi/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAI1D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAsB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO/E,OAAO,EACL,IAAI,EAGJ,eAAe,EAIhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAajD,wBAAsB,mCAAmC,CACvD,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE;IACN,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,IAAI,EAAE;IACJ,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA8C3B;AAED,wBAAsB,mCAAmC,CACvD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,eAAe,EAAE,CAAC,CA6B5B;AAED,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,KAAK,CAAC,EAAE,SAAS,EACjB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CACR;IAAE,eAAe,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,EAAE,CAC/E,CAyDA;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,kBAAkB,EAAE,OAAO,UAqB5B;AA0DD,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,KAAK,UAAU,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,CAAC;AAwBhE,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,GAAG,EACR,aAAa,EAAE;IAAE,EAAE,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,EAChE,aAAa,CAAC,EAAE,SAAS,EACzB,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,aAAa,EACpB,UAAU,CAAC,EAAE,UAAU,EACvB,cAAc,CAAC,EAAE,cAAc,EAC/B,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CACN;IAAE,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GACxE,SAAS,CACZ,CA2KA;AA+DD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,oBAU7C;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBnE"}
|
@@ -1,13 +1,5 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.createDynamicMarginfiProgram = createDynamicMarginfiProgram;
|
4
|
-
exports.umiWithMarginfiProgram = umiWithMarginfiProgram;
|
5
|
-
exports.getAllBankRelatedAccounts = getAllBankRelatedAccounts;
|
6
|
-
exports.fetchBankAddresses = fetchBankAddresses;
|
7
|
-
exports.getMarginfiPriceOracle = getMarginfiPriceOracle;
|
8
|
-
exports.findMarginfiAccounts = findMarginfiAccounts;
|
9
|
-
exports.getRemainingAccountsForMarginfiHealthCheck = getRemainingAccountsForMarginfiHealthCheck;
|
10
|
-
exports.calcMarginfiMaxLtvAndLiqThresholdBps = calcMarginfiMaxLtvAndLiqThresholdBps;
|
11
3
|
exports.getMarginfiMaxLtvAndLiqThresholdBps = getMarginfiMaxLtvAndLiqThresholdBps;
|
12
4
|
exports.getEmptyMarginfiAccountsByAuthority = getEmptyMarginfiAccountsByAuthority;
|
13
5
|
exports.getAllMarginfiAccountsByAuthority = getAllMarginfiAccountsByAuthority;
|
@@ -15,139 +7,15 @@ exports.getBankLiquidityAvailableBaseUnit = getBankLiquidityAvailableBaseUnit;
|
|
15
7
|
exports.getMarginfiAccountPositionState = getMarginfiAccountPositionState;
|
16
8
|
exports.calculateAnnualAPYs = calculateAnnualAPYs;
|
17
9
|
exports.getUpToDateShareValues = getUpToDateShareValues;
|
18
|
-
exports.marginfiAccountEmpty = marginfiAccountEmpty;
|
19
10
|
const web3_js_1 = require("@solana/web3.js");
|
20
11
|
const umi_1 = require("@metaplex-foundation/umi");
|
21
12
|
const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
|
22
|
-
const constants_1 = require("
|
23
|
-
const marginfi_sdk_1 = require("
|
24
|
-
const priceUtils_1 = require("
|
25
|
-
const generalUtils_1 = require("
|
26
|
-
const numberUtils_1 = require("
|
27
|
-
const
|
28
|
-
const pythUtils_1 = require("./pythUtils");
|
29
|
-
const solanaUtils_1 = require("./solanaUtils");
|
30
|
-
function createDynamicMarginfiProgram(env) {
|
31
|
-
return {
|
32
|
-
name: "marginfi",
|
33
|
-
publicKey: (0, umi_1.publicKey)((0, constants_1.getMarginfiAccounts)(env ?? "Prod").program),
|
34
|
-
getErrorFromCode(code, cause) {
|
35
|
-
return (0, marginfi_sdk_1.getMarginfiErrorFromCode)(code, this, cause);
|
36
|
-
},
|
37
|
-
getErrorFromName(name, cause) {
|
38
|
-
return (0, marginfi_sdk_1.getMarginfiErrorFromName)(name, this, cause);
|
39
|
-
},
|
40
|
-
isOnCluster() {
|
41
|
-
return true;
|
42
|
-
},
|
43
|
-
};
|
44
|
-
}
|
45
|
-
function umiWithMarginfiProgram(umi, marginfiEnv) {
|
46
|
-
return umi.use({
|
47
|
-
install(umi) {
|
48
|
-
umi.programs.add(createDynamicMarginfiProgram(marginfiEnv ?? "Prod"), false);
|
49
|
-
},
|
50
|
-
});
|
51
|
-
}
|
52
|
-
async function getAllBankRelatedAccounts(umi, bankAccountsMap) {
|
53
|
-
const banks = Object.values(bankAccountsMap).flatMap((group) => Object.values(group).map((accounts) => accounts.bank));
|
54
|
-
const banksData = await (0, marginfi_sdk_1.safeFetchAllBank)(umi, banks.map((x) => (0, umi_1.publicKey)(x)));
|
55
|
-
const oracles = banksData
|
56
|
-
.map((bank) => {
|
57
|
-
const oracleKey = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.config.oracleKeys[0]);
|
58
|
-
return bank.config.oracleSetup === marginfi_sdk_1.OracleSetup.PythPushOracle
|
59
|
-
? [
|
60
|
-
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.PYTH_SPONSORED_SHARD_ID),
|
61
|
-
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.MARGINFI_SPONSORED_SHARD_ID),
|
62
|
-
]
|
63
|
-
: [oracleKey];
|
64
|
-
})
|
65
|
-
.flat()
|
66
|
-
.map((x) => x.toString());
|
67
|
-
const otherAccounts = Object.entries(bankAccountsMap).flatMap(([groupName, tokenMap]) => Object.values(tokenMap).flatMap((accounts) => [
|
68
|
-
groupName,
|
69
|
-
accounts.liquidityVault,
|
70
|
-
accounts.vaultAuthority,
|
71
|
-
]));
|
72
|
-
return Array.from(new Set([...banks, ...oracles, ...otherAccounts]))
|
73
|
-
.filter((x) => x !== web3_js_1.PublicKey.default.toString())
|
74
|
-
.map((x) => new web3_js_1.PublicKey(x));
|
75
|
-
}
|
76
|
-
async function fetchBankAddresses(umi, bankPk) {
|
77
|
-
const bank = await (0, marginfi_sdk_1.fetchBank)(umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(bankPk));
|
78
|
-
const liquidityVault = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.liquidityVault);
|
79
|
-
const vaultAuthority = (await (0, accountUtils_1.getTokenAccountData)(umi, liquidityVault))
|
80
|
-
?.owner;
|
81
|
-
const priceOracle = await getMarginfiPriceOracle(umi, { data: bank });
|
82
|
-
return {
|
83
|
-
bank: bankPk,
|
84
|
-
liquidityVault,
|
85
|
-
vaultAuthority,
|
86
|
-
priceOracle,
|
87
|
-
};
|
88
|
-
}
|
89
|
-
async function getMarginfiPriceOracle(umi, bank) {
|
90
|
-
if (!bank.data) {
|
91
|
-
bank.data = await (0, marginfi_sdk_1.fetchBank)(umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(bank.pk));
|
92
|
-
}
|
93
|
-
const oracleKey = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.data.config.oracleKeys[0]);
|
94
|
-
const priceOracle = bank.data.config.oracleSetup === marginfi_sdk_1.OracleSetup.PythPushOracle
|
95
|
-
? await (0, pythUtils_1.getMostUpToDatePythOracle)(umi, [
|
96
|
-
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.PYTH_SPONSORED_SHARD_ID),
|
97
|
-
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.MARGINFI_SPONSORED_SHARD_ID),
|
98
|
-
])
|
99
|
-
: oracleKey;
|
100
|
-
return priceOracle;
|
101
|
-
}
|
102
|
-
function findMarginfiAccounts(bank) {
|
103
|
-
const search = (bankAccounts) => {
|
104
|
-
for (const group in bankAccounts) {
|
105
|
-
for (const key in bankAccounts[group]) {
|
106
|
-
const account = bankAccounts[group][key];
|
107
|
-
if (account.bank.toString().toLowerCase() ===
|
108
|
-
bank.toString().toLowerCase()) {
|
109
|
-
return { ...account, mint: new web3_js_1.PublicKey(key) };
|
110
|
-
}
|
111
|
-
}
|
112
|
-
}
|
113
|
-
};
|
114
|
-
let res = search((0, constants_1.getMarginfiAccounts)("Prod").bankAccounts);
|
115
|
-
if (res) {
|
116
|
-
return res;
|
117
|
-
}
|
118
|
-
res = search((0, constants_1.getMarginfiAccounts)("Staging").bankAccounts);
|
119
|
-
if (res) {
|
120
|
-
return res;
|
121
|
-
}
|
122
|
-
throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
|
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
|
-
}
|
136
|
-
function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank, debtBank, supplyPrice) {
|
137
|
-
let maxLtv = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightInit.value) /
|
138
|
-
(0, numberUtils_1.bytesToI80F48)(debtBank.config.liabilityWeightInit.value);
|
139
|
-
const liqThreshold = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightMaint.value) /
|
140
|
-
(0, numberUtils_1.bytesToI80F48)(debtBank.config.liabilityWeightMaint.value);
|
141
|
-
const totalDepositedUsdValue = (0, numberUtils_1.fromBaseUnit)(BigInt(Math.round((0, numberUtils_1.bytesToI80F48)(supplyBank.totalAssetShares.value) *
|
142
|
-
(0, numberUtils_1.bytesToI80F48)(supplyBank.assetShareValue.value))), supplyBank.mintDecimals) * supplyPrice;
|
143
|
-
if (supplyBank.config.totalAssetValueInitLimit !== BigInt(0) &&
|
144
|
-
totalDepositedUsdValue > supplyBank.config.totalAssetValueInitLimit) {
|
145
|
-
const discount = Number(supplyBank.config.totalAssetValueInitLimit) /
|
146
|
-
totalDepositedUsdValue;
|
147
|
-
maxLtv = maxLtv * Number(discount);
|
148
|
-
}
|
149
|
-
return [(0, numberUtils_1.toBps)(maxLtv, "Floor"), (0, numberUtils_1.toBps)(liqThreshold, "Floor")];
|
150
|
-
}
|
13
|
+
const constants_1 = require("../../constants");
|
14
|
+
const marginfi_sdk_1 = require("../../marginfi-sdk");
|
15
|
+
const priceUtils_1 = require("../priceUtils");
|
16
|
+
const generalUtils_1 = require("../generalUtils");
|
17
|
+
const numberUtils_1 = require("../numberUtils");
|
18
|
+
const general_1 = require("./general");
|
151
19
|
async function getMarginfiMaxLtvAndLiqThresholdBps(umi, marginfiGroup, supply, debt, supplyPrice) {
|
152
20
|
if (!supply.bank && !(0, generalUtils_1.validPubkey)(supply.mint)) {
|
153
21
|
return [0, 0];
|
@@ -168,7 +36,7 @@ async function getMarginfiMaxLtvAndLiqThresholdBps(umi, marginfiGroup, supply, d
|
|
168
36
|
if (!debt.bank || debt.bank === null) {
|
169
37
|
return [0, 0];
|
170
38
|
}
|
171
|
-
return calcMarginfiMaxLtvAndLiqThresholdBps(supply.bank, debt.bank, supplyPrice);
|
39
|
+
return (0, general_1.calcMarginfiMaxLtvAndLiqThresholdBps)(supply.bank, debt.bank, supplyPrice);
|
172
40
|
}
|
173
41
|
async function getEmptyMarginfiAccountsByAuthority(umi, authority) {
|
174
42
|
const marginfiAccounts = await umi.rpc.getProgramAccounts(umi.programs.get("marginfi").publicKey, {
|
@@ -194,7 +62,7 @@ async function getEmptyMarginfiAccountsByAuthority(umi, authority) {
|
|
194
62
|
});
|
195
63
|
return marginfiAccounts
|
196
64
|
.map((x) => (0, marginfi_sdk_1.deserializeMarginfiAccount)(x))
|
197
|
-
.filter((x) => marginfiAccountEmpty(x));
|
65
|
+
.filter((x) => (0, general_1.marginfiAccountEmpty)(x));
|
198
66
|
}
|
199
67
|
async function getAllMarginfiAccountsByAuthority(umi, authority, group, compatibleWithSolauto) {
|
200
68
|
const marginfiAccounts = await umi.rpc.getProgramAccounts(umi.programs.get("marginfi").publicKey, {
|
@@ -452,8 +320,3 @@ function getUpToDateShareValues(bank) {
|
|
452
320
|
calcAccruedInterestPaymentPerPeriod(borrowingApr, timeDelta, (0, numberUtils_1.bytesToI80F48)(bank.liabilityShareValue.value)),
|
453
321
|
];
|
454
322
|
}
|
455
|
-
function marginfiAccountEmpty(marginfiAccount) {
|
456
|
-
return (marginfiAccount.lendingAccount.balances.find((x) => x.bankPk.toString() !== web3_js_1.PublicKey.default.toString() &&
|
457
|
-
((0, numberUtils_1.bytesToI80F48)(x.assetShares.value) > 0.000001 ||
|
458
|
-
(0, numberUtils_1.bytesToI80F48)(x.liabilityShares.value) > 0.000001)) === undefined);
|
459
|
-
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
2
|
+
import { AccountMeta, Program, Umi } from "@metaplex-foundation/umi";
|
3
|
+
import { ProgramEnv, MarginfiAssetAccounts } from "../../types";
|
4
|
+
import { MarginfiBankAccountsMap } from "../../constants";
|
5
|
+
import { Balance, Bank, MarginfiAccount } from "../../marginfi-sdk";
|
6
|
+
export declare function createDynamicMarginfiProgram(env?: ProgramEnv): Program;
|
7
|
+
export declare function umiWithMarginfiProgram(umi: Umi, marginfiEnv?: ProgramEnv): Umi;
|
8
|
+
export declare function getAllBankRelatedAccounts(umi: Umi, bankAccountsMap: MarginfiBankAccountsMap): Promise<PublicKey[]>;
|
9
|
+
export declare function fetchBankAddresses(umi: Umi, bankPk: PublicKey): Promise<{
|
10
|
+
bank: PublicKey;
|
11
|
+
liquidityVault: PublicKey;
|
12
|
+
vaultAuthority: PublicKey | undefined;
|
13
|
+
priceOracle: PublicKey;
|
14
|
+
}>;
|
15
|
+
export declare function getMarginfiPriceOracle(umi: Umi, bank: {
|
16
|
+
pk?: PublicKey;
|
17
|
+
data?: Bank;
|
18
|
+
}): Promise<PublicKey>;
|
19
|
+
interface AllMarginfiAssetAccounts extends MarginfiAssetAccounts {
|
20
|
+
mint: PublicKey;
|
21
|
+
}
|
22
|
+
export declare function findMarginfiAccounts(bank: PublicKey): AllMarginfiAssetAccounts;
|
23
|
+
export declare function getRemainingAccountsForMarginfiHealthCheck(umi: Umi, balance: Balance): Promise<AccountMeta[]>;
|
24
|
+
export declare function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank: Bank, debtBank: Bank, supplyPrice: number): [number, number];
|
25
|
+
export declare function marginfiAccountEmpty(marginfiAccount: MarginfiAccount): boolean;
|
26
|
+
export {};
|
27
|
+
//# sourceMappingURL=general.d.ts.map
|
@@ -0,0 +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,oBAAoB,CAAC;AAS5B,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"}
|
@@ -0,0 +1,146 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.createDynamicMarginfiProgram = createDynamicMarginfiProgram;
|
4
|
+
exports.umiWithMarginfiProgram = umiWithMarginfiProgram;
|
5
|
+
exports.getAllBankRelatedAccounts = getAllBankRelatedAccounts;
|
6
|
+
exports.fetchBankAddresses = fetchBankAddresses;
|
7
|
+
exports.getMarginfiPriceOracle = getMarginfiPriceOracle;
|
8
|
+
exports.findMarginfiAccounts = findMarginfiAccounts;
|
9
|
+
exports.getRemainingAccountsForMarginfiHealthCheck = getRemainingAccountsForMarginfiHealthCheck;
|
10
|
+
exports.calcMarginfiMaxLtvAndLiqThresholdBps = calcMarginfiMaxLtvAndLiqThresholdBps;
|
11
|
+
exports.marginfiAccountEmpty = marginfiAccountEmpty;
|
12
|
+
const web3_js_1 = require("@solana/web3.js");
|
13
|
+
const umi_1 = require("@metaplex-foundation/umi");
|
14
|
+
const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
|
15
|
+
const constants_1 = require("../../constants");
|
16
|
+
const marginfi_sdk_1 = require("../../marginfi-sdk");
|
17
|
+
const numberUtils_1 = require("../numberUtils");
|
18
|
+
const accountUtils_1 = require("../accountUtils");
|
19
|
+
const pythUtils_1 = require("../pythUtils");
|
20
|
+
const solanaUtils_1 = require("../solanaUtils");
|
21
|
+
function createDynamicMarginfiProgram(env) {
|
22
|
+
return {
|
23
|
+
name: "marginfi",
|
24
|
+
publicKey: (0, umi_1.publicKey)((0, constants_1.getMarginfiAccounts)(env ?? "Prod").program),
|
25
|
+
getErrorFromCode(code, cause) {
|
26
|
+
return (0, marginfi_sdk_1.getMarginfiErrorFromCode)(code, this, cause);
|
27
|
+
},
|
28
|
+
getErrorFromName(name, cause) {
|
29
|
+
return (0, marginfi_sdk_1.getMarginfiErrorFromName)(name, this, cause);
|
30
|
+
},
|
31
|
+
isOnCluster() {
|
32
|
+
return true;
|
33
|
+
},
|
34
|
+
};
|
35
|
+
}
|
36
|
+
function umiWithMarginfiProgram(umi, marginfiEnv) {
|
37
|
+
return umi.use({
|
38
|
+
install(umi) {
|
39
|
+
umi.programs.add(createDynamicMarginfiProgram(marginfiEnv ?? "Prod"), false);
|
40
|
+
},
|
41
|
+
});
|
42
|
+
}
|
43
|
+
async function getAllBankRelatedAccounts(umi, bankAccountsMap) {
|
44
|
+
const banks = Object.values(bankAccountsMap).flatMap((group) => Object.values(group).map((accounts) => accounts.bank));
|
45
|
+
const banksData = await (0, marginfi_sdk_1.safeFetchAllBank)(umi, banks.map((x) => (0, umi_1.publicKey)(x)));
|
46
|
+
const oracles = banksData
|
47
|
+
.map((bank) => {
|
48
|
+
const oracleKey = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.config.oracleKeys[0]);
|
49
|
+
return bank.config.oracleSetup === marginfi_sdk_1.OracleSetup.PythPushOracle
|
50
|
+
? [
|
51
|
+
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.PYTH_SPONSORED_SHARD_ID),
|
52
|
+
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.MARGINFI_SPONSORED_SHARD_ID),
|
53
|
+
]
|
54
|
+
: [oracleKey];
|
55
|
+
})
|
56
|
+
.flat()
|
57
|
+
.map((x) => x.toString());
|
58
|
+
const otherAccounts = Object.entries(bankAccountsMap).flatMap(([groupName, tokenMap]) => Object.values(tokenMap).flatMap((accounts) => [
|
59
|
+
groupName,
|
60
|
+
accounts.liquidityVault,
|
61
|
+
accounts.vaultAuthority,
|
62
|
+
]));
|
63
|
+
return Array.from(new Set([...banks, ...oracles, ...otherAccounts]))
|
64
|
+
.filter((x) => x !== web3_js_1.PublicKey.default.toString())
|
65
|
+
.map((x) => new web3_js_1.PublicKey(x));
|
66
|
+
}
|
67
|
+
async function fetchBankAddresses(umi, bankPk) {
|
68
|
+
const bank = await (0, marginfi_sdk_1.fetchBank)(umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(bankPk));
|
69
|
+
const liquidityVault = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.liquidityVault);
|
70
|
+
const vaultAuthority = (await (0, accountUtils_1.getTokenAccountData)(umi, liquidityVault))
|
71
|
+
?.owner;
|
72
|
+
const priceOracle = await getMarginfiPriceOracle(umi, { data: bank });
|
73
|
+
return {
|
74
|
+
bank: bankPk,
|
75
|
+
liquidityVault,
|
76
|
+
vaultAuthority,
|
77
|
+
priceOracle,
|
78
|
+
};
|
79
|
+
}
|
80
|
+
async function getMarginfiPriceOracle(umi, bank) {
|
81
|
+
if (!bank.data) {
|
82
|
+
bank.data = await (0, marginfi_sdk_1.fetchBank)(umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(bank.pk));
|
83
|
+
}
|
84
|
+
const oracleKey = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.data.config.oracleKeys[0]);
|
85
|
+
const priceOracle = bank.data.config.oracleSetup === marginfi_sdk_1.OracleSetup.PythPushOracle
|
86
|
+
? await (0, pythUtils_1.getMostUpToDatePythOracle)(umi, [
|
87
|
+
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.PYTH_SPONSORED_SHARD_ID),
|
88
|
+
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.MARGINFI_SPONSORED_SHARD_ID),
|
89
|
+
])
|
90
|
+
: oracleKey;
|
91
|
+
return priceOracle;
|
92
|
+
}
|
93
|
+
function findMarginfiAccounts(bank) {
|
94
|
+
const search = (bankAccounts) => {
|
95
|
+
for (const group in bankAccounts) {
|
96
|
+
for (const key in bankAccounts[group]) {
|
97
|
+
const account = bankAccounts[group][key];
|
98
|
+
if (account.bank.toString().toLowerCase() ===
|
99
|
+
bank.toString().toLowerCase()) {
|
100
|
+
return { ...account, mint: new web3_js_1.PublicKey(key) };
|
101
|
+
}
|
102
|
+
}
|
103
|
+
}
|
104
|
+
};
|
105
|
+
let res = search((0, constants_1.getMarginfiAccounts)("Prod").bankAccounts);
|
106
|
+
if (res) {
|
107
|
+
return res;
|
108
|
+
}
|
109
|
+
res = search((0, constants_1.getMarginfiAccounts)("Staging").bankAccounts);
|
110
|
+
if (res) {
|
111
|
+
return res;
|
112
|
+
}
|
113
|
+
throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
|
114
|
+
}
|
115
|
+
async function getRemainingAccountsForMarginfiHealthCheck(umi, balance) {
|
116
|
+
if (!balance.active) {
|
117
|
+
return [];
|
118
|
+
}
|
119
|
+
const priceOracle = await getMarginfiPriceOracle(umi, {
|
120
|
+
pk: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(balance.bankPk),
|
121
|
+
});
|
122
|
+
return [
|
123
|
+
(0, solanaUtils_1.getAccountMeta)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(balance.bankPk)),
|
124
|
+
(0, solanaUtils_1.getAccountMeta)(priceOracle),
|
125
|
+
];
|
126
|
+
}
|
127
|
+
function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank, debtBank, supplyPrice) {
|
128
|
+
let maxLtv = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightInit.value) /
|
129
|
+
(0, numberUtils_1.bytesToI80F48)(debtBank.config.liabilityWeightInit.value);
|
130
|
+
const liqThreshold = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightMaint.value) /
|
131
|
+
(0, numberUtils_1.bytesToI80F48)(debtBank.config.liabilityWeightMaint.value);
|
132
|
+
const totalDepositedUsdValue = (0, numberUtils_1.fromBaseUnit)(BigInt(Math.round((0, numberUtils_1.bytesToI80F48)(supplyBank.totalAssetShares.value) *
|
133
|
+
(0, numberUtils_1.bytesToI80F48)(supplyBank.assetShareValue.value))), supplyBank.mintDecimals) * supplyPrice;
|
134
|
+
if (supplyBank.config.totalAssetValueInitLimit !== BigInt(0) &&
|
135
|
+
totalDepositedUsdValue > supplyBank.config.totalAssetValueInitLimit) {
|
136
|
+
const discount = Number(supplyBank.config.totalAssetValueInitLimit) /
|
137
|
+
totalDepositedUsdValue;
|
138
|
+
maxLtv = maxLtv * Number(discount);
|
139
|
+
}
|
140
|
+
return [(0, numberUtils_1.toBps)(maxLtv, "Floor"), (0, numberUtils_1.toBps)(liqThreshold, "Floor")];
|
141
|
+
}
|
142
|
+
function marginfiAccountEmpty(marginfiAccount) {
|
143
|
+
return (marginfiAccount.lendingAccount.balances.find((x) => x.bankPk.toString() !== web3_js_1.PublicKey.default.toString() &&
|
144
|
+
((0, numberUtils_1.bytesToI80F48)(x.assetShares.value) > 0.000001 ||
|
145
|
+
(0, numberUtils_1.bytesToI80F48)(x.liabilityShares.value) > 0.000001)) === undefined);
|
146
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/marginfi/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC"}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
|
+
};
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
+
__exportStar(require("./data"), exports);
|
18
|
+
__exportStar(require("./general"), exports);
|
@@ -30,7 +30,7 @@ const marginfi_sdk_1 = require("../marginfi-sdk");
|
|
30
30
|
const accountUtils_1 = require("./accountUtils");
|
31
31
|
const generalUtils_1 = require("./generalUtils");
|
32
32
|
const solautoUtils_1 = require("./solautoUtils");
|
33
|
-
const
|
33
|
+
const marginfi_1 = require("./marginfi");
|
34
34
|
function getSolanaRpcConnection(rpcUrl, programId, lpEnv) {
|
35
35
|
const connection = new web3_js_1.Connection(rpcUrl, {
|
36
36
|
commitment: "confirmed",
|
@@ -38,7 +38,7 @@ function getSolanaRpcConnection(rpcUrl, programId, lpEnv) {
|
|
38
38
|
const umi = (0, umi_bundle_defaults_1.createUmi)(connection).use({
|
39
39
|
install(umi) {
|
40
40
|
umi.programs.add((0, solautoUtils_1.createDynamicSolautoProgram)(programId), false);
|
41
|
-
umi.programs.add((0,
|
41
|
+
umi.programs.add((0, marginfi_1.createDynamicMarginfiProgram)(lpEnv), false);
|
42
42
|
},
|
43
43
|
});
|
44
44
|
return [connection, umi];
|
@@ -272,7 +272,7 @@ async function sendSingleOptimizedTransaction(umi, connection, tx, txType, prior
|
|
272
272
|
let cuPrice;
|
273
273
|
if (prioritySetting !== types_1.PriorityFeeSetting.None) {
|
274
274
|
cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting);
|
275
|
-
cuPrice = Math.min(cuPrice ?? 0,
|
275
|
+
cuPrice = Math.min(cuPrice ?? 0, 100000000);
|
276
276
|
(0, generalUtils_1.consoleLog)("Compute unit price: ", cuPrice);
|
277
277
|
}
|
278
278
|
if (txType !== "only-simulate") {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solautoUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,gCAAgC,EAChC,SAAS,EAMV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,cAAc,EACf,MAAM,aAAa,CAAC;
|
1
|
+
{"version":3,"file":"solautoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solautoUtils.ts"],"names":[],"mappings":"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"}
|