diff --git a/app/components/LiveTransactionStatsCard.tsx b/app/components/LiveTransactionStatsCard.tsx index c6e38beb..f2440465 100644 --- a/app/components/LiveTransactionStatsCard.tsx +++ b/app/components/LiveTransactionStatsCard.tsx @@ -224,7 +224,8 @@ function AnimatedTransactionCount({ info }: { info: PerformanceInfo }) { const countUpRef = React.useRef({ lastUpdate: 0, period: 0, start: 0 }); const countUp = countUpRef.current; - const { transactionCount: txCount, avgTps } = info; + const { transactionCount, avgTps } = info; + const txCount = Number(transactionCount); // Track last tx count to reset count up options if (txCount !== txCountRef.current) { @@ -442,14 +443,13 @@ function PingBarChart({
${val.mean} ms

${val.confirmed} of ${val.submitted} confirmed

- ${ - val.loss + ${val.loss ? `

${val.loss.toLocaleString(undefined, { - minimumFractionDigits: 2, - style: 'percent', - })} loss

` + minimumFractionDigits: 2, + style: 'percent', + })} loss

` : '' - } + } ${SERIES_INFO[series].label(seriesLength - i)}min ago
`; diff --git a/app/components/TopAccountsCard.tsx b/app/components/TopAccountsCard.tsx index 50ab389c..bce2264d 100755 --- a/app/components/TopAccountsCard.tsx +++ b/app/components/TopAccountsCard.tsx @@ -11,6 +11,8 @@ import React, { createRef, useMemo } from 'react'; import { ChevronDown } from 'react-feather'; import useAsyncEffect from 'use-async-effect'; +import { percentage } from '../utils/math'; + type Filter = 'circulating' | 'nonCirculating' | 'all' | null; export function TopAccountsCard() { @@ -33,7 +35,7 @@ export function TopAccountsCard() { return ; } - let supplyCount: number; + let supplyCount: bigint; let accounts, header; if (richList !== Status.Idle) { @@ -105,7 +107,7 @@ export function TopAccountsCard() { ); } -const renderAccountRow = (account: AccountBalancePair, index: number, supply: number) => { +const renderAccountRow = (account: AccountBalancePair, index: number, supply: bigint) => { return ( @@ -117,7 +119,7 @@ const renderAccountRow = (account: AccountBalancePair, index: number, supply: nu - {`${((100 * account.lamports) / supply).toFixed(3)}%`} + {percentage(BigInt(100 * account.lamports), supply, 4).toFixed(3) + '%'} ); }; diff --git a/app/page.tsx b/app/page.tsx index 80837d2e..9d67ecc4 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -19,6 +19,7 @@ import { import { Status, useFetchSupply, useSupply } from '@providers/supply'; import { ClusterStatus } from '@utils/cluster'; import { abbreviatedNumber, lamportsToSol, slotsToHumanString } from '@utils/index'; +import { percentage } from '@utils/math'; import React from 'react'; export default function Page() { @@ -59,13 +60,13 @@ function StakingComponent() { const delinquentStake = React.useMemo(() => { if (voteAccounts) { - return voteAccounts.delinquent.reduce((prev, current) => prev + current.activatedStake, 0); + return voteAccounts.delinquent.reduce((prev, current) => prev + current.activatedStake, BigInt(0)); } }, [voteAccounts]); const activeStake = React.useMemo(() => { if (voteAccounts && delinquentStake) { - return voteAccounts.current.reduce((prev, current) => prev + current.activatedStake, 0) + delinquentStake; + return voteAccounts.current.reduce((prev, current) => prev + current.activatedStake, BigInt(0)) + delinquentStake; } }, [voteAccounts, delinquentStake]); @@ -80,11 +81,12 @@ function StakingComponent() { return ; } - const circulatingPercentage = ((supply.circulating / supply.total) * 100).toFixed(1); + // Calculate to 2dp for accuracy, then display as 1 + const circulatingPercentage = percentage(supply.circulating, supply.total, 2).toFixed(1); let delinquentStakePercentage; if (delinquentStake && activeStake) { - delinquentStakePercentage = ((delinquentStake / activeStake) * 100).toFixed(1); + delinquentStakePercentage = percentage(delinquentStake, activeStake, 2).toFixed(1); } return ( @@ -107,11 +109,11 @@ function StakingComponent() {

Active Stake

- {activeStake && ( + {activeStake ? (

{displayLamports(activeStake)} / {displayLamports(supply.total)}

- )} + ) : null} {delinquentStakePercentage && (
Delinquent stake: {delinquentStakePercentage}% @@ -124,7 +126,7 @@ function StakingComponent() { ); } -function displayLamports(value: number) { +function displayLamports(value: number | bigint) { return abbreviatedNumber(lamportsToSol(value)); } @@ -149,8 +151,8 @@ function StatsCardBody() { const hourlySlotTime = Math.round(1000 * avgSlotTime_1h); const averageSlotTime = Math.round(1000 * avgSlotTime_1min); const { slotIndex, slotsInEpoch } = epochInfo; - const epochProgress = ((100 * slotIndex) / slotsInEpoch).toFixed(1) + '%'; - const epochTimeRemaining = slotsToHumanString(slotsInEpoch - slotIndex, hourlySlotTime); + const epochProgress = percentage(slotIndex, slotsInEpoch, 2).toFixed(1) + '%'; + const epochTimeRemaining = slotsToHumanString(Number(slotsInEpoch - slotIndex), hourlySlotTime); const { blockHeight, absoluteSlot } = epochInfo; return ( @@ -158,14 +160,14 @@ function StatsCardBody() { Slot - + {blockHeight !== undefined && ( Block height - + )} diff --git a/app/providers/accounts/vote-accounts.tsx b/app/providers/accounts/vote-accounts.tsx index ee9076af..618610c8 100644 --- a/app/providers/accounts/vote-accounts.tsx +++ b/app/providers/accounts/vote-accounts.tsx @@ -1,18 +1,34 @@ import { useCluster } from '@providers/cluster'; -import { Connection, VoteAccountStatus } from '@solana/web3.js'; import { Cluster } from '@utils/cluster'; import { reportError } from '@utils/sentry'; import React from 'react'; +import { createDefaultRpcTransport, createSolanaRpc } from 'web3js-experimental'; + +type VoteAccountInfo = Readonly<{ + activatedStake: bigint, +}>; + +type VoteAccounts = Readonly<{ + current: VoteAccountInfo[], + delinquent: VoteAccountInfo[], +}>; async function fetchVoteAccounts( cluster: Cluster, url: string, - setVoteAccounts: React.Dispatch> + setVoteAccounts: React.Dispatch> ) { try { - const connection = new Connection(url); - const result = await connection.getVoteAccounts(); - setVoteAccounts(result); + const transport = createDefaultRpcTransport({ url }); + const rpc = createSolanaRpc({ transport }); + + const voteAccountsResponse = await rpc.getVoteAccounts({ commitment: 'confirmed' }).send(); + const voteAccounts: VoteAccounts = { + current: voteAccountsResponse.current.map(c => ({ activatedStake: c.activatedStake })), + delinquent: voteAccountsResponse.delinquent.map(d => ({ activatedStake: d.activatedStake })), + } + + setVoteAccounts(voteAccounts); } catch (error) { if (cluster !== Cluster.Custom) { reportError(error, { url }); @@ -21,7 +37,7 @@ async function fetchVoteAccounts( } export function useVoteAccounts() { - const [voteAccounts, setVoteAccounts] = React.useState(); + const [voteAccounts, setVoteAccounts] = React.useState(); const { cluster, url } = useCluster(); return { diff --git a/app/providers/stats/solanaClusterStats.tsx b/app/providers/stats/solanaClusterStats.tsx index ae4abbca..57fd038d 100644 --- a/app/providers/stats/solanaClusterStats.tsx +++ b/app/providers/stats/solanaClusterStats.tsx @@ -1,14 +1,14 @@ 'use client'; import { useCluster } from '@providers/cluster'; -import { Connection } from '@solana/web3.js'; import { Cluster } from '@utils/cluster'; import { reportError } from '@utils/sentry'; import React from 'react'; import useTabVisibility from 'use-tab-visibility'; +import { createDefaultRpcTransport, createSolanaRpc } from 'web3js-experimental'; -import { DashboardInfo, DashboardInfoActionType, dashboardInfoReducer } from './solanaDashboardInfo'; -import { PerformanceInfo, PerformanceInfoActionType, performanceInfoReducer } from './solanaPerformanceInfo'; +import { DashboardInfo, DashboardInfoActionType, dashboardInfoReducer, EpochInfo } from './solanaDashboardInfo'; +import { PerformanceInfo, PerformanceInfoActionType, performanceInfoReducer, PerformanceSample } from './solanaPerformanceInfo'; export const PERF_UPDATE_SEC = 5; export const SAMPLE_HISTORY_HOURS = 6; @@ -33,18 +33,18 @@ const initialPerformanceInfo: PerformanceInfo = { short: [], }, status: ClusterStatsStatus.Loading, - transactionCount: 0, + transactionCount: BigInt(0), }; const initialDashboardInfo: DashboardInfo = { avgSlotTime_1h: 0, avgSlotTime_1min: 0, epochInfo: { - absoluteSlot: 0, - blockHeight: 0, - epoch: 0, - slotIndex: 0, - slotsInEpoch: 0, + absoluteSlot: BigInt(0), + blockHeight: BigInt(0), + epoch: BigInt(0), + slotIndex: BigInt(0), + slotsInEpoch: BigInt(0), }, status: ClusterStatsStatus.Loading, }; @@ -52,11 +52,11 @@ const initialDashboardInfo: DashboardInfo = { type SetActive = React.Dispatch>; const StatsProviderContext = React.createContext< | { - setActive: SetActive; - setTimedOut: () => void; - retry: () => void; - active: boolean; - } + setActive: SetActive; + setTimedOut: () => void; + retry: () => void; + active: boolean; + } | undefined >(undefined); @@ -68,14 +68,6 @@ const PerformanceContext = React.createContext(und type Props = { children: React.ReactNode }; -function getConnection(url: string): Connection | undefined { - try { - return new Connection(url); - } catch (error) { - /* empty */ - } -} - export function SolanaClusterStatsProvider({ children }: Props) { const { cluster, url } = useCluster(); const [active, setActive] = React.useState(false); @@ -85,19 +77,25 @@ export function SolanaClusterStatsProvider({ children }: Props) { React.useEffect(() => { if (!active || !isTabVisible || !url) return; - const connection = getConnection(url); + const transport = createDefaultRpcTransport({ url }); + const rpc = createSolanaRpc({ transport }); - if (!connection) return; - - let lastSlot: number | null = null; + let lastSlot: bigint | null = null; let stale = false; const getPerformanceSamples = async () => { try { - const samples = await connection.getRecentPerformanceSamples(60 * SAMPLE_HISTORY_HOURS); + const samplesResponse = await rpc.getRecentPerformanceSamples(60 * SAMPLE_HISTORY_HOURS).send(); + + const samples: PerformanceSample[] = samplesResponse.map(s => ({ + numSlots: s.numSlots, + numTransactions: s.numTransactions, + samplePeriodSecs: s.samplePeriodSecs, + })); + if (stale) { return; } - if (samples.length < 1) { + if (samplesResponse.length < 1) { // no samples to work with (node has no history). return; // we will allow for a timeout instead of throwing an error } @@ -131,7 +129,7 @@ export function SolanaClusterStatsProvider({ children }: Props) { const getTransactionCount = async () => { try { - const transactionCount = await connection.getTransactionCount(); + const transactionCount = await rpc.getTransactionCount({ commitment: 'confirmed' }).send(); if (stale) { return; } @@ -155,7 +153,16 @@ export function SolanaClusterStatsProvider({ children }: Props) { const getEpochInfo = async () => { try { - const epochInfo = await connection.getEpochInfo(); + const epochInfoResponse = await rpc.getEpochInfo().send(); + + const epochInfo: EpochInfo = { + absoluteSlot: epochInfoResponse.absoluteSlot, + blockHeight: epochInfoResponse.blockHeight, + epoch: epochInfoResponse.epoch, + slotIndex: epochInfoResponse.slotIndex, + slotsInEpoch: epochInfoResponse.slotsInEpoch, + } + if (stale) { return; } @@ -181,19 +188,18 @@ export function SolanaClusterStatsProvider({ children }: Props) { const getBlockTime = async () => { if (lastSlot) { try { - const blockTime = await connection.getBlockTime(lastSlot); + const blockTime = await rpc.getBlockTime(lastSlot).send(); + if (stale) { return; } - if (blockTime !== null) { - dispatchDashboardInfo({ - data: { - blockTime: blockTime * 1000, - slot: lastSlot, - }, - type: DashboardInfoActionType.SetLastBlockTime, - }); - } + dispatchDashboardInfo({ + data: { + blockTime: blockTime * 1000, + slot: lastSlot, + }, + type: DashboardInfoActionType.SetLastBlockTime, + }); } catch (error) { // let this fail gracefully } diff --git a/app/providers/stats/solanaDashboardInfo.tsx b/app/providers/stats/solanaDashboardInfo.tsx index d318e8db..2f77d5db 100644 --- a/app/providers/stats/solanaDashboardInfo.tsx +++ b/app/providers/stats/solanaDashboardInfo.tsx @@ -1,6 +1,5 @@ -import { EpochInfo, PerfSample } from '@solana/web3.js'; - import { ClusterStatsStatus } from './solanaClusterStats'; +import { PerformanceSample } from './solanaPerformanceInfo'; export type DashboardInfo = { status: ClusterStatsStatus; @@ -13,7 +12,7 @@ export type DashboardInfo = { export type BlockTimeInfo = { blockTime: number; - slot: number; + slot: bigint; }; export enum DashboardInfoActionType { @@ -24,9 +23,17 @@ export enum DashboardInfoActionType { Reset, } +export type EpochInfo = { + absoluteSlot: bigint, + blockHeight: bigint, + epoch: bigint, + slotIndex: bigint, + slotsInEpoch: bigint, +}; + export type DashboardInfoActionSetPerfSamples = { type: DashboardInfoActionType.SetPerfSamples; - data: PerfSample[]; + data: PerformanceSample[]; }; export type DashboardInfoActionSetEpochInfo = { @@ -74,10 +81,10 @@ export function dashboardInfoReducer(state: DashboardInfo, action: DashboardInfo const samples = action.data .filter(sample => { - return sample.numSlots !== 0; + return sample.numSlots !== BigInt(0); }) .map(sample => { - return sample.samplePeriodSecs / sample.numSlots; + return sample.samplePeriodSecs / Number(sample.numSlots); }) .slice(0, 60); @@ -87,7 +94,7 @@ export function dashboardInfoReducer(state: DashboardInfo, action: DashboardInfo return sum + cur; }, 0) / samplesInHour; - const status = state.epochInfo.absoluteSlot !== 0 ? ClusterStatsStatus.Ready : ClusterStatsStatus.Loading; + const status = state.epochInfo.absoluteSlot !== BigInt(0) ? ClusterStatsStatus.Ready : ClusterStatsStatus.Loading; return { ...state, @@ -109,8 +116,8 @@ export function dashboardInfoReducer(state: DashboardInfo, action: DashboardInfo action.data.absoluteSlot >= state.lastBlockTime.slot ) { blockTime = - state.lastBlockTime.blockTime + - (action.data.absoluteSlot - state.lastBlockTime.slot) * Math.floor(state.avgSlotTime_1h * 1000); + Number(BigInt(state.lastBlockTime.blockTime) + + (action.data.absoluteSlot - state.lastBlockTime.slot) * BigInt(Math.floor(state.avgSlotTime_1h * 1000))); } return { diff --git a/app/providers/stats/solanaPerformanceInfo.tsx b/app/providers/stats/solanaPerformanceInfo.tsx index 70837cab..3726b759 100644 --- a/app/providers/stats/solanaPerformanceInfo.tsx +++ b/app/providers/stats/solanaPerformanceInfo.tsx @@ -1,5 +1,3 @@ -import { PerfSample } from '@solana/web3.js'; - import { ClusterStatsStatus } from './solanaClusterStats'; export type PerformanceInfo = { @@ -11,7 +9,13 @@ export type PerformanceInfo = { medium: (number | null)[]; long: (number | null)[]; }; - transactionCount: number; + transactionCount: bigint; +}; + +export type PerformanceSample = { + numTransactions: bigint; + numSlots: bigint; + samplePeriodSecs: number; }; export enum PerformanceInfoActionType { @@ -23,12 +27,12 @@ export enum PerformanceInfoActionType { export type PerformanceInfoActionSetTransactionCount = { type: PerformanceInfoActionType.SetTransactionCount; - data: number; + data: bigint; }; export type PerformanceInfoActionSetPerfSamples = { type: PerformanceInfoActionType.SetPerfSamples; - data: PerfSample[]; + data: PerformanceSample[]; }; export type PerformanceInfoActionSetError = { @@ -56,10 +60,10 @@ export function performanceInfoReducer(state: PerformanceInfo, action: Performan const short = action.data .filter(sample => { - return sample.numTransactions !== 0; + return sample.numTransactions !== BigInt(0); }) .map(sample => { - return sample.numTransactions / sample.samplePeriodSecs; + return Number(sample.numTransactions / BigInt(sample.samplePeriodSecs)); }); const avgTps = short[0]; @@ -78,7 +82,7 @@ export function performanceInfoReducer(state: PerformanceInfo, action: Performan Math.max(...perfHistory.long) ); - const status = state.transactionCount !== 0 ? ClusterStatsStatus.Ready : ClusterStatsStatus.Loading; + const status = state.transactionCount !== BigInt(0) ? ClusterStatsStatus.Ready : ClusterStatsStatus.Loading; return { ...state, diff --git a/app/providers/supply.tsx b/app/providers/supply.tsx index e8077ab1..150dd358 100644 --- a/app/providers/supply.tsx +++ b/app/providers/supply.tsx @@ -1,10 +1,10 @@ 'use client'; import { useCluster } from '@providers/cluster'; -import { Connection, Supply } from '@solana/web3.js'; import { Cluster, ClusterStatus } from '@utils/cluster'; import { reportError } from '@utils/sentry'; import React from 'react'; +import { createDefaultRpcTransport, createSolanaRpc } from 'web3js-experimental'; export enum Status { Idle, @@ -12,6 +12,14 @@ export enum Status { Connecting, } +type Lamports = bigint; + +type Supply = Readonly<{ + circulating: Lamports, + nonCirculating: Lamports, + total: Lamports, +}>; + type State = Supply | Status | string; type Dispatch = React.Dispatch>; @@ -41,8 +49,15 @@ async function fetch(dispatch: Dispatch, cluster: Cluster, url: string) { dispatch(Status.Connecting); try { - const connection = new Connection(url, 'finalized'); - const supply = (await connection.getSupply({ excludeNonCirculatingAccountsList: true })).value; + const transport = createDefaultRpcTransport({ url }); + const rpc = createSolanaRpc({ transport }); + + const supplyResponse = await rpc.getSupply({ commitment: 'finalized', excludeNonCirculatingAccountsList: true }).send(); + const supply: Supply = { + circulating: supplyResponse.value.circulating, + nonCirculating: supplyResponse.value.nonCirculating, + total: supplyResponse.value.total, + }; // Update state if still connecting dispatch(state => { diff --git a/app/utils/__tests__/math-test.ts b/app/utils/__tests__/math-test.ts new file mode 100644 index 00000000..c1f39f45 --- /dev/null +++ b/app/utils/__tests__/math-test.ts @@ -0,0 +1,9 @@ +import { percentage } from '@utils/math'; + +describe('percentage', () => { + it('returns a number with the right decimals', () => { + expect(percentage(BigInt(1), BigInt(3), 0)).toEqual(33) + expect(percentage(BigInt(1), BigInt(3), 1)).toEqual(33.3) + expect(percentage(BigInt(1), BigInt(3), 2)).toEqual(33.33) + }); +}); diff --git a/app/utils/math.ts b/app/utils/math.ts new file mode 100644 index 00000000..8b578b14 --- /dev/null +++ b/app/utils/math.ts @@ -0,0 +1,10 @@ +/** + * Calculate a percentage using bigints, as numerator/denominator * 100 + * @returns the percentage, with the requested number of decimal places + */ +export function percentage(numerator: bigint, denominator: bigint, decimals: number): number { + // since bigint is integer, we need to multiply first to get decimals + // see https://stackoverflow.com/a/63095380/1375972 + const pow = 10 ** decimals; + return Number(numerator * BigInt(100 * pow) / denominator) / pow; +} diff --git a/package.json b/package.json index e6fc65df..84379201 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,8 @@ "tweetnacl": "^1.0.3", "typescript": "5.0.4", "use-async-effect": "^2.2.7", - "use-tab-visibility": "^1.0.9" + "use-tab-visibility": "^1.0.9", + "web3js-experimental": "npm:@solana/web3.js@2.0.0-experimental.b79b56f" }, "devDependencies": { "@solana/eslint-config-solana": "^1.0.1", @@ -98,4 +99,4 @@ "uuid": "^9.0.0" } } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19474503..4ba70fff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,7 +15,7 @@ dependencies: version: 3.6.7 '@bonfida/spl-name-service': specifier: 0.1.30 - version: 0.1.30(@solana/buffer-layout@3.0.0)(@solana/spl-token@0.1.8)(@solana/web3.js@1.66.0)(bn.js@5.2.1)(borsh@0.7.0) + version: 0.1.30(@solana/buffer-layout@3.0.0)(@solana/spl-token@0.1.8)(@solana/web3.js@2.0.0-experimental.b79b56f)(bn.js@5.2.1)(borsh@0.7.0) '@cloudflare/stream-react': specifier: ^1.2.0 version: 1.2.0(react@18.2.0) @@ -27,7 +27,7 @@ dependencies: version: 1.1.0 '@metaplex/js': specifier: ^4.12.0 - version: 4.12.0(@metaplex-foundation/mpl-auction@0.0.2)(@metaplex-foundation/mpl-core@0.0.2)(@metaplex-foundation/mpl-metaplex@0.0.5)(@metaplex-foundation/mpl-token-metadata@1.1.0)(@metaplex-foundation/mpl-token-vault@0.0.2)(@solana/spl-token@0.1.8)(@solana/web3.js@1.66.0) + version: 4.12.0(@metaplex-foundation/mpl-auction@0.0.2)(@metaplex-foundation/mpl-core@0.0.2)(@metaplex-foundation/mpl-metaplex@0.0.5)(@metaplex-foundation/mpl-token-metadata@1.1.0)(@metaplex-foundation/mpl-token-vault@0.0.2)(@solana/spl-token@0.1.8)(@solana/web3.js@2.0.0-experimental.b79b56f) '@project-serum/anchor': specifier: ^0.23.0 version: 0.23.0 @@ -51,7 +51,7 @@ dependencies: version: 3.0.0 '@solana/spl-account-compression': specifier: ^0.1.8 - version: 0.1.8(@solana/web3.js@1.66.0) + version: 0.1.8(@solana/web3.js@2.0.0-experimental.b79b56f) '@solana/spl-token': specifier: ^0.1.8 version: 0.1.8 @@ -148,6 +148,9 @@ dependencies: use-tab-visibility: specifier: ^1.0.9 version: 1.0.9(react@18.2.0) + web3js-experimental: + specifier: npm:@solana/web3.js@2.0.0-experimental.b79b56f + version: /@solana/web3.js@2.0.0-experimental.b79b56f devDependencies: '@solana/eslint-config-solana': @@ -553,7 +556,7 @@ packages: - utf-8-validate dev: false - /@bonfida/spl-name-service@0.1.30(@solana/buffer-layout@3.0.0)(@solana/spl-token@0.1.8)(@solana/web3.js@1.66.0)(bn.js@5.2.1)(borsh@0.7.0): + /@bonfida/spl-name-service@0.1.30(@solana/buffer-layout@3.0.0)(@solana/spl-token@0.1.8)(@solana/web3.js@2.0.0-experimental.b79b56f)(bn.js@5.2.1)(borsh@0.7.0): resolution: {integrity: sha512-0aSpymeNDq7rDSDEJgB6/qKyy3yUkHLQk7Jxwtmibfva3s1johEfFdl2kUDDPWi/ubgbxYjPxJRGrlGQNEmmQw==} peerDependencies: '@solana/buffer-layout': ^4.0.0 @@ -564,7 +567,7 @@ packages: dependencies: '@solana/buffer-layout': 3.0.0 '@solana/spl-token': 0.1.8 - '@solana/web3.js': 1.66.0 + '@solana/web3.js': 2.0.0-experimental.b79b56f bn.js: 5.2.1 borsh: 0.7.0 ethers: 5.7.2 @@ -1403,7 +1406,7 @@ packages: - utf-8-validate dev: false - /@metaplex/js@4.12.0(@metaplex-foundation/mpl-auction@0.0.2)(@metaplex-foundation/mpl-core@0.0.2)(@metaplex-foundation/mpl-metaplex@0.0.5)(@metaplex-foundation/mpl-token-metadata@1.1.0)(@metaplex-foundation/mpl-token-vault@0.0.2)(@solana/spl-token@0.1.8)(@solana/web3.js@1.66.0): + /@metaplex/js@4.12.0(@metaplex-foundation/mpl-auction@0.0.2)(@metaplex-foundation/mpl-core@0.0.2)(@metaplex-foundation/mpl-metaplex@0.0.5)(@metaplex-foundation/mpl-token-metadata@1.1.0)(@metaplex-foundation/mpl-token-vault@0.0.2)(@solana/spl-token@0.1.8)(@solana/web3.js@2.0.0-experimental.b79b56f): resolution: {integrity: sha512-rIUTMXo5gIXFIZt08AEHyqH4oVoLL2dMYiNePQluw9pydesRym4jDayJ5POxEmKmyc6KGqVKw/YWUIivmUY5zg==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: @@ -1421,7 +1424,7 @@ packages: '@metaplex-foundation/mpl-token-metadata': 1.1.0 '@metaplex-foundation/mpl-token-vault': 0.0.2 '@solana/spl-token': 0.1.8 - '@solana/web3.js': 1.66.0 + '@solana/web3.js': 2.0.0-experimental.b79b56f '@types/bs58': 4.0.1 axios: 0.25.0 bn.js: 5.2.1 @@ -1980,6 +1983,12 @@ packages: typescript: 5.0.4 dev: true + /@solana/keys@2.0.0-experimental.b79b56f: + resolution: {integrity: sha512-CQO4bbMkKX4DF6lMyw/8D6gSVD3Md60vKuK6cfxcE2h2vl0Je/MvHHjpTa6CAibRiAfrVAPeqqVcZviQUng58g==} + dependencies: + bs58: 5.0.0 + dev: false + /@solana/prettier-config-solana@0.0.2(prettier@2.8.8): resolution: {integrity: sha512-F/e2UIJwb30Y8QjR9nr/OrJiCc8yjMkiP9Ctk4VYg+8jODNP31dx6s9mn4sbMFVYA0Km5EPZLN2xsZacBy0y/A==} peerDependencies: @@ -1988,7 +1997,18 @@ packages: prettier: 2.8.8 dev: true - /@solana/spl-account-compression@0.1.8(@solana/web3.js@1.66.0): + /@solana/rpc-core@2.0.0-experimental.b79b56f: + resolution: {integrity: sha512-nZ/PFIpbmq3Y/+/QR3kMI99WCkMEiPdiZusnE+pb3BLgDcZ5SZpPf/yGytv6/MqvqwgT8oxwS/G6Z3XogeUzng==} + dependencies: + '@solana/keys': 2.0.0-experimental.b79b56f + bs58: 5.0.0 + dev: false + + /@solana/rpc-transport@2.0.0-experimental.b79b56f: + resolution: {integrity: sha512-CadExK4nr2COekDkHpeByOosY0hfJSUOb1gogX6N/4dHbShOEnRLVXUXQeSw6ochMtLkfxamuZU1I3p1rS/ObQ==} + dev: false + + /@solana/spl-account-compression@0.1.8(@solana/web3.js@2.0.0-experimental.b79b56f): resolution: {integrity: sha512-vsvsx358pVFPtyNd8zIZy0lezR0NuvOykQ29Zq+8oto+kHfTXMGXXQ1tKHUYke6XkINIWLFVg/jDi+1D9RYaqQ==} engines: {node: '>=16'} peerDependencies: @@ -1996,7 +2016,7 @@ packages: dependencies: '@metaplex-foundation/beet': 0.7.1 '@metaplex-foundation/beet-solana': 0.4.0 - '@solana/web3.js': 1.66.0 + '@solana/web3.js': 2.0.0-experimental.b79b56f bn.js: 5.2.1 borsh: 0.7.0 js-sha3: 0.8.0 @@ -2058,6 +2078,15 @@ packages: - utf-8-validate dev: false + /@solana/web3.js@2.0.0-experimental.b79b56f: + resolution: {integrity: sha512-f6wbWSSGGsBlwQ23jmBAG4ZOEzXcbXKpIceC+y2iTYnCKf+dLGco27RPPx6AjRNe8cgB5dxeY+rHiEWRWJPoxA==} + dependencies: + '@solana/keys': 2.0.0-experimental.b79b56f + '@solana/rpc-core': 2.0.0-experimental.b79b56f + '@solana/rpc-transport': 2.0.0-experimental.b79b56f + fast-stable-stringify: 1.0.0 + dev: false + /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: