From 65f3a9bc17d3b6b5111e037e20a75c32db539468 Mon Sep 17 00:00:00 2001 From: Alessandro <37877991+aledefra@users.noreply.github.com> Date: Wed, 17 Jun 2026 16:46:11 +0200 Subject: [PATCH 1/4] fix: handle oracle syncing state in explorer (#36) --- app/node/[nodeAddr]/page.tsx | 12 +-- app/playwright-preview/page.tsx | 80 +++++++++++++++++- .../LicensePageNodeCardWrapper.tsx | 5 +- .../LicensePageNodePerformanceCardWrapper.tsx | 5 +- .../Licenses/LicenseRewardsPoA.tsx | 20 +++-- .../Licenses/NodeSmallCard.tsx | 2 +- .../Nodes/NodeListGNDCard.tsx | 2 +- .../main-cards/LicenseCard.tsx | 2 +- app/server-components/main-cards/NodeCard.tsx | 84 +++++++++++-------- .../main-cards/NodePerformanceCard.tsx | 75 ++++++++++------- .../shared/SyncingOraclesTag.tsx | 12 +++ lib/actions.ts | 46 +++++++++- lib/api/oracles.ts | 17 +++- lib/oracles.ts | 44 ++++++++++ typedefs/blockchain.ts | 22 +++++ 15 files changed, 332 insertions(+), 96 deletions(-) create mode 100644 app/server-components/shared/SyncingOraclesTag.tsx create mode 100644 lib/oracles.ts diff --git a/app/node/[nodeAddr]/page.tsx b/app/node/[nodeAddr]/page.tsx index f173ce6..1934f68 100644 --- a/app/node/[nodeAddr]/page.tsx +++ b/app/node/[nodeAddr]/page.tsx @@ -55,7 +55,7 @@ export async function generateMetadata({ params }) { }, }; - let nodeResponse: types.OraclesAvailabilityResult & types.OraclesDefaultResult; + let nodeResponse: types.OraclesAvailabilityResult; try { ({ nodeResponse } = await fetchLicenseDetailsAndNodeAvailability(resolvedNodeEthAddr, config.environment)); @@ -80,10 +80,10 @@ const fetchLicenseDetailsAndNodeAvailability = async ( _environment: 'mainnet' | 'testnet' | 'devnet', ): Promise<{ license: types.License; - licenseId: bigint; - licenseType: 'ND' | 'MND' | 'GND'; - owner: types.EthAddress; - nodeResponse: types.OraclesAvailabilityResult & types.OraclesDefaultResult; + licenseId: bigint; + licenseType: 'ND' | 'MND' | 'GND'; + owner: types.EthAddress; + nodeResponse: types.OraclesAvailabilityResult; }> => { let nodeAddress: types.EthAddress, totalAssignedAmount: bigint, @@ -165,7 +165,7 @@ export default async function NodePage({ params }) { let licenseId: bigint; let licenseType: 'ND' | 'MND' | 'GND'; let owner: types.EthAddress; - let nodeResponse: types.OraclesAvailabilityResult & types.OraclesDefaultResult; + let nodeResponse: types.OraclesAvailabilityResult; try { ({ license, licenseId, licenseType, owner, nodeResponse } = await fetchLicenseDetailsAndNodeAvailability( diff --git a/app/playwright-preview/page.tsx b/app/playwright-preview/page.tsx index d5cdf66..66ebff6 100644 --- a/app/playwright-preview/page.tsx +++ b/app/playwright-preview/page.tsx @@ -1,3 +1,10 @@ +import LicenseRewardsPoA from '@/app/server-components/Licenses/LicenseRewardsPoA'; +import NodeCard from '@/app/server-components/main-cards/NodeCard'; +import NodePerformanceCard from '@/app/server-components/main-cards/NodePerformanceCard'; +import { BorderedCard } from '@/app/server-components/shared/cards/BorderedCard'; +import SyncingOraclesTag from '@/app/server-components/shared/SyncingOraclesTag'; +import { getEpochStartTimestamp } from '@/config'; +import * as types from '@/typedefs/blockchain'; import { notFound } from 'next/navigation'; /* @@ -13,9 +20,80 @@ export default function PlaywrightPreviewPage() { notFound(); } + const assignTimestamp = BigInt(Math.floor(getEpochStartTimestamp(1).getTime() / 1000)); + const nodeEthAddress = '0x1111111111111111111111111111111111111111' as types.EthAddress; + const ownerAddress = '0x2222222222222222222222222222222222222222' as types.EthAddress; + const nodeResponse = { + node: '0xai_mocked_preview_node_address_000000000000000000', + node_alias: 'Mock Syncing Node', + node_eth_address: nodeEthAddress, + epochs: [], + epochs_vals: [], + error: 'No epochs found for the given node', + eth_signed_data: { + input: [], + signature_field: '', + }, + eth_signatures: [], + eth_addresses: [], + node_is_online: true, + node_is_oracle: false, + node_version: 'ratio1-node|2.4.1|preview', + node_last_seen_sec: 76, + resources: { + cpu_cores: 16, + cpu_cores_avail: 12.5, + default_cuda: { + cpu: 0, + 'cuda:0': 0, + }, + disk_avail: 415.4, + disk_total: 512, + mem_avail: 48.3, + mem_total: 64, + }, + tags: ['preview', 'syncing'], + availability_status: 'syncing', + server_current_epoch: 10, + server_last_synced_epoch: 8, + } satisfies types.OraclesAvailabilityResult; + const license = { + nodeAddress: nodeEthAddress, + totalAssignedAmount: 1_000_000n * 10n ** 18n, + totalClaimedAmount: 125_000n * 10n ** 18n, + awbBalance: 0n, + lastClaimEpoch: 2n, + assignTimestamp, + lastClaimOracle: ownerAddress, + isBanned: false, + owner: ownerAddress, + r1PoaiRewards: 0n, + usdcPoaiRewards: 0n, + } satisfies types.License; + return (
-
+
+ +
+
Direct tag
+ +
+
+ + + + + +
PoA rewards
+ Promise.resolve(nodeResponse)} + /> +
+
); } diff --git a/app/server-components/LicensePage/LicensePageNodeCardWrapper.tsx b/app/server-components/LicensePage/LicensePageNodeCardWrapper.tsx index ec221d5..819e752 100644 --- a/app/server-components/LicensePage/LicensePageNodeCardWrapper.tsx +++ b/app/server-components/LicensePage/LicensePageNodeCardWrapper.tsx @@ -6,11 +6,10 @@ import { Alert } from '../shared/Alert'; export default async function LicensePageNodeCardWrapper({ cachedGetNodeAvailability, }: { - cachedGetNodeAvailability: () => Promise<(types.OraclesAvailabilityResult & types.OraclesDefaultResult) | undefined>; + cachedGetNodeAvailability: () => Promise; }) { try { - const nodeResponse: (types.OraclesAvailabilityResult & types.OraclesDefaultResult) | undefined = - await cachedGetNodeAvailability(); + const nodeResponse: types.OraclesAvailabilityResult | undefined = await cachedGetNodeAvailability(); if (!nodeResponse) { return null; diff --git a/app/server-components/LicensePage/LicensePageNodePerformanceCardWrapper.tsx b/app/server-components/LicensePage/LicensePageNodePerformanceCardWrapper.tsx index c24d5e4..71dc408 100644 --- a/app/server-components/LicensePage/LicensePageNodePerformanceCardWrapper.tsx +++ b/app/server-components/LicensePage/LicensePageNodePerformanceCardWrapper.tsx @@ -4,10 +4,9 @@ import NodePerformanceCard from '../main-cards/NodePerformanceCard'; export default async function LicensePageNodePerformanceCardWrapper({ cachedGetNodeAvailability, }: { - cachedGetNodeAvailability: () => Promise<(types.OraclesAvailabilityResult & types.OraclesDefaultResult) | undefined>; + cachedGetNodeAvailability: () => Promise; }) { - const nodeResponse: (types.OraclesAvailabilityResult & types.OraclesDefaultResult) | undefined = - await cachedGetNodeAvailability(); + const nodeResponse: types.OraclesAvailabilityResult | undefined = await cachedGetNodeAvailability(); if (!nodeResponse) { return null; diff --git a/app/server-components/Licenses/LicenseRewardsPoA.tsx b/app/server-components/Licenses/LicenseRewardsPoA.tsx index 8208695..21e5347 100644 --- a/app/server-components/Licenses/LicenseRewardsPoA.tsx +++ b/app/server-components/Licenses/LicenseRewardsPoA.tsx @@ -1,9 +1,11 @@ import { getLicenseFirstCheckEpoch } from '@/config'; +import { isOraclesSyncing } from '@/lib/oracles'; import { getLicenseRewardsBreakdown } from '@/lib/api/blockchain'; import * as types from '@/typedefs/blockchain'; import { formatUnits } from 'viem'; import { CardHorizontal } from '../shared/cards/CardHorizontal'; import { SmallTag } from '../shared/SmallTag'; +import SyncingOraclesTag from '../shared/SyncingOraclesTag'; export default async function LicenseRewardsPoA({ license, @@ -14,11 +16,10 @@ export default async function LicenseRewardsPoA({ license: types.License; licenseType: 'ND' | 'MND' | 'GND'; licenseId: string; - getNodeAvailability: () => Promise<(types.OraclesAvailabilityResult & types.OraclesDefaultResult) | undefined>; + getNodeAvailability: () => Promise; }) { try { - const nodeResponse: (types.OraclesAvailabilityResult & types.OraclesDefaultResult) | undefined = - await getNodeAvailability(); + const nodeResponse: types.OraclesAvailabilityResult | undefined = await getNodeAvailability(); if (!nodeResponse) { return null; @@ -36,6 +37,7 @@ export default async function LicenseRewardsPoA({ ); const rewards = rewardsBreakdown.claimableAmount; + const syncingOracles = isOraclesSyncing(nodeResponse); const showMndBreakdown = licenseType !== 'ND' && rewardsBreakdown.claimableAmount !== undefined && @@ -47,9 +49,15 @@ export default async function LicenseRewardsPoA({ value={
- {rewards === undefined - ? '...' - : parseFloat(Number(formatUnits(rewards ?? 0n, 18)).toFixed(2)).toLocaleString()} + {rewards === undefined ? ( + syncingOracles ? ( + + ) : ( + '...' + ) + ) : ( + parseFloat(Number(formatUnits(rewards ?? 0n, 18)).toFixed(2)).toLocaleString() + )} {!!rewards ? ' $R1' : ''}
diff --git a/app/server-components/Licenses/NodeSmallCard.tsx b/app/server-components/Licenses/NodeSmallCard.tsx index 7220e14..e0ea627 100644 --- a/app/server-components/Licenses/NodeSmallCard.tsx +++ b/app/server-components/Licenses/NodeSmallCard.tsx @@ -8,7 +8,7 @@ import clsx from 'clsx'; import Link from 'next/link'; export default async function NodeSmallCard({ nodeEthAddr }: { nodeEthAddr: types.EthAddress }) { - let nodeResponse: types.OraclesAvailabilityResult & types.OraclesDefaultResult; + let nodeResponse: types.OraclesAvailabilityResult; try { nodeResponse = await getNodeLastEpoch(nodeEthAddr); diff --git a/app/server-components/Nodes/NodeListGNDCard.tsx b/app/server-components/Nodes/NodeListGNDCard.tsx index 7e2f52a..cd75834 100644 --- a/app/server-components/Nodes/NodeListGNDCard.tsx +++ b/app/server-components/Nodes/NodeListGNDCard.tsx @@ -16,7 +16,7 @@ export default async function NodeListGNDCard() { Number(licenseId), )); - const nodeResponse: types.OraclesAvailabilityResult & types.OraclesDefaultResult = await getNodeLastEpoch(nodeAddress); + const nodeResponse: types.OraclesAvailabilityResult = await getNodeLastEpoch(nodeAddress); ratio1Addr = nodeResponse.node as types.R1Address; diff --git a/app/server-components/main-cards/LicenseCard.tsx b/app/server-components/main-cards/LicenseCard.tsx index d3b071d..747af3f 100644 --- a/app/server-components/main-cards/LicenseCard.tsx +++ b/app/server-components/main-cards/LicenseCard.tsx @@ -21,7 +21,7 @@ interface Props { licenseType: 'ND' | 'MND' | 'GND'; licenseId: string; owner: types.EthAddress; - getNodeAvailability: () => Promise<(types.OraclesAvailabilityResult & types.OraclesDefaultResult) | undefined>; + getNodeAvailability: () => Promise; hasLink?: boolean; // If it has a link to it, it means it's not the main card (displayed on top of the page) } diff --git a/app/server-components/main-cards/NodeCard.tsx b/app/server-components/main-cards/NodeCard.tsx index ecdfe7b..2cadd65 100644 --- a/app/server-components/main-cards/NodeCard.tsx +++ b/app/server-components/main-cards/NodeCard.tsx @@ -20,9 +20,13 @@ export default async function NodeCard({ nodeResponse, hasLink, }: { - nodeResponse: types.OraclesAvailabilityResult & types.OraclesDefaultResult; + nodeResponse: types.OraclesAvailabilityResult; hasLink?: boolean; // If it has a link to it, it means it's not the main card (displayed on top of the page) }) { + const nodeVersion = nodeResponse.node_version?.split('|')[0] ?? 'N/A'; + const fullNodeVersion = nodeResponse.node_version ? nodeResponse.node_version.replace(/\|(?=\S)/g, '| ') : 'N/A'; + const nodeResources = nodeResponse.resources; + const getTitle = () => Node • {nodeResponse.node_alias}; // Safe handling for tags - ensure it's an array or empty array @@ -131,11 +135,15 @@ export default async function NodeCard({ - {formatDistanceToNow(subSeconds(new Date(), nodeResponse.node_last_seen_sec), { - addSuffix: true, - })} -
+ typeof nodeResponse.node_last_seen_sec === 'number' ? ( +
+ {formatDistanceToNow(subSeconds(new Date(), nodeResponse.node_last_seen_sec), { + addSuffix: true, + })} +
+ ) : ( + 'N/A' + ) } isSmall isFlexible @@ -144,42 +152,46 @@ export default async function NodeCard({ - + {nodeResources && ( + <> + - - {fN(round(nodeResponse.resources.mem_avail, 2))}/ - {fN(round(nodeResponse.resources.mem_total, 2))} GB - - } - isFlexible - widthClasses="min-w-[312px]" - /> + + {fN(round(nodeResources.mem_avail, 2))}/{fN(round(nodeResources.mem_total, 2))}{' '} + GB + + } + isFlexible + widthClasses="min-w-[312px]" + /> - - {fN(round(nodeResponse.resources.disk_avail, 2))}/ - {fN(round(nodeResponse.resources.disk_total, 2))} GB - - } - isFlexible - widthClasses="min-w-[320px] md:max-w-[340px]" - /> + + {fN(round(nodeResources.disk_avail, 2))}/{fN(round(nodeResources.disk_total, 2))}{' '} + GB + + } + isFlexible + widthClasses="min-w-[320px] md:max-w-[340px]" + /> + + )} {nodeResponse.node_is_oracle && nodeR1Balance !== undefined && nodeEthBalance !== undefined && ( <> @@ -202,7 +214,7 @@ export default async function NodeCard({
- {nodeResponse.node_version.replace(/\|(?=\S)/g, '| ')} + {fullNodeVersion}
); diff --git a/app/server-components/main-cards/NodePerformanceCard.tsx b/app/server-components/main-cards/NodePerformanceCard.tsx index 1cba3d6..3bc3b67 100644 --- a/app/server-components/main-cards/NodePerformanceCard.tsx +++ b/app/server-components/main-cards/NodePerformanceCard.tsx @@ -1,4 +1,5 @@ import EpochsChart from '@/components/Nodes/EpochsChart'; +import { isOraclesSyncing } from '@/lib/oracles'; import { arrayAverage } from '@/lib/utils'; import * as types from '@/typedefs/blockchain'; import { Tooltip } from '@heroui/tooltip'; @@ -6,12 +7,31 @@ import clsx from 'clsx'; import { BorderedCard } from '../shared/cards/BorderedCard'; import { CardFlexible } from '../shared/cards/CardFlexible'; import { CardHorizontal } from '../shared/cards/CardHorizontal'; +import { SmallTag } from '../shared/SmallTag'; +import SyncingOraclesTag from '../shared/SyncingOraclesTag'; + +export default async function NodePerformanceCard({ nodeResponse }: { nodeResponse: types.OraclesAvailabilityResult }) { + const epochs = nodeResponse.epochs ?? []; + const epochsVals = nodeResponse.epochs_vals ?? []; + + const hasAvailabilityData = epochs.length > 0 && epochsVals.length > 0 && epochs.length === epochsVals.length; + const showSyncingTag = isOraclesSyncing(nodeResponse); + const lastTenEpochs = epochs.slice(-10).map((epoch, index) => ({ + epoch, + availability: epochsVals.slice(-10)[index], + })); + + if (showSyncingTag || !hasAvailabilityData) { + return ( + +
+
Node Performance
+ {showSyncingTag ? : No availability data} +
+
+ ); + } -export default async function NodePerformanceCard({ - nodeResponse, -}: { - nodeResponse: types.OraclesAvailabilityResult & types.OraclesDefaultResult; -}) { return (
Node Performance
@@ -19,7 +39,7 @@ export default async function NodePerformanceCard({
value > 0).length} + value={epochsVals.filter((value) => value > 0).length} isSmall isFlexible widthClasses="xs:min-w-[316px] min-w-[224px]" @@ -55,11 +75,9 @@ export default async function NodePerformanceCard({ value={
- {nodeResponse.epochs.slice(-10).map((epoch, index) => { - const availability = nodeResponse.epochs_vals.slice(-10)[index]; - + {lastTenEpochs.map(({ epoch, availability }) => { return ( -
+
@@ -86,9 +104,9 @@ export default async function NodePerformanceCard({
({ - Availability: (100 * value) / 255, - Epoch: nodeResponse.epochs[index], + data={lastTenEpochs.map(({ epoch, availability }) => ({ + Availability: (100 * availability) / 255, + Epoch: epoch, }))} />
@@ -105,23 +123,18 @@ export default async function NodePerformanceCard({
Last 10 Epochs Availability
- {nodeResponse.epochs - .slice(-10) - .reverse() - .map((epoch, index) => { - const availability = nodeResponse.epochs_vals.slice(-10)[index]; - - return ( -
-
-
Epoch {epoch}
-
- {parseFloat(((100 * availability) / 255).toFixed(2))}% -
+ {[...lastTenEpochs].reverse().map(({ epoch, availability }) => { + return ( +
+
+
Epoch {epoch}
+
+ {parseFloat(((100 * availability) / 255).toFixed(2))}%
- ); - })} +
+ ); + })}
diff --git a/app/server-components/shared/SyncingOraclesTag.tsx b/app/server-components/shared/SyncingOraclesTag.tsx new file mode 100644 index 0000000..a6b46a7 --- /dev/null +++ b/app/server-components/shared/SyncingOraclesTag.tsx @@ -0,0 +1,12 @@ +import { Spinner } from '@heroui/spinner'; + +export default function SyncingOraclesTag() { + return ( +
+
+ + Syncing oracles +
+
+ ); +} diff --git a/lib/actions.ts b/lib/actions.ts index 96c2de1..1bd6e76 100644 --- a/lib/actions.ts +++ b/lib/actions.ts @@ -7,6 +7,7 @@ import { SearchResult } from '@/typedefs/general'; import { headers } from 'next/headers'; import { getLicense } from './api/blockchain'; import { getNodeEpochsRange, getNodeLastEpoch } from './api/oracles'; +import { isNoEpochsResult, isOraclesBehind } from './oracles'; import { cachedGetENSName, internalNodeAddressToEthAddress, isNonZeroInteger, isZeroAddress } from './utils'; const URL_SAFE_PATTERN = /^[a-zA-Z0-9x\s\-_\.]+$/; @@ -22,14 +23,51 @@ export const getSSURL = async (value: string): Promise => { export const getNodeAvailability = async ( nodeEthAddr: types.EthAddress, assignTimestamp: bigint, -): Promise => { +): Promise => { const currentEpoch: number = getCurrentEpoch(); const firstCheckEpoch: number = getLicenseFirstCheckEpoch(assignTimestamp); + const expectedLastEpoch = currentEpoch - 1; // If the license was linked in the current or previous epoch - return currentEpoch - firstCheckEpoch <= 1 - ? await getNodeLastEpoch(nodeEthAddr) - : await getNodeEpochsRange(nodeEthAddr, firstCheckEpoch, currentEpoch - 1); + if (currentEpoch - firstCheckEpoch <= 1) { + const lastEpochResponse = await getNodeLastEpoch(nodeEthAddr); + + return { + ...lastEpochResponse, + availability_status: 'ok', + }; + } + + const epochsRangeResponse = await getNodeEpochsRange(nodeEthAddr, firstCheckEpoch, expectedLastEpoch); + + // Range endpoint can return a partial no-epochs payload, so use last epoch for node metadata. + if (isNoEpochsResult(epochsRangeResponse)) { + const lastEpochResponse = await getNodeLastEpoch(nodeEthAddr); + const availabilityStatus: types.OraclesAvailabilityStatus = isOraclesBehind(epochsRangeResponse, expectedLastEpoch) + ? 'syncing' + : 'no-data'; + + return { + ...lastEpochResponse, + ...epochsRangeResponse, + epochs: [], + epochs_vals: [], + availability_status: availabilityStatus, + }; + } + + const lastReturnedEpoch = epochsRangeResponse.epochs.at(-1); + const availabilityStatus: types.OraclesAvailabilityStatus = + lastReturnedEpoch === expectedLastEpoch + ? 'ok' + : isOraclesBehind(epochsRangeResponse, expectedLastEpoch) + ? 'syncing' + : 'no-data'; + + return { + ...epochsRangeResponse, + availability_status: availabilityStatus, + }; }; export const search = async ( diff --git a/lib/api/oracles.ts b/lib/api/oracles.ts index c90ba60..cddbfaa 100644 --- a/lib/api/oracles.ts +++ b/lib/api/oracles.ts @@ -1,6 +1,7 @@ 'use server'; import config from '@/config'; +import { hasNoEpochsFoundError } from '@/lib/oracles'; import * as types from '@/typedefs/blockchain'; const oraclesApiURL = config.oraclesUrl; @@ -9,10 +10,15 @@ export const getNodeLastEpoch = async (nodeEthAddr: types.EthAddress) => { return _doGet(`/node_last_epoch?eth_node_addr=${nodeEthAddr}`, oraclesApiURL); }; -export const getNodeEpochsRange = async (nodeEthAddr: types.EthAddress, startEpoch: number, endEpoch: number) => { - return _doGet( +export const getNodeEpochsRange = async ( + nodeEthAddr: types.EthAddress, + startEpoch: number, + endEpoch: number, +): Promise => { + return _doGet( `/node_epochs_range?eth_node_addr=${nodeEthAddr}&start_epoch=${startEpoch}&end_epoch=${endEpoch}`, oraclesApiURL, + { allowNoEpochsResult: true }, ); }; @@ -20,7 +26,7 @@ export const getCurrentEpochServer = async () => { return _doGet('/current_epoch', oraclesApiURL); }; -async function _doGet(endpoint: string, baseUrl: string) { +async function _doGet(endpoint: string, baseUrl: string, options?: { allowNoEpochsResult?: boolean }) { const response = await fetch(`${baseUrl}${endpoint}`, { next: { revalidate: 60 }, }); @@ -45,6 +51,11 @@ async function _doGet(endpoint: string, baseUrl: string) { } if ('error' in data.result) { + if (options?.allowNoEpochsResult && hasNoEpochsFoundError(data.result.error)) { + return data.result as T; + } + + console.log(endpoint, data.result); throw new Error(data.result.error); } diff --git a/lib/oracles.ts b/lib/oracles.ts new file mode 100644 index 0000000..9af25df --- /dev/null +++ b/lib/oracles.ts @@ -0,0 +1,44 @@ +import * as types from '@/typedefs/blockchain'; + +const NO_EPOCHS_FOUND_ERROR = 'No epochs found for the given node'; + +type OraclesSyncStatus = Partial & { + server_current_epoch?: number; + server_last_synced_epoch?: number; + error?: string; + availability_status?: types.OraclesAvailabilityStatus; +}; + +export const hasNoEpochsFoundError = (errorMessage?: string): boolean => + !!errorMessage && errorMessage.includes(NO_EPOCHS_FOUND_ERROR); + +export const isNoEpochsResult = ( + status?: Partial | Partial, +): status is types.OraclesNoEpochsResult => !!status?.error && hasNoEpochsFoundError(status.error); + +export const isOraclesSyncing = (status?: OraclesSyncStatus): boolean => { + if (!status) { + return false; + } + + if (status.availability_status) { + return status.availability_status === 'syncing'; + } + + return isOraclesBehind(status); +}; + +export const isOraclesBehind = (status?: OraclesSyncStatus, expectedLastEpoch?: number): boolean => { + if (!status || typeof status.server_last_synced_epoch !== 'number') { + return false; + } + + const expectedEpoch = + typeof expectedLastEpoch === 'number' + ? expectedLastEpoch + : typeof status.server_current_epoch === 'number' + ? status.server_current_epoch - 1 + : undefined; + + return typeof expectedEpoch === 'number' && status.server_last_synced_epoch < expectedEpoch; +}; diff --git a/typedefs/blockchain.ts b/typedefs/blockchain.ts index 56af800..d027d6b 100644 --- a/typedefs/blockchain.ts +++ b/typedefs/blockchain.ts @@ -63,6 +63,8 @@ type OraclesAvailabilityResult = { node_eth_address: EthAddress; epochs: number[]; epochs_vals: number[]; + error?: string; + availability_status?: OraclesAvailabilityStatus; eth_signed_data: EthSignedData; eth_signatures: EthAddress[]; eth_addresses: EthAddress[]; @@ -72,8 +74,25 @@ type OraclesAvailabilityResult = { node_last_seen_sec: number; resources: Resources; tags?: string[]; + server_current_epoch?: number; + server_last_synced_epoch?: number; }; +type OraclesNoEpochsResult = { + error: string; + epochs?: number[]; + epochs_vals?: number[]; + node?: string; + node_alias?: string; + node_eth_address?: EthAddress; + node_is_online?: boolean; + node_is_oracle?: boolean; + server_current_epoch?: number; + server_last_synced_epoch?: number; +}; + +type OraclesAvailabilityStatus = 'ok' | 'syncing' | 'no-data'; + type EthSignedData = { input: string[]; signature_field: string; @@ -118,6 +137,7 @@ type ServerInfo = { server_version: string; server_time: string; server_current_epoch: number; + server_last_synced_epoch?: number; server_uptime: string; }; @@ -207,8 +227,10 @@ export type { NodeLicenseDetailsResponse, NodeState, OraclesAvailabilityResult, + OraclesAvailabilityStatus, OraclesCountryStatsResult, OraclesDefaultResult, + OraclesNoEpochsResult, R1Address, Resources, ServerInfo, From a416608568d643ada6a23a120819c1a9c0ac2615 Mon Sep 17 00:00:00 2001 From: Alessandro Date: Fri, 19 Jun 2026 11:40:10 +0200 Subject: [PATCH 2/4] fix: use unkown for countries without code --- components/charts/NodesMap.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/charts/NodesMap.tsx b/components/charts/NodesMap.tsx index c37193c..df43c27 100644 --- a/components/charts/NodesMap.tsx +++ b/components/charts/NodesMap.tsx @@ -185,7 +185,7 @@ function Entry({ country }: { country: CountryNodeStats }) {
- {countryCodeToName(country.code)} + {countryCodeToName(country.code) ?? country.code}
From ade1c0ee38abdbc1b3bdf625382a9dd4b5a4b082 Mon Sep 17 00:00:00 2001 From: Alessandro <37877991+aledefra@users.noreply.github.com> Date: Thu, 23 Jul 2026 12:16:53 +0200 Subject: [PATCH 3/4] fix(node-operators): replace Moralis holder lookup (#46) --- .github/workflows/build_devnet.yml | 1 - .github/workflows/build_testnet_mainnet.yml | 2 - .github/workflows/release.yml | 1 - Dockerfile_devnet | 2 - Dockerfile_mainnet | 2 - Dockerfile_testnet | 2 - app/api/license-holders/route.ts | 30 - app/node-operators/page.tsx | 26 +- lib/api/blockchain.ts | 81 +- package-lock.json | 1524 +------------------ package.json | 1 - 11 files changed, 81 insertions(+), 1591 deletions(-) delete mode 100644 app/api/license-holders/route.ts diff --git a/.github/workflows/build_devnet.yml b/.github/workflows/build_devnet.yml index 4d72300..6446888 100644 --- a/.github/workflows/build_devnet.yml +++ b/.github/workflows/build_devnet.yml @@ -35,7 +35,6 @@ jobs: push: true platforms: linux/amd64 build-args: | - MORALIS_API_KEY=${{ secrets.MORALIS_API_KEY }} ALCHEMY_API_KEY=${{ secrets.ALCHEMY_API_KEY }} NEXT_PUBLIC_COMMIT_HASH=${{ github.sha }} tags: | diff --git a/.github/workflows/build_testnet_mainnet.yml b/.github/workflows/build_testnet_mainnet.yml index e5079ca..aa98091 100644 --- a/.github/workflows/build_testnet_mainnet.yml +++ b/.github/workflows/build_testnet_mainnet.yml @@ -57,7 +57,6 @@ jobs: push: true platforms: linux/amd64 build-args: | - MORALIS_API_KEY=${{ secrets.MORALIS_API_KEY }} ALCHEMY_API_KEY=${{ secrets.ALCHEMY_API_KEY }} NEXT_PUBLIC_APP_VERSION=${{ needs.generate-version.outputs.version }} tags: | @@ -72,7 +71,6 @@ jobs: push: true platforms: linux/amd64 build-args: | - MORALIS_API_KEY=${{ secrets.MORALIS_API_KEY }} ALCHEMY_API_KEY=${{ secrets.ALCHEMY_API_KEY }} NEXT_PUBLIC_APP_VERSION=${{ needs.generate-version.outputs.version }} tags: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ef603c8..406854e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -74,7 +74,6 @@ jobs: run: npm run build:${{ matrix.network }} env: NODE_ENV: production - MORALIS_API_KEY: ${{ secrets.MORALIS_API_KEY }} ALCHEMY_API_KEY: ${{ secrets.ALCHEMY_API_KEY }} NEXT_PUBLIC_APP_VERSION: ${{ needs.generate-version.outputs.version }} diff --git a/Dockerfile_devnet b/Dockerfile_devnet index 6703a54..f65a560 100644 --- a/Dockerfile_devnet +++ b/Dockerfile_devnet @@ -2,7 +2,6 @@ FROM node:18-alpine AS builder WORKDIR /app -ARG MORALIS_API_KEY ARG ALCHEMY_API_KEY ARG NEXT_PUBLIC_COMMIT_HASH @@ -13,7 +12,6 @@ COPY . . ENV NODE_ENV=production \ NEXT_TELEMETRY_DISABLED=1 \ - MORALIS_API_KEY=$MORALIS_API_KEY \ ALCHEMY_API_KEY=$ALCHEMY_API_KEY \ NEXT_PUBLIC_COMMIT_HASH=$NEXT_PUBLIC_COMMIT_HASH diff --git a/Dockerfile_mainnet b/Dockerfile_mainnet index 2a69221..d539e27 100644 --- a/Dockerfile_mainnet +++ b/Dockerfile_mainnet @@ -2,7 +2,6 @@ FROM node:18-alpine AS builder WORKDIR /app -ARG MORALIS_API_KEY ARG ALCHEMY_API_KEY ARG NEXT_PUBLIC_APP_VERSION @@ -13,7 +12,6 @@ COPY . . ENV NODE_ENV=production \ NEXT_TELEMETRY_DISABLED=1 \ - MORALIS_API_KEY=$MORALIS_API_KEY \ ALCHEMY_API_KEY=$ALCHEMY_API_KEY \ NEXT_PUBLIC_APP_VERSION=$NEXT_PUBLIC_APP_VERSION diff --git a/Dockerfile_testnet b/Dockerfile_testnet index aaeca30..6aaf7b8 100644 --- a/Dockerfile_testnet +++ b/Dockerfile_testnet @@ -2,7 +2,6 @@ FROM node:18-alpine AS builder WORKDIR /app -ARG MORALIS_API_KEY ARG ALCHEMY_API_KEY ARG NEXT_PUBLIC_APP_VERSION @@ -13,7 +12,6 @@ COPY . . ENV NODE_ENV=production \ NEXT_TELEMETRY_DISABLED=1 \ - MORALIS_API_KEY=$MORALIS_API_KEY \ ALCHEMY_API_KEY=$ALCHEMY_API_KEY \ NEXT_PUBLIC_APP_VERSION=$NEXT_PUBLIC_APP_VERSION diff --git a/app/api/license-holders/route.ts b/app/api/license-holders/route.ts deleted file mode 100644 index 8662bf4..0000000 --- a/app/api/license-holders/route.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { getLicenseHolders } from '@/lib/api/blockchain'; -import * as types from '@/typedefs/blockchain'; -import { NextResponse } from 'next/server'; - -export const dynamic = 'force-dynamic'; // Ensure API route is not cached - -export async function GET() { - try { - const [ndHolders, mndHolders] = await Promise.all([getLicenseHolders('ND'), getLicenseHolders('MND')]); - - const response = { - ndHolders: ndHolders - .filter((holder) => !!holder.ownerOf) - .map((holder) => ({ - ethAddress: holder.ownerOf as unknown as types.EthAddress, - licenseId: typeof holder.tokenId === 'string' ? parseInt(holder.tokenId, 10) : holder.tokenId, - })), - mndHolders: mndHolders - .filter((holder) => !!holder.ownerOf) - .map((holder) => ({ - ethAddress: holder.ownerOf as unknown as types.EthAddress, - licenseId: typeof holder.tokenId === 'string' ? parseInt(holder.tokenId, 10) : holder.tokenId, - })), - }; - return NextResponse.json(response, { status: 200 }); - } catch (error) { - console.log(error); - return NextResponse.json({ error: 'Internal server error' }, { status: 500 }); - } -} diff --git a/app/node-operators/page.tsx b/app/node-operators/page.tsx index 6c7518d..a7e5a40 100644 --- a/app/node-operators/page.tsx +++ b/app/node-operators/page.tsx @@ -1,8 +1,8 @@ import ErrorComponent from '@/app/server-components/shared/ErrorComponent'; -import config from '@/config'; -import { getSSURL } from '@/lib/actions'; +import { getAllLicenseHolders } from '@/lib/api/blockchain'; import * as types from '@/typedefs/blockchain'; import { LicenseItem } from '@/typedefs/general'; +import { unstable_cache } from 'next/cache'; import List from '../server-components/NodeOperators/List'; import { BorderedCard } from '../server-components/shared/cards/BorderedCard'; import { CardHorizontal } from '../server-components/shared/cards/CardHorizontal'; @@ -23,25 +23,7 @@ export async function generateMetadata({ searchParams }: { searchParams?: Promis }; } -const fetchLicenseHolders = async (environment: 'mainnet' | 'testnet' | 'devnet') => { - const url = await getSSURL(`license-holders?env=${environment}`); - - const res = await fetch(url, { - next: { revalidate: 300 }, // Cache for 5 minutes - }); - - const data: { - ndHolders: { - ethAddress: types.EthAddress; - licenseId: number; - }[]; - mndHolders: { - ethAddress: types.EthAddress; - licenseId: number; - }[]; - } = await res.json(); - return data; -}; +const getCachedLicenseHolders = unstable_cache(getAllLicenseHolders, ['license-holders'], { revalidate: 300 }); export default async function NodeOperatorsPage(props: { searchParams?: Promise<{ @@ -70,7 +52,7 @@ export default async function NodeOperatorsPage(props: { }[]; try { - ({ ndHolders, mndHolders } = await fetchLicenseHolders(config.environment)); + ({ ndHolders, mndHolders } = await getCachedLicenseHolders()); ndHolders.forEach((holder) => { if (!holders[holder.ethAddress]) { diff --git a/lib/api/blockchain.ts b/lib/api/blockchain.ts index d101ab5..118fa89 100644 --- a/lib/api/blockchain.ts +++ b/lib/api/blockchain.ts @@ -10,8 +10,6 @@ import * as types from '@/typedefs/blockchain'; import { LicenseListItem } from '@/typedefs/general'; import console from 'console'; import { differenceInSeconds } from 'date-fns'; -import Moralis from 'moralis'; -import { EvmAddress, EvmChain } from 'moralis/common-evm-utils'; import { unstable_cache } from 'next/cache'; import type { ReadContractReturnType } from 'viem'; import { isZeroAddress } from '../utils'; @@ -24,16 +22,6 @@ export type LicenseRewardsBreakdown = { withheldAmount?: bigint; }; -async function startMoralis() { - await Moralis.start({ - apiKey: process.env.MORALIS_API_KEY, - }); - - console.log('Moralis started'); -} - -startMoralis(); - const getMndLicenseExtraData = async ( publicClient: Awaited>, licenseId: bigint, @@ -471,35 +459,58 @@ export async function getLicensesPage( }; } -export async function getLicenseHolders(licenseType: 'ND' | 'MND' | 'GND'): Promise< - { - ownerOf: EvmAddress | undefined; - tokenId: string | number; - }[] -> { - const address = licenseType === 'ND' ? config.ndContractAddress : config.mndContractAddress; - const evmChain: EvmChain = config.environment === 'mainnet' ? EvmChain.BASE : EvmChain.BASE_SEPOLIA; - - const holders: { - ownerOf: EvmAddress | undefined; - tokenId: string | number; +const LICENSE_HOLDERS_BATCH_SIZE = 50; + +export async function getAllLicenseHolders(): Promise<{ + ndHolders: { + ethAddress: types.EthAddress; + licenseId: number; + }[]; + mndHolders: { + ethAddress: types.EthAddress; + licenseId: number; + }[]; +}> { + const ndHolders: { + ethAddress: types.EthAddress; + licenseId: number; }[] = []; - let cursor: string | undefined = undefined; + const mndHolders: { + ethAddress: types.EthAddress; + licenseId: number; + }[] = []; + + let offset = 0; + let totalLicenses = 0; do { - const response = await Moralis.EvmApi.nft.getNFTOwners({ - chain: evmChain, - format: 'decimal', - cursor, - address, - limit: 100, + const page = await getLicensesPage(offset, LICENSE_HOLDERS_BATCH_SIZE); + totalLicenses = Number(page.mndTotalSupply + page.ndTotalSupply); + + if (page.licenses.length === 0 && offset < totalLicenses) { + throw new Error(`Reader returned an empty licenses page at offset ${offset} of ${totalLicenses}`); + } + + page.licenses.forEach((license) => { + const holder = { + ethAddress: license.owner, + licenseId: license.licenseId, + }; + + if (license.licenseType === 'ND') { + ndHolders.push(holder); + } else { + mndHolders.push(holder); + } }); - holders.push(...response.result); - cursor = response.pagination.cursor; - } while (!!cursor); + offset += page.licenses.length; + } while (offset < totalLicenses); - return holders; + return { + ndHolders, + mndHolders, + }; } export async function fetchR1MintedLastEpoch() { diff --git a/package-lock.json b/package-lock.json index a2e9360..4c96acd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,6 @@ "lodash": "4.17.23", "mapbox-gl": "^3.15.0", "maplibre-gl": "^5.7.1", - "moralis": "^2.27.2", "next": "15.5.10", "qs": "^6.14.1", "react": "19.2.4", @@ -272,517 +271,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", - "license": "MPL-2.0", - "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@ethereumjs/util/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", - "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/hash": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", - "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/networks": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/transactions": "^5.8.0", - "@ethersproject/web": "^5.8.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", - "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", - "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/rlp": "^5.8.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", - "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", - "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bytes": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", - "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", - "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", - "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/address": "^5.8.0", - "@ethersproject/base64": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", - "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", - "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT" - }, - "node_modules/@ethersproject/networks": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", - "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", - "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", - "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", - "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", - "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "bn.js": "^5.2.1", - "elliptic": "6.6.1", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", - "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", - "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/rlp": "^5.8.0", - "@ethersproject/signing-key": "^5.8.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", - "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/base64": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" - } - }, "node_modules/@formatjs/ecma402-abstract": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz", @@ -3008,159 +2496,6 @@ "supercluster": "^8.0.1" } }, - "node_modules/@moralisweb3/api-utils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/api-utils/-/api-utils-2.27.2.tgz", - "integrity": "sha512-Z1Ipe+bJZqQcL3p6vtlB8Ih5ne0UJJpXutv4Qg/OGym+YrQpBNCummEQWSAMt6874IQDqNcCJzeBEpcipkzQ+Q==", - "license": "MIT", - "dependencies": { - "@moralisweb3/common-core": "^2.27.2", - "@moralisweb3/common-evm-utils": "^2.27.2", - "axios": "^1.2.1" - } - }, - "node_modules/@moralisweb3/aptos-api": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/aptos-api/-/aptos-api-2.27.2.tgz", - "integrity": "sha512-x/dUZhlp4ocMfRTLXcLRXdBHx62l8WCNPOWCSSg5Z10WngU1REgL2WTnZPQ2ic+13re3Iv2x1YhZW098xkw0vA==", - "license": "MIT", - "dependencies": { - "@moralisweb3/api-utils": "^2.27.2", - "@moralisweb3/common-aptos-utils": "^2.27.2", - "@moralisweb3/common-core": "^2.27.2" - } - }, - "node_modules/@moralisweb3/auth": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/auth/-/auth-2.27.2.tgz", - "integrity": "sha512-q3f0AQo7RCgTtxnAvj66yoj8cBCe/Rz7AfXM4M3+irEmCjs9f+94E/e410qAztGAI2VSQIq/3gGNheJ+nviYCQ==", - "license": "MIT", - "dependencies": { - "@moralisweb3/api-utils": "^2.27.2", - "@moralisweb3/common-aptos-utils": "^2.27.2", - "@moralisweb3/common-auth-utils": "^2.27.2", - "@moralisweb3/common-core": "^2.27.2", - "@moralisweb3/common-evm-utils": "^2.27.2", - "@moralisweb3/common-sol-utils": "^2.27.2" - } - }, - "node_modules/@moralisweb3/common-aptos-utils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/common-aptos-utils/-/common-aptos-utils-2.27.2.tgz", - "integrity": "sha512-Th0+9nOV+rQnT39d9rXu24ff+LDtKzGuk8WzRIYAdpIo0Yv7jrWsqkJL2DwZ5vrkNOcNLabktTrLjZEXRCHw3A==", - "license": "MIT", - "dependencies": { - "@moralisweb3/common-core": "^2.27.2", - "@noble/hashes": "^1.2.0" - } - }, - "node_modules/@moralisweb3/common-auth-utils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/common-auth-utils/-/common-auth-utils-2.27.2.tgz", - "integrity": "sha512-h35RkVNT+sD7C1PbSi/LwfjNdq7CyhhBShSrImXpl9Fs66jFVzronbiKFe9HOxJjn8tIz9ajxKQU46aJC2ZaHA==", - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@moralisweb3/common-aptos-utils": "^2.27.2", - "@moralisweb3/common-core": "^2.27.2", - "@moralisweb3/common-evm-utils": "^2.27.2", - "@moralisweb3/common-sol-utils": "^2.27.2", - "@moralisweb3/streams-typings": "^1.0.6" - } - }, - "node_modules/@moralisweb3/common-core": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/common-core/-/common-core-2.27.2.tgz", - "integrity": "sha512-/rGs2kdK/f41LizpfWTMfkyO5zFkbiOrn6wxpCTXzrzGequ+D5fWSCeYvA9BEH/XVH0aYR89eVYtQgxs5Zd0Dg==", - "license": "MIT", - "dependencies": { - "axios": "^1.2.1" - } - }, - "node_modules/@moralisweb3/common-evm-utils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/common-evm-utils/-/common-evm-utils-2.27.2.tgz", - "integrity": "sha512-VGhS6f2+PRUqokl3sgp6yVDxbpTPvGdhcITiPxuym6eKWhHbHkp10eS9SR0LRmR1oog6p5HS1fSkGjl0aLr6Dg==", - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@moralisweb3/common-core": "^2.27.2" - } - }, - "node_modules/@moralisweb3/common-sol-utils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/common-sol-utils/-/common-sol-utils-2.27.2.tgz", - "integrity": "sha512-MzIFxFLtz9a8SVTvfh/WS1f7fBENtxAzpF3xiXI3SBKuoZExnR/ah8pKzY4DVL8FpswoFzVsO+yVBmToxc0aSw==", - "license": "MIT", - "dependencies": { - "@moralisweb3/common-core": "^2.27.2", - "bn.js": "^5.2.1", - "bs58": "^5.0.0", - "buffer": "^6.0.3" - } - }, - "node_modules/@moralisweb3/common-streams-utils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/common-streams-utils/-/common-streams-utils-2.27.2.tgz", - "integrity": "sha512-4bYUONJB5vpTnc045iSFlVIOgh/2HoEuNFj3jOzLRj/WD/H4SIeua1x1I33Z8sjTATvRKYJYuXxI1JrgAtNFtA==", - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@moralisweb3/common-aptos-utils": "^2.27.2", - "@moralisweb3/common-core": "^2.27.2", - "@moralisweb3/common-evm-utils": "^2.27.2", - "@moralisweb3/streams-typings": "^1.0.7" - } - }, - "node_modules/@moralisweb3/evm-api": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/evm-api/-/evm-api-2.27.2.tgz", - "integrity": "sha512-CLT5bAZQdBkgmz/LydavrpVAKe0aAY1pjafihgyV2nh520rQ3ZSzMHJN2ptGotPJ6ryYXAJgzWXIS4IC0dY4Tw==", - "license": "MIT", - "dependencies": { - "@moralisweb3/api-utils": "^2.27.2", - "@moralisweb3/common-core": "^2.27.2", - "@moralisweb3/common-evm-utils": "^2.27.2" - } - }, - "node_modules/@moralisweb3/sol-api": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/sol-api/-/sol-api-2.27.2.tgz", - "integrity": "sha512-mlm0RrcDdpgRCIxMenmJ/4CLDbvrJ/26g5Fl7m5oaVT6Lug1KERksTlSYp2PxPqlHme+AU0AfvOiln5A1MorEA==", - "license": "MIT", - "dependencies": { - "@moralisweb3/api-utils": "^2.27.2", - "@moralisweb3/common-core": "^2.27.2", - "@moralisweb3/common-sol-utils": "^2.27.2" - } - }, - "node_modules/@moralisweb3/streams": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@moralisweb3/streams/-/streams-2.27.2.tgz", - "integrity": "sha512-I/y8D/VZGHPA9GM5Tkpa8uNLu3z2q3sBV9r2dzSKy7QX7p5iNTGey+FAfczC9yM+jWo2eDCJK4Il8UTRmUrk8g==", - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@moralisweb3/api-utils": "^2.27.2", - "@moralisweb3/common-core": "^2.27.2", - "@moralisweb3/common-evm-utils": "^2.27.2", - "@moralisweb3/common-streams-utils": "^2.27.2", - "@moralisweb3/streams-typings": "^1.0.7", - "ethereumjs-util": "^7.1.0", - "web3-eth-abi": "^1.8.0" - } - }, - "node_modules/@moralisweb3/streams-typings": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@moralisweb3/streams-typings/-/streams-typings-1.0.7.tgz", - "integrity": "sha512-ShbVqil0KLOTyTjO6z9JewPcVVE3S6kzkQFnW2flGBRsGdKucpkUdOx1HijOLoaikz/9gH92n+lzTvRFIj0AoA==", - "license": "ISC" - }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -4622,15 +3957,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/d3-array": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", @@ -4747,6 +4073,7 @@ "version": "20.19.28", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.28.tgz", "integrity": "sha512-VyKBr25BuFDzBFCK5sUM6ZXiWfqgCTwTAOK8qzGV/m9FCirXYDlmczJ+d5dXBAQALGCdRRdbteKYfJ84NGEusw==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -4765,15 +4092,6 @@ "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", "license": "MIT" }, - "node_modules/@types/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -4801,15 +4119,6 @@ "@types/react": "^19.2.0" } }, - "node_modules/@types/secp256k1": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.7.tgz", - "integrity": "sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/supercluster": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", @@ -5739,6 +5048,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -5788,32 +5098,6 @@ "dev": true, "license": "MIT" }, - "node_modules/base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -5826,18 +5110,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "license": "MIT" - }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -5861,94 +5133,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "license": "MIT", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/bs58check/node_modules/base-x": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", - "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bs58check/node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "license": "MIT" - }, "node_modules/bytewise": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", @@ -5972,6 +5156,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -6113,20 +5298,6 @@ "node": ">= 6" } }, - "node_modules/cipher-base": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", - "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -6235,39 +5406,6 @@ "dev": true, "license": "MIT" }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -6555,6 +5693,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -6705,27 +5844,6 @@ "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", "license": "ISC" }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "license": "MIT" - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -7349,90 +6467,12 @@ "integrity": "sha512-ED+noMZ6z7RrzzhvrQna1L30C27MX+ZsdB5c/d5vygXtHjEyAQjQS2TgCYhPxs+z3U+u2YQsL9PiRkNl1f+ugg==", "license": "MIT" }, - "node_modules/ethereum-bloom-filters": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz", - "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.4.0" - } - }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "license": "MIT", - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "license": "MIT" - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -7610,6 +6650,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -7931,6 +6972,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -7958,95 +7000,28 @@ "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", - "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/hash-base/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/hash-base/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/hasown": { @@ -8061,43 +7036,12 @@ "node": ">= 0.4" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "license": "MIT" }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -8135,12 +7079,6 @@ "node": ">=0.8.19" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -8280,6 +7218,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8404,16 +7343,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "license": "MIT", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -8562,6 +7491,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -8623,6 +7553,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -8683,12 +7614,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "license": "MIT" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8770,21 +7695,6 @@ "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", "license": "ISC" }, - "node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8992,17 +7902,6 @@ "node": ">= 0.4" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9012,12 +7911,6 @@ "node": ">= 8" } }, - "node_modules/micro-ftch": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "license": "MIT" - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9052,18 +7945,6 @@ "node": ">= 0.6" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9086,27 +7967,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/moralis": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/moralis/-/moralis-2.27.2.tgz", - "integrity": "sha512-SVPJDVRgqUEkLxC8R/QlBHOtAxvUBzK4b/w1oBW9m9oJigywhgNQMKLfu9eJZ3lMxvnVOMBUD+hzw47I4dEg7g==", - "license": "MIT", - "dependencies": { - "@moralisweb3/api-utils": "^2.27.2", - "@moralisweb3/aptos-api": "^2.27.2", - "@moralisweb3/auth": "^2.27.2", - "@moralisweb3/common-aptos-utils": "^2.27.2", - "@moralisweb3/common-auth-utils": "^2.27.2", - "@moralisweb3/common-core": "^2.27.2", - "@moralisweb3/common-evm-utils": "^2.27.2", - "@moralisweb3/common-sol-utils": "^2.27.2", - "@moralisweb3/common-streams-utils": "^2.27.2", - "@moralisweb3/evm-api": "^2.27.2", - "@moralisweb3/sol-api": "^2.27.2", - "@moralisweb3/streams": "^2.27.2", - "@moralisweb3/streams-typings": "^1.0.7" - } - }, "node_modules/motion-dom": { "version": "12.24.11", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.24.11.tgz", @@ -9285,23 +8145,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "license": "MIT" - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9311,26 +8154,6 @@ "node": ">=0.10.0" } }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "license": "MIT", - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "license": "MIT" - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -9625,23 +8448,6 @@ "pbf": "bin/pbf" } }, - "node_modules/pbkdf2": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", - "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", - "license": "MIT", - "dependencies": { - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ripemd160": "^2.0.3", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.12", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -9682,6 +8488,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9962,12 +8769,6 @@ } } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -10042,15 +8843,6 @@ "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", "license": "ISC" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", @@ -10168,20 +8960,6 @@ "pify": "^2.3.0" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -10335,31 +9113,6 @@ "node": ">=0.10.0" } }, - "node_modules/ripemd160": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", - "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, "node_modules/robust-predicates": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", @@ -10415,26 +9168,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -10485,33 +9218,6 @@ "compute-scroll-into-view": "^3.0.2" } }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "license": "MIT" - }, - "node_modules/secp256k1": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", - "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "elliptic": "^6.5.7", - "node-addon-api": "^5.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/secp256k1/node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "license": "MIT" - }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -10529,6 +9235,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -10600,32 +9307,6 @@ "node": ">=0.10.0" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/sharp": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", @@ -10909,15 +9590,6 @@ "node": ">= 0.4" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -11041,19 +9713,6 @@ "node": ">=4" } }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "license": "MIT", - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -11334,20 +9993,6 @@ "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", "license": "ISC" }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11424,6 +10069,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -11549,6 +10195,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, "node_modules/union-value": { @@ -11656,12 +10303,6 @@ } } }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "license": "MIT" - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -11720,110 +10361,6 @@ } } }, - "node_modules/web3-eth-abi": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.4.tgz", - "integrity": "sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==", - "license": "LGPL-3.0", - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", - "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/util": "^8.1.0", - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereum-cryptography": "^2.1.2", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/web3-utils/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/web3-utils/node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/web3-utils/node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/web3-utils/node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/web3-utils/node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, "node_modules/webpack-bundle-analyzer": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", @@ -11968,6 +10505,7 @@ "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", diff --git a/package.json b/package.json index dd560b8..6123536 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ "lodash": "4.17.23", "mapbox-gl": "^3.15.0", "maplibre-gl": "^5.7.1", - "moralis": "^2.27.2", "next": "15.5.10", "qs": "^6.14.1", "react": "19.2.4", From 611b6efeceb25de268c727b8bf14dad13f1917e6 Mon Sep 17 00:00:00 2001 From: Alessandro Date: Thu, 23 Jul 2026 12:29:39 +0200 Subject: [PATCH 4/4] fix(node-operators): preserve reader license types --- app/node-operators/page.tsx | 6 ++++-- lib/api/blockchain.ts | 21 ++++++++++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/app/node-operators/page.tsx b/app/node-operators/page.tsx index a7e5a40..23907c7 100644 --- a/app/node-operators/page.tsx +++ b/app/node-operators/page.tsx @@ -36,10 +36,12 @@ export default async function NodeOperatorsPage(props: { let ndHolders: { ethAddress: types.EthAddress; licenseId: number; + licenseType: 'ND'; }[], mndHolders: { ethAddress: types.EthAddress; licenseId: number; + licenseType: 'MND' | 'GND'; }[]; const holders: { @@ -58,7 +60,7 @@ export default async function NodeOperatorsPage(props: { if (!holders[holder.ethAddress]) { holders[holder.ethAddress] = []; } - holders[holder.ethAddress].push({ licenseId: holder.licenseId, licenseType: 'ND' }); + holders[holder.ethAddress].push({ licenseId: holder.licenseId, licenseType: holder.licenseType }); }); mndHolders.forEach((holder) => { @@ -67,7 +69,7 @@ export default async function NodeOperatorsPage(props: { } holders[holder.ethAddress].push({ licenseId: holder.licenseId, - licenseType: holder.licenseId === 1 ? 'GND' : 'MND', + licenseType: holder.licenseType, }); }); diff --git a/lib/api/blockchain.ts b/lib/api/blockchain.ts index 118fa89..e9c71a2 100644 --- a/lib/api/blockchain.ts +++ b/lib/api/blockchain.ts @@ -465,19 +465,23 @@ export async function getAllLicenseHolders(): Promise<{ ndHolders: { ethAddress: types.EthAddress; licenseId: number; + licenseType: 'ND'; }[]; mndHolders: { ethAddress: types.EthAddress; licenseId: number; + licenseType: 'MND' | 'GND'; }[]; }> { const ndHolders: { ethAddress: types.EthAddress; licenseId: number; + licenseType: 'ND'; }[] = []; const mndHolders: { ethAddress: types.EthAddress; licenseId: number; + licenseType: 'MND' | 'GND'; }[] = []; let offset = 0; @@ -492,15 +496,18 @@ export async function getAllLicenseHolders(): Promise<{ } page.licenses.forEach((license) => { - const holder = { - ethAddress: license.owner, - licenseId: license.licenseId, - }; - if (license.licenseType === 'ND') { - ndHolders.push(holder); + ndHolders.push({ + ethAddress: license.owner, + licenseId: license.licenseId, + licenseType: license.licenseType, + }); } else { - mndHolders.push(holder); + mndHolders.push({ + ethAddress: license.owner, + licenseId: license.licenseId, + licenseType: license.licenseType, + }); } });