Skip to content

Commit 7d92a8d

Browse files
committed
Merge branch 'add-x402-template' of github.com:tomi204/builders-hub into add-x402-template
2 parents 7d0a14c + 7b2b8d2 commit 7d92a8d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+3389
-529
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ content/docs/tooling/cli-commands.mdx
222222
# Generated OpenAPI specs (fetched during build)
223223
public/openapi/glacier.json
224224
public/openapi/popsicle.json
225+
public/openapi/speakeasy.yaml
225226

226227
# Generated OpenAPI documentation (auto-generated during build)
227228
content/docs/api-reference/data-api/**/*.mdx

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"cSpell.words": ["ICTT", "interchain", "Teleporter"]
3+
}

app/(home)/stats/l1/[[...slug]]/page.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,7 @@ import { notFound } from "next/navigation";
22
import ChainMetricsPage from "@/components/stats/ChainMetricsPage";
33
import l1ChainsData from "@/constants/l1-chains.json";
44
import { Metadata } from "next";
5-
6-
interface L1Chain {
7-
chainId: string;
8-
chainName: string;
9-
chainLogoURI: string;
10-
subnetId: string;
11-
slug: string;
12-
color?: string;
13-
}
5+
import { L1Chain } from "@/types/stats";
146

157
export async function generateMetadata({
168
params,
@@ -70,6 +62,7 @@ export default async function L1Metrics({
7062
chainName={currentChain.chainName}
7163
description={`Real-time insights into ${currentChain.chainName} L1 activity and network usage`}
7264
themeColor={currentChain.color || "#E57373"}
65+
chainLogoURI={currentChain.chainLogoURI}
7366
/>
7467
);
7568
}

app/(home)/stats/overview/page.tsx

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ import {
1717
} from "lucide-react";
1818
import { StatsBubbleNav } from "@/components/stats/stats-bubble.config";
1919
import l1ChainsData from "@/constants/l1-chains.json";
20-
import { TimeSeriesMetric, ICMMetric, TimeRange } from "@/types/stats";
20+
import { TimeSeriesMetric, ICMMetric, TimeRange, L1Chain } from "@/types/stats";
2121
import { AvalancheLogo } from "@/components/navigation/avalanche-logo";
2222
import { ChartSkeletonLoader } from "@/components/ui/chart-skeleton";
23+
import { ExplorerDropdown } from "@/components/stats/ExplorerDropdown";
2324

2425
interface ChainOverviewMetrics {
2526
chainId: string;
@@ -527,7 +528,7 @@ export default function AvalancheMetrics() {
527528
<table className="w-full border-collapse">
528529
<thead className="bg-[#fcfcfd] dark:bg-neutral-900">
529530
<tr className="border-b border-neutral-200 dark:border-neutral-800">
530-
<th className="border-r border-neutral-200 dark:border-neutral-800 px-6 py-4 text-left">
531+
<th className="border-r border-neutral-200 dark:border-neutral-800 px-4 py-2 text-left">
531532
<div className="flex items-center gap-2">
532533
<SortButton field="chainName">
533534
<span className="text-sm font-semibold uppercase tracking-wide text-neutral-700 dark:text-neutral-300">
@@ -536,7 +537,7 @@ export default function AvalancheMetrics() {
536537
</SortButton>
537538
</div>
538539
</th>
539-
<th className="border-r border-neutral-200 dark:border-neutral-800 px-6 py-4 text-left">
540+
<th className="border-r border-neutral-200 dark:border-neutral-800 px-4 py-2 text-left">
540541
<div className="flex items-center gap-2">
541542
<SortButton field="weeklyActiveAddresses">
542543
<span className="hidden lg:flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-neutral-700 dark:text-neutral-300">
@@ -548,7 +549,7 @@ export default function AvalancheMetrics() {
548549
</SortButton>
549550
</div>
550551
</th>
551-
<th className="border-r border-neutral-200 dark:border-neutral-800 px-6 py-4 text-left">
552+
<th className="border-r border-neutral-200 dark:border-neutral-800 px-4 py-2 text-left">
552553
<div className="flex items-center gap-2">
553554
<SortButton field="weeklyTxCount">
554555
<span className="hidden lg:flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-neutral-700 dark:text-neutral-300">
@@ -560,7 +561,7 @@ export default function AvalancheMetrics() {
560561
</SortButton>
561562
</div>
562563
</th>
563-
<th className="border-r border-neutral-200 dark:border-neutral-800 px-6 py-4 text-left">
564+
<th className="border-r border-neutral-200 dark:border-neutral-800 px-4 py-2 text-left">
564565
<div className="flex items-center gap-2">
565566
<SortButton field="totalIcmMessages">
566567
<span className="hidden lg:flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-neutral-700 dark:text-neutral-300">
@@ -572,7 +573,7 @@ export default function AvalancheMetrics() {
572573
</SortButton>
573574
</div>
574575
</th>
575-
<th className="border-r border-neutral-200 dark:border-neutral-800 px-6 py-4 text-left">
576+
<th className="border-r border-neutral-200 dark:border-neutral-800 px-4 py-2 text-left">
576577
<div className="flex items-center gap-2">
577578
<SortButton field="validatorCount">
578579
<span className="hidden lg:flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-neutral-700 dark:text-neutral-300">
@@ -581,7 +582,7 @@ export default function AvalancheMetrics() {
581582
</SortButton>
582583
</div>
583584
</th>
584-
<th className="border-r border-neutral-200 dark:border-neutral-800 px-6 py-4 text-left">
585+
<th className="border-r border-neutral-200 dark:border-neutral-800 px-4 py-2 text-left">
585586
<div className="flex items-center gap-2">
586587
<SortButton field="throughput">
587588
<span className="text-sm font-semibold uppercase tracking-wide text-neutral-700 dark:text-neutral-300">
@@ -590,7 +591,7 @@ export default function AvalancheMetrics() {
590591
</SortButton>
591592
</div>
592593
</th>
593-
<th className="px-6 py-4 text-left">
594+
<th className="border-r border-neutral-200 dark:border-neutral-800 px-4 py-2 text-left">
594595
<div className="flex items-center gap-2">
595596
<SortButton field="category">
596597
<span className="text-sm font-semibold uppercase tracking-wide text-neutral-700 dark:text-neutral-300">
@@ -599,6 +600,13 @@ export default function AvalancheMetrics() {
599600
</SortButton>
600601
</div>
601602
</th>
603+
<th className="px-4 py-2 text-center">
604+
<div className="flex items-center justify-center gap-2">
605+
<span className="text-sm font-semibold uppercase tracking-wide text-neutral-700 dark:text-neutral-300 whitespace-nowrap">
606+
Block Explorer
607+
</span>
608+
</div>
609+
</th>
602610
</tr>
603611
</thead>
604612
<tbody className="bg-white dark:bg-neutral-950">
@@ -619,7 +627,7 @@ export default function AvalancheMetrics() {
619627
}
620628
}}
621629
>
622-
<td className="border-r border-slate-100 dark:border-neutral-800 px-6 py-4">
630+
<td className="border-r border-slate-100 dark:border-neutral-800 px-4 py-2">
623631
<div className="flex items-center gap-3 group">
624632
<div className="relative">
625633
{chain.chainLogoURI ? (
@@ -654,7 +662,7 @@ export default function AvalancheMetrics() {
654662
)}
655663
</div>
656664
</td>
657-
<td className="border-r border-slate-100 dark:border-neutral-800 px-6 py-4">
665+
<td className="border-r border-slate-100 dark:border-neutral-800 px-4 py-2">
658666
<span className="text-sm font-medium text-neutral-900 dark:text-neutral-100">
659667
{typeof chain.activeAddresses.current_value ===
660668
"number"
@@ -664,7 +672,7 @@ export default function AvalancheMetrics() {
664672
: chain.activeAddresses.current_value}
665673
</span>
666674
</td>
667-
<td className="border-r border-slate-100 dark:border-neutral-800 px-6 py-4">
675+
<td className="border-r border-slate-100 dark:border-neutral-800 px-4 py-2">
668676
<span className="text-sm font-medium text-neutral-900 dark:text-neutral-100">
669677
{typeof chain.txCount.current_value === "number"
670678
? formatFullNumber(
@@ -673,7 +681,7 @@ export default function AvalancheMetrics() {
673681
: chain.txCount.current_value}
674682
</span>
675683
</td>
676-
<td className="border-r border-slate-100 dark:border-neutral-800 px-6 py-4">
684+
<td className="border-r border-slate-100 dark:border-neutral-800 px-4 py-2">
677685
<span className="text-sm font-medium text-neutral-900 dark:text-neutral-100">
678686
{typeof chain.icmMessages.current_value === "number"
679687
? formatFullNumber(
@@ -684,19 +692,19 @@ export default function AvalancheMetrics() {
684692
: chain.icmMessages.current_value}
685693
</span>
686694
</td>
687-
<td className="border-r border-slate-100 dark:border-neutral-800 px-6 py-4">
695+
<td className="border-r border-slate-100 dark:border-neutral-800 px-4 py-2">
688696
<span className="text-sm font-medium text-neutral-900 dark:text-neutral-100">
689697
{typeof chain.validatorCount === "number"
690698
? formatFullNumber(chain.validatorCount)
691699
: chain.validatorCount}
692700
</span>
693701
</td>
694-
<td className="border-r border-slate-100 dark:border-neutral-800 px-6 py-4">
702+
<td className="border-r border-slate-100 dark:border-neutral-800 px-4 py-2">
695703
<span className="text-sm font-medium text-neutral-900 dark:text-neutral-100">
696704
{getChainTPS(chain)} TPS
697705
</span>
698706
</td>
699-
<td className="px-6 py-4">
707+
<td className="border-r border-slate-100 dark:border-neutral-800 px-4 py-2">
700708
<span
701709
className={`inline-flex items-center px-3 py-1 rounded-full text-xs font-medium ${getCategoryColor(
702710
getChainCategory(chain.chainId, chain.chainName)
@@ -705,6 +713,21 @@ export default function AvalancheMetrics() {
705713
{getChainCategory(chain.chainId, chain.chainName)}
706714
</span>
707715
</td>
716+
<td className="px-4 py-2">
717+
<div className="flex items-center justify-center">
718+
<ExplorerDropdown
719+
explorers={
720+
(l1ChainsData.find(
721+
(c) => c.chainId === chain.chainId
722+
) as L1Chain)?.explorers
723+
}
724+
size="sm"
725+
variant="outline"
726+
showIcon={true}
727+
buttonText="Open"
728+
/>
729+
</div>
730+
</td>
708731
</tr>
709732
);
710733
})}

app/api/chain-stats/[chainId]/route.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ interface ChainMetrics {
1111
txCount: TimeSeriesMetric;
1212
cumulativeTxCount: TimeSeriesMetric;
1313
cumulativeContracts: TimeSeriesMetric;
14+
contracts: TimeSeriesMetric;
15+
deployers: TimeSeriesMetric;
1416
gasUsed: TimeSeriesMetric;
1517
avgGps: TimeSeriesMetric;
1618
maxGps: TimeSeriesMetric;
@@ -185,6 +187,8 @@ export async function GET(
185187
txCountData,
186188
cumulativeTxCountData,
187189
cumulativeContractsData,
190+
contractsData,
191+
deployersData,
188192
gasUsedData,
189193
avgGpsData,
190194
maxGpsData,
@@ -202,6 +206,8 @@ export async function GET(
202206
getTimeSeriesData('txCount', chainId, timeRange, pageSize, fetchAllPages),
203207
getTimeSeriesData('cumulativeTxCount', chainId, timeRange, pageSize, fetchAllPages),
204208
getTimeSeriesData('cumulativeContracts', chainId, timeRange, pageSize, fetchAllPages),
209+
getTimeSeriesData('contracts', chainId, timeRange, pageSize, fetchAllPages),
210+
getTimeSeriesData('deployers', chainId, timeRange, pageSize, fetchAllPages),
205211
getTimeSeriesData('gasUsed', chainId, timeRange, pageSize, fetchAllPages),
206212
getTimeSeriesData('avgGps', chainId, timeRange, pageSize, fetchAllPages),
207213
getTimeSeriesData('maxGps', chainId, timeRange, pageSize, fetchAllPages),
@@ -221,6 +227,8 @@ export async function GET(
221227
txCount: createTimeSeriesMetric(txCountData),
222228
cumulativeTxCount: createTimeSeriesMetric(cumulativeTxCountData),
223229
cumulativeContracts: createTimeSeriesMetric(cumulativeContractsData),
230+
contracts: createTimeSeriesMetric(contractsData),
231+
deployers: createTimeSeriesMetric(deployersData),
224232
gasUsed: createTimeSeriesMetric(gasUsedData),
225233
avgGps: createTimeSeriesMetric(avgGpsData),
226234
maxGps: createTimeSeriesMetric(maxGpsData),

app/blog/layout.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Footer } from '@/components/navigation/footer';
55
import { baseOptions } from '@/app/layout.config';
66
import { SessionProvider } from 'next-auth/react';
77
import { LayoutWrapper } from '@/app/layout-wrapper.client';
8+
import { NavbarDropdownInjector } from '@/components/navigation/navbar-dropdown-injector';
89

910
export default function Layout({
1011
children,
@@ -14,6 +15,7 @@ export default function Layout({
1415
return (
1516
<SessionProvider>
1617
<LayoutWrapper baseOptions={baseOptions}>
18+
<NavbarDropdownInjector />
1719
{children}
1820
<Footer />
1921
</LayoutWrapper>

app/docs/[...slug]/page.tsx

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import { APIStorageManager } from "@/components/content-design/api-storage-manager";
21
import Mermaid from "@/components/content-design/mermaid";
32
import { AutoTypeTable } from "@/components/content-design/type-table";
43
import YouTube from "@/components/content-design/youtube";
54
import { BackToTop } from "@/components/ui/back-to-top";
65
import { Feedback } from "@/components/ui/feedback";
76
import { SidebarActions } from "@/components/ui/sidebar-actions";
8-
import { cChainApi, dataApi, metricsApi, pChainApi } from "@/lib/openapi";
7+
import { CChainAPIPage, DataAPIPage, MetricsAPIPage, PChainAPIPage, XChainAPIPage } from "@/components/api/api-pages";
98
import { documentation } from "@/lib/source";
109
import { createMetadata } from "@/utils/metadata";
11-
import { APIPage } from "fumadocs-openapi/ui";
1210
import { Popup, PopupContent, PopupTrigger } from "fumadocs-twoslash/ui";
1311
import { Accordion, Accordions } from "fumadocs-ui/components/accordion";
1412
import { Callout } from "fumadocs-ui/components/callout";
@@ -127,29 +125,19 @@ export default async function Page(props: {
127125
const isMetricsApi = document.includes('popsicle.json');
128126
const isPChainApi = document.includes('platformvm.yaml');
129127
const isCChainApi = document.includes('coreth.yaml');
128+
const isXChainApi = document.includes('xchain.yaml');
130129

131-
let apiInstance;
132-
let storageKey;
133130
if (isPChainApi) {
134-
apiInstance = pChainApi;
135-
storageKey = 'apiBaseUrl-pchain';
131+
return <PChainAPIPage {...props} />;
136132
} else if (isCChainApi) {
137-
apiInstance = cChainApi;
138-
storageKey = 'apiBaseUrl-cchain';
133+
return <CChainAPIPage {...props} />;
134+
} else if (isXChainApi) {
135+
return <XChainAPIPage {...props} />;
139136
} else if (isMetricsApi) {
140-
apiInstance = metricsApi;
141-
storageKey = 'apiBaseUrl-metrics';
137+
return <MetricsAPIPage {...props} />;
142138
} else {
143-
apiInstance = dataApi;
144-
storageKey = 'apiBaseUrl-data';
139+
return <DataAPIPage {...props} />;
145140
}
146-
147-
return (
148-
<>
149-
<APIStorageManager storageKey={storageKey} />
150-
<APIPage {...apiInstance.getAPIPageProps(props)} />
151-
</>
152-
);
153141
},
154142
blockquote: Callout as unknown as FC<ComponentProps<"blockquote">>,
155143
}}

app/global.css

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,3 +1208,33 @@ body[data-hide-sidebar-dropdown] #nd-sidebar-mobile button:has(> div > p.text-sm
12081208
margin-top: 0 !important;
12091209
}
12101210

1211+
/* API Playground Send button customization - make it blue (All APIs) */
1212+
.pchain-api-playground form.not-prose button[type="submit"].bg-fd-primary,
1213+
.cchain-api-playground form.not-prose button[type="submit"].bg-fd-primary,
1214+
.xchain-api-playground form.not-prose button[type="submit"].bg-fd-primary,
1215+
.data-api-playground form.not-prose button[type="submit"].bg-fd-primary,
1216+
.metrics-api-playground form.not-prose button[type="submit"].bg-fd-primary,
1217+
.webhooks-api-playground form.not-prose button[type="submit"].bg-fd-primary {
1218+
background-color: #3b82f6 !important; /* Blue-500 */
1219+
color: white !important;
1220+
}
1221+
1222+
.pchain-api-playground form.not-prose button[type="submit"].bg-fd-primary:hover,
1223+
.cchain-api-playground form.not-prose button[type="submit"].bg-fd-primary:hover,
1224+
.xchain-api-playground form.not-prose button[type="submit"].bg-fd-primary:hover,
1225+
.data-api-playground form.not-prose button[type="submit"].bg-fd-primary:hover,
1226+
.metrics-api-playground form.not-prose button[type="submit"].bg-fd-primary:hover,
1227+
.webhooks-api-playground form.not-prose button[type="submit"].bg-fd-primary:hover {
1228+
background-color: #2563eb !important; /* Blue-600 on hover */
1229+
}
1230+
1231+
.pchain-api-playground form.not-prose button[type="submit"].bg-fd-primary:disabled,
1232+
.cchain-api-playground form.not-prose button[type="submit"].bg-fd-primary:disabled,
1233+
.xchain-api-playground form.not-prose button[type="submit"].bg-fd-primary:disabled,
1234+
.data-api-playground form.not-prose button[type="submit"].bg-fd-primary:disabled,
1235+
.metrics-api-playground form.not-prose button[type="submit"].bg-fd-primary:disabled,
1236+
.webhooks-api-playground form.not-prose button[type="submit"].bg-fd-primary:disabled {
1237+
background-color: #93c5fd !important; /* Blue-300 when disabled */
1238+
opacity: 0.5;
1239+
}
1240+

0 commit comments

Comments
 (0)