@haven-fi/solauto-sdk 1.0.660 → 1.0.662
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.d.ts +0 -1
- package/dist/services/rebalance/rebalanceTxBuilder.d.ts.map +1 -1
- package/dist/services/rebalance/rebalanceTxBuilder.js +2 -7
- package/dist/services/solauto/solautoClient.d.ts +0 -2
- package/dist/services/solauto/solautoClient.d.ts.map +1 -1
- package/dist/services/solauto/solautoClient.js +5 -8
- package/dist/services/solauto/solautoMarginfiClient.js +6 -6
- package/dist/services/transactions/transactionUtils.js +1 -1
- package/dist/solautoPosition/marginfiSolautoPositionEx.d.ts.map +1 -1
- package/dist/solautoPosition/marginfiSolautoPositionEx.js +1 -4
- package/dist/solautoPosition/positionUtils.d.ts +1 -1
- package/dist/solautoPosition/positionUtils.d.ts.map +1 -1
- package/dist/solautoPosition/positionUtils.js +17 -16
- package/dist/solautoPosition/solautoPositionEx.d.ts +17 -7
- package/dist/solautoPosition/solautoPositionEx.d.ts.map +1 -1
- package/dist/solautoPosition/solautoPositionEx.js +62 -49
- package/dist/utils/instructionUtils.js +1 -1
- package/dist/utils/marginfiUtils.d.ts.map +1 -1
- package/dist/utils/marginfiUtils.js +8 -5
- package/dist/utils/numberUtils.d.ts +2 -0
- package/dist/utils/numberUtils.d.ts.map +1 -1
- package/dist/utils/numberUtils.js +7 -0
- package/local/logPositions.ts +0 -2
- package/local/txSandbox.ts +3 -0
- package/package.json +1 -1
- package/src/services/rebalance/rebalanceTxBuilder.ts +7 -20
- package/src/services/solauto/solautoClient.ts +7 -17
- package/src/services/solauto/solautoMarginfiClient.ts +6 -6
- package/src/services/transactions/transactionUtils.ts +1 -1
- package/src/solautoPosition/marginfiSolautoPositionEx.ts +1 -5
- package/src/solautoPosition/positionUtils.ts +31 -26
- package/src/solautoPosition/solautoPositionEx.ts +124 -72
- package/src/utils/instructionUtils.ts +1 -1
- package/src/utils/marginfiUtils.ts +20 -13
- package/src/utils/numberUtils.ts +13 -1
@@ -15,7 +15,6 @@ export declare class RebalanceTxBuilder {
|
|
15
15
|
private flashLoanRequirements;
|
16
16
|
private getFlashLoanDetails;
|
17
17
|
private setRebalanceType;
|
18
|
-
private realtimeUsdToEmaUsd;
|
19
18
|
private getInitialRebalanceValues;
|
20
19
|
private setRebalanceDetails;
|
21
20
|
private refreshBeforeRebalance;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rebalanceTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceTxBuilder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAGL,qBAAqB,EACtB,MAAM,aAAa,CAAC;
|
1
|
+
{"version":3,"file":"rebalanceTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceTxBuilder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAGL,qBAAqB,EACtB,MAAM,aAAa,CAAC;AA2BrB,qBAAa,kBAAkB;IAQ3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,2BAA2B,CAAC;IARtC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAC,CAAwB;IAC/C,OAAO,CAAC,SAAS,CAAiC;gBAGxC,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,YAAA;IAG9C,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,oBAAoB;YAyCd,qBAAqB;IAwCnC,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,yBAAyB;YAqBnB,mBAAmB;YAwBnB,sBAAsB;YAyBtB,mBAAmB;IAmEpB,gBAAgB,CAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;CAe9C"}
|
@@ -114,17 +114,12 @@ class RebalanceTxBuilder {
|
|
114
114
|
this.rebalanceType = generated_1.SolautoRebalanceType.Regular;
|
115
115
|
}
|
116
116
|
}
|
117
|
-
realtimeUsdToEmaUsd(realtimeAmountUsd, mint) {
|
118
|
-
return ((realtimeAmountUsd / (0, utils_1.safeGetPrice)(mint, generated_1.PriceType.Realtime)) *
|
119
|
-
(0, utils_1.safeGetPrice)(mint, generated_1.PriceType.Ema));
|
120
|
-
}
|
121
117
|
getInitialRebalanceValues() {
|
122
118
|
let rebalanceValues = this.getRebalanceValues();
|
123
119
|
if (!rebalanceValues) {
|
124
120
|
return undefined;
|
125
121
|
}
|
126
|
-
|
127
|
-
if (postRebalanceEmaUtilRateBps > this.client.pos.maxBoostToBps) {
|
122
|
+
if (!this.client.pos.rebalanceHelper.validRealtimePricesBoost(rebalanceValues.debtAdjustmentUsd)) {
|
128
123
|
this.priceType = generated_1.PriceType.Ema;
|
129
124
|
rebalanceValues = this.getRebalanceValues();
|
130
125
|
if (!rebalanceValues) {
|
@@ -149,7 +144,7 @@ class RebalanceTxBuilder {
|
|
149
144
|
return true;
|
150
145
|
}
|
151
146
|
async refreshBeforeRebalance() {
|
152
|
-
if (this.client.selfManaged ||
|
147
|
+
if (this.client.pos.selfManaged ||
|
153
148
|
this.client.contextUpdates.supplyAdjustment > BigInt(0) ||
|
154
149
|
this.client.contextUpdates.debtAdjustment > BigInt(0) ||
|
155
150
|
!this.client.pos.exists) {
|
@@ -18,8 +18,6 @@ export declare abstract class SolautoClient extends ReferralStateManager {
|
|
18
18
|
lendingPlatform: LendingPlatform;
|
19
19
|
lpEnv: ProgramEnv;
|
20
20
|
authority: PublicKey;
|
21
|
-
positionId: number;
|
22
|
-
selfManaged: boolean;
|
23
21
|
pos: SolautoPositionEx;
|
24
22
|
positionSupplyTa: PublicKey;
|
25
23
|
signerSupplyTa: PublicKey;
|
@@ -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,
|
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;IA+ExC,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"}
|
@@ -18,14 +18,11 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
|
|
18
18
|
}
|
19
19
|
async initialize(args) {
|
20
20
|
await super.initialize(args);
|
21
|
-
|
22
|
-
|
23
|
-
if (this.selfManaged &&
|
24
|
-
(!args.supplyMint || !args.debtMint || !args.lpUserAccount)) {
|
21
|
+
const positionId = args.positionId ?? 0;
|
22
|
+
if (positionId === 0 && !args.lpUserAccount) {
|
25
23
|
throw new Error("Self managed position is missing arguments");
|
26
24
|
}
|
27
|
-
|
28
|
-
this.pos = await (0, solautoPosition_1.getOrCreatePositionEx)(this.umi, positionPk, {
|
25
|
+
this.pos = await (0, solautoPosition_1.getOrCreatePositionEx)(this.umi, this.authority, positionId, this.programId, {
|
29
26
|
supplyMint: args.supplyMint,
|
30
27
|
debtMint: args.debtMint,
|
31
28
|
lendingPool: args.lendingPool,
|
@@ -33,7 +30,7 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
|
|
33
30
|
lendingPlatform: this.lendingPlatform,
|
34
31
|
lpEnv: this.lpEnv,
|
35
32
|
}, this.contextUpdates);
|
36
|
-
if (this.pos.selfManaged
|
33
|
+
if (this.pos.selfManaged) {
|
37
34
|
await this.pos.refreshPositionState();
|
38
35
|
}
|
39
36
|
this.positionSupplyTa = (0, utils_1.getTokenAccount)(this.pos.publicKey, this.pos.supplyMint);
|
@@ -274,7 +271,7 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
|
|
274
271
|
}
|
275
272
|
protocolInteractionIx(args) {
|
276
273
|
let tx = (0, umi_1.transactionBuilder)();
|
277
|
-
if (!this.selfManaged) {
|
274
|
+
if (!this.pos.selfManaged) {
|
278
275
|
if (args.__kind === "Deposit") {
|
279
276
|
tx = tx.add((0, utils_1.splTokenTransferUmiIx)(this.signer, this.signerSupplyTa, this.positionSupplyTa, (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), BigInt(args.fields[0])));
|
280
277
|
}
|
@@ -18,7 +18,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
18
18
|
await super.initialize(args);
|
19
19
|
this.mfiAccounts = (0, constants_1.getMarginfiAccounts)(this.lpEnv);
|
20
20
|
this.marginfiGroup = await this.pos.lendingPool();
|
21
|
-
if (this.selfManaged) {
|
21
|
+
if (this.pos.selfManaged) {
|
22
22
|
this.marginfiAccount =
|
23
23
|
args.lpUserAccount ??
|
24
24
|
(0, umi_1.createSignerFromKeypair)(this.umi, this.umi.eddsa.generateKeypair());
|
@@ -106,7 +106,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
106
106
|
signerDebtTa: signerDebtTa,
|
107
107
|
positionType: positionType ?? generated_1.PositionType.Leverage,
|
108
108
|
positionData: {
|
109
|
-
positionId: this.positionId,
|
109
|
+
positionId: this.pos.positionId,
|
110
110
|
settings: settings ?? null,
|
111
111
|
dca: dca ?? null,
|
112
112
|
},
|
@@ -139,7 +139,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
139
139
|
}
|
140
140
|
protocolInteractionIx(args) {
|
141
141
|
let tx = super.protocolInteractionIx(args);
|
142
|
-
if (this.selfManaged) {
|
142
|
+
if (this.pos.selfManaged) {
|
143
143
|
return tx.add(this.marginfiProtocolInteractionIx(args));
|
144
144
|
}
|
145
145
|
else {
|
@@ -203,7 +203,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
203
203
|
let vaultSupplyTa = undefined;
|
204
204
|
let supplyVaultAuthority = undefined;
|
205
205
|
if (args.__kind === "Deposit" || args.__kind === "Withdraw") {
|
206
|
-
positionSupplyTa = (0, umi_1.publicKey)(args.__kind === "Withdraw" || this.selfManaged
|
206
|
+
positionSupplyTa = (0, umi_1.publicKey)(args.__kind === "Withdraw" || this.pos.selfManaged
|
207
207
|
? this.signerSupplyTa
|
208
208
|
: this.positionSupplyTa);
|
209
209
|
vaultSupplyTa = (0, umi_1.publicKey)(this.marginfiSupplyAccounts.liquidityVault);
|
@@ -213,7 +213,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
213
213
|
let vaultDebtTa = undefined;
|
214
214
|
let debtVaultAuthority = undefined;
|
215
215
|
if (args.__kind === "Borrow" || args.__kind === "Repay") {
|
216
|
-
positionDebtTa = (0, umi_1.publicKey)(args.__kind === "Borrow" || this.selfManaged
|
216
|
+
positionDebtTa = (0, umi_1.publicKey)(args.__kind === "Borrow" || this.pos.selfManaged
|
217
217
|
? this.signerDebtTa
|
218
218
|
: this.positionDebtTa);
|
219
219
|
vaultDebtTa = (0, umi_1.publicKey)(this.marginfiDebtAccounts.liquidityVault);
|
@@ -250,7 +250,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
250
250
|
const isFirstRebalance = (preSwapRebalance && (0, utils_1.hasFirstRebalance)(data.rebalanceType)) ||
|
251
251
|
(postSwapRebalance &&
|
252
252
|
data.rebalanceType === generated_1.SolautoRebalanceType.FLSwapThenRebalance);
|
253
|
-
const addAuthorityTas = this.selfManaged || data.values.tokenBalanceChange !== undefined;
|
253
|
+
const addAuthorityTas = this.pos.selfManaged || data.values.tokenBalanceChange !== undefined;
|
254
254
|
return (0, generated_1.marginfiRebalance)(this.umi, {
|
255
255
|
signer: this.signer,
|
256
256
|
marginfiProgram: (0, umi_1.publicKey)(this.mfiAccounts.program),
|
@@ -52,7 +52,7 @@ async function transactionChoresBefore(client, accountsGettingCreated, solautoAc
|
|
52
52
|
(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(client.referralStateData.lookupTable).equals(web3_js_1.PublicKey.default))) {
|
53
53
|
chores = chores.add(client.updateReferralStatesIx(undefined, client.authorityLutAddress));
|
54
54
|
}
|
55
|
-
if (client.selfManaged) {
|
55
|
+
if (client.pos.selfManaged) {
|
56
56
|
if ((0, utils_1.isMarginfiClient)(client) &&
|
57
57
|
!(await (0, utils_1.getSolanaAccountCreated)(client.umi, client.marginfiAccountPk))) {
|
58
58
|
chores = chores.add(client.marginfiAccountInitialize(client.marginfiAccount));
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"marginfiSolautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/marginfiSolautoPositionEx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,IAAI,EAIL,MAAM,iBAAiB,CAAC;AAYzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D,qBAAa,yBAA0B,SAAQ,iBAAiB;IAC9D,eAAe,kBAA4B;IAE3C,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAqB;IAExB,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAyBxC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAgB3B,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IASpC,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAa3D,IAAI,wBAAwB,IAAI,MAAM,CAKrC;IAEK,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;
|
1
|
+
{"version":3,"file":"marginfiSolautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/marginfiSolautoPositionEx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,IAAI,EAIL,MAAM,iBAAiB,CAAC;AAYzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D,qBAAa,yBAA0B,SAAQ,iBAAiB;IAC9D,eAAe,kBAA4B;IAE3C,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAqB;IAExB,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAyBxC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAgB3B,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IASpC,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAa3D,IAAI,wBAAwB,IAAI,MAAM,CAKrC;IAEK,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBjE"}
|
@@ -62,10 +62,7 @@ class MarginfiSolautoPositionEx extends solautoPositionEx_1.SolautoPositionEx {
|
|
62
62
|
return (0, utils_1.fromBaseUnit)((0, utils_1.getBankLiquidityAvailableBaseUnit)(this.supplyBank, false), this.supplyMintInfo.decimals);
|
63
63
|
}
|
64
64
|
async refreshPositionState(priceType) {
|
65
|
-
|
66
|
-
return;
|
67
|
-
}
|
68
|
-
const useDesignatedMint = !this._data.position || !this._data.selfManaged;
|
65
|
+
const useDesignatedMint = !this._data.position || !this.selfManaged;
|
69
66
|
const resp = await (0, utils_1.getMarginfiAccountPositionState)(this.umi, { pk: this.lpUserAccount }, await this.lendingPool(), useDesignatedMint ? { mint: this.supplyMint } : undefined, useDesignatedMint ? { mint: this.debtMint } : undefined, this.lpEnv, this.contextUpdates, priceType);
|
70
67
|
if (resp) {
|
71
68
|
this.supplyBank = resp.supplyBank;
|
@@ -5,7 +5,7 @@ import { ContextUpdates } from "../utils";
|
|
5
5
|
import { PositionCustomArgs, SolautoPositionEx } from "./solautoPositionEx";
|
6
6
|
export declare function createSolautoSettings(settings: SolautoSettingsParametersInpArgs): SolautoSettingsParameters;
|
7
7
|
export declare function getPositionExBulk(umi: Umi, publicKeys: PublicKey[]): Promise<SolautoPositionEx[]>;
|
8
|
-
export declare function getOrCreatePositionEx(umi: Umi,
|
8
|
+
export declare function getOrCreatePositionEx(umi: Umi, authority: PublicKey, positionId: number, programId: PublicKey, customArgs?: PositionCustomArgs, contextUpdates?: ContextUpdates): Promise<SolautoPositionEx>;
|
9
9
|
interface AssetProps {
|
10
10
|
mint: PublicKey;
|
11
11
|
price?: number;
|
@@ -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,
|
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;AAI7B,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"}
|
@@ -35,28 +35,29 @@ async function getPositionExBulk(umi, publicKeys) {
|
|
35
35
|
}
|
36
36
|
});
|
37
37
|
}
|
38
|
-
async function getOrCreatePositionEx(umi,
|
38
|
+
async function getOrCreatePositionEx(umi, authority, positionId, programId, customArgs, contextUpdates) {
|
39
|
+
const publicKey = (0, utils_1.getSolautoPositionAccount)(authority, positionId, programId);
|
39
40
|
const data = await (0, generated_1.safeFetchSolautoPosition)(umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(publicKey));
|
40
|
-
if (!data && (!customArgs?.supplyMint || !customArgs.debtMint)) {
|
41
|
-
throw new Error("Must provide a supply & debt mint if creating a new position");
|
42
|
-
}
|
43
|
-
const placeholderState = createFakePositionState({
|
44
|
-
mint: customArgs?.supplyMint ?? web3_js_1.PublicKey.default,
|
45
|
-
}, { mint: customArgs?.debtMint ?? web3_js_1.PublicKey.default }, 0, 0);
|
46
41
|
const lendingPlatform = data
|
47
42
|
? data.position.lendingPlatform
|
48
43
|
: customArgs.lendingPlatform;
|
44
|
+
const args = {
|
45
|
+
umi,
|
46
|
+
publicKey,
|
47
|
+
authority,
|
48
|
+
positionId,
|
49
|
+
programId,
|
50
|
+
data: data ?? {
|
51
|
+
state: createFakePositionState({
|
52
|
+
mint: customArgs?.supplyMint ?? web3_js_1.PublicKey.default,
|
53
|
+
}, { mint: customArgs?.debtMint ?? web3_js_1.PublicKey.default }, 0, 0),
|
54
|
+
},
|
55
|
+
customArgs,
|
56
|
+
contextUpdates,
|
57
|
+
};
|
49
58
|
switch (lendingPlatform) {
|
50
59
|
case generated_1.LendingPlatform.Marginfi:
|
51
|
-
return new marginfiSolautoPositionEx_1.MarginfiSolautoPositionEx(
|
52
|
-
umi,
|
53
|
-
publicKey,
|
54
|
-
data: data ?? {
|
55
|
-
state: placeholderState,
|
56
|
-
},
|
57
|
-
customArgs,
|
58
|
-
contextUpdates,
|
59
|
-
});
|
60
|
+
return new marginfiSolautoPositionEx_1.MarginfiSolautoPositionEx(args);
|
60
61
|
// TODO: PF
|
61
62
|
}
|
62
63
|
}
|
@@ -15,9 +15,12 @@ export interface PositionCustomArgs {
|
|
15
15
|
interface SolautoPositionExData extends Partial<SolautoPosition> {
|
16
16
|
state: PositionState;
|
17
17
|
}
|
18
|
-
interface PositionExArgs {
|
18
|
+
export interface PositionExArgs {
|
19
19
|
umi: Umi;
|
20
|
-
publicKey
|
20
|
+
publicKey?: PublicKey;
|
21
|
+
programId?: PublicKey;
|
22
|
+
authority?: PublicKey;
|
23
|
+
positionId?: number;
|
21
24
|
data: SolautoPositionExData;
|
22
25
|
customArgs?: PositionCustomArgs;
|
23
26
|
contextUpdates?: ContextUpdates;
|
@@ -27,18 +30,19 @@ export declare abstract class SolautoPositionEx {
|
|
27
30
|
protected contextUpdates?: ContextUpdates;
|
28
31
|
publicKey: PublicKey;
|
29
32
|
lendingPlatform: LendingPlatform;
|
33
|
+
positionId: number;
|
34
|
+
authority: PublicKey;
|
30
35
|
protected _data: SolautoPositionExData;
|
31
36
|
protected lp?: PublicKey;
|
32
|
-
protected lpEnv: ProgramEnv;
|
33
37
|
lpUserAccount?: PublicKey;
|
38
|
+
protected lpEnv: ProgramEnv;
|
34
39
|
private readonly firstState;
|
35
40
|
protected _supplyPrice?: number;
|
36
41
|
protected _debtPrice?: number;
|
42
|
+
rebalanceHelper: PositionRebalanceHelper;
|
37
43
|
constructor(args: PositionExArgs);
|
38
44
|
abstract lendingPool(): Promise<PublicKey>;
|
39
45
|
get exists(): boolean;
|
40
|
-
get authority(): PublicKey;
|
41
|
-
get positionId(): number | undefined;
|
42
46
|
get selfManaged(): boolean;
|
43
47
|
get positionType(): import("../generated").PositionType | undefined;
|
44
48
|
get strategyName(): string;
|
@@ -77,10 +81,8 @@ export declare abstract class SolautoPositionEx {
|
|
77
81
|
abstract maxLtvAndLiqThresholdBps(): Promise<[number, number]>;
|
78
82
|
abstract priceOracles(): Promise<PublicKey[]>;
|
79
83
|
get memecoinPosition(): boolean | undefined;
|
80
|
-
private sufficientLiquidityToBoost;
|
81
84
|
eligibleForRebalance(bpsDistanceThreshold?: number): RebalanceAction | undefined;
|
82
85
|
eligibleForRefresh(): boolean;
|
83
|
-
protected canRefreshPositionState(): boolean;
|
84
86
|
abstract refreshPositionState(priceType?: PriceType): Promise<void>;
|
85
87
|
utilizationRateBpsDrift(priceType?: PriceType): Promise<number>;
|
86
88
|
updateSupply(newSupplyUsd: number, supplyPrice?: number): void;
|
@@ -92,5 +94,13 @@ export declare abstract class SolautoPositionEx {
|
|
92
94
|
simulateRebalance(unixTime: number, supplyPrice: number, debtPrice: number, targetLiqUtilizationRateBps?: number): undefined;
|
93
95
|
refetchPositionData(): Promise<void>;
|
94
96
|
}
|
97
|
+
declare class PositionRebalanceHelper {
|
98
|
+
private pos;
|
99
|
+
constructor(pos: SolautoPositionEx);
|
100
|
+
private sufficientLiquidityToBoost;
|
101
|
+
validRealtimePricesBoost(debtAdjustmentUsd: number): boolean;
|
102
|
+
private validBoostFromHere;
|
103
|
+
eligibleForRebalance(bpsDistanceThreshold: number): RebalanceAction | undefined;
|
104
|
+
}
|
95
105
|
export {};
|
96
106
|
//# 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,
|
1
|
+
{"version":3,"file":"solautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/solautoPositionEx.ts"],"names":[],"mappings":"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"}
|
@@ -1,19 +1,21 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.SolautoPositionEx = void 0;
|
4
|
-
const web3_js_1 = require("@solana/web3.js");
|
5
4
|
const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
|
6
5
|
const generated_1 = require("../generated");
|
7
6
|
const utils_1 = require("../utils");
|
8
7
|
const rebalance_1 = require("../services/rebalance");
|
9
|
-
const constants_1 = require("../constants");
|
10
8
|
class SolautoPositionEx {
|
11
9
|
constructor(args) {
|
12
10
|
this.lp = undefined;
|
13
11
|
this.lpUserAccount = undefined;
|
14
12
|
this.umi = args.umi;
|
15
|
-
this.publicKey = args.publicKey;
|
16
13
|
this.contextUpdates = args.contextUpdates;
|
14
|
+
this.publicKey =
|
15
|
+
args.publicKey ??
|
16
|
+
(0, utils_1.getSolautoPositionAccount)(args.authority, args.positionId, args.programId);
|
17
|
+
this.positionId = args.positionId ?? args.data.positionId[0];
|
18
|
+
this.authority = args.authority ?? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(args.data.authority);
|
17
19
|
this.lp = args.customArgs?.lendingPool;
|
18
20
|
this.lpUserAccount =
|
19
21
|
args.customArgs?.lpUserAccount ??
|
@@ -23,18 +25,11 @@ class SolautoPositionEx {
|
|
23
25
|
this.lpEnv = args.customArgs?.lpEnv ?? "Prod";
|
24
26
|
this._data = args.data;
|
25
27
|
this.firstState = { ...args.data.state };
|
28
|
+
this.rebalanceHelper = new PositionRebalanceHelper(this);
|
26
29
|
}
|
27
30
|
get exists() {
|
28
31
|
return this._data.position !== undefined;
|
29
32
|
}
|
30
|
-
get authority() {
|
31
|
-
return this._data.authority
|
32
|
-
? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this._data.authority)
|
33
|
-
: web3_js_1.PublicKey.default;
|
34
|
-
}
|
35
|
-
get positionId() {
|
36
|
-
return this._data.positionId ? this._data.positionId[0] : undefined;
|
37
|
-
}
|
38
33
|
get selfManaged() {
|
39
34
|
return this.positionId === 0;
|
40
35
|
}
|
@@ -146,50 +141,14 @@ class SolautoPositionEx {
|
|
146
141
|
get memecoinPosition() {
|
147
142
|
return (0, utils_1.tokenInfo)(this.supplyMint).isMeme || (0, utils_1.tokenInfo)(this.debtMint).isMeme;
|
148
143
|
}
|
149
|
-
sufficientLiquidityToBoost() {
|
150
|
-
const limitsUpToDate = this.debtLiquidityUsdAvailable !== 0 ||
|
151
|
-
this.supplyLiquidityUsdDepositable !== 0;
|
152
|
-
if (limitsUpToDate) {
|
153
|
-
const { debtAdjustmentUsd } = (0, rebalance_1.getDebtAdjustment)(this.state.liqThresholdBps, { supplyUsd: this.supplyUsd(), debtUsd: this.debtUsd() }, this.boostToBps, { solauto: 50, lpBorrow: 50, flashLoan: 50 } // TODO: get true data here instead of magic numbers
|
154
|
-
);
|
155
|
-
const sufficientLiquidity = this.debtLiquidityUsdAvailable * 0.95 > debtAdjustmentUsd &&
|
156
|
-
this.supplyLiquidityUsdDepositable * 0.95 > debtAdjustmentUsd;
|
157
|
-
if (!sufficientLiquidity) {
|
158
|
-
(0, utils_1.consoleLog)("Insufficient liquidity to further boost");
|
159
|
-
}
|
160
|
-
return sufficientLiquidity;
|
161
|
-
}
|
162
|
-
return true;
|
163
|
-
}
|
164
144
|
eligibleForRebalance(bpsDistanceThreshold = 0) {
|
165
|
-
|
166
|
-
return undefined;
|
167
|
-
}
|
168
|
-
const realtimeLiqUtilRateBps = this.liqUtilizationRateBps(generated_1.PriceType.Realtime);
|
169
|
-
const emaLiqUtilRateBps = this.liqUtilizationRateBps(generated_1.PriceType.Ema);
|
170
|
-
if (this.repayFromBps - realtimeLiqUtilRateBps <= bpsDistanceThreshold) {
|
171
|
-
return "repay";
|
172
|
-
}
|
173
|
-
else if (realtimeLiqUtilRateBps - this.boostFromBps <= bpsDistanceThreshold ||
|
174
|
-
emaLiqUtilRateBps - this.boostFromBps <= bpsDistanceThreshold) {
|
175
|
-
const sufficientLiquidity = this.sufficientLiquidityToBoost();
|
176
|
-
return sufficientLiquidity ? "boost" : undefined;
|
177
|
-
}
|
178
|
-
return undefined;
|
145
|
+
return this.rebalanceHelper.eligibleForRebalance(bpsDistanceThreshold);
|
179
146
|
}
|
180
147
|
eligibleForRefresh() {
|
181
|
-
if (this.
|
148
|
+
if (this.selfManaged)
|
182
149
|
return false;
|
183
150
|
return ((0, utils_1.currentUnixSeconds)() - Number(this.state.lastRefreshed) > 60 * 60 * 24 * 7);
|
184
151
|
}
|
185
|
-
canRefreshPositionState() {
|
186
|
-
if (Number(this.state.lastRefreshed) >
|
187
|
-
(0, utils_1.currentUnixSeconds)() - constants_1.MIN_POSITION_STATE_FRESHNESS_SECS &&
|
188
|
-
!this.contextUpdates?.positionUpdates()) {
|
189
|
-
return false;
|
190
|
-
}
|
191
|
-
return true;
|
192
|
-
}
|
193
152
|
async utilizationRateBpsDrift(priceType) {
|
194
153
|
const supplyPrice = this.supplyPrice(priceType) ?? 0;
|
195
154
|
const debtPrice = this.debtPrice(priceType) ?? 0;
|
@@ -238,3 +197,57 @@ class SolautoPositionEx {
|
|
238
197
|
}
|
239
198
|
}
|
240
199
|
exports.SolautoPositionEx = SolautoPositionEx;
|
200
|
+
class PositionRebalanceHelper {
|
201
|
+
constructor(pos) {
|
202
|
+
this.pos = pos;
|
203
|
+
}
|
204
|
+
sufficientLiquidityToBoost() {
|
205
|
+
const limitsUpToDate = this.pos.debtLiquidityUsdAvailable !== 0 ||
|
206
|
+
this.pos.supplyLiquidityUsdDepositable !== 0;
|
207
|
+
if (limitsUpToDate) {
|
208
|
+
const { debtAdjustmentUsd } = (0, rebalance_1.getDebtAdjustment)(this.pos.state.liqThresholdBps, { supplyUsd: this.pos.supplyUsd(), debtUsd: this.pos.debtUsd() }, this.pos.boostToBps, { solauto: 50, lpBorrow: 50, flashLoan: 50 } // Overshoot fees
|
209
|
+
);
|
210
|
+
const sufficientLiquidity = this.pos.debtLiquidityUsdAvailable * 0.95 > debtAdjustmentUsd &&
|
211
|
+
this.pos.supplyLiquidityUsdDepositable * 0.95 > debtAdjustmentUsd;
|
212
|
+
if (!sufficientLiquidity) {
|
213
|
+
(0, utils_1.consoleLog)("Insufficient liquidity to further boost");
|
214
|
+
}
|
215
|
+
return sufficientLiquidity;
|
216
|
+
}
|
217
|
+
return true;
|
218
|
+
}
|
219
|
+
validRealtimePricesBoost(debtAdjustmentUsd) {
|
220
|
+
if (this.pos.lendingPlatform !== generated_1.LendingPlatform.Marginfi) {
|
221
|
+
// TODO: LP
|
222
|
+
return true;
|
223
|
+
}
|
224
|
+
const postRebalanceLiqUtilRate = (0, utils_1.getLiqUtilzationRateBps)((0, utils_1.realtimeUsdToEmaUsd)(this.pos.supplyUsd() + debtAdjustmentUsd, this.pos.supplyMint), (0, utils_1.realtimeUsdToEmaUsd)(this.pos.debtUsd() + debtAdjustmentUsd, this.pos.debtMint), this.pos.state.liqThresholdBps);
|
225
|
+
return postRebalanceLiqUtilRate <= this.pos.maxBoostToBps;
|
226
|
+
}
|
227
|
+
validBoostFromHere() {
|
228
|
+
const { debtAdjustmentUsd } = (0, rebalance_1.getDebtAdjustment)(this.pos.state.liqThresholdBps, {
|
229
|
+
supplyUsd: this.pos.supplyUsd(generated_1.PriceType.Realtime),
|
230
|
+
debtUsd: this.pos.debtUsd(generated_1.PriceType.Realtime),
|
231
|
+
}, this.pos.boostToBps, { solauto: 25, lpBorrow: 0, flashLoan: 0 } // Undershoot fees
|
232
|
+
);
|
233
|
+
return this.validRealtimePricesBoost(debtAdjustmentUsd);
|
234
|
+
}
|
235
|
+
eligibleForRebalance(bpsDistanceThreshold) {
|
236
|
+
if (!this.pos.settings || !this.pos.supplyUsd()) {
|
237
|
+
return undefined;
|
238
|
+
}
|
239
|
+
const realtimeLiqUtilRateBps = this.pos.liqUtilizationRateBps(generated_1.PriceType.Realtime);
|
240
|
+
const emaLiqUtilRateBps = this.pos.liqUtilizationRateBps(generated_1.PriceType.Ema);
|
241
|
+
if (this.pos.repayFromBps - realtimeLiqUtilRateBps <=
|
242
|
+
bpsDistanceThreshold) {
|
243
|
+
return "repay";
|
244
|
+
}
|
245
|
+
else if ((realtimeLiqUtilRateBps - this.pos.boostFromBps <= bpsDistanceThreshold ||
|
246
|
+
emaLiqUtilRateBps - this.pos.boostFromBps <= bpsDistanceThreshold) &&
|
247
|
+
this.validBoostFromHere()) {
|
248
|
+
const sufficientLiquidity = this.sufficientLiquidityToBoost();
|
249
|
+
return sufficientLiquidity ? "boost" : undefined;
|
250
|
+
}
|
251
|
+
return undefined;
|
252
|
+
}
|
253
|
+
}
|
@@ -26,7 +26,7 @@ function closeSolautoPosition(client) {
|
|
26
26
|
function updateSolautoPosition(client, settings, dca) {
|
27
27
|
return new services_1.TransactionItem(async () => ({
|
28
28
|
tx: client.updatePositionIx({
|
29
|
-
positionId: client.positionId,
|
29
|
+
positionId: client.pos.positionId,
|
30
30
|
settings,
|
31
31
|
dca,
|
32
32
|
}),
|
@@ -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;AAKnE,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAsB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAIL,uBAAuB,EAIxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,IAAI,EAMJ,eAAe,EAKhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAiBhD,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,
|
1
|
+
{"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"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"}
|
@@ -283,10 +283,13 @@ async function getTokenUsage(bank, isAsset, shares, amountUsedAdjustment, priceT
|
|
283
283
|
};
|
284
284
|
}
|
285
285
|
async function getBank(umi, data, marginfiGroup) {
|
286
|
-
|
287
|
-
? data.
|
288
|
-
:
|
289
|
-
|
286
|
+
const mint = data?.mint && !data.mint.equals(web3_js_1.PublicKey.default)
|
287
|
+
? data.mint.toString()
|
288
|
+
: undefined;
|
289
|
+
return data?.banksCache && mint
|
290
|
+
? data.banksCache[marginfiGroup.toString()][mint]
|
291
|
+
: mint && mint !== web3_js_1.PublicKey.default.toString()
|
292
|
+
? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)((0, constants_1.getMarginfiAccounts)(undefined, marginfiGroup).bankAccounts[marginfiGroup.toString()][mint].bank), { commitment: "confirmed" })
|
290
293
|
: null;
|
291
294
|
}
|
292
295
|
async function getMarginfiAccountPositionState(umi, lpUserAccount, marginfiGroup, supply, debt, programEnv, contextUpdates, priceType) {
|
@@ -363,7 +366,7 @@ async function getMarginfiAccountPositionState(umi, lpUserAccount, marginfiGroup
|
|
363
366
|
if (!debtUsage) {
|
364
367
|
debtUsage = await getTokenUsage(debtBank, false, 0, contextUpdates?.debtAdjustment);
|
365
368
|
}
|
366
|
-
const supplyPrice = (0, priceUtils_1.safeGetPrice)(
|
369
|
+
const supplyPrice = (0, priceUtils_1.safeGetPrice)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint));
|
367
370
|
let [maxLtvBps, liqThresholdBps] = await getMarginfiMaxLtvAndLiqThresholdBps(umi, marginfiGroup ?? (0, constants_1.getMarginfiAccounts)(programEnv).defaultGroup, {
|
368
371
|
mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint),
|
369
372
|
bank: supplyBank,
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
1
2
|
import { PositionState } from "../generated";
|
2
3
|
import { RoundAction } from "../types";
|
3
4
|
export declare function calcNetWorthUsd(state?: PositionState): number;
|
@@ -23,4 +24,5 @@ export declare function getMaxLiqUtilizationRateBps(maxLtvBps: number, liqThresh
|
|
23
24
|
export declare function maxRepayFromBps(maxLtvBps: number, liqThresholdBps: number): number;
|
24
25
|
export declare function maxRepayToBps(maxLtvBps: number, liqThresholdBps: number): number;
|
25
26
|
export declare function maxBoostToBps(maxLtvBps: number, liqThresholdBps: number): number;
|
27
|
+
export declare function realtimeUsdToEmaUsd(realtimeAmountUsd: number, mint: PublicKey): number;
|
26
28
|
//# sourceMappingURL=numberUtils.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"
|
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;AAGvC,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"}
|
@@ -23,7 +23,10 @@ exports.getMaxLiqUtilizationRateBps = getMaxLiqUtilizationRateBps;
|
|
23
23
|
exports.maxRepayFromBps = maxRepayFromBps;
|
24
24
|
exports.maxRepayToBps = maxRepayToBps;
|
25
25
|
exports.maxBoostToBps = maxBoostToBps;
|
26
|
+
exports.realtimeUsdToEmaUsd = realtimeUsdToEmaUsd;
|
26
27
|
const constants_1 = require("../constants");
|
28
|
+
const generated_1 = require("../generated");
|
29
|
+
const priceUtils_1 = require("./priceUtils");
|
27
30
|
function calcNetWorthUsd(state) {
|
28
31
|
return fromRoundedUsdValue(state?.netWorth.baseAmountUsdValue ?? BigInt(0));
|
29
32
|
}
|
@@ -131,3 +134,7 @@ function maxRepayToBps(maxLtvBps, liqThresholdBps) {
|
|
131
134
|
function maxBoostToBps(maxLtvBps, liqThresholdBps) {
|
132
135
|
return Math.min(maxRepayToBps(maxLtvBps, liqThresholdBps), getMaxLiqUtilizationRateBps(maxLtvBps, liqThresholdBps, constants_1.OFFSET_FROM_MAX_LTV));
|
133
136
|
}
|
137
|
+
function realtimeUsdToEmaUsd(realtimeAmountUsd, mint) {
|
138
|
+
return ((realtimeAmountUsd / (0, priceUtils_1.safeGetPrice)(mint, generated_1.PriceType.Realtime)) *
|
139
|
+
(0, priceUtils_1.safeGetPrice)(mint, generated_1.PriceType.Ema));
|
140
|
+
}
|
package/local/logPositions.ts
CHANGED
package/local/txSandbox.ts
CHANGED
@@ -43,6 +43,9 @@ export async function main() {
|
|
43
43
|
await client.initialize({
|
44
44
|
positionId: 1,
|
45
45
|
authority: new PublicKey("5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe"),
|
46
|
+
// lpUserAccount: new PublicKey(
|
47
|
+
// "EyATEtRH6FQRCJCn4nVzEnKXnzyGaUV1nt4sHqBrQ2fZ"
|
48
|
+
// ),
|
46
49
|
});
|
47
50
|
|
48
51
|
const transactionItems = [rebalance(client)];
|