@haven-fi/solauto-sdk 1.0.205 → 1.0.206
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/clients/solautoMarginfiClient.js +2 -2
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +1 -2
- package/dist/utils/marginfiUtils.d.ts +11 -1
- package/dist/utils/marginfiUtils.d.ts.map +1 -1
- package/dist/utils/marginfiUtils.js +24 -14
- package/package.json +1 -1
- package/src/clients/solautoMarginfiClient.ts +2 -3
- package/src/transactions/transactionUtils.ts +1 -2
- package/src/utils/marginfiUtils.ts +49 -31
- package/tests/transactions/solautoMarginfi.ts +27 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAM1D,OAAO,EACL,kBAAkB,EAElB,aAAa,EAEb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAM1D,OAAO,EACL,kBAAkB,EAElB,aAAa,EAEb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IACtD,OAAO,CAAC,WAAW,CAAkB;IAE9B,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,EAAE,MAAM,CAAa;IAC3C,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,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;IAG5B,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,6BAA6B,EAAG,SAAS,CAAC;IAC1C,2BAA2B,CAAC,EAAE,eAAe,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE,yBAAyB;IA6D1C,8BAA8B;IA0CpC,eAAe,IAAI,SAAS;IAI5B,mBAAmB,IAAI,MAAM,EAAE;IAI/B,gBAAgB,IAAI,SAAS,EAAE;IAUzB,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IA0BvE,yBAAyB,IAAI,kBAAkB;IAS/C,YAAY,CACV,aAAa,CAAC,EAAE,gCAAgC,EAChD,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA6C9B,OAAO,IAAI,kBAAkB;IAc7B,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUhE,OAAO,CAAC,6BAA6B;IAmErC,OAAO,CAAC,oCAAoC;IA0D5C,SAAS,CACP,aAAa,EAAE,GAAG,GAAG,GAAG,EACxB,QAAQ,EAAE,aAAa,EACvB,aAAa,EAAE,wBAAwB,EACvC,SAAS,CAAC,EAAE,gBAAgB,EAC5B,2BAA2B,CAAC,EAAE,MAAM,GACnC,kBAAkB;IAqErB,WAAW,CACT,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,SAAS,GACjC,kBAAkB;IA2BrB,UAAU,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,kBAAkB;IAoFlE,iCAAiC,IAAI,kBAAkB;IASjD,qBAAqB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CA6ClE"}
|
|
@@ -430,9 +430,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
|
430
430
|
return state;
|
|
431
431
|
}
|
|
432
432
|
const freshState = await (0, marginfiUtils_1.getMarginfiAccountPositionState)(this.umi, this.marginfiAccountPk, this.marginfiGroup, !this.selfManaged && this.solautoPositionData === null
|
|
433
|
-
? this.supplyMint
|
|
433
|
+
? { mint: this.supplyMint }
|
|
434
434
|
: undefined, !this.selfManaged && this.solautoPositionData === null
|
|
435
|
-
? this.debtMint
|
|
435
|
+
? { mint: this.debtMint }
|
|
436
436
|
: undefined, this.livePositionUpdates);
|
|
437
437
|
if (freshState) {
|
|
438
438
|
this.log("Fresh state", freshState);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAKxE,OAAO,EAGL,aAAa,EAYd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqOzD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA+G7B;AAkLD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA0BnD;AAED,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAKxE,OAAO,EAGL,aAAa,EAYd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqOzD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA+G7B;AAkLD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA0BnD;AAED,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,aAAa,oBAwCzE;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CACN;IACE,EAAE,EAAE,kBAAkB,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC,GACD,SAAS,CACZ,CAkHA;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,SAAS,GACtB,OAAO,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAmCrD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG;;;;EAwC9D"}
|
|
@@ -340,8 +340,7 @@ async function requiresRefreshBeforeRebalance(client) {
|
|
|
340
340
|
oldStateWithLatestPrices.liqUtilizationRateBps);
|
|
341
341
|
if (client.livePositionUpdates.supplyAdjustment === BigInt(0) &&
|
|
342
342
|
client.livePositionUpdates.debtAdjustment === BigInt(0) &&
|
|
343
|
-
utilizationRateDiff
|
|
344
|
-
0.005) {
|
|
343
|
+
utilizationRateDiff >= 20) {
|
|
345
344
|
return true;
|
|
346
345
|
}
|
|
347
346
|
}
|
|
@@ -18,7 +18,17 @@ export declare function getAllMarginfiAccountsByAuthority(umi: Umi, authority: P
|
|
|
18
18
|
supplyMint?: PublicKey;
|
|
19
19
|
debtMint?: PublicKey;
|
|
20
20
|
}[]>;
|
|
21
|
-
|
|
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, marginfiAccountPk: PublicKey, marginfiGroup?: PublicKey, supply?: BankSelection, debt?: BankSelection, livePositionUpdates?: LivePositionUpdates): Promise<PositionState | undefined>;
|
|
22
31
|
export declare function calculateAnnualAPYs(bank: Bank): [number, number];
|
|
23
32
|
export declare function getUpToDateShareValues(bank: Bank): Promise<[number, number]>;
|
|
33
|
+
export {};
|
|
24
34
|
//# sourceMappingURL=marginfiUtils.d.ts.map
|
|
@@ -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,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAKL,MAAM,iBAAiB,CAAC;AAiBzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,qBAAqB,CAY3E;AAED,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAsB,wBAAwB,CAC5C,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,CAwC3B;AAED,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,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,CAwDA;AA6DD,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,SAAS,EAC5B,aAAa,CAAC,EAAE,SAAS,EACzB,
|
|
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,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAKL,MAAM,iBAAiB,CAAC;AAiBzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,qBAAqB,CAY3E;AAED,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAsB,wBAAwB,CAC5C,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,CAwC3B;AAED,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,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,CAwDA;AA6DD,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;AAEhE,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,SAAS,EAC5B,aAAa,CAAC,EAAE,SAAS,EACzB,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,aAAa,EACpB,mBAAmB,CAAC,EAAE,mBAAmB,GACxC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA0LpC;AA+DD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,oBAU7C;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgB3B"}
|
|
@@ -143,17 +143,27 @@ async function getTokenUsage(bank, isAsset, shares, amountUsedAdjustment) {
|
|
|
143
143
|
padding: new Uint8Array([]),
|
|
144
144
|
};
|
|
145
145
|
}
|
|
146
|
-
async function getMarginfiAccountPositionState(umi, marginfiAccountPk, marginfiGroup,
|
|
146
|
+
async function getMarginfiAccountPositionState(umi, marginfiAccountPk, marginfiGroup, supply, debt, livePositionUpdates) {
|
|
147
147
|
let marginfiAccount = await (0, marginfi_sdk_1.safeFetchMarginfiAccount)(umi, (0, umi_1.publicKey)(marginfiAccountPk), { commitment: "confirmed" });
|
|
148
|
+
if (!supply) {
|
|
149
|
+
supply = {};
|
|
150
|
+
}
|
|
151
|
+
if (!debt) {
|
|
152
|
+
debt = {};
|
|
153
|
+
}
|
|
148
154
|
if (!marginfiGroup && marginfiAccount) {
|
|
149
155
|
marginfiGroup = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(marginfiAccount.group);
|
|
150
156
|
}
|
|
151
|
-
let supplyBank =
|
|
152
|
-
?
|
|
153
|
-
:
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
+
let supplyBank = supply?.banksCache && supply.mint && marginfiGroup
|
|
158
|
+
? supply.banksCache[marginfiGroup.toString()][supply?.mint?.toString()]
|
|
159
|
+
: supply?.mint && supply?.mint !== web3_js_1.PublicKey.default
|
|
160
|
+
? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(marginfiAccounts_1.MARGINFI_ACCOUNTS[marginfiGroup?.toString() ?? ""][supply?.mint.toString()].bank), { commitment: "confirmed" })
|
|
161
|
+
: null;
|
|
162
|
+
let debtBank = debt?.banksCache && debt.mint && marginfiGroup
|
|
163
|
+
? debt.banksCache[marginfiGroup.toString()][debt?.mint?.toString()]
|
|
164
|
+
: debt?.mint && debt?.mint !== web3_js_1.PublicKey.default
|
|
165
|
+
? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(marginfiAccounts_1.MARGINFI_ACCOUNTS[marginfiGroup?.toString() ?? ""][debt?.mint.toString()].bank), { commitment: "confirmed" })
|
|
166
|
+
: null;
|
|
157
167
|
let supplyUsage = undefined;
|
|
158
168
|
let debtUsage = undefined;
|
|
159
169
|
if (marginfiAccount !== null &&
|
|
@@ -170,8 +180,8 @@ async function getMarginfiAccountPositionState(umi, marginfiAccountPk, marginfiG
|
|
|
170
180
|
commitment: "confirmed",
|
|
171
181
|
});
|
|
172
182
|
}
|
|
173
|
-
if (!
|
|
174
|
-
|
|
183
|
+
if (!supply.mint) {
|
|
184
|
+
supply.mint = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint);
|
|
175
185
|
}
|
|
176
186
|
supplyUsage = await getTokenUsage(supplyBank, true, (0, numberUtils_1.bytesToI80F48)(supplyBalances[0].assetShares.value), livePositionUpdates?.supplyAdjustment);
|
|
177
187
|
}
|
|
@@ -181,8 +191,8 @@ async function getMarginfiAccountPositionState(umi, marginfiAccountPk, marginfiG
|
|
|
181
191
|
commitment: "confirmed",
|
|
182
192
|
});
|
|
183
193
|
}
|
|
184
|
-
if (!
|
|
185
|
-
|
|
194
|
+
if (!debt.mint) {
|
|
195
|
+
debt.mint = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(debtBank.mint);
|
|
186
196
|
}
|
|
187
197
|
debtUsage = await getTokenUsage(debtBank, false, (0, numberUtils_1.bytesToI80F48)(debtBalances[0].liabilityShares.value), livePositionUpdates?.debtAdjustment);
|
|
188
198
|
}
|
|
@@ -204,7 +214,7 @@ async function getMarginfiAccountPositionState(umi, marginfiAccountPk, marginfiG
|
|
|
204
214
|
if (!debtUsage) {
|
|
205
215
|
debtUsage = await getTokenUsage(debtBank, false, 0, livePositionUpdates?.debtAdjustment);
|
|
206
216
|
}
|
|
207
|
-
const supplyPrice = (0, generalUtils_1.safeGetPrice)(
|
|
217
|
+
const supplyPrice = (0, generalUtils_1.safeGetPrice)(supply.mint);
|
|
208
218
|
let [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(umi, marginfiGroup ?? new web3_js_1.PublicKey(marginfiAccounts_1.DEFAULT_MARGINFI_GROUP), {
|
|
209
219
|
mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint),
|
|
210
220
|
bank: supplyBank,
|
|
@@ -238,7 +248,7 @@ function marginfiInterestRateCurve(bank, utilizationRatio) {
|
|
|
238
248
|
return (utilizationRatio * plateauIr) / optimalUr;
|
|
239
249
|
}
|
|
240
250
|
else {
|
|
241
|
-
return (((
|
|
251
|
+
return (((utilizationRatio - optimalUr) / (1 - optimalUr)) * (maxIr - plateauIr) +
|
|
242
252
|
plateauIr);
|
|
243
253
|
}
|
|
244
254
|
}
|
|
@@ -251,7 +261,7 @@ function calcInterestRate(bank, utilizationRatio) {
|
|
|
251
261
|
const insuranceFixedFeeApr = (0, numberUtils_1.bytesToI80F48)(bank.config.interestRateConfig.insuranceFeeFixedApr.value);
|
|
252
262
|
const rateFee = protocolIrFee + insuranceIrFee;
|
|
253
263
|
const totalFixedFeeApr = protocolFixedFeeApr + insuranceFixedFeeApr;
|
|
254
|
-
const borrowingRate =
|
|
264
|
+
const borrowingRate = baseRate * (1 + rateFee) + totalFixedFeeApr;
|
|
255
265
|
return [lendingRate, borrowingRate];
|
|
256
266
|
}
|
|
257
267
|
function calcAccruedInterestPaymentPerPeriod(apr, timeDelta, shareValue) {
|
package/package.json
CHANGED
|
@@ -55,7 +55,6 @@ import {
|
|
|
55
55
|
getMaxLtvAndLiqThreshold,
|
|
56
56
|
} from "../utils/marginfiUtils";
|
|
57
57
|
import { bytesToI80F48, fromBaseUnit, toBps } from "../utils/numberUtils";
|
|
58
|
-
import { createFakePositionState } from "../utils";
|
|
59
58
|
import { QuoteResponse } from "@jup-ag/api";
|
|
60
59
|
|
|
61
60
|
export interface SolautoMarginfiClientArgs extends SolautoClientArgs {
|
|
@@ -653,10 +652,10 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
653
652
|
this.marginfiAccountPk,
|
|
654
653
|
this.marginfiGroup,
|
|
655
654
|
!this.selfManaged && this.solautoPositionData === null
|
|
656
|
-
? this.supplyMint
|
|
655
|
+
? { mint: this.supplyMint }
|
|
657
656
|
: undefined,
|
|
658
657
|
!this.selfManaged && this.solautoPositionData === null
|
|
659
|
-
? this.debtMint
|
|
658
|
+
? { mint: this.debtMint }
|
|
660
659
|
: undefined,
|
|
661
660
|
this.livePositionUpdates
|
|
662
661
|
);
|
|
@@ -612,8 +612,7 @@ export async function requiresRefreshBeforeRebalance(client: SolautoClient) {
|
|
|
612
612
|
if (
|
|
613
613
|
client.livePositionUpdates.supplyAdjustment === BigInt(0) &&
|
|
614
614
|
client.livePositionUpdates.debtAdjustment === BigInt(0) &&
|
|
615
|
-
utilizationRateDiff
|
|
616
|
-
0.005
|
|
615
|
+
utilizationRateDiff >= 20
|
|
617
616
|
) {
|
|
618
617
|
return true;
|
|
619
618
|
}
|
|
@@ -256,12 +256,19 @@ async function getTokenUsage(
|
|
|
256
256
|
};
|
|
257
257
|
}
|
|
258
258
|
|
|
259
|
+
interface BankSelection {
|
|
260
|
+
mint?: PublicKey;
|
|
261
|
+
banksCache?: BanksCache;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
type BanksCache = { [group: string]: { [mint: string]: Bank } };
|
|
265
|
+
|
|
259
266
|
export async function getMarginfiAccountPositionState(
|
|
260
267
|
umi: Umi,
|
|
261
268
|
marginfiAccountPk: PublicKey,
|
|
262
269
|
marginfiGroup?: PublicKey,
|
|
263
|
-
|
|
264
|
-
|
|
270
|
+
supply?: BankSelection,
|
|
271
|
+
debt?: BankSelection,
|
|
265
272
|
livePositionUpdates?: LivePositionUpdates
|
|
266
273
|
): Promise<PositionState | undefined> {
|
|
267
274
|
let marginfiAccount = await safeFetchMarginfiAccount(
|
|
@@ -270,34 +277,45 @@ export async function getMarginfiAccountPositionState(
|
|
|
270
277
|
{ commitment: "confirmed" }
|
|
271
278
|
);
|
|
272
279
|
|
|
280
|
+
if (!supply) {
|
|
281
|
+
supply = {};
|
|
282
|
+
}
|
|
283
|
+
if (!debt) {
|
|
284
|
+
debt = {};
|
|
285
|
+
}
|
|
286
|
+
|
|
273
287
|
if (!marginfiGroup && marginfiAccount) {
|
|
274
288
|
marginfiGroup = toWeb3JsPublicKey(marginfiAccount.group);
|
|
275
289
|
}
|
|
276
290
|
|
|
277
291
|
let supplyBank: Bank | null =
|
|
278
|
-
|
|
279
|
-
?
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
292
|
+
supply?.banksCache && supply.mint && marginfiGroup
|
|
293
|
+
? supply.banksCache[marginfiGroup!.toString()][supply?.mint?.toString()]
|
|
294
|
+
: supply?.mint && supply?.mint !== PublicKey.default
|
|
295
|
+
? await safeFetchBank(
|
|
296
|
+
umi,
|
|
297
|
+
publicKey(
|
|
298
|
+
MARGINFI_ACCOUNTS[marginfiGroup?.toString() ?? ""][
|
|
299
|
+
supply?.mint.toString()
|
|
300
|
+
].bank
|
|
301
|
+
),
|
|
302
|
+
{ commitment: "confirmed" }
|
|
303
|
+
)
|
|
304
|
+
: null;
|
|
289
305
|
let debtBank: Bank | null =
|
|
290
|
-
|
|
291
|
-
?
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
306
|
+
debt?.banksCache && debt.mint && marginfiGroup
|
|
307
|
+
? debt.banksCache[marginfiGroup!.toString()][debt?.mint?.toString()]
|
|
308
|
+
: debt?.mint && debt?.mint !== PublicKey.default
|
|
309
|
+
? await safeFetchBank(
|
|
310
|
+
umi,
|
|
311
|
+
publicKey(
|
|
312
|
+
MARGINFI_ACCOUNTS[marginfiGroup?.toString() ?? ""][
|
|
313
|
+
debt?.mint.toString()
|
|
314
|
+
].bank
|
|
315
|
+
),
|
|
316
|
+
{ commitment: "confirmed" }
|
|
317
|
+
)
|
|
318
|
+
: null;
|
|
301
319
|
|
|
302
320
|
let supplyUsage: PositionTokenUsage | undefined = undefined;
|
|
303
321
|
let debtUsage: PositionTokenUsage | undefined = undefined;
|
|
@@ -326,8 +344,8 @@ export async function getMarginfiAccountPositionState(
|
|
|
326
344
|
commitment: "confirmed",
|
|
327
345
|
});
|
|
328
346
|
}
|
|
329
|
-
if (!
|
|
330
|
-
|
|
347
|
+
if (!supply.mint) {
|
|
348
|
+
supply.mint = toWeb3JsPublicKey(supplyBank!.mint);
|
|
331
349
|
}
|
|
332
350
|
supplyUsage = await getTokenUsage(
|
|
333
351
|
supplyBank!,
|
|
@@ -343,8 +361,8 @@ export async function getMarginfiAccountPositionState(
|
|
|
343
361
|
commitment: "confirmed",
|
|
344
362
|
});
|
|
345
363
|
}
|
|
346
|
-
if (!
|
|
347
|
-
|
|
364
|
+
if (!debt.mint) {
|
|
365
|
+
debt.mint = toWeb3JsPublicKey(debtBank!.mint);
|
|
348
366
|
}
|
|
349
367
|
debtUsage = await getTokenUsage(
|
|
350
368
|
debtBank!,
|
|
@@ -393,7 +411,7 @@ export async function getMarginfiAccountPositionState(
|
|
|
393
411
|
);
|
|
394
412
|
}
|
|
395
413
|
|
|
396
|
-
const supplyPrice = safeGetPrice(
|
|
414
|
+
const supplyPrice = safeGetPrice(supply.mint!)!;
|
|
397
415
|
let [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(
|
|
398
416
|
umi,
|
|
399
417
|
marginfiGroup ?? new PublicKey(DEFAULT_MARGINFI_GROUP),
|
|
@@ -458,7 +476,7 @@ function marginfiInterestRateCurve(
|
|
|
458
476
|
return (utilizationRatio * plateauIr) / optimalUr;
|
|
459
477
|
} else {
|
|
460
478
|
return (
|
|
461
|
-
((
|
|
479
|
+
((utilizationRatio - optimalUr) / (1 - optimalUr)) * (maxIr - plateauIr) +
|
|
462
480
|
plateauIr
|
|
463
481
|
);
|
|
464
482
|
}
|
|
@@ -486,7 +504,7 @@ function calcInterestRate(
|
|
|
486
504
|
);
|
|
487
505
|
const rateFee = protocolIrFee + insuranceIrFee;
|
|
488
506
|
const totalFixedFeeApr = protocolFixedFeeApr + insuranceFixedFeeApr;
|
|
489
|
-
const borrowingRate =
|
|
507
|
+
const borrowingRate = baseRate * (1 + rateFee) + totalFixedFeeApr;
|
|
490
508
|
|
|
491
509
|
return [lendingRate, borrowingRate];
|
|
492
510
|
}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { describe, it } from "mocha";
|
|
2
2
|
import { none, publicKey, some } from "@metaplex-foundation/umi";
|
|
3
3
|
import { setupTest } from "../shared";
|
|
4
|
+
import { SolautoMarginfiClient } from "../../src/clients/solautoMarginfiClient";
|
|
4
5
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {
|
|
6
|
+
PositionType,
|
|
7
|
+
safeFetchAllSolautoPosition,
|
|
8
8
|
solautoAction,
|
|
9
9
|
SolautoSettingsParametersInpArgs,
|
|
10
10
|
} from "../../src/generated";
|
|
11
11
|
import { buildSolautoRebalanceTransaction } from "../../src/transactions/transactionUtils";
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
maxBoostToBps,
|
|
14
|
+
maxRepayFromBps,
|
|
15
|
+
maxRepayToBps,
|
|
16
|
+
toBaseUnit,
|
|
17
|
+
} from "../../src/utils/numberUtils";
|
|
13
18
|
import { getAssociatedTokenAddress, NATIVE_MINT } from "@solana/spl-token";
|
|
14
19
|
import { fetchTokenPrices } from "../../src/utils/generalUtils";
|
|
15
20
|
import {
|
|
@@ -18,18 +23,23 @@ import {
|
|
|
18
23
|
} from "../../src/transactions/transactionsManager";
|
|
19
24
|
import { PublicKey } from "@solana/web3.js";
|
|
20
25
|
import { USDC } from "../../src/constants";
|
|
21
|
-
import {
|
|
26
|
+
import {
|
|
27
|
+
buildHeliusApiUrl,
|
|
28
|
+
getAllPositionsByAuthority,
|
|
29
|
+
getMarginfiAccountPositionState,
|
|
30
|
+
getSolautoManagedPositions,
|
|
31
|
+
} from "../../src/utils";
|
|
32
|
+
import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
|
|
22
33
|
|
|
23
34
|
describe("Solauto Marginfi tests", async () => {
|
|
24
35
|
// const signer = setupTest();
|
|
25
36
|
const signer = setupTest("solauto-manager");
|
|
26
37
|
|
|
27
|
-
const payForTransactions =
|
|
38
|
+
const payForTransactions = false;
|
|
28
39
|
const useJitoBundle = false;
|
|
29
40
|
const positionId = 1;
|
|
30
41
|
|
|
31
42
|
it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
|
|
32
|
-
|
|
33
43
|
const client = new SolautoMarginfiClient(
|
|
34
44
|
buildHeliusApiUrl(process.env.HELIUS_API_KEY!),
|
|
35
45
|
true
|
|
@@ -39,18 +49,16 @@ describe("Solauto Marginfi tests", async () => {
|
|
|
39
49
|
const supplyDecimals = 9;
|
|
40
50
|
const debtDecimals = 6;
|
|
41
51
|
|
|
42
|
-
await client.initialize(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
);
|
|
52
|
+
await client.initialize({
|
|
53
|
+
signer,
|
|
54
|
+
positionId,
|
|
55
|
+
authority: new PublicKey("AprYCPiVeKMCgjQ2ZufwChMzvQ5kFjJo2ekTLSkXsQDm"),
|
|
56
|
+
// marginfiAccount: new PublicKey(
|
|
57
|
+
// "4nNvUXF5YqHFcH2nGweSiuvy1ct7V5FXfoCLKFYUN36z"
|
|
58
|
+
// ),
|
|
59
|
+
// supplyMint: NATIVE_MINT,
|
|
60
|
+
// debtMint: new PublicKey(USDC),
|
|
61
|
+
});
|
|
54
62
|
|
|
55
63
|
const transactionItems: TransactionItem[] = [];
|
|
56
64
|
// const settingParams: SolautoSettingsParametersInpArgs = {
|