@haven-fi/solauto-sdk 1.0.625 → 1.0.626
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/constants/marginfiAccounts.d.ts +9 -4
- package/dist/constants/marginfiAccounts.d.ts.map +1 -1
- package/dist/constants/marginfiAccounts.js +58 -6
- package/dist/services/flashLoans/marginfiFlProvider.d.ts.map +1 -1
- package/dist/services/flashLoans/marginfiFlProvider.js +4 -3
- package/dist/services/solauto/solautoClient.d.ts.map +1 -1
- package/dist/services/solauto/solautoClient.js +1 -0
- package/dist/services/solauto/solautoMarginfiClient.d.ts +2 -1
- package/dist/services/solauto/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/services/solauto/solautoMarginfiClient.js +11 -8
- package/dist/solautoPosition/marginfiSolautoPositionEx.d.ts.map +1 -1
- package/dist/solautoPosition/marginfiSolautoPositionEx.js +5 -4
- package/dist/solautoPosition/solautoPositionEx.d.ts +3 -1
- package/dist/solautoPosition/solautoPositionEx.d.ts.map +1 -1
- package/dist/solautoPosition/solautoPositionEx.js +11 -4
- package/dist/utils/marginfiUtils.d.ts +6 -1
- package/dist/utils/marginfiUtils.d.ts.map +1 -1
- package/dist/utils/marginfiUtils.js +35 -10
- package/local/updateMarginfiLUT.ts +11 -14
- package/package.json +1 -1
- package/src/constants/marginfiAccounts.ts +75 -6
- package/src/services/flashLoans/marginfiFlProvider.ts +6 -4
- package/src/services/solauto/solautoClient.ts +1 -0
- package/src/services/solauto/solautoMarginfiClient.ts +13 -15
- package/src/solautoPosition/marginfiSolautoPositionEx.ts +6 -6
- package/src/solautoPosition/solautoPositionEx.ts +16 -5
- package/src/utils/marginfiUtils.ts +51 -16
@@ -1,13 +1,18 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
2
|
import { MarginfiAssetAccounts } from "../types/accounts";
|
3
|
+
import { ProgramEnv } from "../types";
|
3
4
|
export declare const MARGINFI_PROD_PROGRAM: PublicKey;
|
4
5
|
export declare const MARGINFI_STAGING_PROGRAM: PublicKey;
|
5
|
-
export
|
6
|
-
export declare const MARGINFI_ACCOUNTS: {
|
6
|
+
export type MarginfiAccountsMap = {
|
7
7
|
[group: string]: {
|
8
8
|
[token: string]: MarginfiAssetAccounts;
|
9
9
|
};
|
10
10
|
};
|
11
|
-
export
|
12
|
-
|
11
|
+
export interface MarginfiProgramAccounts {
|
12
|
+
program: PublicKey;
|
13
|
+
defaultGroup: PublicKey;
|
14
|
+
lookupTable: PublicKey;
|
15
|
+
bankAccounts: MarginfiAccountsMap;
|
16
|
+
}
|
17
|
+
export declare function getMarginfiAccounts(programEnv?: ProgramEnv, marginfiGroup?: PublicKey): MarginfiProgramAccounts;
|
13
18
|
//# sourceMappingURL=marginfiAccounts.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"marginfiAccounts.d.ts","sourceRoot":"","sources":["../../src/constants/marginfiAccounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
1
|
+
{"version":3,"file":"marginfiAccounts.d.ts","sourceRoot":"","sources":["../../src/constants/marginfiAccounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,eAAO,MAAM,qBAAqB,WAEjC,CAAC;AACF,eAAO,MAAM,wBAAwB,WAEpC,CAAC;AAUF,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAAA;KAAE,CAAC;CAC7D,CAAC;AA+MF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,SAAS,CAAC;IACnB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CACjC,UAAU,CAAC,EAAE,UAAU,EACvB,aAAa,CAAC,EAAE,SAAS,GACxB,uBAAuB,CA4BzB"}
|
@@ -23,17 +23,41 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
23
23
|
return result;
|
24
24
|
};
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
-
exports.
|
26
|
+
exports.MARGINFI_STAGING_PROGRAM = exports.MARGINFI_PROD_PROGRAM = void 0;
|
27
|
+
exports.getMarginfiAccounts = getMarginfiAccounts;
|
27
28
|
const web3_js_1 = require("@solana/web3.js");
|
28
29
|
const spl_token_1 = require("@solana/spl-token");
|
29
30
|
const tokens = __importStar(require("./tokenConstants"));
|
30
31
|
const switchboardConstants_1 = require("./switchboardConstants");
|
31
32
|
exports.MARGINFI_PROD_PROGRAM = new web3_js_1.PublicKey("MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA");
|
32
33
|
exports.MARGINFI_STAGING_PROGRAM = new web3_js_1.PublicKey("stag8sTKds2h4KzjUw3zKTsxbqvT4XKHdaR9X9E6Rct");
|
33
|
-
|
34
|
+
const PROD_DEFAULT_MARGINFI_GROUP = "4qp6Fx6tnZkY5Wropq9wUYgtFxXKwE6viZxFHg3rdAG8";
|
35
|
+
const STAGING_DEFAULT_MARGINFI_GROUP = "FCPfpHA69EbS8f9KKSreTRkXbzFpunsKuYf5qNmnJjpo";
|
34
36
|
const USDC_PRICE_ORACLE = "Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX";
|
35
|
-
|
36
|
-
[
|
37
|
+
const MARGINFI_STAGING_ACCOUNTS = {
|
38
|
+
[STAGING_DEFAULT_MARGINFI_GROUP]: {
|
39
|
+
[spl_token_1.NATIVE_MINT.toString()]: {
|
40
|
+
bank: "3evdJSa25nsUiZzEUzd92UNa13TPRJrje1dRyiQP5Lhp",
|
41
|
+
liquidityVault: "FVXESa7wCd1tf3o9LGroBc3Ym8Gpcq1HdsLek6oo7Ykv",
|
42
|
+
vaultAuthority: "DuYk1WGq8UsjW5ThLtaehFLrnJeupTjtF7TaPzja9LBQ",
|
43
|
+
priceOracle: "7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE",
|
44
|
+
},
|
45
|
+
[tokens.USDC]: {
|
46
|
+
bank: "Ek5JSFJFD8QgXM6rPDCzf31XhDp1q3xezaWYSkJWqbqc",
|
47
|
+
liquidityVault: "6n7xXMni5WJKUMb4Vm5Zis6UaUtGF5xEGmagZNVWWoKB",
|
48
|
+
vaultAuthority: "9mXNyA5yS4WSTpYUa5gi3yBrSJWWM7XNPNDWRzWGjdVe",
|
49
|
+
priceOracle: USDC_PRICE_ORACLE,
|
50
|
+
},
|
51
|
+
[tokens.USDT]: {
|
52
|
+
bank: "4WFCsVXwfnQvZG52VvPwae7CtL13PUFVWdjkw5YCRBo6",
|
53
|
+
liquidityVault: "BFSyniKfXU9rHqUvHLKeZMivQsAKWTE7HZ1fW6vZcvJp",
|
54
|
+
vaultAuthority: "Fgxe3SUMzcNuLtT9Xkv8QhhWXCmu4VxynzUMwCF4HvJd",
|
55
|
+
priceOracle: "HT2PLQBcG5EiCcNSaMHAjSgd9F98ecpATbk4Sk5oYuM",
|
56
|
+
},
|
57
|
+
},
|
58
|
+
};
|
59
|
+
const MARGINFI_PROD_ACCOUNTS = {
|
60
|
+
[PROD_DEFAULT_MARGINFI_GROUP.toString()]: {
|
37
61
|
[spl_token_1.NATIVE_MINT.toString()]: {
|
38
62
|
bank: "CCKtUs6Cgwo4aaQUmBPmyoApH2gUDErxNZCAntD6LYGh",
|
39
63
|
liquidityVault: "2eicbpitfJXDwqCuFAmPgDP7t2oUotnAzbGzRKLMgSLe",
|
@@ -206,5 +230,33 @@ exports.MARGINFI_ACCOUNTS = {
|
|
206
230
|
},
|
207
231
|
},
|
208
232
|
};
|
209
|
-
|
210
|
-
|
233
|
+
const MARGINFI_PROD_ACCOUNTS_LOOKUP_TABLE = "GAjmWmBPcH5Gxbiykasydj6RsCEaCLyHEvK6kHdFigc6";
|
234
|
+
const MARGINFI_STAGING_ACCOUNTS_LOOKUP_TABLE = "EoEVYjz3MnsX6fKyxrwJkRhzMCHKjj6dvnjTCHoZLMc7";
|
235
|
+
function getMarginfiAccounts(programEnv, marginfiGroup) {
|
236
|
+
if (programEnv === undefined) {
|
237
|
+
if (Boolean(marginfiGroup)) {
|
238
|
+
programEnv = Object.keys(MARGINFI_PROD_ACCOUNTS).includes(marginfiGroup.toString())
|
239
|
+
? "Prod"
|
240
|
+
: "Staging";
|
241
|
+
}
|
242
|
+
else {
|
243
|
+
programEnv = "Prod";
|
244
|
+
}
|
245
|
+
}
|
246
|
+
if (programEnv === "Prod") {
|
247
|
+
return {
|
248
|
+
program: exports.MARGINFI_PROD_PROGRAM,
|
249
|
+
defaultGroup: new web3_js_1.PublicKey(PROD_DEFAULT_MARGINFI_GROUP),
|
250
|
+
lookupTable: new web3_js_1.PublicKey(MARGINFI_PROD_ACCOUNTS_LOOKUP_TABLE),
|
251
|
+
bankAccounts: MARGINFI_PROD_ACCOUNTS,
|
252
|
+
};
|
253
|
+
}
|
254
|
+
else {
|
255
|
+
return {
|
256
|
+
program: exports.MARGINFI_STAGING_PROGRAM,
|
257
|
+
defaultGroup: new web3_js_1.PublicKey(STAGING_DEFAULT_MARGINFI_GROUP),
|
258
|
+
lookupTable: new web3_js_1.PublicKey(MARGINFI_STAGING_ACCOUNTS_LOOKUP_TABLE),
|
259
|
+
bankAccounts: MARGINFI_STAGING_ACCOUNTS,
|
260
|
+
};
|
261
|
+
}
|
262
|
+
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"marginfiFlProvider.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/marginfiFlProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAML,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAclC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAelD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,eAAe,CAAe;IAEhC,UAAU;YAiBF,iBAAiB;
|
1
|
+
{"version":3,"file":"marginfiFlProvider.d.ts","sourceRoot":"","sources":["../../../src/services/flashLoans/marginfiFlProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAML,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAclC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAelD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,eAAe,CAAe;IAEhC,UAAU;YAiBF,iBAAiB;IA6C/B,OAAO,CAAC,sBAAsB;IA0CxB,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyC3D,gBAAgB,IAAI,SAAS,EAAE;IAY/B,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAMnB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM;IAc9D,WAAW,CACT,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,SAAS,GAC1B,kBAAkB;IAoCrB,UAAU,CAAC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB;IA2E3D,YAAY,CACV,eAAe,EAAE,SAAS,EAC1B,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,SAAS;CAW3B"}
|
@@ -23,13 +23,14 @@ class MarginfiFlProvider extends flProviderBase_1.FlProviderBase {
|
|
23
23
|
}
|
24
24
|
}
|
25
25
|
async setAvailableBanks() {
|
26
|
+
const bankAccounts = (0, constants_1.getMarginfiAccounts)(this.programEnv).bankAccounts;
|
26
27
|
const availableBanks = [];
|
27
28
|
const checkIfUsable = (group, mint) => {
|
28
|
-
if (Object.keys(
|
29
|
-
availableBanks.push(
|
29
|
+
if (Object.keys(bankAccounts[group]).includes(mint.toString())) {
|
30
|
+
availableBanks.push(bankAccounts[group][mint.toString()].bank);
|
30
31
|
}
|
31
32
|
};
|
32
|
-
for (const group of Object.keys(
|
33
|
+
for (const group of Object.keys(bankAccounts)) {
|
33
34
|
checkIfUsable(group, this.supplyMint);
|
34
35
|
checkIfUsable(group, this.debtMint);
|
35
36
|
}
|
@@ -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,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,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,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,UAAU,EAAG,MAAM,CAAC;IACpB,WAAW,EAAG,OAAO,CAAC;IACtB,GAAG,EAAG,iBAAiB,CAAC;IAExB,gBAAgB,EAAG,SAAS,CAAC;IAC7B,cAAc,EAAG,SAAS,CAAC;IAE3B,cAAc,EAAG,SAAS,CAAC;IAC3B,YAAY,EAAG,SAAS,CAAC;IAEzB,mBAAmB,EAAG,SAAS,CAAC;IAChC,iBAAiB,EAAG,SAAS,CAAC;IAE9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,UAAU,EAAG,oBAAoB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAwB;IAE7D,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAqB;IAExC,UAAU,CAAC,IAAI,EAAE,iBAAiB;
|
1
|
+
{"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoClient.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,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,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,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,UAAU,EAAG,MAAM,CAAC;IACpB,WAAW,EAAG,OAAO,CAAC;IACtB,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;IAoFxC,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;IAoBzB,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;IA4DK,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,IAAI,kBAAkB;IAExC,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAsFlE,QAAQ,CAAC,WAAW,CAClB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CACtB"}
|
@@ -31,6 +31,7 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
|
|
31
31
|
lendingPool: args.lendingPool,
|
32
32
|
lpUserAccount: args.lpUserAccount,
|
33
33
|
lendingPlatform: this.lendingPlatform,
|
34
|
+
lpEnv: this.lpEnv,
|
34
35
|
}, this.contextUpdates);
|
35
36
|
this.positionSupplyTa = (0, utils_1.getTokenAccount)(this.pos.publicKey, this.pos.supplyMint());
|
36
37
|
this.signerSupplyTa = (0, utils_1.getTokenAccount)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), this.pos.supplyMint());
|
@@ -1,11 +1,12 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
2
|
import { Signer, TransactionBuilder } from "@metaplex-foundation/umi";
|
3
3
|
import { MarginfiAssetAccounts, RebalanceDetails } from "../../types";
|
4
|
+
import { MarginfiProgramAccounts } from "../../constants";
|
4
5
|
import { DCASettingsInpArgs, LendingPlatform, RebalanceStep, SolautoActionArgs, SolautoSettingsParametersInpArgs } from "../../generated";
|
5
6
|
import { SolautoClient, SolautoClientArgs } from "./solautoClient";
|
6
7
|
export declare class SolautoMarginfiClient extends SolautoClient {
|
7
8
|
lendingPlatform: LendingPlatform;
|
8
|
-
|
9
|
+
mfiAccounts: MarginfiProgramAccounts;
|
9
10
|
marginfiAccount: PublicKey | Signer;
|
10
11
|
marginfiAccountPk: PublicKey;
|
11
12
|
marginfiGroup: PublicKey;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoMarginfiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,MAAM,EACN,kBAAkB,EAInB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
1
|
+
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoMarginfiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,MAAM,EACN,kBAAkB,EAInB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAuB,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,eAAe,EAGf,aAAa,EACb,iBAAiB,EAEjB,gCAAgC,EAOjC,MAAM,iBAAiB,CAAC;AAezB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,qBAAa,qBAAsB,SAAQ,aAAa;IAC/C,eAAe,kBAA4B;IAE3C,WAAW,EAAG,uBAAuB,CAAC;IAEtC,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAE7B,UAAU,CAAC,IAAI,EAAE,iBAAiB;IAwExC,mBAAmB,IAAI,MAAM,EAAE;IAO/B,gBAAgB,IAAI,SAAS,EAAE;IAI/B,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,kBAAkB;IAStE,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA0C9B,eAAe,IAAI,kBAAkB;IAYrC,SAAS,IAAI,kBAAkB;IAc/B,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUlE,OAAO,CAAC,6BAA6B;IAmErC,OAAO,CAAC,oCAAoC;IA0D5C,WAAW,CACT,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CAiGtB"}
|
@@ -16,7 +16,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
16
16
|
}
|
17
17
|
async initialize(args) {
|
18
18
|
await super.initialize(args);
|
19
|
-
this.
|
19
|
+
this.mfiAccounts = (0, constants_1.getMarginfiAccounts)(this.lpEnv);
|
20
20
|
this.marginfiGroup = await this.pos.lendingPool();
|
21
21
|
if (this.selfManaged) {
|
22
22
|
this.marginfiAccount =
|
@@ -46,9 +46,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
46
46
|
this.otherSigners.push(this.marginfiAccount);
|
47
47
|
}
|
48
48
|
this.marginfiSupplyAccounts =
|
49
|
-
|
49
|
+
this.mfiAccounts.bankAccounts[this.marginfiGroup.toString()][this.pos.supplyMint().toString()];
|
50
50
|
this.marginfiDebtAccounts =
|
51
|
-
|
51
|
+
this.mfiAccounts.bankAccounts[this.marginfiGroup.toString()][this.pos.debtMint().toString()];
|
52
52
|
// TODO: Don't dynamically pull oracle from bank until Marginfi sorts out their price oracle issues.
|
53
53
|
// const [supplyBank, debtBank] = await safeFetchAllBank(this.umi, [
|
54
54
|
// publicKey(this.marginfiSupplyAccounts.bank),
|
@@ -61,7 +61,10 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
61
61
|
this.log("Marginfi account:", this.marginfiAccountPk.toString());
|
62
62
|
}
|
63
63
|
defaultLookupTables() {
|
64
|
-
return [
|
64
|
+
return [
|
65
|
+
this.mfiAccounts.lookupTable.toString(),
|
66
|
+
...super.defaultLookupTables(),
|
67
|
+
];
|
65
68
|
}
|
66
69
|
lutAccountsToAdd() {
|
67
70
|
return [...super.lutAccountsToAdd(), this.marginfiAccountPk];
|
@@ -86,7 +89,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
86
89
|
}
|
87
90
|
return (0, generated_1.marginfiOpenPosition)(this.umi, {
|
88
91
|
signer: this.signer,
|
89
|
-
marginfiProgram: (0, umi_1.publicKey)(this.
|
92
|
+
marginfiProgram: (0, umi_1.publicKey)(this.mfiAccounts.program),
|
90
93
|
signerReferralState: (0, umi_1.publicKey)(this.referralState),
|
91
94
|
referredByState: this.referredByState
|
92
95
|
? (0, umi_1.publicKey)(this.referredByState)
|
@@ -128,7 +131,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
128
131
|
refreshIx() {
|
129
132
|
return (0, generated_1.marginfiRefreshData)(this.umi, {
|
130
133
|
signer: this.signer,
|
131
|
-
marginfiProgram: (0, umi_1.publicKey)(this.
|
134
|
+
marginfiProgram: (0, umi_1.publicKey)(this.mfiAccounts.program),
|
132
135
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
133
136
|
marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccount),
|
134
137
|
supplyBank: (0, umi_1.publicKey)(this.marginfiSupplyAccounts.bank),
|
@@ -228,7 +231,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
228
231
|
}
|
229
232
|
return (0, generated_1.marginfiProtocolInteraction)(this.umi, {
|
230
233
|
signer: this.signer,
|
231
|
-
marginfiProgram: (0, umi_1.publicKey)(this.
|
234
|
+
marginfiProgram: (0, umi_1.publicKey)(this.mfiAccounts.program),
|
232
235
|
solautoPosition: (0, umi_1.publicKey)(this.pos.publicKey),
|
233
236
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
234
237
|
marginfiAccount: (0, umi_1.publicKey)(this.marginfiAccountPk),
|
@@ -262,7 +265,7 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
262
265
|
const addAuthorityTas = this.selfManaged || data.values.tokenBalanceChange !== undefined;
|
263
266
|
return (0, generated_1.marginfiRebalance)(this.umi, {
|
264
267
|
signer: this.signer,
|
265
|
-
marginfiProgram: (0, umi_1.publicKey)(this.
|
268
|
+
marginfiProgram: (0, umi_1.publicKey)(this.mfiAccounts.program),
|
266
269
|
ixsSysvar: (0, umi_1.publicKey)(web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY),
|
267
270
|
solautoFeesTa: (0, umi_1.publicKey)(data.values.rebalanceDirection === generated_1.RebalanceDirection.Boost
|
268
271
|
? this.solautoFeesSupplyTa
|
@@ -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;AAiB5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,yBAA0B,SAAQ,iBAAiB;IAC9D,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAqB;IAExB,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAyBxC,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
1
|
+
{"version":3,"file":"marginfiSolautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/marginfiSolautoPositionEx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAiB5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,yBAA0B,SAAQ,iBAAiB;IAC9D,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAqB;IAExB,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAyBxC,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAuB3D,wBAAwB,IAAI,MAAM;IAO5B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B5C"}
|
@@ -26,15 +26,16 @@ class MarginfiSolautoPositionEx extends solautoPositionEx_1.SolautoPositionEx {
|
|
26
26
|
this.lp = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.marginfiAccountData.group);
|
27
27
|
}
|
28
28
|
if (!this.lp) {
|
29
|
-
this.lp =
|
29
|
+
this.lp = (0, constants_1.getMarginfiAccounts)(this.lpEnv).defaultGroup;
|
30
30
|
}
|
31
31
|
return this.lp;
|
32
32
|
}
|
33
33
|
async maxLtvAndLiqThresholdBps() {
|
34
34
|
if (!this.supplyBank || !this.debtBank) {
|
35
35
|
const group = (await this.lendingPool()).toString();
|
36
|
-
const
|
37
|
-
const
|
36
|
+
const bankAccounts = (0, constants_1.getMarginfiAccounts)(this.lpEnv).bankAccounts;
|
37
|
+
const supplyBank = bankAccounts[group][this.supplyMint().toString()].bank;
|
38
|
+
const debtBank = bankAccounts[group][this.debtMint().toString()].bank;
|
38
39
|
[this.supplyBank, this.debtBank] = await (0, marginfi_sdk_1.safeFetchAllBank)(this.umi, [
|
39
40
|
(0, umi_1.publicKey)(supplyBank),
|
40
41
|
(0, umi_1.publicKey)(debtBank),
|
@@ -56,7 +57,7 @@ class MarginfiSolautoPositionEx extends solautoPositionEx_1.SolautoPositionEx {
|
|
56
57
|
? { mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.state().supply.mint) }
|
57
58
|
: undefined, useDesignatedMint
|
58
59
|
? { mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.state().debt.mint) }
|
59
|
-
: undefined, this.contextUpdates);
|
60
|
+
: undefined, this.lpEnv, this.contextUpdates);
|
60
61
|
if (resp) {
|
61
62
|
this.supplyBank = resp.supplyBank;
|
62
63
|
this.debtBank = resp.debtBank;
|
@@ -2,7 +2,7 @@ import { PublicKey } from "@solana/web3.js";
|
|
2
2
|
import { Umi } from "@metaplex-foundation/umi";
|
3
3
|
import { DCASettings, LendingPlatform, PositionState, SolautoPosition, SolautoSettingsParameters } from "../generated";
|
4
4
|
import { ContextUpdates } from "../utils";
|
5
|
-
import { RebalanceAction } from "../types";
|
5
|
+
import { ProgramEnv, RebalanceAction } from "../types";
|
6
6
|
import { TokenInfo } from "../constants";
|
7
7
|
export interface PositionCustomArgs {
|
8
8
|
lendingPlatform: LendingPlatform;
|
@@ -10,6 +10,7 @@ export interface PositionCustomArgs {
|
|
10
10
|
debtMint?: PublicKey;
|
11
11
|
lendingPool?: PublicKey;
|
12
12
|
lpUserAccount?: PublicKey;
|
13
|
+
lpEnv?: ProgramEnv;
|
13
14
|
}
|
14
15
|
interface SolautoPositionExData extends Partial<SolautoPosition> {
|
15
16
|
state: PositionState;
|
@@ -26,6 +27,7 @@ export declare abstract class SolautoPositionEx {
|
|
26
27
|
publicKey: PublicKey;
|
27
28
|
protected _data: SolautoPositionExData;
|
28
29
|
protected lp?: PublicKey;
|
30
|
+
protected lpEnv: ProgramEnv;
|
29
31
|
lpUserAccount?: PublicKey;
|
30
32
|
protected contextUpdates?: ContextUpdates;
|
31
33
|
private readonly firstState;
|
@@ -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,eAAe,EACf,yBAAyB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAQL,cAAc,EAgBf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;
|
1
|
+
{"version":3,"file":"solautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/solautoPositionEx.ts"],"names":[],"mappings":"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"}
|
@@ -19,6 +19,7 @@ class SolautoPositionEx {
|
|
19
19
|
(args.data.position
|
20
20
|
? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(args.data.position.protocolUserAccount)
|
21
21
|
: undefined);
|
22
|
+
this.lpEnv = args.customArgs?.lpEnv ?? "Prod";
|
22
23
|
this._data = args.data;
|
23
24
|
this.firstState = { ...args.data.state };
|
24
25
|
}
|
@@ -82,13 +83,19 @@ class SolautoPositionEx {
|
|
82
83
|
return (0, utils_1.calcTotalSupply)(this.state());
|
83
84
|
}
|
84
85
|
supplyUsd() {
|
85
|
-
|
86
|
+
const supplyPrice = (0, utils_1.safeGetPrice)(this.supplyMint());
|
87
|
+
return supplyPrice
|
88
|
+
? (0, utils_1.calcTotalSupply)(this.state()) * supplyPrice
|
89
|
+
: (0, utils_1.calcSupplyUsd)(this.state());
|
86
90
|
}
|
87
91
|
totalDebt() {
|
88
92
|
return (0, utils_1.calcTotalDebt)(this.state());
|
89
93
|
}
|
90
94
|
debtUsd() {
|
91
|
-
|
95
|
+
const debtPrice = (0, utils_1.safeGetPrice)(this.debtMint());
|
96
|
+
return debtPrice
|
97
|
+
? (0, utils_1.calcTotalDebt)(this.state()) * debtPrice
|
98
|
+
: (0, utils_1.calcDebtUsd)(this.state());
|
92
99
|
}
|
93
100
|
supplyLiquidityDepositable() {
|
94
101
|
return (0, utils_1.supplyLiquidityDepositable)(this.state());
|
@@ -97,7 +104,7 @@ class SolautoPositionEx {
|
|
97
104
|
return (0, utils_1.supplyLiquidityUsdDepositable)(this.state());
|
98
105
|
}
|
99
106
|
supplyLiquidityUsdAvailable() {
|
100
|
-
return this.supplyLiquidityAvailable() * ((0, utils_1.safeGetPrice)(this.supplyMint()) ?? 0);
|
107
|
+
return (this.supplyLiquidityAvailable() * ((0, utils_1.safeGetPrice)(this.supplyMint()) ?? 0));
|
101
108
|
}
|
102
109
|
debtLiquidityAvailable() {
|
103
110
|
return (0, utils_1.debtLiquidityAvailable)(this.state());
|
@@ -121,7 +128,7 @@ class SolautoPositionEx {
|
|
121
128
|
return true;
|
122
129
|
}
|
123
130
|
eligibleForRebalance(bpsDistanceThreshold = 0) {
|
124
|
-
if (!this.settings() || !
|
131
|
+
if (!this.settings() || !this.supplyUsd()) {
|
125
132
|
return undefined;
|
126
133
|
}
|
127
134
|
if (this.state().liqUtilizationRateBps - this.boostFromBps() <=
|
@@ -8,6 +8,11 @@ export declare function getMarginfiProgram(env: ProgramEnv): PublicKey;
|
|
8
8
|
export declare function isMarginfiProgram(programId: PublicKey): boolean;
|
9
9
|
export declare function createDynamicMarginfiProgram(env?: ProgramEnv): Program;
|
10
10
|
export declare function umiWithMarginfiProgram(umi: Umi, marginfiEnv?: ProgramEnv): Umi;
|
11
|
+
export declare function fetchBankAddresses(umi: Umi, bankPk: PublicKey): Promise<{
|
12
|
+
bank: PublicKey;
|
13
|
+
liquidityVault: PublicKey;
|
14
|
+
vaultAuthority: PublicKey | undefined;
|
15
|
+
}>;
|
11
16
|
interface AllMarginfiAssetAccounts extends MarginfiAssetAccounts {
|
12
17
|
mint: PublicKey;
|
13
18
|
}
|
@@ -39,7 +44,7 @@ type BanksCache = {
|
|
39
44
|
export declare function getMarginfiAccountPositionState(umi: Umi, lpUserAccount: {
|
40
45
|
pk?: PublicKey;
|
41
46
|
data?: MarginfiAccount | null;
|
42
|
-
}, marginfiGroup?: PublicKey, supply?: BankSelection, debt?: BankSelection, contextUpdates?: ContextUpdates): Promise<{
|
47
|
+
}, marginfiGroup?: PublicKey, supply?: BankSelection, debt?: BankSelection, programEnv?: ProgramEnv, contextUpdates?: ContextUpdates): Promise<{
|
43
48
|
supplyBank: Bank | null;
|
44
49
|
debtBank: Bank | null;
|
45
50
|
state: PositionState;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;
|
1
|
+
{"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"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"}
|
@@ -4,6 +4,7 @@ exports.getMarginfiProgram = getMarginfiProgram;
|
|
4
4
|
exports.isMarginfiProgram = isMarginfiProgram;
|
5
5
|
exports.createDynamicMarginfiProgram = createDynamicMarginfiProgram;
|
6
6
|
exports.umiWithMarginfiProgram = umiWithMarginfiProgram;
|
7
|
+
exports.fetchBankAddresses = fetchBankAddresses;
|
7
8
|
exports.findMarginfiAccounts = findMarginfiAccounts;
|
8
9
|
exports.calcMarginfiMaxLtvAndLiqThresholdBps = calcMarginfiMaxLtvAndLiqThresholdBps;
|
9
10
|
exports.getMarginfiMaxLtvAndLiqThresholdBps = getMarginfiMaxLtvAndLiqThresholdBps;
|
@@ -22,6 +23,7 @@ const marginfi_sdk_1 = require("../marginfi-sdk");
|
|
22
23
|
const priceUtils_1 = require("./priceUtils");
|
23
24
|
const generalUtils_1 = require("./generalUtils");
|
24
25
|
const numberUtils_1 = require("./numberUtils");
|
26
|
+
const accountUtils_1 = require("./accountUtils");
|
25
27
|
function getMarginfiProgram(env) {
|
26
28
|
return env === "Prod" ? constants_1.MARGINFI_PROD_PROGRAM : constants_1.MARGINFI_STAGING_PROGRAM;
|
27
29
|
}
|
@@ -51,14 +53,36 @@ function umiWithMarginfiProgram(umi, marginfiEnv) {
|
|
51
53
|
},
|
52
54
|
});
|
53
55
|
}
|
56
|
+
async function fetchBankAddresses(umi, bankPk) {
|
57
|
+
const bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(bankPk));
|
58
|
+
const liquidityVault = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.liquidityVault);
|
59
|
+
const vaultAuthority = (await (0, accountUtils_1.getTokenAccountData)(umi, liquidityVault))
|
60
|
+
?.owner;
|
61
|
+
return {
|
62
|
+
bank: bankPk,
|
63
|
+
liquidityVault,
|
64
|
+
vaultAuthority,
|
65
|
+
};
|
66
|
+
}
|
54
67
|
function findMarginfiAccounts(bank) {
|
55
|
-
|
56
|
-
for (const
|
57
|
-
const
|
58
|
-
|
59
|
-
|
68
|
+
const search = (bankAccounts) => {
|
69
|
+
for (const group in bankAccounts) {
|
70
|
+
for (const key in bankAccounts[group]) {
|
71
|
+
const account = bankAccounts[group][key];
|
72
|
+
if (account.bank.toString().toLowerCase() ===
|
73
|
+
bank.toString().toLowerCase()) {
|
74
|
+
return { ...account, mint: new web3_js_1.PublicKey(key) };
|
75
|
+
}
|
60
76
|
}
|
61
77
|
}
|
78
|
+
};
|
79
|
+
let res = search((0, constants_1.getMarginfiAccounts)("Prod").bankAccounts);
|
80
|
+
if (res) {
|
81
|
+
return res;
|
82
|
+
}
|
83
|
+
res = search((0, constants_1.getMarginfiAccounts)("Staging").bankAccounts);
|
84
|
+
if (res) {
|
85
|
+
return res;
|
62
86
|
}
|
63
87
|
throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
|
64
88
|
}
|
@@ -81,12 +105,13 @@ async function getMarginfiMaxLtvAndLiqThresholdBps(umi, marginfiGroup, supply, d
|
|
81
105
|
if (!supply.bank && supply.mint.equals(web3_js_1.PublicKey.default)) {
|
82
106
|
return [0, 0];
|
83
107
|
}
|
108
|
+
const bankAccounts = (0, constants_1.getMarginfiAccounts)(undefined, marginfiGroup).bankAccounts;
|
84
109
|
if (!supply.bank || supply.bank === null) {
|
85
|
-
supply.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(
|
110
|
+
supply.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(bankAccounts[marginfiGroup.toString()][supply.mint.toString()].bank), { commitment: "confirmed" });
|
86
111
|
}
|
87
112
|
if ((!debt.bank || debt.bank === null) &&
|
88
113
|
!debt.mint.equals(web3_js_1.PublicKey.default)) {
|
89
|
-
debt.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(
|
114
|
+
debt.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(bankAccounts[marginfiGroup.toString()][debt.mint.toString()].bank), { commitment: "confirmed" });
|
90
115
|
}
|
91
116
|
if (!supplyPrice) {
|
92
117
|
const [price] = await (0, priceUtils_1.fetchTokenPrices)([
|
@@ -228,10 +253,10 @@ async function getBank(umi, data, marginfiGroup) {
|
|
228
253
|
return data?.banksCache && data.mint && marginfiGroup
|
229
254
|
? data.banksCache[marginfiGroup.toString()][data?.mint?.toString()]
|
230
255
|
: data?.mint && data?.mint !== web3_js_1.PublicKey.default
|
231
|
-
? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(constants_1.
|
256
|
+
? await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)((0, constants_1.getMarginfiAccounts)(undefined, marginfiGroup).bankAccounts[marginfiGroup?.toString() ?? ""][data?.mint.toString()].bank), { commitment: "confirmed" })
|
232
257
|
: null;
|
233
258
|
}
|
234
|
-
async function getMarginfiAccountPositionState(umi, lpUserAccount, marginfiGroup, supply, debt, contextUpdates) {
|
259
|
+
async function getMarginfiAccountPositionState(umi, lpUserAccount, marginfiGroup, supply, debt, programEnv, contextUpdates) {
|
235
260
|
let marginfiAccount = lpUserAccount.data ??
|
236
261
|
(lpUserAccount.pk
|
237
262
|
? await (0, marginfi_sdk_1.safeFetchMarginfiAccount)(umi, (0, umi_1.publicKey)(lpUserAccount.pk), {
|
@@ -306,7 +331,7 @@ async function getMarginfiAccountPositionState(umi, lpUserAccount, marginfiGroup
|
|
306
331
|
debtUsage = await getTokenUsage(debtBank, false, 0, contextUpdates?.debtAdjustment);
|
307
332
|
}
|
308
333
|
const supplyPrice = (0, priceUtils_1.safeGetPrice)(supply.mint);
|
309
|
-
let [maxLtvBps, liqThresholdBps] = await getMarginfiMaxLtvAndLiqThresholdBps(umi, marginfiGroup ??
|
334
|
+
let [maxLtvBps, liqThresholdBps] = await getMarginfiMaxLtvAndLiqThresholdBps(umi, marginfiGroup ?? (0, constants_1.getMarginfiAccounts)(programEnv).defaultGroup, {
|
310
335
|
mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint),
|
311
336
|
bank: supplyBank,
|
312
337
|
}, {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { Keypair
|
1
|
+
import { Keypair } from "@solana/web3.js";
|
2
2
|
import {
|
3
3
|
createSignerFromKeypair,
|
4
4
|
publicKey,
|
@@ -10,22 +10,19 @@ import {
|
|
10
10
|
toWeb3JsKeypair,
|
11
11
|
} from "@metaplex-foundation/umi-web3js-adapters";
|
12
12
|
import {
|
13
|
-
MARGINFI_ACCOUNTS_LOOKUP_TABLE,
|
14
|
-
MARGINFI_ACCOUNTS,
|
15
|
-
DEFAULT_MARGINFI_GROUP,
|
16
13
|
getEmptyMarginfiAccountsByAuthority,
|
17
14
|
getSolanaRpcConnection,
|
18
15
|
SOLAUTO_MANAGER,
|
19
16
|
marginfiAccountInitialize,
|
20
17
|
LOCAL_IRONFORGE_API_URL,
|
21
|
-
|
18
|
+
getMarginfiAccounts,
|
22
19
|
} from "../src";
|
23
20
|
import { createAndSendV0Tx, getSecretKey, updateLookupTable } from "./shared";
|
24
21
|
|
25
|
-
const
|
26
|
-
|
27
|
-
|
28
|
-
);
|
22
|
+
const mfiAccounts = getMarginfiAccounts("Prod");
|
23
|
+
|
24
|
+
const LOOKUP_TABLE_ADDRESS = mfiAccounts.lookupTable;
|
25
|
+
let [, umi] = getSolanaRpcConnection(LOCAL_IRONFORGE_API_URL);
|
29
26
|
umi = umi.use(
|
30
27
|
signerIdentity(
|
31
28
|
createSignerFromKeypair(umi, umi.eddsa.generateKeypair()),
|
@@ -41,9 +38,9 @@ const solautoManager = createSignerFromKeypair(
|
|
41
38
|
);
|
42
39
|
|
43
40
|
async function addBanks() {
|
44
|
-
for (const group in
|
45
|
-
for (const key in
|
46
|
-
const accounts =
|
41
|
+
for (const group in mfiAccounts.bankAccounts) {
|
42
|
+
for (const key in mfiAccounts.bankAccounts[group]) {
|
43
|
+
const accounts = mfiAccounts.bankAccounts[group][key];
|
47
44
|
await updateLookupTable(
|
48
45
|
[
|
49
46
|
group,
|
@@ -65,7 +62,7 @@ async function addImfiAccounts() {
|
|
65
62
|
);
|
66
63
|
|
67
64
|
const iMfiAccountsPerGrp = 2;
|
68
|
-
for (const group in
|
65
|
+
for (const group in mfiAccounts.bankAccounts) {
|
69
66
|
const emptyAccs = imfiAccounts.filter((x) => x.group.toString() === group);
|
70
67
|
if (emptyAccs.length >= iMfiAccountsPerGrp) {
|
71
68
|
await updateLookupTable(
|
@@ -97,7 +94,7 @@ async function addImfiAccounts() {
|
|
97
94
|
}
|
98
95
|
|
99
96
|
updateLookupTable(
|
100
|
-
[
|
97
|
+
[mfiAccounts.defaultGroup.toString(), mfiAccounts.program.toString()],
|
101
98
|
LOOKUP_TABLE_ADDRESS
|
102
99
|
);
|
103
100
|
|
package/package.json
CHANGED
@@ -3,6 +3,7 @@ import { NATIVE_MINT } from "@solana/spl-token";
|
|
3
3
|
import * as tokens from "./tokenConstants";
|
4
4
|
import { MarginfiAssetAccounts } from "../types/accounts";
|
5
5
|
import { SWITCHBOARD_PRICE_FEED_IDS } from "./switchboardConstants";
|
6
|
+
import { ProgramEnv } from "../types";
|
6
7
|
|
7
8
|
export const MARGINFI_PROD_PROGRAM = new PublicKey(
|
8
9
|
"MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA"
|
@@ -11,15 +12,43 @@ export const MARGINFI_STAGING_PROGRAM = new PublicKey(
|
|
11
12
|
"stag8sTKds2h4KzjUw3zKTsxbqvT4XKHdaR9X9E6Rct"
|
12
13
|
);
|
13
14
|
|
14
|
-
|
15
|
+
const PROD_DEFAULT_MARGINFI_GROUP =
|
15
16
|
"4qp6Fx6tnZkY5Wropq9wUYgtFxXKwE6viZxFHg3rdAG8";
|
16
17
|
|
18
|
+
const STAGING_DEFAULT_MARGINFI_GROUP =
|
19
|
+
"FCPfpHA69EbS8f9KKSreTRkXbzFpunsKuYf5qNmnJjpo";
|
20
|
+
|
17
21
|
const USDC_PRICE_ORACLE = "Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX";
|
18
22
|
|
19
|
-
export
|
23
|
+
export type MarginfiAccountsMap = {
|
20
24
|
[group: string]: { [token: string]: MarginfiAssetAccounts };
|
21
|
-
}
|
22
|
-
|
25
|
+
};
|
26
|
+
|
27
|
+
const MARGINFI_STAGING_ACCOUNTS: MarginfiAccountsMap = {
|
28
|
+
[STAGING_DEFAULT_MARGINFI_GROUP]: {
|
29
|
+
[NATIVE_MINT.toString()]: {
|
30
|
+
bank: "3evdJSa25nsUiZzEUzd92UNa13TPRJrje1dRyiQP5Lhp",
|
31
|
+
liquidityVault: "FVXESa7wCd1tf3o9LGroBc3Ym8Gpcq1HdsLek6oo7Ykv",
|
32
|
+
vaultAuthority: "DuYk1WGq8UsjW5ThLtaehFLrnJeupTjtF7TaPzja9LBQ",
|
33
|
+
priceOracle: "7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE",
|
34
|
+
},
|
35
|
+
[tokens.USDC]: {
|
36
|
+
bank: "Ek5JSFJFD8QgXM6rPDCzf31XhDp1q3xezaWYSkJWqbqc",
|
37
|
+
liquidityVault: "6n7xXMni5WJKUMb4Vm5Zis6UaUtGF5xEGmagZNVWWoKB",
|
38
|
+
vaultAuthority: "9mXNyA5yS4WSTpYUa5gi3yBrSJWWM7XNPNDWRzWGjdVe",
|
39
|
+
priceOracle: USDC_PRICE_ORACLE,
|
40
|
+
},
|
41
|
+
[tokens.USDT]: {
|
42
|
+
bank: "4WFCsVXwfnQvZG52VvPwae7CtL13PUFVWdjkw5YCRBo6",
|
43
|
+
liquidityVault: "BFSyniKfXU9rHqUvHLKeZMivQsAKWTE7HZ1fW6vZcvJp",
|
44
|
+
vaultAuthority: "Fgxe3SUMzcNuLtT9Xkv8QhhWXCmu4VxynzUMwCF4HvJd",
|
45
|
+
priceOracle: "HT2PLQBcG5EiCcNSaMHAjSgd9F98ecpATbk4Sk5oYuM",
|
46
|
+
},
|
47
|
+
},
|
48
|
+
};
|
49
|
+
|
50
|
+
const MARGINFI_PROD_ACCOUNTS: MarginfiAccountsMap = {
|
51
|
+
[PROD_DEFAULT_MARGINFI_GROUP.toString()]: {
|
23
52
|
[NATIVE_MINT.toString()]: {
|
24
53
|
bank: "CCKtUs6Cgwo4aaQUmBPmyoApH2gUDErxNZCAntD6LYGh",
|
25
54
|
liquidityVault: "2eicbpitfJXDwqCuFAmPgDP7t2oUotnAzbGzRKLMgSLe",
|
@@ -194,8 +223,48 @@ export const MARGINFI_ACCOUNTS: {
|
|
194
223
|
},
|
195
224
|
};
|
196
225
|
|
197
|
-
|
226
|
+
const MARGINFI_PROD_ACCOUNTS_LOOKUP_TABLE =
|
198
227
|
"GAjmWmBPcH5Gxbiykasydj6RsCEaCLyHEvK6kHdFigc6";
|
199
228
|
|
200
|
-
|
229
|
+
const MARGINFI_STAGING_ACCOUNTS_LOOKUP_TABLE =
|
201
230
|
"EoEVYjz3MnsX6fKyxrwJkRhzMCHKjj6dvnjTCHoZLMc7";
|
231
|
+
|
232
|
+
export interface MarginfiProgramAccounts {
|
233
|
+
program: PublicKey;
|
234
|
+
defaultGroup: PublicKey;
|
235
|
+
lookupTable: PublicKey;
|
236
|
+
bankAccounts: MarginfiAccountsMap;
|
237
|
+
}
|
238
|
+
|
239
|
+
export function getMarginfiAccounts(
|
240
|
+
programEnv?: ProgramEnv,
|
241
|
+
marginfiGroup?: PublicKey
|
242
|
+
): MarginfiProgramAccounts {
|
243
|
+
if (programEnv === undefined) {
|
244
|
+
if (Boolean(marginfiGroup)) {
|
245
|
+
programEnv = Object.keys(MARGINFI_PROD_ACCOUNTS).includes(
|
246
|
+
marginfiGroup!.toString()
|
247
|
+
)
|
248
|
+
? "Prod"
|
249
|
+
: "Staging";
|
250
|
+
} else {
|
251
|
+
programEnv = "Prod";
|
252
|
+
}
|
253
|
+
}
|
254
|
+
|
255
|
+
if (programEnv === "Prod") {
|
256
|
+
return {
|
257
|
+
program: MARGINFI_PROD_PROGRAM,
|
258
|
+
defaultGroup: new PublicKey(PROD_DEFAULT_MARGINFI_GROUP),
|
259
|
+
lookupTable: new PublicKey(MARGINFI_PROD_ACCOUNTS_LOOKUP_TABLE),
|
260
|
+
bankAccounts: MARGINFI_PROD_ACCOUNTS,
|
261
|
+
};
|
262
|
+
} else {
|
263
|
+
return {
|
264
|
+
program: MARGINFI_STAGING_PROGRAM,
|
265
|
+
defaultGroup: new PublicKey(STAGING_DEFAULT_MARGINFI_GROUP),
|
266
|
+
lookupTable: new PublicKey(MARGINFI_STAGING_ACCOUNTS_LOOKUP_TABLE),
|
267
|
+
bankAccounts: MARGINFI_STAGING_ACCOUNTS,
|
268
|
+
};
|
269
|
+
}
|
270
|
+
}
|
@@ -8,7 +8,7 @@ import {
|
|
8
8
|
TransactionBuilder,
|
9
9
|
} from "@metaplex-foundation/umi";
|
10
10
|
import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
|
11
|
-
import {
|
11
|
+
import { getMarginfiAccounts } from "../../constants";
|
12
12
|
import {
|
13
13
|
Bank,
|
14
14
|
lendingAccountBorrow,
|
@@ -69,14 +69,16 @@ export class MarginfiFlProvider extends FlProviderBase {
|
|
69
69
|
}
|
70
70
|
|
71
71
|
private async setAvailableBanks() {
|
72
|
+
const bankAccounts = getMarginfiAccounts(this.programEnv).bankAccounts;
|
73
|
+
|
72
74
|
const availableBanks: string[] = [];
|
73
75
|
const checkIfUsable = (group: string, mint: PublicKey) => {
|
74
|
-
if (Object.keys(
|
75
|
-
availableBanks.push(
|
76
|
+
if (Object.keys(bankAccounts[group]).includes(mint.toString())) {
|
77
|
+
availableBanks.push(bankAccounts[group][mint.toString()].bank);
|
76
78
|
}
|
77
79
|
};
|
78
80
|
|
79
|
-
for (const group of Object.keys(
|
81
|
+
for (const group of Object.keys(bankAccounts)) {
|
80
82
|
checkIfUsable(group, this.supplyMint);
|
81
83
|
checkIfUsable(group, this.debtMint);
|
82
84
|
}
|
@@ -8,10 +8,7 @@ import {
|
|
8
8
|
} from "@metaplex-foundation/umi";
|
9
9
|
import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
|
10
10
|
import { MarginfiAssetAccounts, RebalanceDetails } from "../../types";
|
11
|
-
import {
|
12
|
-
MARGINFI_ACCOUNTS,
|
13
|
-
MARGINFI_ACCOUNTS_LOOKUP_TABLE,
|
14
|
-
} from "../../constants";
|
11
|
+
import { getMarginfiAccounts, MarginfiProgramAccounts } from "../../constants";
|
15
12
|
import {
|
16
13
|
DCASettingsInpArgs,
|
17
14
|
LendingPlatform,
|
@@ -47,7 +44,7 @@ import { SolautoClient, SolautoClientArgs } from "./solautoClient";
|
|
47
44
|
export class SolautoMarginfiClient extends SolautoClient {
|
48
45
|
public lendingPlatform = LendingPlatform.Marginfi;
|
49
46
|
|
50
|
-
public
|
47
|
+
public mfiAccounts!: MarginfiProgramAccounts;
|
51
48
|
|
52
49
|
public marginfiAccount!: PublicKey | Signer;
|
53
50
|
public marginfiAccountPk!: PublicKey;
|
@@ -62,9 +59,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
62
59
|
async initialize(args: SolautoClientArgs) {
|
63
60
|
await super.initialize(args);
|
64
61
|
|
65
|
-
this.
|
66
|
-
this.umi.programs.get("marginfi").publicKey
|
67
|
-
);
|
62
|
+
this.mfiAccounts = getMarginfiAccounts(this.lpEnv);
|
68
63
|
|
69
64
|
this.marginfiGroup = await this.pos.lendingPool();
|
70
65
|
|
@@ -110,11 +105,11 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
110
105
|
}
|
111
106
|
|
112
107
|
this.marginfiSupplyAccounts =
|
113
|
-
|
108
|
+
this.mfiAccounts.bankAccounts[this.marginfiGroup.toString()][
|
114
109
|
this.pos.supplyMint().toString()
|
115
110
|
]!;
|
116
111
|
this.marginfiDebtAccounts =
|
117
|
-
|
112
|
+
this.mfiAccounts.bankAccounts[this.marginfiGroup.toString()][
|
118
113
|
this.pos.debtMint().toString()
|
119
114
|
]!;
|
120
115
|
|
@@ -134,7 +129,10 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
134
129
|
}
|
135
130
|
|
136
131
|
defaultLookupTables(): string[] {
|
137
|
-
return [
|
132
|
+
return [
|
133
|
+
this.mfiAccounts.lookupTable.toString(),
|
134
|
+
...super.defaultLookupTables(),
|
135
|
+
];
|
138
136
|
}
|
139
137
|
|
140
138
|
lutAccountsToAdd(): PublicKey[] {
|
@@ -171,7 +169,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
171
169
|
|
172
170
|
return marginfiOpenPosition(this.umi, {
|
173
171
|
signer: this.signer,
|
174
|
-
marginfiProgram: publicKey(this.
|
172
|
+
marginfiProgram: publicKey(this.mfiAccounts.program),
|
175
173
|
signerReferralState: publicKey(this.referralState),
|
176
174
|
referredByState: this.referredByState
|
177
175
|
? publicKey(this.referredByState)
|
@@ -216,7 +214,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
216
214
|
refreshIx(): TransactionBuilder {
|
217
215
|
return marginfiRefreshData(this.umi, {
|
218
216
|
signer: this.signer,
|
219
|
-
marginfiProgram: publicKey(this.
|
217
|
+
marginfiProgram: publicKey(this.mfiAccounts.program),
|
220
218
|
marginfiGroup: publicKey(this.marginfiGroup),
|
221
219
|
marginfiAccount: publicKey(this.marginfiAccount),
|
222
220
|
supplyBank: publicKey(this.marginfiSupplyAccounts.bank),
|
@@ -344,7 +342,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
344
342
|
|
345
343
|
return marginfiProtocolInteraction(this.umi, {
|
346
344
|
signer: this.signer,
|
347
|
-
marginfiProgram: publicKey(this.
|
345
|
+
marginfiProgram: publicKey(this.mfiAccounts.program),
|
348
346
|
solautoPosition: publicKey(this.pos.publicKey),
|
349
347
|
marginfiGroup: publicKey(this.marginfiGroup),
|
350
348
|
marginfiAccount: publicKey(this.marginfiAccountPk),
|
@@ -395,7 +393,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
395
393
|
|
396
394
|
return marginfiRebalance(this.umi, {
|
397
395
|
signer: this.signer,
|
398
|
-
marginfiProgram: publicKey(this.
|
396
|
+
marginfiProgram: publicKey(this.mfiAccounts.program),
|
399
397
|
ixsSysvar: publicKey(SYSVAR_INSTRUCTIONS_PUBKEY),
|
400
398
|
solautoFeesTa: publicKey(
|
401
399
|
data.values.rebalanceDirection === RebalanceDirection.Boost
|
@@ -14,7 +14,7 @@ import {
|
|
14
14
|
getBankLiquidityAvailableBaseUnit,
|
15
15
|
getMarginfiAccountPositionState,
|
16
16
|
} from "../utils";
|
17
|
-
import {
|
17
|
+
import { getMarginfiAccounts } from "../constants";
|
18
18
|
import { SolautoPositionEx } from "./solautoPositionEx";
|
19
19
|
|
20
20
|
export class MarginfiSolautoPositionEx extends SolautoPositionEx {
|
@@ -41,7 +41,7 @@ export class MarginfiSolautoPositionEx extends SolautoPositionEx {
|
|
41
41
|
}
|
42
42
|
|
43
43
|
if (!this.lp) {
|
44
|
-
this.lp =
|
44
|
+
this.lp = getMarginfiAccounts(this.lpEnv).defaultGroup;
|
45
45
|
}
|
46
46
|
|
47
47
|
return this.lp;
|
@@ -50,10 +50,9 @@ export class MarginfiSolautoPositionEx extends SolautoPositionEx {
|
|
50
50
|
async maxLtvAndLiqThresholdBps(): Promise<[number, number]> {
|
51
51
|
if (!this.supplyBank || !this.debtBank) {
|
52
52
|
const group = (await this.lendingPool()).toString();
|
53
|
-
const
|
54
|
-
|
55
|
-
const debtBank =
|
56
|
-
MARGINFI_ACCOUNTS[group][this.debtMint().toString()].bank;
|
53
|
+
const bankAccounts = getMarginfiAccounts(this.lpEnv).bankAccounts;
|
54
|
+
const supplyBank = bankAccounts[group][this.supplyMint().toString()].bank;
|
55
|
+
const debtBank = bankAccounts[group][this.debtMint().toString()].bank;
|
57
56
|
|
58
57
|
[this.supplyBank, this.debtBank] = await safeFetchAllBank(this.umi, [
|
59
58
|
publicKey(supplyBank),
|
@@ -94,6 +93,7 @@ export class MarginfiSolautoPositionEx extends SolautoPositionEx {
|
|
94
93
|
useDesignatedMint
|
95
94
|
? { mint: toWeb3JsPublicKey(this.state().debt.mint) }
|
96
95
|
: undefined,
|
96
|
+
this.lpEnv,
|
97
97
|
this.contextUpdates
|
98
98
|
);
|
99
99
|
|
@@ -37,7 +37,7 @@ import {
|
|
37
37
|
tokenInfo,
|
38
38
|
toRoundedUsdValue,
|
39
39
|
} from "../utils";
|
40
|
-
import { RebalanceAction } from "../types";
|
40
|
+
import { ProgramEnv, RebalanceAction } from "../types";
|
41
41
|
import {
|
42
42
|
getDebtAdjustment,
|
43
43
|
getRebalanceValues,
|
@@ -51,6 +51,7 @@ export interface PositionCustomArgs {
|
|
51
51
|
debtMint?: PublicKey;
|
52
52
|
lendingPool?: PublicKey;
|
53
53
|
lpUserAccount?: PublicKey;
|
54
|
+
lpEnv?: ProgramEnv;
|
54
55
|
}
|
55
56
|
|
56
57
|
interface SolautoPositionExData extends Partial<SolautoPosition> {
|
@@ -70,6 +71,7 @@ export abstract class SolautoPositionEx {
|
|
70
71
|
public publicKey!: PublicKey;
|
71
72
|
protected _data!: SolautoPositionExData;
|
72
73
|
protected lp?: PublicKey = undefined;
|
74
|
+
protected lpEnv!: ProgramEnv;
|
73
75
|
public lpUserAccount?: PublicKey = undefined;
|
74
76
|
protected contextUpdates?: ContextUpdates;
|
75
77
|
|
@@ -86,6 +88,7 @@ export abstract class SolautoPositionEx {
|
|
86
88
|
(args.data.position
|
87
89
|
? toWeb3JsPublicKey(args.data.position!.protocolUserAccount)
|
88
90
|
: undefined);
|
91
|
+
this.lpEnv = args.customArgs?.lpEnv ?? "Prod";
|
89
92
|
|
90
93
|
this._data = args.data;
|
91
94
|
this.firstState = { ...args.data.state };
|
@@ -183,7 +186,10 @@ export abstract class SolautoPositionEx {
|
|
183
186
|
}
|
184
187
|
|
185
188
|
supplyUsd() {
|
186
|
-
|
189
|
+
const supplyPrice = safeGetPrice(this.supplyMint());
|
190
|
+
return supplyPrice
|
191
|
+
? calcTotalSupply(this.state()) * supplyPrice
|
192
|
+
: calcSupplyUsd(this.state());
|
187
193
|
}
|
188
194
|
|
189
195
|
totalDebt() {
|
@@ -191,7 +197,10 @@ export abstract class SolautoPositionEx {
|
|
191
197
|
}
|
192
198
|
|
193
199
|
debtUsd() {
|
194
|
-
|
200
|
+
const debtPrice = safeGetPrice(this.debtMint());
|
201
|
+
return debtPrice
|
202
|
+
? calcTotalDebt(this.state()) * debtPrice
|
203
|
+
: calcDebtUsd(this.state());
|
195
204
|
}
|
196
205
|
|
197
206
|
supplyLiquidityDepositable() {
|
@@ -203,7 +212,9 @@ export abstract class SolautoPositionEx {
|
|
203
212
|
}
|
204
213
|
|
205
214
|
supplyLiquidityUsdAvailable() {
|
206
|
-
return
|
215
|
+
return (
|
216
|
+
this.supplyLiquidityAvailable() * (safeGetPrice(this.supplyMint()) ?? 0)
|
217
|
+
);
|
207
218
|
}
|
208
219
|
|
209
220
|
debtLiquidityAvailable() {
|
@@ -244,7 +255,7 @@ export abstract class SolautoPositionEx {
|
|
244
255
|
}
|
245
256
|
|
246
257
|
eligibleForRebalance(bpsDistanceThreshold = 0): RebalanceAction | undefined {
|
247
|
-
if (!this.settings() || !
|
258
|
+
if (!this.settings() || !this.supplyUsd()) {
|
248
259
|
return undefined;
|
249
260
|
}
|
250
261
|
|
@@ -1,14 +1,17 @@
|
|
1
1
|
import { PublicKey } from "@solana/web3.js";
|
2
2
|
import { Program, publicKey, Umi } from "@metaplex-foundation/umi";
|
3
|
-
import {
|
3
|
+
import {
|
4
|
+
fromWeb3JsPublicKey,
|
5
|
+
toWeb3JsPublicKey,
|
6
|
+
} from "@metaplex-foundation/umi-web3js-adapters";
|
4
7
|
import { ProgramEnv, MarginfiAssetAccounts } from "../types";
|
5
8
|
import { PositionState, PositionTokenState } from "../generated";
|
6
9
|
import {
|
7
|
-
DEFAULT_MARGINFI_GROUP,
|
8
|
-
MARGINFI_ACCOUNTS,
|
9
10
|
ALL_SUPPORTED_TOKENS,
|
11
|
+
getMarginfiAccounts,
|
10
12
|
MARGINFI_PROD_PROGRAM,
|
11
13
|
MARGINFI_STAGING_PROGRAM,
|
14
|
+
MarginfiAccountsMap,
|
12
15
|
TOKEN_INFO,
|
13
16
|
USD_DECIMALS,
|
14
17
|
} from "../constants";
|
@@ -34,6 +37,7 @@ import {
|
|
34
37
|
toBaseUnit,
|
35
38
|
toBps,
|
36
39
|
} from "./numberUtils";
|
40
|
+
import { getTokenAccountData } from "./accountUtils";
|
37
41
|
|
38
42
|
export function getMarginfiProgram(env: ProgramEnv) {
|
39
43
|
return env === "Prod" ? MARGINFI_PROD_PROGRAM : MARGINFI_STAGING_PROGRAM;
|
@@ -73,6 +77,18 @@ export function umiWithMarginfiProgram(umi: Umi, marginfiEnv?: ProgramEnv) {
|
|
73
77
|
});
|
74
78
|
}
|
75
79
|
|
80
|
+
export async function fetchBankAddresses(umi: Umi, bankPk: PublicKey) {
|
81
|
+
const bank = await safeFetchBank(umi, fromWeb3JsPublicKey(bankPk));
|
82
|
+
const liquidityVault = toWeb3JsPublicKey(bank!.liquidityVault);
|
83
|
+
const vaultAuthority = (await getTokenAccountData(umi, liquidityVault))
|
84
|
+
?.owner;
|
85
|
+
return {
|
86
|
+
bank: bankPk,
|
87
|
+
liquidityVault,
|
88
|
+
vaultAuthority,
|
89
|
+
};
|
90
|
+
}
|
91
|
+
|
76
92
|
interface AllMarginfiAssetAccounts extends MarginfiAssetAccounts {
|
77
93
|
mint: PublicKey;
|
78
94
|
}
|
@@ -80,16 +96,29 @@ interface AllMarginfiAssetAccounts extends MarginfiAssetAccounts {
|
|
80
96
|
export function findMarginfiAccounts(
|
81
97
|
bank: PublicKey
|
82
98
|
): AllMarginfiAssetAccounts {
|
83
|
-
|
84
|
-
for (const
|
85
|
-
const
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
99
|
+
const search = (bankAccounts: MarginfiAccountsMap) => {
|
100
|
+
for (const group in bankAccounts) {
|
101
|
+
for (const key in bankAccounts[group]) {
|
102
|
+
const account = bankAccounts[group][key];
|
103
|
+
if (
|
104
|
+
account.bank.toString().toLowerCase() ===
|
105
|
+
bank.toString().toLowerCase()
|
106
|
+
) {
|
107
|
+
return { ...account, mint: new PublicKey(key) };
|
108
|
+
}
|
90
109
|
}
|
91
110
|
}
|
111
|
+
};
|
112
|
+
|
113
|
+
let res = search(getMarginfiAccounts("Prod").bankAccounts);
|
114
|
+
if (res) {
|
115
|
+
return res;
|
116
|
+
}
|
117
|
+
res = search(getMarginfiAccounts("Staging").bankAccounts);
|
118
|
+
if (res) {
|
119
|
+
return res;
|
92
120
|
}
|
121
|
+
|
93
122
|
throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
|
94
123
|
}
|
95
124
|
|
@@ -145,11 +174,16 @@ export async function getMarginfiMaxLtvAndLiqThresholdBps(
|
|
145
174
|
return [0, 0];
|
146
175
|
}
|
147
176
|
|
177
|
+
const bankAccounts = getMarginfiAccounts(
|
178
|
+
undefined,
|
179
|
+
marginfiGroup
|
180
|
+
).bankAccounts;
|
181
|
+
|
148
182
|
if (!supply.bank || supply.bank === null) {
|
149
183
|
supply.bank = await safeFetchBank(
|
150
184
|
umi,
|
151
185
|
publicKey(
|
152
|
-
|
186
|
+
bankAccounts[marginfiGroup.toString()][supply.mint.toString()].bank
|
153
187
|
),
|
154
188
|
{ commitment: "confirmed" }
|
155
189
|
);
|
@@ -162,7 +196,7 @@ export async function getMarginfiMaxLtvAndLiqThresholdBps(
|
|
162
196
|
debt.bank = await safeFetchBank(
|
163
197
|
umi,
|
164
198
|
publicKey(
|
165
|
-
|
199
|
+
bankAccounts[marginfiGroup.toString()][debt.mint.toString()].bank
|
166
200
|
),
|
167
201
|
{ commitment: "confirmed" }
|
168
202
|
);
|
@@ -381,9 +415,9 @@ async function getBank(
|
|
381
415
|
? await safeFetchBank(
|
382
416
|
umi,
|
383
417
|
publicKey(
|
384
|
-
|
385
|
-
|
386
|
-
].bank
|
418
|
+
getMarginfiAccounts(undefined, marginfiGroup).bankAccounts[
|
419
|
+
marginfiGroup?.toString() ?? ""
|
420
|
+
][data?.mint.toString()].bank
|
387
421
|
),
|
388
422
|
{ commitment: "confirmed" }
|
389
423
|
)
|
@@ -396,6 +430,7 @@ export async function getMarginfiAccountPositionState(
|
|
396
430
|
marginfiGroup?: PublicKey,
|
397
431
|
supply?: BankSelection,
|
398
432
|
debt?: BankSelection,
|
433
|
+
programEnv?: ProgramEnv,
|
399
434
|
contextUpdates?: ContextUpdates
|
400
435
|
): Promise<
|
401
436
|
| { supplyBank: Bank | null; debtBank: Bank | null; state: PositionState }
|
@@ -523,7 +558,7 @@ export async function getMarginfiAccountPositionState(
|
|
523
558
|
const supplyPrice = safeGetPrice(supply.mint!)!;
|
524
559
|
let [maxLtvBps, liqThresholdBps] = await getMarginfiMaxLtvAndLiqThresholdBps(
|
525
560
|
umi,
|
526
|
-
marginfiGroup ??
|
561
|
+
marginfiGroup ?? getMarginfiAccounts(programEnv).defaultGroup,
|
527
562
|
{
|
528
563
|
mint: toWeb3JsPublicKey(supplyBank.mint),
|
529
564
|
bank: supplyBank,
|