@haven-fi/solauto-sdk 1.0.667 → 1.0.669
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/marginfi-sdk/errors/marginfi.d.ts +209 -23
- package/dist/marginfi-sdk/errors/marginfi.d.ts.map +1 -1
- package/dist/marginfi-sdk/errors/marginfi.js +465 -123
- package/dist/marginfi-sdk/instructions/lendingAccountDeposit.d.ts +3 -1
- package/dist/marginfi-sdk/instructions/lendingAccountDeposit.d.ts.map +1 -1
- package/dist/marginfi-sdk/instructions/lendingAccountDeposit.js +1 -0
- package/dist/services/rebalance/rebalanceTxBuilder.js +1 -1
- package/dist/services/solauto/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/services/solauto/solautoMarginfiClient.js +2 -1
- package/dist/services/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/services/transactions/transactionUtils.js +1 -0
- package/dist/solautoPosition/positionUtils.d.ts.map +1 -1
- package/dist/solautoPosition/solautoPositionEx.d.ts +3 -3
- package/dist/solautoPosition/solautoPositionEx.d.ts.map +1 -1
- package/dist/solautoPosition/solautoPositionEx.js +14 -8
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/marginfi/data.d.ts +41 -0
- package/dist/utils/marginfi/data.d.ts.map +1 -0
- package/dist/utils/{marginfiUtils.js → marginfi/data.js} +8 -145
- package/dist/utils/marginfi/general.d.ts +27 -0
- package/dist/utils/marginfi/general.d.ts.map +1 -0
- package/dist/utils/marginfi/general.js +146 -0
- package/dist/utils/marginfi/index.d.ts +3 -0
- package/dist/utils/marginfi/index.d.ts.map +1 -0
- package/dist/utils/marginfi/index.js +18 -0
- package/dist/utils/solanaUtils.d.ts.map +1 -1
- package/dist/utils/solanaUtils.js +14 -13
- package/dist/utils/solautoUtils.d.ts.map +1 -1
- package/dist/utils/solautoUtils.js +4 -4
- package/local/txSandbox.ts +3 -3
- package/package.json +1 -1
- package/src/marginfi-sdk/errors/marginfi.ts +583 -122
- package/src/marginfi-sdk/instructions/lendingAccountDeposit.ts +7 -0
- package/src/services/rebalance/rebalanceTxBuilder.ts +1 -1
- package/src/services/solauto/solautoMarginfiClient.ts +2 -1
- package/src/services/transactions/transactionUtils.ts +1 -0
- package/src/solautoPosition/positionUtils.ts +0 -1
- package/src/solautoPosition/solautoPositionEx.ts +24 -9
- package/src/utils/index.ts +1 -1
- package/src/utils/{marginfiUtils.ts → marginfi/data.ts} +10 -220
- package/src/utils/marginfi/general.ts +226 -0
- package/src/utils/marginfi/index.ts +2 -0
- package/src/utils/solanaUtils.ts +12 -17
- package/src/utils/solautoUtils.ts +1 -4
- package/tests/transactions/shared.ts +3 -1
- package/tests/transactions/solautoMarginfi.ts +4 -2
- package/dist/utils/marginfiUtils.d.ts +0 -62
- package/dist/utils/marginfiUtils.d.ts.map +0 -1
@@ -0,0 +1,146 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.createDynamicMarginfiProgram = createDynamicMarginfiProgram;
|
4
|
+
exports.umiWithMarginfiProgram = umiWithMarginfiProgram;
|
5
|
+
exports.getAllBankRelatedAccounts = getAllBankRelatedAccounts;
|
6
|
+
exports.fetchBankAddresses = fetchBankAddresses;
|
7
|
+
exports.getMarginfiPriceOracle = getMarginfiPriceOracle;
|
8
|
+
exports.findMarginfiAccounts = findMarginfiAccounts;
|
9
|
+
exports.getRemainingAccountsForMarginfiHealthCheck = getRemainingAccountsForMarginfiHealthCheck;
|
10
|
+
exports.calcMarginfiMaxLtvAndLiqThresholdBps = calcMarginfiMaxLtvAndLiqThresholdBps;
|
11
|
+
exports.marginfiAccountEmpty = marginfiAccountEmpty;
|
12
|
+
const web3_js_1 = require("@solana/web3.js");
|
13
|
+
const umi_1 = require("@metaplex-foundation/umi");
|
14
|
+
const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
|
15
|
+
const constants_1 = require("../../constants");
|
16
|
+
const marginfi_sdk_1 = require("../../marginfi-sdk");
|
17
|
+
const numberUtils_1 = require("../numberUtils");
|
18
|
+
const accountUtils_1 = require("../accountUtils");
|
19
|
+
const pythUtils_1 = require("../pythUtils");
|
20
|
+
const solanaUtils_1 = require("../solanaUtils");
|
21
|
+
function createDynamicMarginfiProgram(env) {
|
22
|
+
return {
|
23
|
+
name: "marginfi",
|
24
|
+
publicKey: (0, umi_1.publicKey)((0, constants_1.getMarginfiAccounts)(env ?? "Prod").program),
|
25
|
+
getErrorFromCode(code, cause) {
|
26
|
+
return (0, marginfi_sdk_1.getMarginfiErrorFromCode)(code, this, cause);
|
27
|
+
},
|
28
|
+
getErrorFromName(name, cause) {
|
29
|
+
return (0, marginfi_sdk_1.getMarginfiErrorFromName)(name, this, cause);
|
30
|
+
},
|
31
|
+
isOnCluster() {
|
32
|
+
return true;
|
33
|
+
},
|
34
|
+
};
|
35
|
+
}
|
36
|
+
function umiWithMarginfiProgram(umi, marginfiEnv) {
|
37
|
+
return umi.use({
|
38
|
+
install(umi) {
|
39
|
+
umi.programs.add(createDynamicMarginfiProgram(marginfiEnv ?? "Prod"), false);
|
40
|
+
},
|
41
|
+
});
|
42
|
+
}
|
43
|
+
async function getAllBankRelatedAccounts(umi, bankAccountsMap) {
|
44
|
+
const banks = Object.values(bankAccountsMap).flatMap((group) => Object.values(group).map((accounts) => accounts.bank));
|
45
|
+
const banksData = await (0, marginfi_sdk_1.safeFetchAllBank)(umi, banks.map((x) => (0, umi_1.publicKey)(x)));
|
46
|
+
const oracles = banksData
|
47
|
+
.map((bank) => {
|
48
|
+
const oracleKey = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.config.oracleKeys[0]);
|
49
|
+
return bank.config.oracleSetup === marginfi_sdk_1.OracleSetup.PythPushOracle
|
50
|
+
? [
|
51
|
+
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.PYTH_SPONSORED_SHARD_ID),
|
52
|
+
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.MARGINFI_SPONSORED_SHARD_ID),
|
53
|
+
]
|
54
|
+
: [oracleKey];
|
55
|
+
})
|
56
|
+
.flat()
|
57
|
+
.map((x) => x.toString());
|
58
|
+
const otherAccounts = Object.entries(bankAccountsMap).flatMap(([groupName, tokenMap]) => Object.values(tokenMap).flatMap((accounts) => [
|
59
|
+
groupName,
|
60
|
+
accounts.liquidityVault,
|
61
|
+
accounts.vaultAuthority,
|
62
|
+
]));
|
63
|
+
return Array.from(new Set([...banks, ...oracles, ...otherAccounts]))
|
64
|
+
.filter((x) => x !== web3_js_1.PublicKey.default.toString())
|
65
|
+
.map((x) => new web3_js_1.PublicKey(x));
|
66
|
+
}
|
67
|
+
async function fetchBankAddresses(umi, bankPk) {
|
68
|
+
const bank = await (0, marginfi_sdk_1.fetchBank)(umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(bankPk));
|
69
|
+
const liquidityVault = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.liquidityVault);
|
70
|
+
const vaultAuthority = (await (0, accountUtils_1.getTokenAccountData)(umi, liquidityVault))
|
71
|
+
?.owner;
|
72
|
+
const priceOracle = await getMarginfiPriceOracle(umi, { data: bank });
|
73
|
+
return {
|
74
|
+
bank: bankPk,
|
75
|
+
liquidityVault,
|
76
|
+
vaultAuthority,
|
77
|
+
priceOracle,
|
78
|
+
};
|
79
|
+
}
|
80
|
+
async function getMarginfiPriceOracle(umi, bank) {
|
81
|
+
if (!bank.data) {
|
82
|
+
bank.data = await (0, marginfi_sdk_1.fetchBank)(umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(bank.pk));
|
83
|
+
}
|
84
|
+
const oracleKey = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.data.config.oracleKeys[0]);
|
85
|
+
const priceOracle = bank.data.config.oracleSetup === marginfi_sdk_1.OracleSetup.PythPushOracle
|
86
|
+
? await (0, pythUtils_1.getMostUpToDatePythOracle)(umi, [
|
87
|
+
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.PYTH_SPONSORED_SHARD_ID),
|
88
|
+
(0, pythUtils_1.getPythPushOracleAddress)(oracleKey, constants_1.MARGINFI_SPONSORED_SHARD_ID),
|
89
|
+
])
|
90
|
+
: oracleKey;
|
91
|
+
return priceOracle;
|
92
|
+
}
|
93
|
+
function findMarginfiAccounts(bank) {
|
94
|
+
const search = (bankAccounts) => {
|
95
|
+
for (const group in bankAccounts) {
|
96
|
+
for (const key in bankAccounts[group]) {
|
97
|
+
const account = bankAccounts[group][key];
|
98
|
+
if (account.bank.toString().toLowerCase() ===
|
99
|
+
bank.toString().toLowerCase()) {
|
100
|
+
return { ...account, mint: new web3_js_1.PublicKey(key) };
|
101
|
+
}
|
102
|
+
}
|
103
|
+
}
|
104
|
+
};
|
105
|
+
let res = search((0, constants_1.getMarginfiAccounts)("Prod").bankAccounts);
|
106
|
+
if (res) {
|
107
|
+
return res;
|
108
|
+
}
|
109
|
+
res = search((0, constants_1.getMarginfiAccounts)("Staging").bankAccounts);
|
110
|
+
if (res) {
|
111
|
+
return res;
|
112
|
+
}
|
113
|
+
throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
|
114
|
+
}
|
115
|
+
async function getRemainingAccountsForMarginfiHealthCheck(umi, balance) {
|
116
|
+
if (!balance.active) {
|
117
|
+
return [];
|
118
|
+
}
|
119
|
+
const priceOracle = await getMarginfiPriceOracle(umi, {
|
120
|
+
pk: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(balance.bankPk),
|
121
|
+
});
|
122
|
+
return [
|
123
|
+
(0, solanaUtils_1.getAccountMeta)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(balance.bankPk)),
|
124
|
+
(0, solanaUtils_1.getAccountMeta)(priceOracle),
|
125
|
+
];
|
126
|
+
}
|
127
|
+
function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank, debtBank, supplyPrice) {
|
128
|
+
let maxLtv = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightInit.value) /
|
129
|
+
(0, numberUtils_1.bytesToI80F48)(debtBank.config.liabilityWeightInit.value);
|
130
|
+
const liqThreshold = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightMaint.value) /
|
131
|
+
(0, numberUtils_1.bytesToI80F48)(debtBank.config.liabilityWeightMaint.value);
|
132
|
+
const totalDepositedUsdValue = (0, numberUtils_1.fromBaseUnit)(BigInt(Math.round((0, numberUtils_1.bytesToI80F48)(supplyBank.totalAssetShares.value) *
|
133
|
+
(0, numberUtils_1.bytesToI80F48)(supplyBank.assetShareValue.value))), supplyBank.mintDecimals) * supplyPrice;
|
134
|
+
if (supplyBank.config.totalAssetValueInitLimit !== BigInt(0) &&
|
135
|
+
totalDepositedUsdValue > supplyBank.config.totalAssetValueInitLimit) {
|
136
|
+
const discount = Number(supplyBank.config.totalAssetValueInitLimit) /
|
137
|
+
totalDepositedUsdValue;
|
138
|
+
maxLtv = maxLtv * Number(discount);
|
139
|
+
}
|
140
|
+
return [(0, numberUtils_1.toBps)(maxLtv, "Floor"), (0, numberUtils_1.toBps)(liqThreshold, "Floor")];
|
141
|
+
}
|
142
|
+
function marginfiAccountEmpty(marginfiAccount) {
|
143
|
+
return (marginfiAccount.lendingAccount.balances.find((x) => x.bankPk.toString() !== web3_js_1.PublicKey.default.toString() &&
|
144
|
+
((0, numberUtils_1.bytesToI80F48)(x.assetShares.value) > 0.000001 ||
|
145
|
+
(0, numberUtils_1.bytesToI80F48)(x.liabilityShares.value) > 0.000001)) === undefined);
|
146
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/marginfi/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC"}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
|
+
};
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
+
__exportStar(require("./data"), exports);
|
18
|
+
__exportStar(require("./general"), exports);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,UAAU,EACV,SAAS,EAKT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;AAQlC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAe9E,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,SAAS,EACrB,KAAK,CAAC,EAAE,UAAU,GACjB,CAAC,UAAU,EAAE,GAAG,CAAC,CAWnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,sBAAsB,GACzB,kBAAkB,CAMpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,kBAAkB,CAOpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAOpB;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,GACd,kBAAkB,CAUpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,EACtB,QAAQ,EAAE,MAAM,GACf,kBAAkB,CASpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,SAAS,EACvB,SAAS,EAAE,SAAS,GACnB,kBAAkB,CAKpB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAKpB;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,QAAQ,GAAE,OAAe,EACzB,UAAU,GAAE,OAAe,GAC1B,WAAW,CAEb;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,SAAS,EAAE,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC,CAcnB;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,oBAAoB,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAmBpC;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,kBAAkB,EACtB,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,
|
1
|
+
{"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"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"}
|
@@ -30,7 +30,7 @@ const marginfi_sdk_1 = require("../marginfi-sdk");
|
|
30
30
|
const accountUtils_1 = require("./accountUtils");
|
31
31
|
const generalUtils_1 = require("./generalUtils");
|
32
32
|
const solautoUtils_1 = require("./solautoUtils");
|
33
|
-
const
|
33
|
+
const marginfi_1 = require("./marginfi");
|
34
34
|
function getSolanaRpcConnection(rpcUrl, programId, lpEnv) {
|
35
35
|
const connection = new web3_js_1.Connection(rpcUrl, {
|
36
36
|
commitment: "confirmed",
|
@@ -38,7 +38,7 @@ function getSolanaRpcConnection(rpcUrl, programId, lpEnv) {
|
|
38
38
|
const umi = (0, umi_bundle_defaults_1.createUmi)(connection).use({
|
39
39
|
install(umi) {
|
40
40
|
umi.programs.add((0, solautoUtils_1.createDynamicSolautoProgram)(programId), false);
|
41
|
-
umi.programs.add((0,
|
41
|
+
umi.programs.add((0, marginfi_1.createDynamicMarginfiProgram)(lpEnv), false);
|
42
42
|
},
|
43
43
|
});
|
44
44
|
return [connection, umi];
|
@@ -111,12 +111,16 @@ function addTxOptimizations(umi, tx, computeUnitPrice, computeUnitLimit) {
|
|
111
111
|
? setComputeUnitLimitUmiIx(umi.identity, computeUnitLimit)
|
112
112
|
: (0, umi_1.transactionBuilder)();
|
113
113
|
const allOptimizations = tx.prepend(computePriceIx).prepend(computeLimitIx);
|
114
|
-
const
|
114
|
+
const withCuPrice = tx.prepend(computePriceIx);
|
115
|
+
const withCuLimit = tx.prepend(computeLimitIx);
|
115
116
|
if (allOptimizations.fitsInOneTransaction(umi)) {
|
116
117
|
return allOptimizations;
|
117
118
|
}
|
118
|
-
else if (
|
119
|
-
return
|
119
|
+
else if (withCuPrice.fitsInOneTransaction(umi)) {
|
120
|
+
return withCuPrice;
|
121
|
+
}
|
122
|
+
else if (withCuLimit.fitsInOneTransaction(umi)) {
|
123
|
+
return withCuLimit;
|
120
124
|
}
|
121
125
|
else {
|
122
126
|
return tx;
|
@@ -259,24 +263,21 @@ async function sendSingleOptimizedTransaction(umi, connection, tx, txType, prior
|
|
259
263
|
]);
|
260
264
|
(0, generalUtils_1.consoleLog)("Unique account locks: ", Array.from(new Set(accounts)).length);
|
261
265
|
const blockhash = await connection.getLatestBlockhash("confirmed");
|
262
|
-
let
|
266
|
+
let cuLimit = undefined;
|
263
267
|
if (txType !== "skip-simulation") {
|
264
268
|
const simulationResult = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await simulateTransaction(umi, connection, assembleFinalTransaction(umi, tx, undefined, 1400000).setBlockhash(blockhash)), 3);
|
265
|
-
|
266
|
-
(0, generalUtils_1.consoleLog)("Compute unit limit: ",
|
269
|
+
cuLimit = Math.round(simulationResult.value.unitsConsumed * 1.15);
|
270
|
+
(0, generalUtils_1.consoleLog)("Compute unit limit: ", cuLimit);
|
267
271
|
}
|
268
272
|
let cuPrice;
|
269
273
|
if (prioritySetting !== types_1.PriorityFeeSetting.None) {
|
270
274
|
cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting);
|
271
|
-
|
272
|
-
cuPrice = 1000000;
|
273
|
-
}
|
274
|
-
cuPrice = Math.min(cuPrice, 100 * 1000000);
|
275
|
+
cuPrice = Math.min(cuPrice ?? 0, 100000000);
|
275
276
|
(0, generalUtils_1.consoleLog)("Compute unit price: ", cuPrice);
|
276
277
|
}
|
277
278
|
if (txType !== "only-simulate") {
|
278
279
|
onAwaitingSign?.();
|
279
|
-
const signedTx = await assembleFinalTransaction(umi, tx, cuPrice,
|
280
|
+
const signedTx = await assembleFinalTransaction(umi, tx, cuPrice, cuLimit)
|
280
281
|
.setBlockhash(blockhash)
|
281
282
|
.buildAndSign(umi);
|
282
283
|
const txSig = await spamSendTransactionUntilConfirmed(connection, (0, umi_web3js_adapters_1.toWeb3JsTransaction)(signedTx), blockhash);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solautoUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,gCAAgC,EAChC,SAAS,EAMV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,cAAc,EACf,MAAM,aAAa,CAAC;
|
1
|
+
{"version":3,"file":"solautoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solautoUtils.ts"],"names":[],"mappings":"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"}
|
@@ -23,8 +23,8 @@ const solautoPosition_1 = require("../solautoPosition");
|
|
23
23
|
const accountUtils_1 = require("./accountUtils");
|
24
24
|
const numberUtils_1 = require("./numberUtils");
|
25
25
|
const priceUtils_1 = require("./priceUtils");
|
26
|
-
const marginfiUtils_1 = require("./marginfiUtils");
|
27
26
|
const generalUtils_1 = require("./generalUtils");
|
27
|
+
const marginfi_1 = require("./marginfi");
|
28
28
|
function createDynamicSolautoProgram(programId) {
|
29
29
|
return {
|
30
30
|
name: "solauto",
|
@@ -120,8 +120,8 @@ async function getSolautoManagedPositions(umi, authority, positionTypeFilter) {
|
|
120
120
|
let tokens;
|
121
121
|
if (position.position.lendingPlatform === generated_1.LendingPlatform.Marginfi) {
|
122
122
|
tokens = [
|
123
|
-
(0,
|
124
|
-
(0,
|
123
|
+
(0, marginfi_1.findMarginfiAccounts)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(position.position.lpSupplyAccount)).mint,
|
124
|
+
(0, marginfi_1.findMarginfiAccounts)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(position.position.lpDebtAccount))
|
125
125
|
.mint,
|
126
126
|
];
|
127
127
|
}
|
@@ -193,7 +193,7 @@ async function getAllPositionsByAuthority(umi, user, positionTypeFilter) {
|
|
193
193
|
if (positionTypeFilter === generated_1.PositionType.SafeLoan) {
|
194
194
|
return [];
|
195
195
|
}
|
196
|
-
let marginfiPositions = await (0,
|
196
|
+
let marginfiPositions = await (0, marginfi_1.getAllMarginfiAccountsByAuthority)(umi, user, undefined, true);
|
197
197
|
marginfiPositions = marginfiPositions.filter((x) => (0, generalUtils_1.validPubkey)(x.supplyMint) && (0, generalUtils_1.validPubkey)(x.debtMint));
|
198
198
|
return marginfiPositions.map((x) => ({
|
199
199
|
publicKey: x.marginfiAccount,
|
package/local/txSandbox.ts
CHANGED
@@ -17,7 +17,7 @@ import {
|
|
17
17
|
import { getSecretKey } from "./shared";
|
18
18
|
|
19
19
|
const payForTransaction = false;
|
20
|
-
const testProgram =
|
20
|
+
const testProgram = false;
|
21
21
|
const lpEnv: ProgramEnv = "Prod";
|
22
22
|
|
23
23
|
export async function main() {
|
@@ -29,7 +29,7 @@ export async function main() {
|
|
29
29
|
|
30
30
|
const signer = createSignerFromKeypair(
|
31
31
|
umi,
|
32
|
-
fromWeb3JsKeypair(Keypair.fromSecretKey(getSecretKey(
|
32
|
+
fromWeb3JsKeypair(Keypair.fromSecretKey(getSecretKey()))
|
33
33
|
);
|
34
34
|
|
35
35
|
const client = getClient(LendingPlatform.Marginfi, {
|
@@ -54,7 +54,7 @@ export async function main() {
|
|
54
54
|
client,
|
55
55
|
undefined,
|
56
56
|
payForTransaction ? "normal" : "only-simulate",
|
57
|
-
PriorityFeeSetting.
|
57
|
+
PriorityFeeSetting.High,
|
58
58
|
true,
|
59
59
|
undefined,
|
60
60
|
{ totalRetries: 5 }
|