diff --git a/apps/marginfi-v2-trading/src/pages/api/oracle/price.ts b/apps/marginfi-v2-trading/src/pages/api/oracle/price.ts index 96cbe4872e..b603b36334 100644 --- a/apps/marginfi-v2-trading/src/pages/api/oracle/price.ts +++ b/apps/marginfi-v2-trading/src/pages/api/oracle/price.ts @@ -93,12 +93,19 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) Object.entries(feedIdMapRaw).map(([key, value]) => [key, new PublicKey(value)]) ); - const requestedOraclesData = banksMap.map((b) => ({ - oracleKey: findOracleKey(BankConfig.fromAccountParsed(b.data.config), feedIdMap).toBase58(), - oracleSetup: parseOracleSetup(b.data.config.oracleSetup), - maxAge: b.data.config.oracleMaxAge, - })); - + const oracleMintMap = new Map(); + const feedHashMintMap = new Map(); + + const requestedOraclesData = banksMap.map((b) => { + const oracleKey = findOracleKey(BankConfig.fromAccountParsed(b.data.config), feedIdMap).toBase58(); + oracleMintMap.set(oracleKey, b.data.mint); + + return { + oracleKey, + oracleSetup: parseOracleSetup(b.data.config.oracleSetup), + maxAge: b.data.config.oracleMaxAge, + }; + }); // Fetch on-chain data for all oracles const oracleAis = await chunkedGetRawMultipleAccountInfoOrdered(connection, [ ...requestedOraclesData.map((oracleData) => oracleData.oracleKey), @@ -107,7 +114,26 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) for (const index in requestedOraclesData) { const oracleData = requestedOraclesData[index]; const priceDataRaw = oracleAis[index]; - const oraclePrice = parsePriceInfo(oracleData.oracleSetup, priceDataRaw.data); + const mintData = oracleMintMap.get(oracleData.oracleKey)!; + let oraclePrice = parsePriceInfo(oracleData.oracleSetup, priceDataRaw.data); + + if (oraclePrice.priceRealtime.price.isNaN()) { + oraclePrice = { + ...oraclePrice, + priceRealtime: { + price: new BigNumber(0), + confidence: new BigNumber(0), + lowestPrice: new BigNumber(0), + highestPrice: new BigNumber(0), + }, + priceWeighted: { + price: new BigNumber(0), + confidence: new BigNumber(0), + lowestPrice: new BigNumber(0), + highestPrice: new BigNumber(0), + }, + }; + } const currentTime = Math.round(Date.now() / 1000); const oracleTime = oraclePrice.timestamp.toNumber(); @@ -115,9 +141,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) // If on-chain data is recent enough, use it even for SwitchboardPull oracles if (oracleData.oracleSetup === OracleSetup.SwitchboardPull && isStale) { + const feedHash = Buffer.from(decodeSwitchboardPullFeedData(priceDataRaw.data).feed_hash).toString("hex"); + feedHashMintMap.set(feedHash, mintData); swbPullOraclesStale.push({ data: { ...oracleData, timestamp: oraclePrice.timestamp }, - feedHash: Buffer.from(decodeSwitchboardPullFeedData(priceDataRaw.data).feed_hash).toString("hex"), + feedHash: feedHash, }); continue; } @@ -128,16 +156,34 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) if (swbPullOraclesStale.length > 0) { // Batch-fetch and cache price data from Crossbar for stale SwitchboardPull oracles const feedHashes = swbPullOraclesStale.map((value) => value.feedHash); - const crossbarPrices = await fetchCrossbarPrices(feedHashes); + const crossbarPrices = await handleFetchCrossbarPrices(feedHashes, feedHashMintMap); for (const { data: { oracleKey, timestamp }, feedHash, } of swbPullOraclesStale) { - const crossbarPrice = crossbarPrices.get(feedHash); + let crossbarPrice = crossbarPrices.get(feedHash); if (!crossbarPrice) { throw new Error(`Crossbar didn't return data for ${feedHash}`); } + if (crossbarPrice.priceRealtime.price.isNaN()) { + crossbarPrice = { + ...crossbarPrice, + priceRealtime: { + price: new BigNumber(0), + confidence: new BigNumber(0), + lowestPrice: new BigNumber(0), + highestPrice: new BigNumber(0), + }, + priceWeighted: { + price: new BigNumber(0), + confidence: new BigNumber(0), + lowestPrice: new BigNumber(0), + highestPrice: new BigNumber(0), + }, + }; + } + const updatedOraclePrice = { ...crossbarPrice, timestamp } as OraclePrice; updatedOraclePrices.set(oracleKey, updatedOraclePrice); @@ -154,16 +200,115 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } } -async function fetchCrossbarPrices(feedHashes: string[]): Promise> { +async function handleFetchCrossbarPrices( + feedHashes: string[], + mintMap: Map +): Promise> { + try { + // main crossbar + const payload: CrossbarSimulatePayload = []; + + const { payload: mainPayload, brokenFeeds: mainBrokenFeeds } = await fetchCrossbarPrices( + feedHashes, + SWITCHBOARD_CROSSSBAR_API + ); + + payload.push(...mainPayload); + + if (!mainBrokenFeeds.length) { + return crossbarPayloadToOraclePricePerFeedHash(payload); + } + + if (process.env.SWITCHBOARD_CROSSSBAR_API_FALLBACK) { + // fallback crossbar + const { payload: fallbackPayload, brokenFeeds: fallbackBrokenFeeds } = await fetchCrossbarPrices( + mainBrokenFeeds, + process.env.SWITCHBOARD_CROSSSBAR_API_FALLBACK + ); + payload.push(...fallbackPayload); + + if (!fallbackBrokenFeeds.length) { + return crossbarPayloadToOraclePricePerFeedHash(payload); + } + } + + // birdeye as last resort + const { payload: birdeyePayload, brokenFeeds: birdeyeBrokenFeeds } = await fetchBirdeyePrices(feedHashes, mintMap); + + payload.push(...birdeyePayload); + + birdeyeBrokenFeeds.forEach((feed) => { + payload.push({ + feedHash: feed, + results: [0], + }); + }); + + return crossbarPayloadToOraclePricePerFeedHash(payload); + } catch (error) { + console.error("Error:", error); + throw new Error("Couldn't fetch from crossbar"); + } +} + +async function fetchBirdeyePrices( + feedHashes: string[], + mintMap: Map +): Promise<{ payload: CrossbarSimulatePayload; brokenFeeds: string[] }> { + try { + const brokenFeeds: string[] = []; + + const tokens = feedHashes + .map((feedHash) => { + const mint = mintMap.get(feedHash)?.toBase58(); + if (!mint) { + console.error("Error:", `Mint not found for feedHash ${feedHash}`); + brokenFeeds.push(feedHash); + } + return mint; + }) + .filter((mint): mint is string => mint !== undefined); + + const response = await fetchMultiPrice(tokens); + + const priceData = response.data; + + const finalPayload: CrossbarSimulatePayload = feedHashes.map((feedHash) => { + const tokenAddress = mintMap.get(feedHash)!.toBase58(); + const price = priceData[tokenAddress]; + return { + feedHash, + results: [price.value], + }; + }); + + return { payload: finalPayload, brokenFeeds }; + } catch (error) { + console.error("Error:", error); + return { payload: [], brokenFeeds: feedHashes }; + } +} + +async function fetchCrossbarPrices( + feedHashes: string[], + endpoint: string, + username?: string, + bearer?: string +): Promise<{ payload: CrossbarSimulatePayload; brokenFeeds: string[] }> { const controller = new AbortController(); const timeoutId = setTimeout(() => { controller.abort(); - }, 5000); + }, 8000); + + const isAuth = username && bearer; + + const basicAuth = isAuth ? Buffer.from(`${username}:${bearer}`).toString("base64") : undefined; try { const feedHashesString = feedHashes.join(","); - const response = await fetch(`${SWITCHBOARD_CROSSSBAR_API}/simulate/${feedHashesString}`, { + const response = await fetch(`${endpoint}/simulate/${feedHashesString}`, { headers: { + Authorization: basicAuth ? `Basic ${basicAuth}` : "", Accept: "application/json", }, signal: controller.signal, @@ -174,12 +319,15 @@ async function fetchCrossbarPrices(feedHashes: string[]): Promise feed.results[0] === null).map((feed) => feed.feedHash); + + return { payload: payload, brokenFeeds: brokenFeeds }; } catch (error) { console.error("Error:", error); - throw new Error("Couldn't fetch from crossbar"); + return { payload: [], brokenFeeds: feedHashes }; } } @@ -241,3 +389,50 @@ function extractHost(referer: string | undefined): string | undefined { const url = new URL(referer); return url.origin; } + +const BIRDEYE_API = "https://public-api.birdeye.so"; + +interface BirdeyeTokenPrice { + value: number; + updateUnixTime: number; + updateHumanTime: string; + priceChange24h: number; +} + +interface BirdeyePriceResponse { + success: boolean; + data: { + [tokenAddress: string]: BirdeyeTokenPrice; + }; +} + +async function fetchMultiPrice(tokens: string[]): Promise { + if (!tokens) { + throw new Error("No tokens provided"); + } + + // use abort controller to restrict fetch to 10 seconds + const controller = new AbortController(); + const timeoutId = setTimeout(() => { + controller.abort(); + }, 5000); + + // Fetch from API and update cache + try { + const response = await fetch(`${BIRDEYE_API}/defi/multi_price?list_address=${tokens.join("%2C")}`, { + headers: { + Accept: "application/json", + "x-chain": "solana", + "X-Api-Key": process.env.BIRDEYE_API_KEY || "", + }, + signal: controller.signal, + }); + clearTimeout(timeoutId); + + const data = (await response.json()) as BirdeyePriceResponse; + return data; + } catch (error) { + console.error("Error:", error); + throw new Error("Error fetching birdey prices"); + } +} diff --git a/apps/marginfi-v2-ui/src/components/common/Stake/stake.tsx b/apps/marginfi-v2-ui/src/components/common/Stake/stake.tsx index c8c467de96..8c9233601f 100644 --- a/apps/marginfi-v2-ui/src/components/common/Stake/stake.tsx +++ b/apps/marginfi-v2-ui/src/components/common/Stake/stake.tsx @@ -6,7 +6,6 @@ import { IconCheck } from "@tabler/icons-react"; import { useMrgnlendStore } from "~/store"; import { useWallet } from "~/components/wallet-v2"; -import { LST_MINT, SOL_MINT } from "~/store/lstStore"; import { IntegrationsData, LSTOverview, fetchLSTOverview } from "~/components/common/Stake/utils/stake-utils"; import { Button } from "~/components/ui/button"; @@ -20,6 +19,10 @@ import { MfiIntegrationCard, ArenaIntegrationCard, } from "~/components/common/Stake"; +import { PublicKey } from "@solana/web3.js"; + +const SOL_MINT = new PublicKey("So11111111111111111111111111111111111111112"); +const LST_MINT = new PublicKey("LSTxxxnJzKDFSLr4dUkPcmCf5VyryEqzPLz5j4bpxFp"); const Stake = () => { const { connected } = useWallet(); diff --git a/apps/marginfi-v2-ui/src/pages/api/lst.ts b/apps/marginfi-v2-ui/src/pages/api/lst.ts index b4141db6d1..65dd0207d4 100644 --- a/apps/marginfi-v2-ui/src/pages/api/lst.ts +++ b/apps/marginfi-v2-ui/src/pages/api/lst.ts @@ -19,6 +19,10 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< apy: 0, }; + if (!process.env.VALIDATOR_API_URL) { + return res.status(500).json({ error: "No validator API URL provided" }); + } + const validatorResponse = await fetch(process.env.VALIDATOR_API_URL!); if (validatorResponse.ok) { diff --git a/apps/marginfi-v2-ui/src/pages/api/oracle/price.ts b/apps/marginfi-v2-ui/src/pages/api/oracle/price.ts index d4406da3aa..0e0771f9a2 100644 --- a/apps/marginfi-v2-ui/src/pages/api/oracle/price.ts +++ b/apps/marginfi-v2-ui/src/pages/api/oracle/price.ts @@ -18,6 +18,7 @@ import { FeedResponse, } from "@mrgnlabs/marginfi-client-v2/dist/vendor"; import { chunkedGetRawMultipleAccountInfoOrdered, median, Wallet } from "@mrgnlabs/mrgn-common"; +import { push } from "@socialgouv/matomo-next"; import { Connection, PublicKey } from "@solana/web3.js"; import BigNumber from "bignumber.js"; import { NextApiRequest, NextApiResponse } from "next"; @@ -88,11 +89,19 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) Object.entries(feedIdMapRaw).map(([key, value]) => [key, new PublicKey(value)]) ); - const requestedOraclesData = banksMap.map((b) => ({ - oracleKey: findOracleKey(BankConfig.fromAccountParsed(b.data.config), feedIdMap).toBase58(), - oracleSetup: parseOracleSetup(b.data.config.oracleSetup), - maxAge: b.data.config.oracleMaxAge, - })); + const oracleMintMap = new Map(); + const feedHashMintMap = new Map(); + + const requestedOraclesData = banksMap.map((b) => { + const oracleKey = findOracleKey(BankConfig.fromAccountParsed(b.data.config), feedIdMap).toBase58(); + oracleMintMap.set(oracleKey, b.data.mint); + + return { + oracleKey, + oracleSetup: parseOracleSetup(b.data.config.oracleSetup), + maxAge: b.data.config.oracleMaxAge, + }; + }); // Fetch on-chain data for all oracles const oracleAis = await chunkedGetRawMultipleAccountInfoOrdered(connection, [ @@ -102,7 +111,26 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) for (const index in requestedOraclesData) { const oracleData = requestedOraclesData[index]; const priceDataRaw = oracleAis[index]; - const oraclePrice = parsePriceInfo(oracleData.oracleSetup, priceDataRaw.data); + const mintData = oracleMintMap.get(oracleData.oracleKey)!; + let oraclePrice = parsePriceInfo(oracleData.oracleSetup, priceDataRaw.data); + + if (oraclePrice.priceRealtime.price.isNaN()) { + oraclePrice = { + ...oraclePrice, + priceRealtime: { + price: new BigNumber(0), + confidence: new BigNumber(0), + lowestPrice: new BigNumber(0), + highestPrice: new BigNumber(0), + }, + priceWeighted: { + price: new BigNumber(0), + confidence: new BigNumber(0), + lowestPrice: new BigNumber(0), + highestPrice: new BigNumber(0), + }, + }; + } const currentTime = Math.round(Date.now() / 1000); const oracleTime = oraclePrice.timestamp.toNumber(); @@ -110,9 +138,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) // If on-chain data is recent enough, use it even for SwitchboardPull oracles if (oracleData.oracleSetup === OracleSetup.SwitchboardPull && isStale) { + const feedHash = Buffer.from(decodeSwitchboardPullFeedData(priceDataRaw.data).feed_hash).toString("hex"); + feedHashMintMap.set(feedHash, mintData); swbPullOraclesStale.push({ data: { ...oracleData, timestamp: oraclePrice.timestamp }, - feedHash: Buffer.from(decodeSwitchboardPullFeedData(priceDataRaw.data).feed_hash).toString("hex"), + feedHash: feedHash, }); continue; } @@ -123,17 +153,35 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) if (swbPullOraclesStale.length > 0) { // Batch-fetch and cache price data from Crossbar for stale SwitchboardPull oracles const feedHashes = swbPullOraclesStale.map((value) => value.feedHash); - const crossbarPrices = await fetchCrossbarPrices(feedHashes); + let crossbarPrices = await handleFetchCrossbarPrices(feedHashes, feedHashMintMap); for (const { data: { oracleKey, timestamp }, feedHash, } of swbPullOraclesStale) { - const crossbarPrice = crossbarPrices.get(feedHash); + let crossbarPrice = crossbarPrices.get(feedHash); if (!crossbarPrice) { throw new Error(`Crossbar didn't return data for ${feedHash}`); } - const updatedOraclePrice = { ...crossbarPrice, timestamp } as OraclePrice; + if (crossbarPrice.priceRealtime.price.isNaN()) { + crossbarPrice = { + ...crossbarPrice, + priceRealtime: { + price: new BigNumber(0), + confidence: new BigNumber(0), + lowestPrice: new BigNumber(0), + highestPrice: new BigNumber(0), + }, + priceWeighted: { + price: new BigNumber(0), + confidence: new BigNumber(0), + lowestPrice: new BigNumber(0), + highestPrice: new BigNumber(0), + }, + }; + } + + let updatedOraclePrice = { ...crossbarPrice, timestamp } as OraclePrice; updatedOraclePrices.set(oracleKey, updatedOraclePrice); } @@ -149,16 +197,117 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } } -async function fetchCrossbarPrices(feedHashes: string[]): Promise> { +async function handleFetchCrossbarPrices( + feedHashes: string[], + mintMap: Map +): Promise> { + try { + // main crossbar + const payload: CrossbarSimulatePayload = []; + + const { payload: mainPayload, brokenFeeds: mainBrokenFeeds } = await fetchCrossbarPrices( + feedHashes, + SWITCHBOARD_CROSSSBAR_API + ); + + payload.push(...mainPayload); + + if (!mainBrokenFeeds.length) { + return crossbarPayloadToOraclePricePerFeedHash(payload); + } + + if (process.env.SWITCHBOARD_CROSSSBAR_API_FALLBACK) { + // fallback crossbar + const { payload: fallbackPayload, brokenFeeds: fallbackBrokenFeeds } = await fetchCrossbarPrices( + mainBrokenFeeds, + process.env.SWITCHBOARD_CROSSSBAR_API_FALLBACK, + process.env.SWITCHBOARD_CROSSSBAR_API_FALLBACK_USERNAME, + process.env.SWITCHBOARD_CROSSSBAR_API_FALLBACK_BEARER + ); + payload.push(...fallbackPayload); + + if (!fallbackBrokenFeeds.length) { + return crossbarPayloadToOraclePricePerFeedHash(payload); + } + } + + // birdeye as last resort + const { payload: birdeyePayload, brokenFeeds: birdeyeBrokenFeeds } = await fetchBirdeyePrices(feedHashes, mintMap); + + payload.push(...birdeyePayload); + + birdeyeBrokenFeeds.forEach((feed) => { + payload.push({ + feedHash: feed, + results: [0], + }); + }); + + return crossbarPayloadToOraclePricePerFeedHash(payload); + } catch (error) { + console.error("Error:", error); + throw new Error("Couldn't fetch from crossbar"); + } +} + +async function fetchBirdeyePrices( + feedHashes: string[], + mintMap: Map +): Promise<{ payload: CrossbarSimulatePayload; brokenFeeds: string[] }> { + try { + const brokenFeeds: string[] = []; + + const tokens = feedHashes + .map((feedHash) => { + const mint = mintMap.get(feedHash)?.toBase58(); + if (!mint) { + console.error("Error:", `Mint not found for feedHash ${feedHash}`); + brokenFeeds.push(feedHash); + } + return mint; + }) + .filter((mint): mint is string => mint !== undefined); + + const response = await fetchMultiPrice(tokens); + + const priceData = response.data; + + const finalPayload: CrossbarSimulatePayload = feedHashes.map((feedHash) => { + const tokenAddress = mintMap.get(feedHash)!.toBase58(); + const price = priceData[tokenAddress]; + return { + feedHash, + results: [price.value], + }; + }); + + return { payload: finalPayload, brokenFeeds }; + } catch (error) { + console.error("Error:", error); + return { payload: [], brokenFeeds: feedHashes }; + } +} + +async function fetchCrossbarPrices( + feedHashes: string[], + endpoint: string, + username?: string, + bearer?: string +): Promise<{ payload: CrossbarSimulatePayload; brokenFeeds: string[] }> { const controller = new AbortController(); const timeoutId = setTimeout(() => { controller.abort(); }, 8000); + const isAuth = username && bearer; + + const basicAuth = isAuth ? Buffer.from(`${username}:${bearer}`).toString("base64") : undefined; + try { const feedHashesString = feedHashes.join(","); - const response = await fetch(`${SWITCHBOARD_CROSSSBAR_API}/simulate/${feedHashesString}`, { + const response = await fetch(`${endpoint}/simulate/${feedHashesString}`, { headers: { + Authorization: basicAuth ? `Basic ${basicAuth}` : "", Accept: "application/json", }, signal: controller.signal, @@ -169,12 +318,15 @@ async function fetchCrossbarPrices(feedHashes: string[]): Promise feed.results[0] === null).map((feed) => feed.feedHash); + + return { payload: payload, brokenFeeds: brokenFeeds }; } catch (error) { console.error("Error:", error); - throw new Error("Couldn't fetch from crossbar"); + return { payload: [], brokenFeeds: feedHashes }; } } @@ -236,3 +388,50 @@ function extractHost(referer: string | undefined): string | undefined { const url = new URL(referer); return url.origin; } + +const BIRDEYE_API = "https://public-api.birdeye.so"; + +interface BirdeyeTokenPrice { + value: number; + updateUnixTime: number; + updateHumanTime: string; + priceChange24h: number; +} + +interface BirdeyePriceResponse { + success: boolean; + data: { + [tokenAddress: string]: BirdeyeTokenPrice; + }; +} + +async function fetchMultiPrice(tokens: string[]): Promise { + if (!tokens) { + throw new Error("No tokens provided"); + } + + // use abort controller to restrict fetch to 10 seconds + const controller = new AbortController(); + const timeoutId = setTimeout(() => { + controller.abort(); + }, 5000); + + // Fetch from API and update cache + try { + const response = await fetch(`${BIRDEYE_API}/defi/multi_price?list_address=${tokens.join("%2C")}`, { + headers: { + Accept: "application/json", + "x-chain": "solana", + "X-Api-Key": process.env.BIRDEYE_API_KEY || "", + }, + signal: controller.signal, + }); + clearTimeout(timeoutId); + + const data = (await response.json()) as BirdeyePriceResponse; + return data; + } catch (error) { + console.error("Error:", error); + throw new Error("Error fetching birdey prices"); + } +} diff --git a/apps/marginfi-v2-ui/src/pages/api/stakingApy.ts b/apps/marginfi-v2-ui/src/pages/api/stakingApy.ts new file mode 100644 index 0000000000..f4340a2e0e --- /dev/null +++ b/apps/marginfi-v2-ui/src/pages/api/stakingApy.ts @@ -0,0 +1,75 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import NodeCache from "node-cache"; +import { Readable } from "stream"; +import { parse } from "csv-parse"; + +type PriceRecord = { + timestamp: number; + epoch: number; + price: number; +}; + +const parsePriceRecordsFromCSV = async (csv: Readable): Promise => { + const csvParser = parse({ delimiter: ",", columns: true }); + const records: PriceRecord[] = []; + for await (const row of csv.pipe(csvParser)) { + const { timestamp, epoch, price } = row; + if (!timestamp || !epoch || !price) { + throw new Error('Columns "timestamp", "epoch", "price" must be present!'); + } + const record = { + timestamp: Math.round(new Date(timestamp).getTime() / 1e3), + epoch: Number(epoch), + price: Number(price), + }; + if (isNaN(record.timestamp)) { + throw new Error("Timestamp must be a... timestamp!"); + } + if (isNaN(record.epoch)) { + throw new Error("Epoch must be a number!"); + } + if (isNaN(record.price)) { + throw new Error("Price must be a number!"); + } + + records.push(record); + } + return records; +}; + +const fetchAndParsePricesCsv = async (url: string) => { + const csvResponse = await fetch(url); + const csvContents = await csvResponse.text(); + const prices = await parsePriceRecordsFromCSV(Readable.from([csvContents])); + + return prices; +}; + +const myCache = new NodeCache({ stdTTL: 1800 }); // Cache for 1 hour +const SOLANA_COMPASS_BASE_URL = "https://raw.githubusercontent.com/glitchful-dev/sol-stake-pool-apy/master/db/"; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const { solanaCompassKey } = req.query; + + if (!solanaCompassKey) { + return res.status(400).json({ error: "solanaCompassKey is required" }); + } + + const cacheKey = `key_${solanaCompassKey.toString()}`; + + const cachedData = myCache.get(cacheKey); + + if (cachedData) { + res.status(200).json(cachedData); + return; + } + + try { + const solanaCompassPrices = await fetchAndParsePricesCsv(`${SOLANA_COMPASS_BASE_URL}${solanaCompassKey}.csv`); + myCache.set(cacheKey, solanaCompassPrices); + res.status(200).json(solanaCompassPrices); + } catch (error) { + console.error("Error:", error); + res.status(500).json({ error: "Error fetching data" }); + } +} diff --git a/apps/marginfi-v2-ui/src/store/lstStore.ts b/apps/marginfi-v2-ui/src/store/lstStore.ts deleted file mode 100644 index cfdb59a543..0000000000 --- a/apps/marginfi-v2-ui/src/store/lstStore.ts +++ /dev/null @@ -1,315 +0,0 @@ -import { vendor } from "@mrgnlabs/marginfi-client-v2"; -import { ACCOUNT_SIZE, TOKEN_PROGRAM_ID, Wallet, aprToApy, uiToNative } from "@mrgnlabs/mrgn-common"; -import { Connection, PublicKey } from "@solana/web3.js"; -import { create, StateCreator } from "zustand"; -import * as solanaStakePool from "@solana/spl-stake-pool"; -import { StakeData } from "@mrgnlabs/mrgn-utils"; -import { PERIOD, calcYield, fetchAndParsePricesCsv, getPriceRangeFromPeriod } from "@mrgnlabs/mrgn-utils"; -import { TokenAccount, TokenAccountMap, fetchBirdeyePrices } from "@mrgnlabs/marginfi-v2-ui-state"; -import { persist } from "zustand/middleware"; -import BN from "bn.js"; - -import type { TokenInfo, TokenInfoMap } from "@solana/spl-token-registry"; -import { QuoteResponseMeta } from "@jup-ag/react-hook"; - -const STAKEVIEW_APP_URL = "https://stakeview.app/apy/prev3.json"; -const BASELINE_VALIDATOR_ID = "mrgn28BhocwdAUEenen3Sw2MR9cPKDpLkDvzDdR7DBD"; -const SOLANA_COMPASS_PRICES_URL = - "https://raw.githubusercontent.com/glitchful-dev/sol-stake-pool-apy/master/db/lst.csv"; - -export const SOL_MINT = new PublicKey("So11111111111111111111111111111111111111112"); -export const LST_MINT = new PublicKey("LSTxxxnJzKDFSLr4dUkPcmCf5VyryEqzPLz5j4bpxFp"); -const NETWORK_FEE_LAMPORTS = 15000; // network fee + some for potential account creation -const SOL_USD_PYTH_ORACLE = new PublicKey("H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG"); -const STAKE_POOL_ID = new PublicKey("DqhH94PjkZsjAqEze2BEkWhFQJ6EyU6MdtMphMgnXqeK"); - -const SUPPORTED_TOKENS = [ - "7kbnvuGBxxj8AG9qp8Scn56muWGaRaFqxg1FsRp3PaFT", - "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn", - "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So", - "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1", - "So11111111111111111111111111111111111111112", - "7dHbWXmci3dT8UFYWYZweBLXgycu7Y3iL6trKn1Y7ARj", - "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", -]; - -export type TokenData = Omit & { price: number; balance: BN; iconUrl: string }; -export type TokenDataMap = Map; - -export type SupportedSlippagePercent = 0.1 | 0.5 | 1.0 | 5.0; - -interface LstState { - // State - initialized: boolean; - userDataFetched: boolean; - isRefreshingStore: boolean; - connection: Connection | null; - wallet: Wallet | null; - lstData: LstData | null; - feesAndRent: number; - availableLamports: BN | null; - tokenDataMap: TokenDataMap | null; - stakeAccounts: StakeData[]; - solUsdValue: number | null; - slippagePct: SupportedSlippagePercent; - quoteResponseMeta: QuoteResponseMeta | null; - - // Actions - fetchLstState: (args?: { connection?: Connection; wallet?: Wallet; isOverride?: boolean }) => Promise; - setIsRefreshingStore: (isRefreshingStore: boolean) => void; - resetUserData: () => void; - setSlippagePct: (slippagePct: SupportedSlippagePercent) => void; - setQuoteResponseMeta: (quoteResponseMeta: QuoteResponseMeta | null) => void; -} - -function createLstStore() { - return create]]>( - persist(stateCreator, { - name: "lst-peristent-store", - partialize(state) { - return { - slippagePct: state.slippagePct, - }; - }, - }) - ); -} - -export interface LstData { - poolAddress: PublicKey; - tvl: number; - projectedApy: number; - lstSolValue: number; - solDepositFee: number; - accountData: solanaStakePool.StakePool; - validatorList: PublicKey[]; -} - -const stateCreator: StateCreator = (set, get) => ({ - // State - initialized: false, - userDataFetched: false, - isRefreshingStore: false, - connection: null, - wallet: null, - lstData: null, - feesAndRent: 0, - availableLamports: null, - tokenDataMap: null, - stakeAccounts: [], - solUsdValue: null, - slippagePct: 1, - stakePoolProxyProgram: null, - quoteResponseMeta: null, - - // Actions - fetchLstState: async (args?: { connection?: Connection; wallet?: Wallet }) => { - try { - let userDataFetched = false; - - const connection = args?.connection || get().connection; - if (!connection) throw new Error("Connection not found"); - - const wallet = args?.wallet || get().wallet; - - let availableLamports: BN | null = null; - let tokenDataMap: TokenDataMap | null = null; - let solUsdValue: number | null = null; - let stakeAccounts: StakeData[] = []; - console.log("Fetching LST data"); - const lstData = await fetchLstData(connection); - // const minimumRentExemption = await connection.getMinimumBalanceForRentExemption(ACCOUNT_SIZE); - // const jupiterTokenInfo = await fetchJupiterTokenInfo(); - - if (wallet?.publicKey) { - // const [accountsAiList, minimumRentExemption, userTokenAccounts, _stakeAccounts] = await Promise.all([ - // connection.getMultipleAccountsInfo([wallet.publicKey, SOL_USD_PYTH_ORACLE]), - // connection.getMinimumBalanceForRentExemption(ACCOUNT_SIZE), - // fetchUserTokenAccounts(connection, wallet.publicKey), - // fetchStakeAccounts(connection, wallet.publicKey), - // ]); - - // const [walletAi, solUsdPythFeedAi] = accountsAiList; - // const nativeSolBalance = walletAi?.lamports ? walletAi.lamports : 0; - // availableLamports = new BN(nativeSolBalance - minimumRentExemption - NETWORK_FEE_LAMPORTS); - // solUsdValue = vendor.parsePriceData(solUsdPythFeedAi!.data).emaPrice.value; - // stakeAccounts = _stakeAccounts.filter( - // (stakeAccount) => - // stakeAccount.isActive && lstData.validatorList.find((v) => v.equals(stakeAccount.validatorVoteAddress)) - // ); - - // tokenDataMap = new Map( - // [...jupiterTokenInfo.entries()].map(([tokenMint, tokenInfo]) => { - // const { logoURI, ..._tokenInfo } = tokenInfo; - - // let walletBalance: BN = new BN(0); - // const tokenAccount = userTokenAccounts?.get(tokenMint); - // walletBalance = uiToNative(tokenAccount?.balance ?? 0, tokenInfo.decimals); - - // return [ - // tokenMint, - // { ..._tokenInfo, iconUrl: logoURI ?? "/info_icon.png", price: 0, balance: walletBalance }, - // ]; - // }) - // ); - - userDataFetched = true; - } else { - // tokenDataMap = new Map( - // [...jupiterTokenInfo.entries()].map(([tokenMint, tokenInfo]) => { - // const { logoURI, ..._tokenInfo } = tokenInfo; - // return [tokenMint, { ..._tokenInfo, iconUrl: logoURI ?? "/info_icon.png", price: 0, balance: new BN(0) }]; - // }) - // ); - // const accountsAiList = await connection.getMultipleAccountsInfo([SOL_USD_PYTH_ORACLE]); - // const [solUsdPythFeedAi] = accountsAiList; - // solUsdValue = vendor.parsePriceData(solUsdPythFeedAi!.data).emaPrice.value; - } - - set({ - initialized: true, - feesAndRent: 0 + NETWORK_FEE_LAMPORTS, - userDataFetched, - isRefreshingStore: false, - connection, - wallet, - lstData, - availableLamports, - tokenDataMap, - stakeAccounts, - solUsdValue, - }); - - // const tokenPrices = await fetchTokenPrices( - // [...jupiterTokenInfo.values()].map((tokenInfo) => new PublicKey(tokenInfo.address)) - // ); - - // tokenDataMap.forEach((value, key, map) => { - // const price = tokenPrices.get(value.address); - // value.price = price ?? 0; - // }); - - set({ - tokenDataMap, - }); - } catch (err) { - console.error("error refreshing state: ", err); - set({ isRefreshingStore: false }); - } - }, - setIsRefreshingStore: (isRefreshingStore: boolean) => set({ isRefreshingStore }), - resetUserData: () => { - let tokenDataMap = get().tokenDataMap; - if (tokenDataMap) { - tokenDataMap = new Map( - [...tokenDataMap?.entries()].map( - ([tokenMint, tokenData]) => [tokenMint, { ...tokenData, balance: new BN(0) }] as [string, TokenData] - ) - ); - } - set({ userDataFetched: false, tokenDataMap }); - }, - setSlippagePct: (slippagePct: SupportedSlippagePercent) => set({ slippagePct }), - setQuoteResponseMeta: (quoteResponseMeta: QuoteResponseMeta | null) => set({ quoteResponseMeta }), -}); - -async function fetchLstData(connection: Connection): Promise { - const [stakePoolInfo, stakePoolAccount, solanaCompassPrices] = await Promise.all([ - solanaStakePool.stakePoolInfo(connection, STAKE_POOL_ID), - solanaStakePool.getStakePoolAccount(connection, STAKE_POOL_ID), - // fetch(STAKEVIEW_APP_URL).then((res) => res.json()), - fetchAndParsePricesCsv(SOLANA_COMPASS_PRICES_URL), - ]); - const stakePool = stakePoolAccount.account.data; - - const poolTokenSupply = Number(stakePoolInfo.poolTokenSupply); - const totalLamports = Number(stakePoolInfo.totalLamports); - const lastPoolTokenSupply = Number(stakePoolInfo.lastEpochPoolTokenSupply); - const lastTotalLamports = Number(stakePoolInfo.lastEpochTotalLamports); - - const solDepositFee = stakePoolInfo.solDepositFee.denominator.eqn(0) - ? 0 - : stakePoolInfo.solDepositFee.numerator.toNumber() / stakePoolInfo.solDepositFee.denominator.toNumber(); - - const lstSolValue = poolTokenSupply > 0 ? totalLamports / poolTokenSupply : 1; - - let projectedApy: number; - if (lastTotalLamports === 0 || lastPoolTokenSupply === 0) { - projectedApy = 0.08; - } else { - const priceRange = getPriceRangeFromPeriod(solanaCompassPrices, PERIOD.DAYS_7); - if (!priceRange) { - throw new Error("No price data found for the specified period!"); - } - projectedApy = calcYield(priceRange).apy; - } - - // commenting out until authorization for stakeview url is approved - // if (projectedApy < 0.08) { - // // temporarily use baseline validator APY waiting for a few epochs to pass - // const baselineValidatorData = apyData.validators.find((validator: any) => validator.id === BASELINE_VALIDATOR_ID); - // if (baselineValidatorData) projectedApy = baselineValidatorData.apy; - // } - - return { - poolAddress: new PublicKey(stakePoolInfo.address), - tvl: totalLamports / 1e9, - projectedApy, - lstSolValue, - solDepositFee, - accountData: stakePool, - validatorList: stakePoolInfo.validatorList.map((v) => new PublicKey(v.voteAccountAddress)), - }; -} - -async function fetchJupiterTokenInfo(): Promise { - const preferredTokenListMode: any = "strict"; - const tokens = await (preferredTokenListMode === "strict" - ? await fetch("https://token.jup.ag/strict") - : await fetch("https://token.jup.ag/all") - ).json(); - - // Dynamically import TokenListContainer when needed - const { TokenListContainer } = await import("@solana/spl-token-registry"); - - const res = new TokenListContainer(tokens); - const list = res.filterByChainId(101).getList(); - const tokenMap = list - .filter((tokenInfo) => SUPPORTED_TOKENS.includes(tokenInfo.address)) - .reduce((acc, item) => { - acc.set(item.address, item); - return acc; - }, new Map()); - - return tokenMap; -} - -async function fetchUserTokenAccounts(connection: Connection, walletAddress: PublicKey): Promise { - const response = await connection.getParsedTokenAccountsByOwner( - walletAddress, - { programId: TOKEN_PROGRAM_ID }, - "confirmed" - ); - - const reducedResult = response.value.map((item: any) => { - return { - created: true, - mint: new PublicKey(item.account.data.parsed.info.mint), - balance: item.account.data.parsed.info.tokenAmount.uiAmount, - } as TokenAccount; - }); - - const userTokenAccounts = new Map( - reducedResult.map((tokenAccount: any) => [tokenAccount.mint.toString(), tokenAccount]) - ); - return userTokenAccounts; -} - -async function fetchTokenPrices(mints: PublicKey[]): Promise> { - const prices = await fetchBirdeyePrices(mints); - return new Map(prices.map((price, index) => [mints[index].toString(), price.toNumber()])); -} - -export { createLstStore }; -export type { LstState }; diff --git a/packages/mrgn-ui/src/components/action-box-v2/actions/loop-box/hooks/use-loop-simulation.hooks.ts b/packages/mrgn-ui/src/components/action-box-v2/actions/loop-box/hooks/use-loop-simulation.hooks.ts index fa93af2a7a..3c2ea9bc41 100644 --- a/packages/mrgn-ui/src/components/action-box-v2/actions/loop-box/hooks/use-loop-simulation.hooks.ts +++ b/packages/mrgn-ui/src/components/action-box-v2/actions/loop-box/hooks/use-loop-simulation.hooks.ts @@ -135,8 +135,6 @@ export function useLoopSimulation({ return; } - console.log("simulating"); - setIsLoading(true); try { const loopingObject = await calculateLooping( diff --git a/packages/mrgn-ui/src/components/action-box-v2/actions/stake-box/utils/stake-simulation.utils.ts b/packages/mrgn-ui/src/components/action-box-v2/actions/stake-box/utils/stake-simulation.utils.ts index 694982852c..3a558febd7 100644 --- a/packages/mrgn-ui/src/components/action-box-v2/actions/stake-box/utils/stake-simulation.utils.ts +++ b/packages/mrgn-ui/src/components/action-box-v2/actions/stake-box/utils/stake-simulation.utils.ts @@ -19,6 +19,7 @@ import { AddressLookupTableAccount, Connection, Keypair, + LAMPORTS_PER_SOL, PublicKey, Signer, SystemProgram, @@ -193,7 +194,7 @@ export async function handleStakeTx( }) ); - const bundleTipIx = makeBundleTipIx(marginfiClient.wallet.publicKey, priorityFee); + const bundleTipIx = makeBundleTipIx(marginfiClient.wallet.publicKey, Math.trunc(priorityFee * LAMPORTS_PER_SOL)); const stakeMessage = new TransactionMessage({ payerKey: marginfiClient.wallet.publicKey, diff --git a/packages/mrgn-ui/src/components/action-box-v2/store/action-box-store.ts b/packages/mrgn-ui/src/components/action-box-v2/store/action-box-store.ts index d63c52d5f2..2a8284a794 100644 --- a/packages/mrgn-ui/src/components/action-box-v2/store/action-box-store.ts +++ b/packages/mrgn-ui/src/components/action-box-v2/store/action-box-store.ts @@ -22,7 +22,11 @@ function createActionBoxStore() { return create()( persist(stateCreator, { name: "actionBoxStore", - onRehydrateStorage: () => (state) => {}, + onRehydrateStorage: () => (state) => { + if (state?.slippageBps && (state.slippageBps < 0 || state.slippageBps > 500)) { + state.slippageBps = 100; + } + }, }) ); } diff --git a/packages/mrgn-utils/src/lst-apy.utils.ts b/packages/mrgn-utils/src/lst-apy.utils.ts index f1d61ac6ff..05ba3f1814 100644 --- a/packages/mrgn-utils/src/lst-apy.utils.ts +++ b/packages/mrgn-utils/src/lst-apy.utils.ts @@ -32,7 +32,7 @@ export const calculateLstYield = async (bank: ExtendedBankInfo) => { const solanaCompassKey = LSTS_SOLANA_COMPASS_MAP[bank.meta.tokenSymbol]; if (!solanaCompassKey) return 0; - const response = await fetch(`/api/lst?solanaCompassKey=${solanaCompassKey}`); + const response = await fetch(`/api/stakingApy?solanaCompassKey=${solanaCompassKey}`); if (!response.ok) return 0; const solanaCompassPrices = await response.json(); diff --git a/turbo.json b/turbo.json index 4279cb1cd5..b4807b3462 100644 --- a/turbo.json +++ b/turbo.json @@ -97,6 +97,9 @@ "API_AUTH_PASSWORD", "SWITCHBOARD_CROSSSBAR_API", "SWITCHBOARD_STAGE_URL", - "VALIDATOR_API_URL" + "VALIDATOR_API_URL", + "SWITCHBOARD_CROSSSBAR_API_FALLBACK", + "SWITCHBOARD_CROSSSBAR_API_FALLBACK_USERNAME", + "SWITCHBOARD_CROSSSBAR_API_FALLBACK_BEARER" ] } diff --git a/yarn.lock b/yarn.lock index 83ab6d6a47..df43b89afc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -76,15 +76,6 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/code-frame@^7.25.9": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.0.tgz#9374b5cd068d128dac0b94ff482594273b1c2815" - integrity sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7", "@babel/compat-data@^7.24.8": version "7.24.9" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz" @@ -209,17 +200,6 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/generator@^7.25.9": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.0.tgz#505cc7c90d92513f458a477e5ef0703e7c91b8d7" - integrity sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w== - dependencies: - "@babel/parser" "^7.26.0" - "@babel/types" "^7.26.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - "@babel/helper-annotate-as-pure@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz" @@ -227,13 +207,6 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-annotate-as-pure@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" - integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== - dependencies: - "@babel/types" "^7.25.9" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz" @@ -290,19 +263,6 @@ "@babel/helper-split-export-declaration" "^7.24.7" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" - integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-member-expression-to-functions" "^7.25.9" - "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/helper-replace-supers" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/traverse" "^7.25.9" - semver "^6.3.1" - "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz" @@ -353,14 +313,6 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-member-expression-to-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" - integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz" @@ -369,14 +321,6 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-module-transforms@^7.22.9": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz" @@ -409,15 +353,6 @@ "@babel/helper-validator-identifier" "^7.24.7" "@babel/traverse" "^7.25.2" -"@babel/helper-module-transforms@^7.25.9": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/helper-optimise-call-expression@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz" @@ -425,23 +360,11 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-optimise-call-expression@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" - integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== - dependencies: - "@babel/types" "^7.25.9" - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz" integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== -"@babel/helper-plugin-utils@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== - "@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz" @@ -460,15 +383,6 @@ "@babel/helper-member-expression-to-functions" "^7.24.7" "@babel/helper-optimise-call-expression" "^7.24.7" -"@babel/helper-replace-supers@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" - integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.25.9" - "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/helper-simple-access@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz" @@ -477,14 +391,6 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-simple-access@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" - integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz" @@ -493,14 +399,6 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" - integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-split-export-declaration@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz" @@ -518,31 +416,16 @@ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - "@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": version "7.24.8" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz" integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== - "@babel/helper-wrap-function@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz" @@ -604,13 +487,6 @@ dependencies: "@babel/types" "^7.25.6" -"@babel/parser@^7.25.9", "@babel/parser@^7.26.0": - version "7.26.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.1.tgz#44e02499960df2cdce2c456372a3e8e0c3c5c975" - integrity sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw== - dependencies: - "@babel/types" "^7.26.0" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz" @@ -833,13 +709,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-jsx@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" - integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" @@ -903,13 +772,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-typescript@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" - integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" @@ -1115,15 +977,6 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" - integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== - dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-simple-access" "^7.25.9" - "@babel/plugin-transform-modules-systemjs@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz" @@ -1367,17 +1220,6 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-typescript" "^7.24.7" -"@babel/plugin-transform-typescript@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz#69267905c2b33c2ac6d8fe765e9dc2ddc9df3849" - integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/plugin-syntax-typescript" "^7.25.9" - "@babel/plugin-transform-unicode-escapes@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz" @@ -1537,17 +1379,6 @@ "@babel/plugin-transform-modules-commonjs" "^7.24.7" "@babel/plugin-transform-typescript" "^7.24.7" -"@babel/preset-typescript@^7.24.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d" - integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-option" "^7.25.9" - "@babel/plugin-syntax-jsx" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.25.9" - "@babel/plugin-transform-typescript" "^7.25.9" - "@babel/register@^7.13.16": version "7.24.6" resolved "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz" @@ -1603,15 +1434,6 @@ "@babel/parser" "^7.25.0" "@babel/types" "^7.25.0" -"@babel/template@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/traverse@^7.20.0", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8": version "7.24.8" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz" @@ -1657,19 +1479,6 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" - debug "^4.3.1" - globals "^11.1.0" - "@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.24.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.24.9" resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz" @@ -1697,14 +1506,6 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" -"@babel/types@^7.25.9", "@babel/types@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" @@ -2587,15 +2388,15 @@ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== -"@emurgo/cardano-serialization-lib-browser@^11.5.0": +"@emurgo/cardano-serialization-lib-browser@^11.0.0": version "11.5.0" resolved "https://registry.yarnpkg.com/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.5.0.tgz#f2d15b538add436e0aa8b67a1d00ca654a680006" integrity sha512-qchOJ9NYDUz10tzs5r5QhP9hK0p+ZOlRiBwPdTAxqAYLw/8emYBkQQLaS8T1DF6EkeudyrgS00ym5Trw1fo4iA== -"@emurgo/cardano-serialization-lib-nodejs@11.5.0": - version "11.5.0" - resolved "https://registry.yarnpkg.com/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.5.0.tgz#0662e2a17d7d1e944f8cdb86396133c8edaec059" - integrity sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ== +"@emurgo/cardano-serialization-lib-nodejs@11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.0.0.tgz#16f5945e576a7ba36f8619279daef771c3079897" + integrity sha512-thm7g+NT9W4Iwor0S7oTewpLoKwGTGVdVWiZsUj3GjNNp+XJQHXffsOy9JyauMHjqaQeIpDLR1QckY5VnCWzhg== "@esbuild-plugins/node-globals-polyfill@^0.2.3": version "0.2.3" @@ -2813,7 +2614,7 @@ resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz" integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== -"@ethereumjs/common@^3.2.0": +"@ethereumjs/common@^3.1.2", "@ethereumjs/common@^3.2.0": version "3.2.0" resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz" integrity sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA== @@ -2821,13 +2622,6 @@ "@ethereumjs/util" "^8.1.0" crc-32 "^1.2.0" -"@ethereumjs/common@^4.3.0", "@ethereumjs/common@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-4.4.0.tgz#fba41612f527a815bf304e98653d6b5fc5d6d4de" - integrity sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w== - dependencies: - "@ethereumjs/util" "^9.1.0" - "@ethereumjs/rlp@^4.0.1": version "4.0.1" resolved "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz" @@ -2848,16 +2642,6 @@ "@ethereumjs/util" "^8.1.0" ethereum-cryptography "^2.0.0" -"@ethereumjs/tx@^5.3.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-5.4.0.tgz#6f47894cc3e2d4e63d87c62b41ed7e8180a1de58" - integrity sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA== - dependencies: - "@ethereumjs/common" "^4.4.0" - "@ethereumjs/rlp" "^5.0.2" - "@ethereumjs/util" "^9.1.0" - ethereum-cryptography "^2.2.1" - "@ethereumjs/util@^8.0.6", "@ethereumjs/util@^8.1.0": version "8.1.0" resolved "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz" @@ -2875,14 +2659,6 @@ "@ethereumjs/rlp" "^5.0.2" ethereum-cryptography "^2.1.3" -"@ethereumjs/util@^9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" - integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== - dependencies: - "@ethereumjs/rlp" "^5.0.2" - ethereum-cryptography "^2.2.1" - "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" @@ -4074,13 +3850,13 @@ resolved "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.0.tgz" integrity sha512-zuWxyfXNbsKbm96HhXzainONPFqRcoZblQ++e9cAIGUuHfl2cFSBzW01jtesqWG/lqaUyX3H8O1y9oWboGNQBA== -"@fivebinaries/coin-selection@2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@fivebinaries/coin-selection/-/coin-selection-2.2.1.tgz#f5329909ac8cd1bf87decdcd054c88a8d69399a0" - integrity sha512-iYFsYr7RY7TEvTqP9NKR4p/yf3Iybf9abUDR7lRjzanGsrLwVsREvIuyE05iRYFrvqarlk+gWRPsdR1N2hUBrg== +"@fivebinaries/coin-selection@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@fivebinaries/coin-selection/-/coin-selection-2.2.0.tgz#492abd9c9e30e9b29beaa3232c25f76fb199c513" + integrity sha512-1j0GGlfXla6Ws51gmemyLBVtsROQBGhTMExSYmpRmLHGLpNuOsEA4O7P19yzjW209gSswcD9+T7zEYCNbp3MRg== dependencies: - "@emurgo/cardano-serialization-lib-browser" "^11.5.0" - "@emurgo/cardano-serialization-lib-nodejs" "11.5.0" + "@emurgo/cardano-serialization-lib-browser" "^11.0.0" + "@emurgo/cardano-serialization-lib-nodejs" "11.0.0" "@floating-ui/core@^1.0.0": version "1.6.2" @@ -6481,7 +6257,7 @@ dependencies: "@noble/hashes" "1.4.0" -"@noble/curves@1.4.2", "@noble/curves@^1.3.0", "@noble/curves@^1.4.2": +"@noble/curves@^1.3.0", "@noble/curves@^1.4.2": version "1.4.2" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz" integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== @@ -9264,11 +9040,6 @@ resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sinclair/typebox@^0.33.7": - version "0.33.17" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.33.17.tgz#603475bb1fb343deb82a4ce85e6adf177a65739b" - integrity sha512-75232GRx3wp3P7NP+yc4nRK3XUAnaQShxTAzapgmQrgs0QvSq0/mOJGoZXRpH15cFCKyys+4laCPbBselqJ5Ag== - "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz" @@ -10935,174 +10706,160 @@ resolved "https://registry.npmjs.org/@toruslabs/tweetnacl-js/-/tweetnacl-js-1.0.4.tgz" integrity sha512-h8fVemW5pstsKbm/fTx+y61dZkh5Pepy/92lsyKp83KErf96jT+w4LGx4nEgeAVrdYQDTLg2tO7vu/boEb23Iw== -"@trezor/analytics@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@trezor/analytics/-/analytics-1.2.1.tgz#40e3e9aa738b90e09ffb858dca3fe19468cee225" - integrity sha512-GKkHp+4e2YaX+nNf3C46Et8y9D7ExRSvlCinJfClFNbY3p5Mn83PwoXpSsM9omqmZkIy+0EoC/o6+JcaiA+p9A== +"@trezor/analytics@1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@trezor/analytics/-/analytics-1.0.10.tgz#b9b087744168545832992483e4df5172c9efccb2" + integrity sha512-uXO51TmcdjhBP7WwXqU6AgnMoWbpRzzd6Ehmb6hSSSokm77RlBEurjSeVxRnjzA7h6XbSX06hxqq3iCTMK4Nmg== dependencies: - "@trezor/env-utils" "1.2.0" - "@trezor/utils" "9.2.1" + "@trezor/env-utils" "1.0.9" + "@trezor/utils" "9.0.15" -"@trezor/blockchain-link-types@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@trezor/blockchain-link-types/-/blockchain-link-types-1.2.1.tgz#394041f0010b60ac083f01357df7ae74c36103f9" - integrity sha512-YokPYnMG60qWoaQU18st3A3lvvefFRLY/TK1sDHFpwKWDLWch+tvZINhviJ1bdbxPqYZVDCmL8yyXNAu0xS5iQ== - dependencies: - "@solana/web3.js" "^1.95.0" - "@trezor/type-utils" "1.1.0" - "@trezor/utxo-lib" "2.2.1" - socks-proxy-agent "6.1.1" +"@trezor/blockchain-link-types@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@trezor/blockchain-link-types/-/blockchain-link-types-1.0.8.tgz#131bf441b0282c3e53f25e216d728ab030b68683" + integrity sha512-0K3Pb3tXnvhPdHlAivbLncbaxcVchdZa/0AdY0L9vEdiszEuAQkw51DqFNPYJxMl91eyW1T2wbJgAvB7e3VIyg== -"@trezor/blockchain-link-utils@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.2.1.tgz#b0b941d4afa7fb463918a8cccdc6b815843c9d1b" - integrity sha512-+h+TIHG6l1gCqguhiWt5ZLKH/ImDGqfaZ0ql/nl5QQUdtPh9g2RU1Wc0CwQHOLmWqI/YBPExhMFB9MTf5feZ3w== +"@trezor/blockchain-link-utils@1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.0.9.tgz#dbff7b5b71a3c8cc5bcbfb7e72d6559591c75893" + integrity sha512-24vxhafyjfIH2iWaOYAcYyG9ApiZ7PCO1hcvAMEIsH8yBRO8zQoHy10uU2CtUX0cvU6LJ/Bp2bplNGe35jUzbw== dependencies: "@mobily/ts-belt" "^3.13.1" - "@solana/web3.js" "^1.95.0" - "@trezor/env-utils" "1.2.0" - "@trezor/utils" "9.2.1" + "@solana/web3.js" "^1.87.6" + "@trezor/utils" "9.0.15" + bignumber.js "^9.1.1" -"@trezor/blockchain-link@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@trezor/blockchain-link/-/blockchain-link-2.3.1.tgz#72f8c956ee2d3e25caeadcbbae1c029dc9a84d48" - integrity sha512-W4cvbPT3+3w3z/Xf8G49XbwkW8hnhiMEnJJfYGR0yPgqul7rtSmPHvII4pb+/AHAo1DfOaJCrRw87tEbhybU6Q== +"@trezor/blockchain-link@2.1.19": + version "2.1.19" + resolved "https://registry.yarnpkg.com/@trezor/blockchain-link/-/blockchain-link-2.1.19.tgz#2279f3780c2df93e2dc0a1ff57848e3301799ab2" + integrity sha512-hOD3S3tE4kj0JsxiT8Ux+GQVpB0OfKWzCJG+U8CTPOZEgpJGioLZr9O94BMCBFECd7dMUkQt/u/QVNvpP4Nacw== dependencies: "@solana/buffer-layout" "^4.0.1" - "@solana/web3.js" "^1.95.0" - "@trezor/blockchain-link-types" "1.2.1" - "@trezor/blockchain-link-utils" "1.2.1" - "@trezor/utils" "9.2.1" - "@trezor/utxo-lib" "2.2.1" - "@types/web" "^0.0.162" + "@solana/web3.js" "^1.87.6" + "@trezor/blockchain-link-types" "1.0.8" + "@trezor/blockchain-link-utils" "1.0.9" + "@trezor/utils" "9.0.15" + "@trezor/utxo-lib" "2.0.1" + "@types/web" "^0.0.119" + bignumber.js "^9.1.1" events "^3.3.0" ripple-lib "^1.10.1" socks-proxy-agent "6.1.1" - ws "^8.18.0" + ws "7.5.9" -"@trezor/connect-analytics@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@trezor/connect-analytics/-/connect-analytics-1.2.1.tgz#c4777fd957833d06d766a9b680c07fd799b81ea7" - integrity sha512-zvnoyTop5rz4i3KkhAIG8rnOOn5TIUgZcBbOD2a8lya/zeAlMhMtGg2R3STZWbj91xhmouoIb76ipB5jShsfCg== +"@trezor/connect-analytics@1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@trezor/connect-analytics/-/connect-analytics-1.0.9.tgz#093f96392f7786b337f2b97d4affaa3714905cb9" + integrity sha512-/wNn/4yoSONFhh61y/BR8SFP+b8zsRuv70Wz5Ozaxy8Fzhhe1k1AeH2OyNY8s3mCi8+1OeMZf4CO7b/mWw9PVw== dependencies: - "@trezor/analytics" "1.2.1" + "@trezor/analytics" "1.0.10" -"@trezor/connect-common@0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@trezor/connect-common/-/connect-common-0.2.2.tgz#d0862d062c7a6b9636ebfe403e7fcdcee77ce8dc" - integrity sha512-evPjhDhV6RNv90OiLIFAXnWKMojwsSMltxyhsCrjzAO5e+xrP/ZykCLoJfO0MR7onFGNi41H91wpvD7LSXLvMQ== - dependencies: - "@trezor/env-utils" "1.2.0" - "@trezor/utils" "9.2.1" - -"@trezor/connect-web@^9.2.1": - version "9.4.2" - resolved "https://registry.yarnpkg.com/@trezor/connect-web/-/connect-web-9.4.2.tgz#f730c795ea9359cd440dd8de8cd507367c5fa2d4" - integrity sha512-nkqfNx7KZyHovteJsxRPqu/63u3Xp4Hi4BtJDkt/ialpIBC78Nheiyz0fY16mxPz+HKrlpswryimlfjDD59aWA== - dependencies: - "@trezor/connect" "9.4.2" - "@trezor/connect-common" "0.2.2" - "@trezor/utils" "9.2.1" - -"@trezor/connect@9.4.2": - version "9.4.2" - resolved "https://registry.yarnpkg.com/@trezor/connect/-/connect-9.4.2.tgz#e20b7fb3a1c3e887113e68e45d4f7598c42172ba" - integrity sha512-SXp34aAZKicDd/3H3Et546MJtwmgSFUdnkIR7zBbqm9sdyxOzNmapE7bRpYYhSJtVarCY/COwdfXNOo1wO9JZQ== - dependencies: - "@babel/preset-typescript" "^7.24.7" - "@ethereumjs/common" "^4.3.0" - "@ethereumjs/tx" "^5.3.0" - "@fivebinaries/coin-selection" "2.2.1" - "@trezor/blockchain-link" "2.3.1" - "@trezor/blockchain-link-types" "1.2.1" - "@trezor/connect-analytics" "1.2.1" - "@trezor/connect-common" "0.2.2" - "@trezor/protobuf" "1.2.2" - "@trezor/protocol" "1.2.1" - "@trezor/schema-utils" "1.2.1" - "@trezor/transport" "1.3.2" - "@trezor/utils" "9.2.1" - "@trezor/utxo-lib" "2.2.1" +"@trezor/connect-common@0.0.23": + version "0.0.23" + resolved "https://registry.yarnpkg.com/@trezor/connect-common/-/connect-common-0.0.23.tgz#c3f5081ad86cc611d9aeb678230ceee7e9f7c96a" + integrity sha512-FJFIO3HRrgW223w5oJSkMzYGx1LpjaYS+I57dhs35HEl//cHcvVUH8DiWV6omUlZp+CcpJguxk8q4Q5+BBPebg== + dependencies: + "@trezor/env-utils" "1.0.9" + +"@trezor/connect-web@9.1.6", "@trezor/connect-web@^9.2.1": + version "9.1.6" + resolved "https://registry.yarnpkg.com/@trezor/connect-web/-/connect-web-9.1.6.tgz#e5e05e7d0650dc1f52ef4b9067b898ff4328f0ea" + integrity sha512-KybU1roM2L47aIXP4AvlMJ8oyEvXuWU/E6+5TVmWx8JOWKFQL6cFS1e+FEsON0WUweQ7AjIMIrcCxddK2UMcCQ== + dependencies: + "@trezor/connect" "9.1.6" + "@trezor/utils" "9.0.15" + events "^3.3.0" + +"@trezor/connect@9.1.6": + version "9.1.6" + resolved "https://registry.yarnpkg.com/@trezor/connect/-/connect-9.1.6.tgz#5e240fc453ea72992e71fbc2da045d9d15a8ee32" + integrity sha512-wPQWNItVQu6kAEVSJroUQKieAYywwf0nBiiZpktfMUaWDwy5tsQMgw6FGTBbbfT5XJhlGyZM+K2Bbt5zGSlJXQ== + dependencies: + "@ethereumjs/common" "^3.1.2" + "@ethereumjs/tx" "^4.1.2" + "@fivebinaries/coin-selection" "2.2.0" + "@trezor/blockchain-link" "2.1.19" + "@trezor/blockchain-link-types" "1.0.8" + "@trezor/connect-analytics" "1.0.9" + "@trezor/connect-common" "0.0.23" + "@trezor/protobuf" "1.0.3" + "@trezor/protocol" "1.0.3" + "@trezor/transport" "1.1.18" + "@trezor/utils" "9.0.15" + "@trezor/utxo-lib" "2.0.1" + bignumber.js "^9.1.1" blakejs "^1.2.1" - bs58 "^6.0.0" - bs58check "^4.0.0" + bs58 "^5.0.0" + bs58check "^3.0.1" cross-fetch "^4.0.0" + events "^3.3.0" -"@trezor/env-utils@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@trezor/env-utils/-/env-utils-1.2.0.tgz#8fb771a6f43e31b7dcf8c383c1f06c21f16b9674" - integrity sha512-dbOR+PIeReZW4iooN+DQIMWloZAV92jMGOTzEdcY6NA63nCV8QUSxoNZwZtU9nVRPeJLrT6cVkVG80nZjlplow== +"@trezor/env-utils@1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@trezor/env-utils/-/env-utils-1.0.9.tgz#6db03168095f88196564f84bf5f35f5ce6934045" + integrity sha512-DygKVWFr21ITnr9iO4+BF40UuocOUXh4Sk/sj67edMaxo/FCF/bzfO5YV2tnfzsOU8l0phuEA/t5W2WVhTwPWg== dependencies: ua-parser-js "^1.0.37" -"@trezor/protobuf@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@trezor/protobuf/-/protobuf-1.2.2.tgz#9563bc701087bb3d19bf42792f05f154446618c2" - integrity sha512-zEpyQHMXpG6LJC/f1lKyzRIsy+v+waor7MdSQ0Dh4ndBf/NkHdxAkCPmT6aehZ8UFZuSDMlp0plK8V+0p9pHNw== +"@trezor/protobuf@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@trezor/protobuf/-/protobuf-1.0.3.tgz#25bca8c6a24afdd7c52378b0eab0c70708dd0ed8" + integrity sha512-cvOJZCA9647nVodZ6Ias/1NWkbCGhnLCa1Rr0sljpzr+DhMpEz2nuuxpYannq8j6H4rxV4bcg/cmm5ym29/H0A== dependencies: - "@trezor/schema-utils" "1.2.1" - protobufjs "7.4.0" - -"@trezor/protocol@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@trezor/protocol/-/protocol-1.2.1.tgz#bc926fc36fa40d2d4f5776bcfa3e1f3d1bb63290" - integrity sha512-KGRtlizHk4nz7owhHH/gP3XfTbOGvD1Co3As1KOvVAA4+J+YJsk4ri84heJG9vb1Mi30rY2fvQ0TrxOL7bgsWQ== + bytebuffer "^5.0.1" + long "^4.0.0" + protobufjs "7.2.5" -"@trezor/schema-utils@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@trezor/schema-utils/-/schema-utils-1.2.1.tgz#ab34c77e06f007ef75853130c1d418f340b773b8" - integrity sha512-oMAxn8UWknstNHW0BHpT5uV3K74Sc71NMp84IDdvmgGJKu8szuynUEbwuLa399TWNT8w76dp4JY1antZ0/uQhw== +"@trezor/protocol@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@trezor/protocol/-/protocol-1.0.3.tgz#b4dcfabc28b06a3d2b9de75ee6dbb4d619e60d89" + integrity sha512-yzbqid0VN3f8F0Kkqyvf2hhbFGVUU2aJKT0AJVYigJfZQE9RVO3mbbUonOs1BXDfLZsNQEGzI6q432qHIm1XhA== dependencies: - "@sinclair/typebox" "^0.33.7" - ts-mixer "^6.0.3" + bytebuffer "^5.0.1" -"@trezor/transport@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@trezor/transport/-/transport-1.3.2.tgz#eb12c986e4493d956e82d15b25a2fc94f23d376e" - integrity sha512-QeudU2AUfFFqORgb+Hg+T7Fy6Qusk45QESJmPI/sxqjQyqEV3kCbg6bPQppDvljasZLiz0Ofw5JAkDAELGkdew== +"@trezor/transport@1.1.18": + version "1.1.18" + resolved "https://registry.yarnpkg.com/@trezor/transport/-/transport-1.1.18.tgz#c13c44382717aaf7d2b64b93caa933a22711530b" + integrity sha512-zxV88QZFgFhQHtgmxVmvxRoQsZOdmtZ1ZgGUDbkUFdeYizZfatiY4LJWQTm2UodmLXNi33bmufcJXI8Ibpo2xw== dependencies: - "@trezor/protobuf" "1.2.2" - "@trezor/protocol" "1.2.1" - "@trezor/utils" "9.2.1" + "@trezor/protobuf" "1.0.3" + "@trezor/protocol" "1.0.3" + "@trezor/utils" "9.0.15" + bytebuffer "^5.0.1" cross-fetch "^4.0.0" + json-stable-stringify "^1.0.2" long "^4.0.0" - protobufjs "7.4.0" - usb "^2.14.0" + protobufjs "7.2.5" + usb "^2.11.0" -"@trezor/type-utils@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@trezor/type-utils/-/type-utils-1.1.0.tgz#cbf65c188555565afe03b16e2ea1238e6fea5b71" - integrity sha512-zoPN9ZmdYlr03WyCWEQY6xCHPfhsodENYHPcZMKObVsUlhtMh1Z7OSD/pzd/NzOPBAtSctNbldx4aFu9A88afw== +"@trezor/utils@9.0.15": + version "9.0.15" + resolved "https://registry.yarnpkg.com/@trezor/utils/-/utils-9.0.15.tgz#b7329560b51dd550f3d985304d310edb2cb13053" + integrity sha512-MbtSIt+C5nWWO1yNVTBeRNW5kxUB2VuBU0CbPSWZkc2sg2/3qe0W/DNf6I0j3wrLSppzZW2jHG3ptz6i+vp39Q== -"@trezor/utils@9.2.1": - version "9.2.1" - resolved "https://registry.yarnpkg.com/@trezor/utils/-/utils-9.2.1.tgz#56959ddd53364d6ebee1b56edfe22f91ac2af3ac" - integrity sha512-BKE/B4szVjdzbZ35Gg0x6l5o/HF3BShlGIQ0S7Ypw9puNriCKTEHBM7YoNYWxx90Byah8o6uxlkQDxPH86ppWA== - dependencies: - bignumber.js "^9.1.2" - -"@trezor/utxo-lib@2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@trezor/utxo-lib/-/utxo-lib-2.2.1.tgz#e819a9b837a22a244aa4e0958e170060e2da4389" - integrity sha512-yBodbZ5kmZucSJFhWfO8WefAacm+d12wbKX8zgrRnQM5Hr4NfACvQh2yLh4UpgM/r3BGAbx8qnEXNpw6SwdOTg== +"@trezor/utxo-lib@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@trezor/utxo-lib/-/utxo-lib-2.0.1.tgz#c1a8afc6bcc8c8860416dfab369eb8d2ba56b2c7" + integrity sha512-C4dY0riZVzYLEt+kXe5KbDguSGBzFto/2jH5xoyhlKt0bEZEJaP4MpYsNwE+zlOGD1yholAPOofx6xiqjDsGig== dependencies: - "@trezor/utils" "9.2.1" + "@trezor/utils" "9.0.15" bchaddrjs "^0.5.2" bech32 "^2.0.0" - bip66 "^2.0.0" + bip66 "^1.1.5" bitcoin-ops "^1.4.1" blake-hash "^2.0.0" blakejs "^1.2.1" bn.js "^5.2.1" - bs58 "^6.0.0" - bs58check "^4.0.0" + bs58 "^5.0.0" + bs58check "^3.0.1" + create-hash "^1.2.0" create-hmac "^1.1.7" int64-buffer "^1.0.1" pushdata-bitcoin "^1.0.1" tiny-secp256k1 "^1.1.6" typeforce "^1.18.0" - varuint-bitcoin "2.0.0" - wif "^5.0.0" + varuint-bitcoin "^1.1.2" + wif "^4.0.0" "@trysound/sax@0.2.0": version "0.2.0" @@ -11906,10 +11663,10 @@ resolved "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz" integrity sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ== -"@types/web@^0.0.162": - version "0.0.162" - resolved "https://registry.yarnpkg.com/@types/web/-/web-0.0.162.tgz#84a31c785e17049f035af47386571cc00d264f02" - integrity sha512-uYssYXblX0BTDdpxllMQ84uDEk0EeU+dcfo8Whyl715cpfsYk5+msRQ6ul0TJGHbCr0XftFybVQGpy1eU262Aw== +"@types/web@^0.0.119": + version "0.0.119" + resolved "https://registry.yarnpkg.com/@types/web/-/web-0.0.119.tgz#848ae9b66608acd257b603b3e716fe5ffc9de8a8" + integrity sha512-CQVOcEWrxr0MXbQbR3rrw6GHo2mcr8WlhLHQkOKDhhySTjz15/35jk0Zm2FbHRyCvSEjr/J7A2iDD5GRrGxE2A== "@types/ws@^7.2.0", "@types/ws@^7.4.4": version "7.4.7" @@ -13914,10 +13671,12 @@ bip39@3.0.2: pbkdf2 "^3.0.9" randombytes "^2.0.1" -bip66@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-2.0.0.tgz#96b5cca18ad10a009f7c8ea4eb24079e37ec9c79" - integrity sha512-kBG+hSpgvZBrkIm9dt5T1Hd/7xGCPEX2npoxAWZfsK1FvjgaxySEh2WizjyIstWXriKo9K9uJ4u0OnsyLDUPXQ== +bip66@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" + integrity sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw== + dependencies: + safe-buffer "^5.0.1" bitcoin-ops@^1.3.0, bitcoin-ops@^1.4.1: version "1.4.1" @@ -14237,13 +13996,13 @@ bs58check@2.1.2, bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" -bs58check@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-4.0.0.tgz#46cda52a5713b7542dcb78ec2efdf78f5bf1d23c" - integrity sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g== +bs58check@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-3.0.1.tgz#2094d13720a28593de1cba1d8c4e48602fdd841c" + integrity sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ== dependencies: "@noble/hashes" "^1.2.0" - bs58 "^6.0.0" + bs58 "^5.0.0" bser@2.1.1: version "2.1.1" @@ -14353,6 +14112,13 @@ busboy@1.6.0: dependencies: streamsearch "^1.1.0" +bytebuffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" + integrity sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ== + dependencies: + long "~3" + bytes@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" @@ -17456,16 +17222,6 @@ ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2, ethereum-cryptograph "@scure/bip32" "1.4.0" "@scure/bip39" "1.3.0" -ethereum-cryptography@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" - integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== - dependencies: - "@noble/curves" "1.4.2" - "@noble/hashes" "1.4.0" - "@scure/bip32" "1.4.0" - "@scure/bip39" "1.3.0" - ethereum-multicall@^2.14.1: version "2.24.0" resolved "https://registry.npmjs.org/ethereum-multicall/-/ethereum-multicall-2.24.0.tgz" @@ -20995,11 +20751,6 @@ jsesc@^2.5.1: resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsesc@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== - jsesc@~0.5.0: version "0.5.0" resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" @@ -21759,6 +21510,11 @@ long@^5.0.0, long@^5.2.3: resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== +long@~3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + integrity sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg== + longest-streak@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" @@ -25197,10 +24953,10 @@ protobufjs@7.2.4: "@types/node" ">=13.7.0" long "^5.0.0" -protobufjs@7.4.0, protobufjs@^7.2.6: - version "7.4.0" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" - integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== +protobufjs@7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" + integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -25252,6 +25008,24 @@ protobufjs@^7.0.0, protobufjs@^7.2.4, protobufjs@^7.2.5: "@types/node" ">=13.7.0" long "^5.0.0" +protobufjs@^7.2.6: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" @@ -28560,11 +28334,6 @@ ts-loader@^9.4.4: semver "^7.3.4" source-map "^0.7.4" -ts-mixer@^6.0.3: - version "6.0.4" - resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28" - integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== - ts-node@^10.9.1, ts-node@^10.9.2: version "10.9.2" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" @@ -28961,11 +28730,6 @@ uglify-js@^3.7.7: resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz" integrity sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A== -uint8array-tools@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/uint8array-tools/-/uint8array-tools-0.0.8.tgz#712bab001f8347bd782f45bc47c76ffff32d1e0b" - integrity sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g== - uint8arrays@3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz" @@ -29335,7 +29099,7 @@ url@^0.11.0: punycode "^1.4.1" qs "^6.11.2" -usb@^2.14.0: +usb@^2.11.0: version "2.14.0" resolved "https://registry.yarnpkg.com/usb/-/usb-2.14.0.tgz#501f18c11b00c248d607ab6b05a8c7b50eb2f21a" integrity sha512-I3lzVOH21BsO6qPYvx1C7Ji08lbuM0qmsEtNGAphqlhNME5cz/vExY+jIXZl+HQIRybI/sTxdyLab5tALsL69w== @@ -29514,12 +29278,12 @@ valtio@1.11.2: proxy-compare "2.5.1" use-sync-external-store "1.2.0" -varuint-bitcoin@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-2.0.0.tgz#59a53845a87ad18c42f184a3d325074465341523" - integrity sha512-6QZbU/rHO2ZQYpWFDALCDSRsXbAs1VOEmXAxtbtjLtKuMJ/FQ8YbhfxlaiKv5nklci0M6lZtlZyxo9Q+qNnyog== +varuint-bitcoin@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz#e76c138249d06138b480d4c5b40ef53693e24e92" + integrity sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw== dependencies: - uint8array-tools "^0.0.8" + safe-buffer "^5.1.1" vary@~1.1.2: version "1.1.2" @@ -29971,12 +29735,12 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wif@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/wif/-/wif-5.0.0.tgz#445e44b8f62e155144d1c970c01ca2ba3979cc3f" - integrity sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA== +wif@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/wif/-/wif-4.0.0.tgz#598d4659f361b1d2a8aed13214783fa374b4b146" + integrity sha512-kADznC+4AFJNXpT8rLhbsfI7EmAcorc5nWvAdKUchGmwXEBD3n55q0/GZ3DBmc6auAvuTSsr/utiKizuXdNYOQ== dependencies: - bs58check "^4.0.0" + bs58check "^3.0.1" winston-transport@^4.7.0: version "4.7.0" @@ -30251,6 +30015,11 @@ ws@7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@7.5.9: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + ws@8.13.0: version "8.13.0" resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" @@ -30273,11 +30042,6 @@ ws@^7, ws@^7.2.0, ws@^7.3.1, ws@^7.4.5, ws@^7.4.6, ws@^7.5.1, ws@^7.5.10: resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.18.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - xcode@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz"