@perena/bankineco-services 1.0.84 → 1.0.85
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.
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { BankinecoAdminClient, BankinecoArgs, VaultDetails } from "@perena/bankineco-sdk";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { PublicKey } from "@solana/web3.js";
|
|
3
|
+
/** Optional oracle price source when Pyth `PYTH_PRICE_FEED_IDS` has no mint entry. */
|
|
4
|
+
export type YbOraclePriceOpts = {
|
|
5
|
+
pythFeedId?: string;
|
|
6
|
+
/** Jupiter spot vs USDC for mints with no Pyth feed (e.g. PST). */
|
|
7
|
+
jupiterUsdSpot?: {
|
|
8
|
+
mint: PublicKey;
|
|
9
|
+
decimals: number;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export declare function updateYBTokenPrice(client: BankinecoAdminClient, vaultDetails: VaultDetails, mintDecimals: number, reportingDiscount?: number, priceOpts?: YbOraclePriceOpts): Promise<void>;
|
|
13
|
+
export declare function runUpdateYBTokenPrice(args: BankinecoArgs, bankIndex: number, vaultDetails: VaultDetails, mintDecimals: number, reportingDiscount?: number, priceOpts?: YbOraclePriceOpts): Promise<void>;
|
|
4
14
|
//# sourceMappingURL=updateYBTokenPrice.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateYBTokenPrice.d.ts","sourceRoot":"","sources":["../../src/oracle/updateYBTokenPrice.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,aAAa,
|
|
1
|
+
{"version":3,"file":"updateYBTokenPrice.d.ts","sourceRoot":"","sources":["../../src/oracle/updateYBTokenPrice.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,aAAa,EAMb,YAAY,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,sFAAsF;AACtF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD,CAAC;AAsFF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,oBAAoB,EAC5B,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,MAAM,EACpB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,SAAS,CAAC,EAAE,iBAAiB,iBAiC9B;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,MAAM,EACpB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,SAAS,CAAC,EAAE,iBAAiB,iBAU9B"}
|
|
@@ -4,7 +4,68 @@ exports.updateYBTokenPrice = updateYBTokenPrice;
|
|
|
4
4
|
exports.runUpdateYBTokenPrice = runUpdateYBTokenPrice;
|
|
5
5
|
const bankineco_sdk_1 = require("@perena/bankineco-sdk");
|
|
6
6
|
const web3_js_1 = require("@solana/web3.js");
|
|
7
|
-
|
|
7
|
+
const ts_retry_1 = require("ts-retry");
|
|
8
|
+
const JUPITER_QUOTE_ENDPOINTS = [
|
|
9
|
+
...(process.env.JUPITER_QUOTE_URL ? [process.env.JUPITER_QUOTE_URL] : []),
|
|
10
|
+
// quote-api.jup.ag is retired / often fails DNS; Swap API v1 lives on lite-api / api.jup.ag
|
|
11
|
+
"https://lite-api.jup.ag/swap/v1/quote",
|
|
12
|
+
"https://api.jup.ag/swap/v1/quote",
|
|
13
|
+
];
|
|
14
|
+
async function fetchJupiterUsdSpotPerToken(mint, decimals) {
|
|
15
|
+
const inAmount = Math.round(Math.pow(10, decimals));
|
|
16
|
+
if (!Number.isFinite(inAmount) || inAmount > Number.MAX_SAFE_INTEGER) {
|
|
17
|
+
throw new Error(`decimals too large for Jupiter quote: ${decimals}`);
|
|
18
|
+
}
|
|
19
|
+
const params = new URLSearchParams({
|
|
20
|
+
inputMint: mint.toBase58(),
|
|
21
|
+
outputMint: bankineco_sdk_1.USDC_MINT.toBase58(),
|
|
22
|
+
amount: String(inAmount),
|
|
23
|
+
swapMode: "ExactIn",
|
|
24
|
+
slippageBps: "50",
|
|
25
|
+
});
|
|
26
|
+
return await (0, ts_retry_1.retry)(async () => {
|
|
27
|
+
let lastError;
|
|
28
|
+
for (const endpoint of JUPITER_QUOTE_ENDPOINTS) {
|
|
29
|
+
try {
|
|
30
|
+
const resp = await fetch(`${endpoint}?${params}`);
|
|
31
|
+
if (!resp.ok) {
|
|
32
|
+
lastError = new Error(`Jupiter quote HTTP ${resp.status} (${endpoint})`);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const json = (await resp.json());
|
|
36
|
+
if (!json.outAmount) {
|
|
37
|
+
lastError = new Error(`Jupiter quote missing outAmount (${endpoint})`);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
return (Number(json.outAmount) / Math.pow(10, bankineco_sdk_1.USDC_DECIMALS));
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
lastError = e;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
throw lastError instanceof Error
|
|
47
|
+
? lastError
|
|
48
|
+
: new Error(String(lastError));
|
|
49
|
+
}, { maxTry: 3, delay: 200 });
|
|
50
|
+
}
|
|
51
|
+
async function getPythPriceByFeedId(priceFeedId) {
|
|
52
|
+
const normalizedFeedId = priceFeedId.startsWith("0x")
|
|
53
|
+
? priceFeedId
|
|
54
|
+
: `0x${priceFeedId}`;
|
|
55
|
+
return await (0, ts_retry_1.retry)(async () => {
|
|
56
|
+
const resp = await fetch(`https://hermes.pyth.network/v2/updates/price/latest?ids%5B%5D=${normalizedFeedId}`);
|
|
57
|
+
if (resp.status !== 200) {
|
|
58
|
+
throw new Error(JSON.stringify(resp));
|
|
59
|
+
}
|
|
60
|
+
const json = await resp.json();
|
|
61
|
+
const pythPrice = json.parsed?.[0]?.price;
|
|
62
|
+
if (!pythPrice) {
|
|
63
|
+
throw new Error(`Pyth price not found for feed ${normalizedFeedId}`);
|
|
64
|
+
}
|
|
65
|
+
return Number(pythPrice.price) * Math.pow(10, pythPrice.expo);
|
|
66
|
+
}, { maxTry: 3, delay: 200 });
|
|
67
|
+
}
|
|
68
|
+
async function updateYBTokenPrice(client, vaultDetails, mintDecimals, reportingDiscount, priceOpts) {
|
|
8
69
|
const isUsdStar = vaultDetails.yieldingMint.equals(new web3_js_1.PublicKey(bankineco_sdk_1.USD_STAR_CONFIG.bankMint[client.bankineco.environment]));
|
|
9
70
|
let impliedPrice;
|
|
10
71
|
if (isUsdStar) {
|
|
@@ -13,13 +74,22 @@ async function updateYBTokenPrice(client, vaultDetails, mintDecimals, reportingD
|
|
|
13
74
|
});
|
|
14
75
|
impliedPrice = await usdStarClient.latestBankMintUiPrice();
|
|
15
76
|
}
|
|
77
|
+
else if (priceOpts?.pythFeedId && priceOpts?.jupiterUsdSpot) {
|
|
78
|
+
throw new Error("Specify only one of pythFeedId or jupiterUsdSpot");
|
|
79
|
+
}
|
|
80
|
+
else if (priceOpts?.pythFeedId) {
|
|
81
|
+
impliedPrice = await getPythPriceByFeedId(priceOpts.pythFeedId);
|
|
82
|
+
}
|
|
83
|
+
else if (priceOpts?.jupiterUsdSpot) {
|
|
84
|
+
impliedPrice = await fetchJupiterUsdSpotPerToken(priceOpts.jupiterUsdSpot.mint, priceOpts.jupiterUsdSpot.decimals);
|
|
85
|
+
}
|
|
16
86
|
else {
|
|
17
87
|
impliedPrice = (await (0, bankineco_sdk_1.getPythPrices)([vaultDetails.yieldingMint]))[vaultDetails.yieldingMint.toString()];
|
|
18
88
|
}
|
|
19
89
|
await client.updateYieldingTokenPriceIfNeeded(vaultDetails, mintDecimals, impliedPrice, reportingDiscount);
|
|
20
90
|
}
|
|
21
|
-
async function runUpdateYBTokenPrice(args, bankIndex, vaultDetails, mintDecimals, reportingDiscount) {
|
|
91
|
+
async function runUpdateYBTokenPrice(args, bankIndex, vaultDetails, mintDecimals, reportingDiscount, priceOpts) {
|
|
22
92
|
const client = new bankineco_sdk_1.BankinecoAdminClient(args, bankIndex);
|
|
23
|
-
await updateYBTokenPrice(client, vaultDetails, mintDecimals, reportingDiscount);
|
|
93
|
+
await updateYBTokenPrice(client, vaultDetails, mintDecimals, reportingDiscount, priceOpts);
|
|
24
94
|
}
|
|
25
95
|
//# sourceMappingURL=updateYBTokenPrice.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateYBTokenPrice.js","sourceRoot":"","sources":["../../src/oracle/updateYBTokenPrice.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"updateYBTokenPrice.js","sourceRoot":"","sources":["../../src/oracle/updateYBTokenPrice.ts"],"names":[],"mappings":"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"}
|