@haven-fi/solauto-sdk 1.0.299 → 1.0.301
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 +3 -3
- package/dist/constants/marginfiAccounts.d.ts.map +1 -1
- package/dist/constants/marginfiAccounts.js +69 -13
- package/dist/constants/pythConstants.d.ts +2 -2
- package/dist/constants/pythConstants.js +2 -2
- package/dist/constants/switchboardConstants.d.ts +4 -0
- package/dist/constants/switchboardConstants.d.ts.map +1 -0
- package/dist/constants/switchboardConstants.js +35 -0
- package/dist/constants/tokenConstants.d.ts +9 -2
- package/dist/constants/tokenConstants.d.ts.map +1 -1
- package/dist/constants/tokenConstants.js +54 -16
- package/dist/idls/switchboard.json +1 -0
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +1 -1
- package/dist/utils/generalUtils.d.ts +5 -2
- package/dist/utils/generalUtils.d.ts.map +1 -1
- package/dist/utils/generalUtils.js +54 -7
- package/dist/utils/marginfiUtils.d.ts +4 -4
- package/dist/utils/marginfiUtils.d.ts.map +1 -1
- package/dist/utils/marginfiUtils.js +16 -12
- package/dist/utils/solauto/generalUtils.d.ts +3 -3
- package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
- package/dist/utils/solauto/generalUtils.js +4 -4
- package/local/createFeeAccounts.ts +52 -0
- package/local/shared.ts +1 -1
- package/package.json +5 -2
- package/src/clients/solautoMarginfiClient.ts +3 -0
- package/src/constants/marginfiAccounts.ts +70 -13
- package/src/constants/pythConstants.ts +4 -4
- package/src/constants/switchboardConstants.ts +10 -0
- package/src/constants/tokenConstants.ts +55 -15
- package/src/idls/switchboard.json +1 -0
- package/src/transactions/transactionUtils.ts +1 -0
- package/src/utils/generalUtils.ts +93 -10
- package/src/utils/marginfiUtils.ts +20 -8
- package/src/utils/solauto/generalUtils.ts +6 -3
- package/tests/transactions/solautoMarginfi.ts +1 -1
- package/tests/unit/rebalanceCalculations.ts +6 -2
@@ -1,4 +1,4 @@
|
|
1
|
-
import { PublicKey } from "@solana/web3.js";
|
1
|
+
import { Connection, PublicKey } from "@solana/web3.js";
|
2
2
|
import { MaybeRpcAccount, Umi, PublicKey as UmiPublicKey } from "@metaplex-foundation/umi";
|
3
3
|
export declare function consoleLog(...args: any[]): void;
|
4
4
|
export declare function generateRandomU8(): number;
|
@@ -7,7 +7,10 @@ export declare function currentUnixSeconds(): number;
|
|
7
7
|
export declare function getSolanaAccountCreated(umi: Umi, pk: PublicKey): Promise<boolean>;
|
8
8
|
export declare function rpcAccountCreated(account: MaybeRpcAccount): boolean;
|
9
9
|
export declare function arraysAreEqual(arrayA: number[], arrayB: number[]): boolean;
|
10
|
-
export declare function
|
10
|
+
export declare function zip<T, U>(list1: T[], list2: U[]): [T, U][];
|
11
|
+
export declare function fetchTokenPrices(conn: Connection, mints: PublicKey[]): Promise<number[]>;
|
12
|
+
export declare function getPythPrices(mints: PublicKey[]): Promise<number[]>;
|
13
|
+
export declare function getSwitchboardPrices(conn: Connection, mints: PublicKey[]): Promise<number[]>;
|
11
14
|
export declare function safeGetPrice(mint: PublicKey | UmiPublicKey | undefined): number | undefined;
|
12
15
|
export type ErrorsToThrow = Array<new (...args: any[]) => Error>;
|
13
16
|
export declare function retryWithExponentialBackoff<T>(fn: (attemptNum: number, prevErr?: Error) => Promise<T>, retries?: number, delay?: number, errorsToThrow?: ErrorsToThrow): Promise<T>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,
|
1
|
+
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EAEf,GAAG,EACH,SAAS,IAAI,YAAY,EAC1B,MAAM,0BAA0B,CAAC;AAalC,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAI/C;AACD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAS1D;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqCnB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAoCrD;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,qBA8BnB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACvD,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
|
@@ -1,4 +1,7 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
6
|
exports.consoleLog = consoleLog;
|
4
7
|
exports.generateRandomU8 = generateRandomU8;
|
@@ -7,13 +10,21 @@ exports.currentUnixSeconds = currentUnixSeconds;
|
|
7
10
|
exports.getSolanaAccountCreated = getSolanaAccountCreated;
|
8
11
|
exports.rpcAccountCreated = rpcAccountCreated;
|
9
12
|
exports.arraysAreEqual = arraysAreEqual;
|
13
|
+
exports.zip = zip;
|
10
14
|
exports.fetchTokenPrices = fetchTokenPrices;
|
15
|
+
exports.getPythPrices = getPythPrices;
|
16
|
+
exports.getSwitchboardPrices = getSwitchboardPrices;
|
11
17
|
exports.safeGetPrice = safeGetPrice;
|
12
18
|
exports.retryWithExponentialBackoff = retryWithExponentialBackoff;
|
19
|
+
const web3_js_1 = require("@solana/web3.js");
|
13
20
|
const umi_1 = require("@metaplex-foundation/umi");
|
14
21
|
const pythConstants_1 = require("../constants/pythConstants");
|
15
22
|
const numberUtils_1 = require("./numberUtils");
|
16
23
|
const solautoConstants_1 = require("../constants/solautoConstants");
|
24
|
+
const on_demand_1 = require("@switchboard-xyz/on-demand");
|
25
|
+
const anchor_1 = require("@coral-xyz/anchor");
|
26
|
+
const switchboard_json_1 = __importDefault(require("../idls/switchboard.json"));
|
27
|
+
const switchboardConstants_1 = require("../constants/switchboardConstants");
|
17
28
|
function consoleLog(...args) {
|
18
29
|
if (globalThis.LOCAL_TEST) {
|
19
30
|
console.log(...args);
|
@@ -53,12 +64,39 @@ function arraysAreEqual(arrayA, arrayB) {
|
|
53
64
|
}
|
54
65
|
return true;
|
55
66
|
}
|
56
|
-
|
67
|
+
function zip(list1, list2) {
|
68
|
+
const minLength = Math.min(list1.length, list2.length);
|
69
|
+
const result = [];
|
70
|
+
for (let i = 0; i < minLength; i++) {
|
71
|
+
result.push([list1[i], list2[i]]);
|
72
|
+
}
|
73
|
+
return result;
|
74
|
+
}
|
75
|
+
async function fetchTokenPrices(conn, mints) {
|
57
76
|
const currentTime = currentUnixSeconds();
|
58
77
|
if (!mints.some((mint) => !(mint.toString() in solautoConstants_1.PRICES) ||
|
59
78
|
currentTime - solautoConstants_1.PRICES[mint.toString()].time > 3)) {
|
60
79
|
return mints.map((mint) => solautoConstants_1.PRICES[mint.toString()].price);
|
61
80
|
}
|
81
|
+
const pythMints = mints.filter((x) => x.toString() in pythConstants_1.PYTH_PRICE_FEED_IDS);
|
82
|
+
const switchboardMints = mints.filter((x) => x.toString() in switchboardConstants_1.SWITCHBOARD_PRICE_FEED_IDS);
|
83
|
+
const [pythData, switchboardData] = await Promise.all([
|
84
|
+
zip(pythMints, await getPythPrices(pythMints)),
|
85
|
+
zip(switchboardMints, await getSwitchboardPrices(conn, switchboardMints)),
|
86
|
+
]);
|
87
|
+
const prices = mints.map((mint) => {
|
88
|
+
const item = [...pythData, ...switchboardData].find((data) => data[0].equals(mint));
|
89
|
+
return item ? item[1] : 0;
|
90
|
+
});
|
91
|
+
for (var i = 0; i < mints.length; i++) {
|
92
|
+
solautoConstants_1.PRICES[mints[i].toString()] = {
|
93
|
+
price: prices[i],
|
94
|
+
time: currentUnixSeconds(),
|
95
|
+
};
|
96
|
+
}
|
97
|
+
return prices;
|
98
|
+
}
|
99
|
+
async function getPythPrices(mints) {
|
62
100
|
const priceFeedIds = mints.map((mint) => pythConstants_1.PYTH_PRICE_FEED_IDS[mint.toString()]);
|
63
101
|
const getReq = async () => await fetch(`https://hermes.pyth.network/v2/updates/price/latest?${priceFeedIds.map((x) => `ids%5B%5D=${x}`).join("&")}`);
|
64
102
|
const prices = await retryWithExponentialBackoff(async () => {
|
@@ -81,14 +119,23 @@ async function fetchTokenPrices(mints) {
|
|
81
119
|
});
|
82
120
|
return prices;
|
83
121
|
}, 5, 200);
|
84
|
-
for (var i = 0; i < mints.length; i++) {
|
85
|
-
solautoConstants_1.PRICES[mints[i].toString()] = {
|
86
|
-
price: prices[i],
|
87
|
-
time: currentUnixSeconds(),
|
88
|
-
};
|
89
|
-
}
|
90
122
|
return prices;
|
91
123
|
}
|
124
|
+
async function getSwitchboardPrices(conn, mints) {
|
125
|
+
const dummyWallet = {
|
126
|
+
publicKey: new web3_js_1.PublicKey("11111111111111111111111111111111"),
|
127
|
+
signTransaction: async (tx) => tx,
|
128
|
+
signAllTransactions: async (txs) => txs,
|
129
|
+
};
|
130
|
+
const provider = new anchor_1.AnchorProvider(conn, dummyWallet, anchor_1.AnchorProvider.defaultOptions());
|
131
|
+
const program = new anchor_1.Program(switchboard_json_1.default, provider);
|
132
|
+
const results = await Promise.all(mints.map(async (mint) => {
|
133
|
+
const feed = new on_demand_1.PullFeed(program, new web3_js_1.PublicKey(switchboardConstants_1.SWITCHBOARD_PRICE_FEED_IDS[mint.toString()]));
|
134
|
+
const result = await feed.loadData();
|
135
|
+
return Number(result.result.value) / Math.pow(10, 18);
|
136
|
+
}));
|
137
|
+
return results;
|
138
|
+
}
|
92
139
|
function safeGetPrice(mint) {
|
93
140
|
if (mint && mint?.toString() in solautoConstants_1.PRICES) {
|
94
141
|
return solautoConstants_1.PRICES[mint.toString()].price;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { PublicKey } from "@solana/web3.js";
|
1
|
+
import { Connection, PublicKey } from "@solana/web3.js";
|
2
2
|
import { Umi } from "@metaplex-foundation/umi";
|
3
3
|
import { Bank, MarginfiAccount } from "../marginfi-sdk";
|
4
4
|
import { MarginfiAssetAccounts } from "../types/accounts";
|
@@ -9,14 +9,14 @@ interface AllMarginfiAssetAccounts extends MarginfiAssetAccounts {
|
|
9
9
|
}
|
10
10
|
export declare function findMarginfiAccounts(bank: PublicKey): AllMarginfiAssetAccounts;
|
11
11
|
export declare function calcMaxLtvAndLiqThreshold(supplyBank: Bank, debtBank: Bank, supplyPrice: number): [number, number];
|
12
|
-
export declare function getMaxLtvAndLiqThreshold(umi: Umi, marginfiGroup: PublicKey, supply: {
|
12
|
+
export declare function getMaxLtvAndLiqThreshold(conn: Connection, umi: Umi, marginfiGroup: PublicKey, supply: {
|
13
13
|
mint: PublicKey;
|
14
14
|
bank?: Bank | null;
|
15
15
|
}, debt: {
|
16
16
|
mint: PublicKey;
|
17
17
|
bank?: Bank | null;
|
18
18
|
}, supplyPrice?: number): Promise<[number, number]>;
|
19
|
-
export declare function getAllMarginfiAccountsByAuthority(umi: Umi, authority: PublicKey, compatibleWithSolauto?: boolean): Promise<{
|
19
|
+
export declare function getAllMarginfiAccountsByAuthority(conn: Connection, umi: Umi, authority: PublicKey, compatibleWithSolauto?: boolean): Promise<{
|
20
20
|
marginfiAccount: PublicKey;
|
21
21
|
supplyMint?: PublicKey;
|
22
22
|
debtMint?: PublicKey;
|
@@ -30,7 +30,7 @@ type BanksCache = {
|
|
30
30
|
[mint: string]: Bank;
|
31
31
|
};
|
32
32
|
};
|
33
|
-
export declare function getMarginfiAccountPositionState(umi: Umi, protocolAccount: {
|
33
|
+
export declare function getMarginfiAccountPositionState(conn: Connection, umi: Umi, protocolAccount: {
|
34
34
|
pk: PublicKey;
|
35
35
|
data?: MarginfiAccount;
|
36
36
|
}, marginfiGroup?: PublicKey, supply?: BankSelection, debt?: BankSelection, livePositionUpdates?: LivePositionUpdates): Promise<PositionState | undefined>;
|
@@ -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;
|
1
|
+
{"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAGJ,eAAe,EAGhB,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,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GACd,wBAAwB,CAY1B;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,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,IAAI,EAAE,UAAU,EAChB,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,CAuDA;AAgED,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,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,GAAG,EACR,eAAe,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,eAAe,CAAA;CAAE,EAC1D,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,CA+LpC;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"}
|
@@ -42,7 +42,7 @@ function calcMaxLtvAndLiqThreshold(supplyBank, debtBank, supplyPrice) {
|
|
42
42
|
}
|
43
43
|
return [maxLtv, liqThreshold];
|
44
44
|
}
|
45
|
-
async function getMaxLtvAndLiqThreshold(umi, marginfiGroup, supply, debt, supplyPrice) {
|
45
|
+
async function getMaxLtvAndLiqThreshold(conn, umi, marginfiGroup, supply, debt, supplyPrice) {
|
46
46
|
if (!supply.bank && supply.mint.equals(web3_js_1.PublicKey.default)) {
|
47
47
|
return [0, 0];
|
48
48
|
}
|
@@ -54,7 +54,7 @@ async function getMaxLtvAndLiqThreshold(umi, marginfiGroup, supply, debt, supply
|
|
54
54
|
debt.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(marginfiAccounts_1.MARGINFI_ACCOUNTS[marginfiGroup.toString()][debt.mint.toString()].bank), { commitment: "confirmed" });
|
55
55
|
}
|
56
56
|
if (!supplyPrice) {
|
57
|
-
const [price] = await (0, generalUtils_1.fetchTokenPrices)([
|
57
|
+
const [price] = await (0, generalUtils_1.fetchTokenPrices)(conn, [
|
58
58
|
(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supply.bank.mint),
|
59
59
|
]);
|
60
60
|
supplyPrice = price;
|
@@ -64,7 +64,7 @@ async function getMaxLtvAndLiqThreshold(umi, marginfiGroup, supply, debt, supply
|
|
64
64
|
}
|
65
65
|
return calcMaxLtvAndLiqThreshold(supply.bank, debt.bank, supplyPrice);
|
66
66
|
}
|
67
|
-
async function getAllMarginfiAccountsByAuthority(umi, authority, compatibleWithSolauto) {
|
67
|
+
async function getAllMarginfiAccountsByAuthority(conn, umi, authority, compatibleWithSolauto) {
|
68
68
|
const marginfiAccounts = await umi.rpc.getProgramAccounts(marginfi_sdk_1.MARGINFI_PROGRAM_ID, {
|
69
69
|
commitment: "confirmed",
|
70
70
|
dataSlice: {
|
@@ -86,7 +86,9 @@ async function getAllMarginfiAccountsByAuthority(umi, authority, compatibleWithS
|
|
86
86
|
if (compatibleWithSolauto) {
|
87
87
|
const positionStates = await Promise.all(marginfiAccounts.map(async (x) => ({
|
88
88
|
publicKey: x.publicKey,
|
89
|
-
state: await getMarginfiAccountPositionState(umi, {
|
89
|
+
state: await getMarginfiAccountPositionState(conn, umi, {
|
90
|
+
pk: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(x.publicKey),
|
91
|
+
}),
|
90
92
|
})));
|
91
93
|
return positionStates
|
92
94
|
.sort((a, b) => (0, numberUtils_1.fromBaseUnit)(b.state?.netWorth.baseAmountUsdValue ?? BigInt(0), generalAccounts_1.USD_DECIMALS) -
|
@@ -104,12 +106,14 @@ async function getAllMarginfiAccountsByAuthority(umi, authority, compatibleWithS
|
|
104
106
|
}));
|
105
107
|
}
|
106
108
|
}
|
107
|
-
async function getTokenUsage(bank, isAsset, shares, amountUsedAdjustment) {
|
109
|
+
async function getTokenUsage(conn, bank, isAsset, shares, amountUsedAdjustment) {
|
108
110
|
let amountUsed = 0;
|
109
111
|
let amountCanBeUsed = 0;
|
110
112
|
let marketPrice = 0;
|
111
113
|
if (bank !== null) {
|
112
|
-
[marketPrice] = await (0, generalUtils_1.fetchTokenPrices)(
|
114
|
+
[marketPrice] = await (0, generalUtils_1.fetchTokenPrices)(conn, [
|
115
|
+
(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.mint),
|
116
|
+
]);
|
113
117
|
const [assetShareValue, liabilityShareValue] = await getUpToDateShareValues(bank);
|
114
118
|
const shareValue = isAsset ? assetShareValue : liabilityShareValue;
|
115
119
|
amountUsed = shares * shareValue + Number(amountUsedAdjustment ?? 0);
|
@@ -143,7 +147,7 @@ async function getTokenUsage(bank, isAsset, shares, amountUsedAdjustment) {
|
|
143
147
|
padding: new Uint8Array([]),
|
144
148
|
};
|
145
149
|
}
|
146
|
-
async function getMarginfiAccountPositionState(umi, protocolAccount, marginfiGroup, supply, debt, livePositionUpdates) {
|
150
|
+
async function getMarginfiAccountPositionState(conn, umi, protocolAccount, marginfiGroup, supply, debt, livePositionUpdates) {
|
147
151
|
let marginfiAccount = protocolAccount.data ??
|
148
152
|
(await (0, marginfi_sdk_1.safeFetchMarginfiAccount)(umi, (0, umi_1.publicKey)(protocolAccount.pk), {
|
149
153
|
commitment: "confirmed",
|
@@ -186,7 +190,7 @@ async function getMarginfiAccountPositionState(umi, protocolAccount, marginfiGro
|
|
186
190
|
if (!supply.mint) {
|
187
191
|
supply.mint = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint);
|
188
192
|
}
|
189
|
-
supplyUsage = await getTokenUsage(supplyBank, true, (0, numberUtils_1.bytesToI80F48)(supplyBalances[0].assetShares.value), livePositionUpdates?.supplyAdjustment);
|
193
|
+
supplyUsage = await getTokenUsage(conn, supplyBank, true, (0, numberUtils_1.bytesToI80F48)(supplyBalances[0].assetShares.value), livePositionUpdates?.supplyAdjustment);
|
190
194
|
}
|
191
195
|
if (debtBalances.length > 0) {
|
192
196
|
if (debtBank === null) {
|
@@ -197,7 +201,7 @@ async function getMarginfiAccountPositionState(umi, protocolAccount, marginfiGro
|
|
197
201
|
if (!debt.mint) {
|
198
202
|
debt.mint = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(debtBank.mint);
|
199
203
|
}
|
200
|
-
debtUsage = await getTokenUsage(debtBank, false, (0, numberUtils_1.bytesToI80F48)(debtBalances[0].liabilityShares.value), livePositionUpdates?.debtAdjustment);
|
204
|
+
debtUsage = await getTokenUsage(conn, debtBank, false, (0, numberUtils_1.bytesToI80F48)(debtBalances[0].liabilityShares.value), livePositionUpdates?.debtAdjustment);
|
201
205
|
}
|
202
206
|
}
|
203
207
|
if (supplyBank === null) {
|
@@ -208,17 +212,17 @@ async function getMarginfiAccountPositionState(umi, protocolAccount, marginfiGro
|
|
208
212
|
return undefined;
|
209
213
|
}
|
210
214
|
if (!supplyUsage) {
|
211
|
-
supplyUsage = await getTokenUsage(supplyBank, true, 0, livePositionUpdates?.supplyAdjustment);
|
215
|
+
supplyUsage = await getTokenUsage(conn, supplyBank, true, 0, livePositionUpdates?.supplyAdjustment);
|
212
216
|
}
|
213
217
|
if (constants_1.TOKEN_INFO[supplyBank.mint.toString()].isStableCoin &&
|
214
218
|
(debtBank === null || constants_1.TOKEN_INFO[debtBank.mint.toString()].isStableCoin)) {
|
215
219
|
return undefined;
|
216
220
|
}
|
217
221
|
if (!debtUsage) {
|
218
|
-
debtUsage = await getTokenUsage(debtBank, false, 0, livePositionUpdates?.debtAdjustment);
|
222
|
+
debtUsage = await getTokenUsage(conn, debtBank, false, 0, livePositionUpdates?.debtAdjustment);
|
219
223
|
}
|
220
224
|
const supplyPrice = (0, generalUtils_1.safeGetPrice)(supply.mint);
|
221
|
-
let [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(umi, marginfiGroup ?? new web3_js_1.PublicKey(marginfiAccounts_1.DEFAULT_MARGINFI_GROUP), {
|
225
|
+
let [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(conn, umi, marginfiGroup ?? new web3_js_1.PublicKey(marginfiAccounts_1.DEFAULT_MARGINFI_GROUP), {
|
222
226
|
mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint),
|
223
227
|
bank: supplyBank,
|
224
228
|
}, {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { PublicKey } from "@solana/web3.js";
|
1
|
+
import { Connection, PublicKey } from "@solana/web3.js";
|
2
2
|
import { Program, Umi } from "@metaplex-foundation/umi";
|
3
3
|
import { AutomationSettings, DCASettings, DCASettingsInpArgs, PositionState, PositionType, SolautoSettingsParameters, SolautoSettingsParametersInpArgs, TokenType } from "../../generated";
|
4
4
|
import { RebalanceAction, SolautoPositionDetails } from "../../types/solauto";
|
@@ -12,8 +12,8 @@ export declare function eligibleForRefresh(positionState: PositionState, positio
|
|
12
12
|
export declare function getSolautoManagedPositions(umi: Umi, authority?: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
|
13
13
|
export declare function getAllReferralStates(umi: Umi): Promise<PublicKey[]>;
|
14
14
|
export declare function getReferralsByUser(umi: Umi, user: PublicKey): Promise<PublicKey[]>;
|
15
|
-
export declare function getAllPositionsByAuthority(umi: Umi, user: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
|
16
|
-
export declare function positionStateWithLatestPrices(state: PositionState, supplyPrice?: number, debtPrice?: number): Promise<PositionState>;
|
15
|
+
export declare function getAllPositionsByAuthority(conn: Connection, umi: Umi, user: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
|
16
|
+
export declare function positionStateWithLatestPrices(conn: Connection, state: PositionState, supplyPrice?: number, debtPrice?: number): Promise<PositionState>;
|
17
17
|
interface AssetProps {
|
18
18
|
mint: PublicKey;
|
19
19
|
price?: number;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
1
|
+
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"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"}
|
@@ -225,7 +225,7 @@ async function getReferralsByUser(umi, user) {
|
|
225
225
|
});
|
226
226
|
return accounts.map((x) => (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(x.publicKey));
|
227
227
|
}
|
228
|
-
async function getAllPositionsByAuthority(umi, user, positionTypeFilter) {
|
228
|
+
async function getAllPositionsByAuthority(conn, umi, user, positionTypeFilter) {
|
229
229
|
const solautoCompatiblePositions = await Promise.all([
|
230
230
|
(async () => {
|
231
231
|
const solautoManagedPositions = await getSolautoManagedPositions(umi, user, positionTypeFilter);
|
@@ -238,7 +238,7 @@ async function getAllPositionsByAuthority(umi, user, positionTypeFilter) {
|
|
238
238
|
if (positionTypeFilter === generated_1.PositionType.SafeLoan) {
|
239
239
|
return [];
|
240
240
|
}
|
241
|
-
let marginfiPositions = await (0, marginfiUtils_1.getAllMarginfiAccountsByAuthority)(umi, user, true);
|
241
|
+
let marginfiPositions = await (0, marginfiUtils_1.getAllMarginfiAccountsByAuthority)(conn, umi, user, true);
|
242
242
|
marginfiPositions = marginfiPositions.filter((x) => x.supplyMint &&
|
243
243
|
(x.debtMint.equals(web3_js_1.PublicKey.default) ||
|
244
244
|
constants_1.ALL_SUPPORTED_TOKENS.includes(x.debtMint.toString())));
|
@@ -256,9 +256,9 @@ async function getAllPositionsByAuthority(umi, user, positionTypeFilter) {
|
|
256
256
|
]);
|
257
257
|
return solautoCompatiblePositions.flat();
|
258
258
|
}
|
259
|
-
async function positionStateWithLatestPrices(state, supplyPrice, debtPrice) {
|
259
|
+
async function positionStateWithLatestPrices(conn, state, supplyPrice, debtPrice) {
|
260
260
|
if (!supplyPrice || !debtPrice) {
|
261
|
-
[supplyPrice, debtPrice] = await (0, generalUtils_1.fetchTokenPrices)([
|
261
|
+
[supplyPrice, debtPrice] = await (0, generalUtils_1.fetchTokenPrices)(conn, [
|
262
262
|
(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.supply.mint),
|
263
263
|
(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.debt.mint),
|
264
264
|
]);
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
2
|
+
import { ALL_SUPPORTED_TOKENS, SOLAUTO_FEES_WALLET } from "../src/constants";
|
3
|
+
import {
|
4
|
+
buildHeliusApiUrl,
|
5
|
+
createAssociatedTokenAccountUmiIx,
|
6
|
+
getSolanaRpcConnection,
|
7
|
+
getTokenAccount,
|
8
|
+
sendSingleOptimizedTransaction,
|
9
|
+
zip,
|
10
|
+
} from "../src/utils";
|
11
|
+
import { getSecretKey } from "./shared";
|
12
|
+
import {
|
13
|
+
createSignerFromKeypair,
|
14
|
+
publicKey,
|
15
|
+
signerIdentity,
|
16
|
+
transactionBuilder,
|
17
|
+
} from "@metaplex-foundation/umi";
|
18
|
+
|
19
|
+
async function create() {
|
20
|
+
let [connection, umi] = getSolanaRpcConnection(
|
21
|
+
buildHeliusApiUrl(process.env.HELIUS_API_KEY!)
|
22
|
+
);
|
23
|
+
|
24
|
+
const secretKey = getSecretKey("solauto-auth");
|
25
|
+
const signerKeypair = umi.eddsa.createKeypairFromSecretKey(secretKey);
|
26
|
+
const signer = createSignerFromKeypair(umi, signerKeypair);
|
27
|
+
|
28
|
+
umi = umi.use(signerIdentity(signer));
|
29
|
+
|
30
|
+
const tokenAccounts = await umi.rpc.getAccounts(
|
31
|
+
ALL_SUPPORTED_TOKENS.map((x) =>
|
32
|
+
publicKey(getTokenAccount(SOLAUTO_FEES_WALLET, new PublicKey(x)))
|
33
|
+
)
|
34
|
+
);
|
35
|
+
|
36
|
+
for (const accounts of zip(tokenAccounts, ALL_SUPPORTED_TOKENS)) {
|
37
|
+
if (!accounts[0].exists) {
|
38
|
+
const tx = createAssociatedTokenAccountUmiIx(
|
39
|
+
signer,
|
40
|
+
SOLAUTO_FEES_WALLET,
|
41
|
+
new PublicKey(accounts[1])
|
42
|
+
);
|
43
|
+
await sendSingleOptimizedTransaction(
|
44
|
+
umi,
|
45
|
+
connection,
|
46
|
+
transactionBuilder().add(tx)
|
47
|
+
);
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
create();
|
package/local/shared.ts
CHANGED
@@ -21,7 +21,7 @@ export function getSecretKey(keypairFilename: string = "id"): Uint8Array {
|
|
21
21
|
);
|
22
22
|
}
|
23
23
|
|
24
|
-
const keypair = Keypair.fromSecretKey(getSecretKey());
|
24
|
+
const keypair = Keypair.fromSecretKey(getSecretKey("solauto-auth"));
|
25
25
|
const [connection, _] = getSolanaRpcConnection(buildHeliusApiUrl(process.env.HELIUS_API_KEY ?? ""));
|
26
26
|
|
27
27
|
async function createAndSendV0Tx(txInstructions: TransactionInstruction[]) {
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@haven-fi/solauto-sdk",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.301",
|
4
4
|
"main": "dist/index.js",
|
5
5
|
"types": "dist/index.d.ts",
|
6
6
|
"description": "Typescript SDK for the Solauto program on the Solana blockchain",
|
@@ -12,9 +12,11 @@
|
|
12
12
|
"test:unit": "ts-mocha -p ./tsconfig.json -t 1000000 tests/unit/**/*.ts",
|
13
13
|
"test:all": "pnpm test:unit && pnpm test:txs",
|
14
14
|
"update-lut:solauto": "npx ts-node local/updateSolautoLUT.ts",
|
15
|
-
"update-lut:marginfi": "npx ts-node local/updateMarginfiLUT.ts"
|
15
|
+
"update-lut:marginfi": "npx ts-node local/updateMarginfiLUT.ts",
|
16
|
+
"create-fee-accounts": "npx ts-node local/createFeeAccounts.ts"
|
16
17
|
},
|
17
18
|
"dependencies": {
|
19
|
+
"@coral-xyz/anchor": "^0.30.1",
|
18
20
|
"@jup-ag/api": "^6.0.24",
|
19
21
|
"@metaplex-foundation/umi": "^0.9.1",
|
20
22
|
"@metaplex-foundation/umi-bundle-defaults": "^0.9.1",
|
@@ -22,6 +24,7 @@
|
|
22
24
|
"@metaplex-foundation/umi-web3js-adapters": "^0.9.1",
|
23
25
|
"@solana/spl-token": "^0.4.0",
|
24
26
|
"@solana/web3.js": "^1.95.4",
|
27
|
+
"@switchboard-xyz/on-demand": "^1.2.51",
|
25
28
|
"bs58": "^5.0.0",
|
26
29
|
"cross-fetch": "^4.0.0",
|
27
30
|
"rpc-websockets": "7.11.0"
|
@@ -159,6 +159,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
159
159
|
async setIntermediaryMarginfiDetails() {
|
160
160
|
const existingMarginfiAccounts = (
|
161
161
|
await getAllMarginfiAccountsByAuthority(
|
162
|
+
this.connection,
|
162
163
|
this.umi,
|
163
164
|
toWeb3JsPublicKey(this.signer.publicKey),
|
164
165
|
false
|
@@ -227,6 +228,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
227
228
|
return [0, 0];
|
228
229
|
} else {
|
229
230
|
const [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(
|
231
|
+
this.connection,
|
230
232
|
this.umi,
|
231
233
|
this.marginfiGroup,
|
232
234
|
{
|
@@ -676,6 +678,7 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
676
678
|
!toWeb3JsPublicKey(this.signer.publicKey).equals(this.authority));
|
677
679
|
|
678
680
|
const freshState = await getMarginfiAccountPositionState(
|
681
|
+
this.connection,
|
679
682
|
this.umi,
|
680
683
|
{ pk: this.marginfiAccountPk },
|
681
684
|
this.marginfiGroup,
|
@@ -2,12 +2,15 @@ import { NATIVE_MINT } from "@solana/spl-token";
|
|
2
2
|
import * as tokens from "./tokenConstants";
|
3
3
|
import { MarginfiAssetAccounts } from "../types/accounts";
|
4
4
|
import { PublicKey } from "@solana/web3.js";
|
5
|
+
import { SWITCHBOARD_PRICE_FEED_IDS } from "./switchboardConstants";
|
5
6
|
|
6
7
|
export const DEFAULT_MARGINFI_GROUP =
|
7
8
|
"4qp6Fx6tnZkY5Wropq9wUYgtFxXKwE6viZxFHg3rdAG8";
|
8
9
|
|
9
10
|
export const DEFAULT_PUBKEY = PublicKey.default.toString();
|
10
11
|
|
12
|
+
const USDC_PRICE_ORACLE = "Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX";
|
13
|
+
|
11
14
|
export const MARGINFI_ACCOUNTS: {
|
12
15
|
[group: string]: { [token: string]: MarginfiAssetAccounts };
|
13
16
|
} = {
|
@@ -48,24 +51,24 @@ export const MARGINFI_ACCOUNTS: {
|
|
48
51
|
vaultAuthority: "AEZb1XH5bfLwqk3hBKDuLfWyJKdLTgDPCkgn64BJKcvV",
|
49
52
|
priceOracle: "DCNeMcAZGU7pAsqu5q2xMKerq35BnUuTkagt1dkR1xB",
|
50
53
|
},
|
54
|
+
[tokens.H_SOL]: {
|
55
|
+
bank: "GJCi1uj3kYPZ64puA5sLUiCQfFapxT2xnREzrbDzFkYY",
|
56
|
+
liquidityVault: "8M97jkdr4rJtPnQ4yQ9stD6qVwaUvjrBdDPDbHJnPJLf",
|
57
|
+
vaultAuthority: "8x7mgTn5RvHR8Tn3CJqexSuQwrs6MLEy8csuXCDVvvpt",
|
58
|
+
priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.H_SOL.toString()],
|
59
|
+
},
|
60
|
+
[tokens.JUP_SOL]: {
|
61
|
+
bank: "8LaUZadNqtzuCG7iCvZd7d5cbquuYfv19KjAg6GPuuCb",
|
62
|
+
liquidityVault: "B1zjqKPoYp9bTMhzFADaAvjyGb49FMitLpi6P3Pa3YR6",
|
63
|
+
vaultAuthority: "93Qqsge2jHVsWLd8vas4cWghrsZJooMUr5JKN5DtcfMX",
|
64
|
+
priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.JUP_SOL.toString()],
|
65
|
+
},
|
51
66
|
[tokens.JUP]: {
|
52
67
|
bank: "Guu5uBc8k1WK1U2ihGosNaCy57LSgCkpWAabtzQqrQf8",
|
53
68
|
liquidityVault: "4w49W4fNDn778wsBa6TNq9hvebZKU17ymsptrEZ8zrsm",
|
54
69
|
vaultAuthority: "2MBwwAhL3c73Jy7HkWd9ofzh1bU39JBabrZCFQR2tUof",
|
55
70
|
priceOracle: "7dbob1psH1iZBS7qPsm3Kwbf5DzSXK8Jyg31CTgTnxH5",
|
56
71
|
},
|
57
|
-
[tokens.BONK]: {
|
58
|
-
bank: "DeyH7QxWvnbbaVB4zFrf4hoq7Q8z1ZT14co42BGwGtfM",
|
59
|
-
liquidityVault: "7FdQsXmCW3N5JQbknj3F9Yqq73er9VZJjGhEEMS8Ct2A",
|
60
|
-
vaultAuthority: "26kcZkdjJc94PdhqiLiEaGiLCYgAVVUfpDaZyK4cqih3",
|
61
|
-
priceOracle: "DBE3N8uNjhKPRHfANdwGvCZghWXyLPdqdSbEW2XFwBiX",
|
62
|
-
},
|
63
|
-
[tokens.WIF]: {
|
64
|
-
bank: "9dpu8KL5ABYiD3WP2Cnajzg1XaotcJvZspv29Y1Y3tn1",
|
65
|
-
liquidityVault: "4kT3EXc5dDVndUU9mV6EH3Jh3CSEvpcCZjuMkwqrtxUy",
|
66
|
-
vaultAuthority: "9gNrvvZ9RuTyRWooiEEypwcXU6kyXW8yWuhXU8tWUH5L",
|
67
|
-
priceOracle: "6B23K3tkb51vLZA14jcEQVCA1pfHptzEHFA93V5dYwbT",
|
68
|
-
},
|
69
72
|
[tokens.JTO]: {
|
70
73
|
bank: "EdB7YADw4XUt6wErT8kHGCUok4mnTpWGzPUU9rWDebzb",
|
71
74
|
liquidityVault: "3bY1DEkXodGmPMG5f7ABA12228MBG5JdAAKf5cgkB6G1",
|
@@ -106,7 +109,7 @@ export const MARGINFI_ACCOUNTS: {
|
|
106
109
|
bank: "2s37akK2eyBbp8DZgCm7RtsaEz8eJP3Nxd4urLHQv7yB",
|
107
110
|
liquidityVault: "7jaiZR5Sk8hdYN9MxTpczTcwbWpb5WEoxSANuUwveuat",
|
108
111
|
vaultAuthority: "3uxNepDbmkDNq6JhRja5Z8QwbTrfmkKP8AKZV5chYDGG",
|
109
|
-
priceOracle:
|
112
|
+
priceOracle: USDC_PRICE_ORACLE,
|
110
113
|
},
|
111
114
|
[tokens.USDT]: {
|
112
115
|
bank: "HmpMfL8942u22htC4EMiWgLX931g3sacXFR6KjuLgKLV",
|
@@ -114,6 +117,60 @@ export const MARGINFI_ACCOUNTS: {
|
|
114
117
|
vaultAuthority: "9r6z6KgkEytHCdQWNxvDQH98PsfU98f1m5PCg47mY2XE",
|
115
118
|
priceOracle: "HT2PLQBcG5EiCcNSaMHAjSgd9F98ecpATbk4Sk5oYuM",
|
116
119
|
},
|
120
|
+
[tokens.BONK]: {
|
121
|
+
bank: "DeyH7QxWvnbbaVB4zFrf4hoq7Q8z1ZT14co42BGwGtfM",
|
122
|
+
liquidityVault: "7FdQsXmCW3N5JQbknj3F9Yqq73er9VZJjGhEEMS8Ct2A",
|
123
|
+
vaultAuthority: "26kcZkdjJc94PdhqiLiEaGiLCYgAVVUfpDaZyK4cqih3",
|
124
|
+
priceOracle: "DBE3N8uNjhKPRHfANdwGvCZghWXyLPdqdSbEW2XFwBiX",
|
125
|
+
},
|
126
|
+
[tokens.WIF]: {
|
127
|
+
bank: "9dpu8KL5ABYiD3WP2Cnajzg1XaotcJvZspv29Y1Y3tn1",
|
128
|
+
liquidityVault: "4kT3EXc5dDVndUU9mV6EH3Jh3CSEvpcCZjuMkwqrtxUy",
|
129
|
+
vaultAuthority: "9gNrvvZ9RuTyRWooiEEypwcXU6kyXW8yWuhXU8tWUH5L",
|
130
|
+
priceOracle: "6B23K3tkb51vLZA14jcEQVCA1pfHptzEHFA93V5dYwbT",
|
131
|
+
},
|
132
|
+
},
|
133
|
+
["DQ2jqDJw9uzTwttf6h6r217BQ7kws3jZbJXDkfbCJa1q"]: {
|
134
|
+
[tokens.POPCAT]: {
|
135
|
+
bank: "845oEvt1oduoBj5zQxTr21cWWaUVnRjGerJuW3yMo2nn",
|
136
|
+
liquidityVault: "At6R64ip51zay4dT6k1WnVGETSMcaiY5vggD5DVTgxri",
|
137
|
+
vaultAuthority: "dNraDCWb5usDSoW4kD1Mi2E9WsNu6EABcQZqnrDfjNb",
|
138
|
+
priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.POPCAT.toString()],
|
139
|
+
},
|
140
|
+
[tokens.USDC]: {
|
141
|
+
bank: "EXrnNVfLagt3j4hCHSD9WqK75o6dkZBtjpnrSrSC78MA",
|
142
|
+
liquidityVault: "D9HSUYz3Rg2cTH65dUPaQS1MYxofNTeLecsAjiBgVPur",
|
143
|
+
vaultAuthority: "5ivKgJnxQ9CewJcKYSPQUiQFdfJki6YS87FqohnMSsFM",
|
144
|
+
priceOracle: USDC_PRICE_ORACLE,
|
145
|
+
},
|
146
|
+
},
|
147
|
+
["EpzY5EYF1A5eFDRfjtsPXSYMPmEx1FXKaXPnouTMF4dm"]: {
|
148
|
+
[tokens.RETARDIO]: {
|
149
|
+
bank: "3J5rKmCi7JXG6qmiobFJyAidVTnnNAMGj4jomfBxKGRM",
|
150
|
+
liquidityVault: "863K9YPVT3xbUGFZevrQJLqMux3UdRkwNQ6usAp4hJyy",
|
151
|
+
vaultAuthority: "Qsv2rnNRdv59AwRU3YmGPMCTdKT41CDAKyYAr4srCJR",
|
152
|
+
priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.RETARDIO.toString()],
|
153
|
+
},
|
154
|
+
[tokens.USDC]: {
|
155
|
+
bank: "6cgYhBFWCc5sNHxkvSRhd5H9AdAHR41zKwuF37HmLry5",
|
156
|
+
liquidityVault: "7orVfNL5ZjqvdSaDgYLgBk4i5B3AnwFXNqqAvJbx6DFy",
|
157
|
+
vaultAuthority: "G4Azxk4PYtNRmDZkJppYo3rNAinkZXzYpQPG5dVDh4Nj",
|
158
|
+
priceOracle: USDC_PRICE_ORACLE,
|
159
|
+
},
|
160
|
+
},
|
161
|
+
["G1rt3EpQ43K3bY457rhukQGRAo2QxydFAGRKqnjKzyr5"]: {
|
162
|
+
[tokens.BILLY]: {
|
163
|
+
bank: "Dj3PndQ3j1vuga5ApiFWWAfQ4h3wBtgS2SeLZBT2LD4g",
|
164
|
+
liquidityVault: "BRcRMDVPBQzXNXWtSS6bNotcGxhVsxfiAt1qf8nFVUpx",
|
165
|
+
vaultAuthority: "36SgFh1qBRyj1PEhsn7Kg9Sfwbrn7rHP7kvTM5o5n6AL",
|
166
|
+
priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.BILLY.toString()],
|
167
|
+
},
|
168
|
+
[tokens.USDC]: {
|
169
|
+
bank: "A7vBgCowCYeja7GTc3pyqUBdC9Gkue2gWaMjGZW38meM",
|
170
|
+
liquidityVault: "DBGhZ8TJTG2Pacdva27zY9etaro24o1tTA3LToSjYHbx",
|
171
|
+
vaultAuthority: "Cg6BCqkGny7A2AXCV8rikhHXM82wqqfzmdsTobEeTQkH",
|
172
|
+
priceOracle: USDC_PRICE_ORACLE,
|
173
|
+
},
|
117
174
|
},
|
118
175
|
};
|
119
176
|
|
@@ -17,10 +17,6 @@ export const PYTH_PRICE_FEED_IDS = {
|
|
17
17
|
"0xf51570985c642c49c2d6e50156390fdba80bb6d5f7fa389d2f012ced4f7d208f",
|
18
18
|
[tokens.JUP]:
|
19
19
|
"0x0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996",
|
20
|
-
[tokens.BONK]:
|
21
|
-
"0x72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419",
|
22
|
-
[tokens.WIF]:
|
23
|
-
"0x4ca4beeca86f0d164160323817a4e42b10010a724c2217c6ee41b54cd4cc61fc",
|
24
20
|
[tokens.JTO]:
|
25
21
|
"0xb43660a5f790c69354b0729a5ef9d50d68f1df92107540210b9cccba1f947cc2",
|
26
22
|
[tokens.JLP]:
|
@@ -37,4 +33,8 @@ export const PYTH_PRICE_FEED_IDS = {
|
|
37
33
|
"0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a",
|
38
34
|
[tokens.USDT]:
|
39
35
|
"0x2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",
|
36
|
+
[tokens.BONK]:
|
37
|
+
"0x72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419",
|
38
|
+
[tokens.WIF]:
|
39
|
+
"0x4ca4beeca86f0d164160323817a4e42b10010a724c2217c6ee41b54cd4cc61fc",
|
40
40
|
};
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import * as tokens from "./tokenConstants";
|
2
|
+
|
3
|
+
// https://beta.ondemand.switchboard.xyz/solana/mainnet
|
4
|
+
export const SWITCHBOARD_PRICE_FEED_IDS: { [key: string]: string } = {
|
5
|
+
[tokens.JUP_SOL]: "HX5WM3qzogAfRCjBUWwnniLByMfFrjm1b5yo4KoWGR27",
|
6
|
+
[tokens.H_SOL]: "1snBjCaHejZqQsAqkELAKNaqUrDNNCr7zmNX6qaQCzg",
|
7
|
+
[tokens.POPCAT]: "FTcFqwCjAgv2VMaowQ9XSBcesVzFzZkaju25nKio6bki",
|
8
|
+
[tokens.RETARDIO]: "EvPXnpMoyrj4B6P55LDP2VpSLkTBWom2SqL4486ToNhM",
|
9
|
+
[tokens.BILLY]: "uBe4er4VSMgYvBNwSbFctSShRXNPkCfaPh7zHMBFeBi",
|
10
|
+
};
|