-
Notifications
You must be signed in to change notification settings - Fork 567
Dashboard: File organization changes #7788
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
|
WalkthroughThis change set primarily reorganizes and updates import paths throughout the codebase to use more specific, absolute, or alias-based module paths, reflecting a modular restructuring. It introduces a new contract verification API, centralizes the favorite chains logic into a reusable hook, and refactors types and UI components for contract import and deployment. Several obsolete files and functions are removed, and minor component renaming is performed for consistency. Changes
Sequence Diagram(s)sequenceDiagram
participant UI
participant useFavoriteChainIds
participant apiServerProxy
participant Server
UI->>useFavoriteChainIds: Call hook
useFavoriteChainIds->>apiServerProxy: GET /v1/chains/favorites
apiServerProxy->>Server: Forward request
Server-->>apiServerProxy: Respond with favorite chain IDs
apiServerProxy-->>useFavoriteChainIds: Return data
useFavoriteChainIds-->>UI: Provide favorite chain IDs
sequenceDiagram
participant UI
participant verifyContract (API)
participant RemoteAPI
UI->>verifyContract: Call with contract info
verifyContract->>RemoteAPI: POST /verify/contract (with chainId, address)
RemoteAPI-->>verifyContract: Respond with verification result
verifyContract-->>UI: Return result or log error
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested reviewers
Warning Review ran into problems🔥 ProblemsErrors were encountered while retrieving linked issues. Errors (1)
✨ Finishing Touches
🧪 Generate unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #7788 +/- ##
=======================================
Coverage 56.34% 56.34%
=======================================
Files 905 905
Lines 58788 58788
Branches 4142 4142
=======================================
Hits 33127 33127
Misses 25556 25556
Partials 105 105
🚀 New features to boost your workflow:
|
size-limit report 📦
|
91ade0b
to
0aac9a8
Compare
fb751b1
to
ce41797
Compare
ce41797
to
4d63d24
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 51
🔭 Outside diff range comments (34)
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/marketplace-table.tsx (1)
1-9
: Missing'use client'
directive for a hook-based componentThe file uses
useState
,useMemo
, and other browser-only hooks, so it must start with the'use client';
pragma per the dashboard client-component rules. Without it, Next.js will treat this as a Server Component, causing runtime errors once hooks are executed.+'use client'; + import type { UseQueryResult } from "@tanstack/react-query";apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/factory-fieldset.tsx (1)
1-4
: Add the"use client"
directiveThis component consumes React hooks (
useFormContext
,useState
viaTabButtons
callbacks), so it must be a client component. Per the dashboard coding rules, every client component must start with the string literal'use client';
before the first import.+'use client'; import type { Abi } from "abitype"; import type { Dispatch, SetStateAction } from "react"; import { useFormContext } from "react-hook-form"; import type { ThirdwebClient } from "thirdweb";
apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/landing-fieldset.tsx (1)
1-3
: Insert"use client"
Hooks (
useState
,useFormContext
) are used extensively, so this must be marked as a client component.+'use client'; import { compare, validate } from "compare-versions"; import { useState } from "react"; import { useFormContext } from "react-hook-form";
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-delete-partner.ts (2)
1-7
: Mark hook as client-sideThe hook consumes React-Query and therefore must start with
'use client';
.+'use client'; import { type UseMutationOptions, useMutation, useQueryClient, } from "@tanstack/react-query"; import type { Ecosystem } from "@/api/team/ecosystems";
28-33
: Remove artificial 3 s delayA hard-coded
setTimeout
slows down every deletion and blocks the mutation queue for no functional reason.- await new Promise((resolve) => setTimeout(resolve, 3000));
Drop the line unless there is a documented requirement to simulate latency.
apps/dashboard/src/app/(app)/account/wallets/LinkWalletUI.tsx (1)
108-110
:format
expects aDate
, not an ISO string
wallet.createdAt
is typed/used as a string but passed directly todate-fns/format
, which requires aDate | number
. Wrap it withnew Date(...)
to avoid runtime/TS errors.-{format(wallet.createdAt, "MMM d, yyyy")} +{format(new Date(wallet.createdAt), "MMM d, yyyy")}apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartners.ts (1)
15-23
:next
option breaks in the browserWhen
fetchPartners
is invoked fromusePartners
(a React-Query client hook) this code will run in the browser.
fetch
will throw: “Invalid value for init option ‘next’”.- const res = await fetch(`${ecosystem.url}/${ecosystem.id}/partners`, { - headers: { … }, - next: { revalidate: 0 }, - }); + const init: RequestInit = { + headers: { + Authorization: `Bearer ${authToken}`, + "x-thirdweb-team-id": teamId, + }, + }; + // Only attach Next.js cache hints on the server + if (typeof window === "undefined") { + (init as any).next = { revalidate: 0 }; + } + + const res = await fetch(`${ecosystem.url}/${ecosystem.id}/partners`, init);Failing to guard this will crash every client render that queries partners.
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartnerDetails.ts (1)
1-8
: ❗ Move sensitive fetch helper to a server-only module
authToken
andteamId
headers must never reach the browser bundle.
Because this helper sits inhooks/
and lacks theimport "server-only";
guard, any client component could import it and expose PII in the JS payload.+import "server-only"; import type { Ecosystem, Partner } from "@/api/team/ecosystems";
Alternatively, relocate the file under
@/api/**
and prefix it withserver-only
.apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-add-partner.ts (1)
26-33
: ❗ Leaking bearer tokens to the client
useAddPartner
executes in the browser (React Query mutation).
PassingauthToken
directly tofetch
ships the raw JWT to every user who loads the page, violating the “Keep tokens secret via internal API routes or server actions” guideline.Refactor:
- Create a server action / internal API route
/api/partners/add
.- Move the
fetch
call (and secret headers) there.- From the client, call that endpoint without credentials.
Until then, any user can inspect dev-tools and exfiltrate team tokens.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/shared-sources-page.tsx (1)
1-6
: ❗ Missingimport "server-only";
in a server componentThis file renders on the edge/runtime only; add the guard at the very top to keep it out of the client bundle.
+import "server-only"; import { notFound } from "next/navigation";
apps/dashboard/src/@/components/project/create-project-modal/index.tsx (1)
1-11
: Missing'use client';
directive violates dashboard client-component ruleThis component uses hooks (
useState
,useForm
, React Query) → it must be compiled as a client component.
Add the directive before all imports:+'use client'; + import { zodResolver } from "@hookform/resolvers/zod";apps/dashboard/src/@/components/chat/CustomChats.tsx (1)
1-10
: Missing'use client'
directive breaks React-client compilation
CustomChats
uses React hooks (useEffect
,useState
) but the file lacks the required"use client";
pragma at the very top. Without it, Next.js will treat the component as a server component and compilation will fail.+// Interactive chat UI (hooks inside) +'use client'; import { AlertCircleIcon, ArrowRightIcon,apps/dashboard/src/@/api/team/team-invites.ts (1)
21-26
: Inconsistent unauthenticated handling vs. other helpers.
Here youthrow new Error("Unauthorized")
, whereasteam-members.ts
returnsundefined
. Choose one convention (throw vs return value) and apply it across all API helpers so callers can rely on a single contract.apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-ecosystem.ts (1)
50-53
: Query key is too generic – will collide across teams
invalidateQueries({ queryKey: ["ecosystems"] })
flushes the cache for every team.
Use a descriptive, stable key that scopes to the current team to prevent unwanted refetches in other dashboards.- await queryClient.invalidateQueries({ - queryKey: ["ecosystems"], - }); + await queryClient.invalidateQueries({ + queryKey: ["team", teamId, "ecosystems"], + });apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (1)
1-4
: Add"server-only"
directive at the top of this server componentDashboard server-side pages must start with
import "server-only";to guarantee the file is never bundled for the browser.
Please insert the directive as the first statement.+import "server-only"; import { EmptyStateCard, EmptyStateContent, } from "app/(app)/team/components/Analytics/EmptyStateCard";
apps/dashboard/src/app/(app)/account/contracts/_components/getSortedDeployedContracts.tsx (1)
1-13
: Prependimport "server-only";
and add explicit return typeThis helper only runs on the server (it fetches auth-protected data and never uses React runtime APIs). Per our dashboard guidelines, it must be tree-shaken from the client bundle, and its signature should expose its return type.
• File:
apps/dashboard/src/app/(app)/account/contracts/_components/getSortedDeployedContracts.tsx• Change required:
- Add
import "server-only";
at the top of the file.- Annotate the function to return
Promise<ProjectContract[]>
.+ import "server-only"; import { getProjectContracts, type ProjectContract, } from "@/api/project/getProjectContracts"; import { fetchChainWithLocalOverrides } from "@/utils/fetchChainWithLocalOverrides"; -export async function getSortedDeployedContracts(params: { +export async function getSortedDeployedContracts( + params: { onlyMainnet?: boolean; teamId: string; projectId: string; authToken: string; deploymentType: string | undefined; -}) { + } +): Promise<ProjectContract[]> {apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/page.tsx (1)
1-8
: Mark the page as a server componentThis route performs server-only work (cookie-based account lookup) and exports
default async function Page
.
Insert the server-only pragma so Next.js never bundles it for the client:+import "server-only"; import { getRawAccount } from "@/api/account/get-account";
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/notifications/page.tsx (1)
1-8
: Server component should start withimport "server-only";
The notifications settings page fetches the authenticated account on the server.
Add the directive to satisfy the dashboard rule set.+import "server-only"; import { getValidAccount } from "@/api/account/get-account";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/ContractExplorerPage.tsx (1)
1-6
: Addimport "server-only";
at the topThis explorer page is rendered on the server (no hooks /
'use client'
).
Please mark it explicitly to avoid accidental client bundle inclusion.+import "server-only"; import type { Abi } from "abitype"; import { CircleAlertIcon } from "lucide-react"; import type { ThirdwebContract } from "thirdweb"; import type { ChainMetadata } from "thirdweb/chains"; import { getContractFunctionsFromAbi } from "@/api/contract/getContractFunctionsFromAbi";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/page.tsx (1)
5-9
: UnusualPromise
annotation onprops.params
Page
receivesparams
synchronously from the Next.js router.
Typing it asPromise<…>
forces an unnecessaryawait
, adds latency, and obscures intent.Consider:
-export default async function Page(props: { - params: Promise<PublicContractPageParams>; -}) { - const [params, account] = await Promise.all([props.params, getRawAccount()]); +export default async function Page(props: { + params: PublicContractPageParams; +}) { + const [account] = await Promise.all([getRawAccount()]); + const { chain_id, contractAddress } = props.params;(Adjust usages accordingly.)
apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/publish-based-deploy.tsx (1)
1-4
: Missingimport "server-only";
directive – this code is being bundled for the browserThis file is a server component (it awaits filesystem/IPFS calls and pulls heavy
thirdweb
SDK objects).
Per the dashboard guidelines, every server component must start withimport "server-only";
so it never leaks into the client bundle.+import "server-only"; import { isAddress } from "thirdweb";
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/projects/TeamProjectsPage.tsx (1)
71-85
:Array.sort()
mutates in-place – this leaks side-effects into props
projects
is received from props. WhensearchTerm === ""
the reference_projectsToShow
points to that original array, and the subsequentsort()
mutates it, potentially causing unexpected re-renders.Refactor by sorting a shallow copy:
- if (sortBy === "name") { - _projectsToShow = _projectsToShow.sort((a, b) => + if (sortBy === "name") { + _projectsToShow = [..._projectsToShow].sort((a, b) => a.name.localeCompare(b.name), ); } else if (sortBy === "createdAt") { - _projectsToShow = _projectsToShow.sort( + _projectsToShow = [..._projectsToShow].sort( (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), ); } else if (sortBy === "monthlyActiveUsers") { - _projectsToShow = _projectsToShow.sort( + _projectsToShow = [..._projectsToShow].sort( (a, b) => b.monthlyActiveUsers - a.monthlyActiveUsers, ); }apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/utils/getPublishedContractsWithPublisherMapping.ts (1)
1-7
: Prefix util withimport "server-only"
to keep it out of the client bundleThis helper performs network-heavy contract-fetching and is only ever called from server components.
Adding the directive prevents tree-shakers from putting it in any client chunk in the future.+import "server-only"; import { isAddress, type ThirdwebClient } from "thirdweb"; import { resolveAddress } from "thirdweb/extensions/ens"; import { fetchLatestPublishedContractVersion, fetchPublishedContractVersions, } from "@/api/contract/fetch-contracts-with-versions";
apps/dashboard/src/@/api/auth-token.ts (1)
9-17
:await cookies()
is a bug –cookies()
is synchronous
next/headers
returns a plainReadonlyRequestCookies
object.
await
ing a non-Promise both confuses TypeScript and adds an unnecessary micro-task.-export async function getAuthToken() { - const cookiesManager = await cookies(); +export async function getAuthToken() { + const cookiesManager = cookies();The same issue appears in
getAuthTokenWalletAddress
(Line 20) andgetUserThirdwebClient
(Line 47).
Please drop theawait
in all three places.apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/SupportTicketForm.tsx (1)
1-8
: Missing'use client'
directive – this file will fail at runtime
The component uses React hooks (useState
,useRef
) but is currently treated as a server component. Add the directive at the very top to opt-in to client compilation.+"use client"; import { LockIcon } from "lucide-react";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/shared-cross-chain-page.tsx (1)
1-2
: Add the mandatoryimport "server-only";
preludeServer components in
apps/dashboard
must start withimport "server-only";
to guarantee they never end up in the client bundle.
Place it before every other import:+import "server-only"; import { notFound } from "next/navigation";
apps/dashboard/src/app/(app)/api/testnet-faucet/claim/route.ts (1)
1-3
: Prefix API route withimport "server-only";
API handlers (
dashboard/**/api/**/*
) must begin with the server-only directive.
This prevents the handler from ever being bundled for the browser and aligns with project rules.+import "server-only"; import { ipAddress } from "@vercel/functions"; import { startOfToday } from "date-fns";
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.tsx (1)
60-76
: Avoid mutating props when sorting
Array.prototype.sort
mutates the array in place.
WhensearchTerm
is empty the variablevalue
still referencesprops.teamInvites
, so the original prop is mutated – React warns against this.- let value = props.teamInvites; + // clone to keep props immutable + let value = [...props.teamInvites];apps/dashboard/src/app/(app)/team/[team_slug]/(team)/page.tsx (1)
1-2
: Missingimport "server-only";
This is a server page. Add the directive before any other import:
+import "server-only"; import { subDays } from "date-fns";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/published-by-ui.tsx (1)
1-9
: Addimport "server-only";
to follow server-component rules.This utility/component file is used on the server (no
'use client'
).
Prefixing with the directive prevents accidental client bundling.+import "server-only"; import type { ThirdwebContract } from "thirdweb"; import { polygon } from "thirdweb/chains"; import { getBytecode, getContract } from "thirdweb/contract"; @@ import { extractIPFSUri, isValidENSName } from "thirdweb/utils"; import { fetchPublishedContractsFromDeploy } from "@/api/contract/fetchPublishedContractsFromDeploy"; import { ContractCard } from "@/components/contracts/contract-card/contract-card";
apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/split-fieldset.tsx (1)
1-1
: Add'use client';
directive to prevent React-hook runtime errorsThis component mounts hooks (
useFieldArray
) and renders interactive UI, so Next.js must treat it as a client component.
Without the directive the build will fail withReact Hook "useFieldArray" is called in server component
.+ 'use client'; + import { InfoIcon, PlusIcon, Trash2Icon } from "lucide-react";apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/primary-sale-fieldset.tsx (1)
1-1
: Mark as client componentThis fieldset receives
register
from React-Hook-Form (client-only). Add the directive to avoid build-time hook violations.+ 'use client'; + import type { UseFormRegisterReturn } from "react-hook-form";apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx (1)
22-32
: Missing early-return afterloginRedirect
may leak data
loginRedirect()
throws a Next.jsredirect()
in most places, but this was recently tightened (see learning #7285) to require an explicitreturn
in server components to guarantee dead-code elimination and avoid accidental execution that could expose privileged data.if (!teams) { loginRedirect(pathname); + return; // prevent the rest of the function from running after redirect }
apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/platform-fee-fieldset.tsx (1)
1-1
: Missing'use client';
directiveThis component registers React-Hook-Form inputs and renders interactive UI. Without the
"use client"
pragma, Next.js will treat the file as a server component, preventing hooks from working and increasing bundle size when automatically switched to the client at runtime.+ 'use client'; import type { ThirdwebClient } from "thirdweb";
♻️ Duplicate comments (6)
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx (1)
1-1
: Same server-only check appliesSame comment as in accounts/page.tsx – ensure the
get-account
helper is server-only.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/page.tsx (1)
1-1
: Same server-only check appliesSame comment as in accounts/page.tsx – ensure the
get-account
helper is server-only.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/page.tsx (1)
1-1
: Same server-only check appliesSame comment as in accounts/page.tsx – ensure the
get-account
helper is server-only.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/english-auctions/page.tsx (1)
1-8
: Missingimport "server-only";
Same reasoning as the direct-listings page: this component runs only on the Node edge, so flag it explicitly.
+import "server-only"; import { getRawAccount } from "@/api/account/get-account";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/page.tsx (1)
1-8
: Add server-only directiveEnsure this token details page is excluded from the client bundle:
+import "server-only"; import { getRawAccount } from "@/api/account/get-account";
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx (1)
5-9
:params
should not be aPromise
See previous comment in NFTs page – the same correction applies here.
🧹 Nitpick comments (34)
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/marketplace-table.tsx (1)
171-178
: Consider supplying alt text for accessibility
NFTMediaWithEmptyState
may expose analt
/name
prop to describe the NFT. Passingrow.asset.metadata.name
(or a fallback) improves screen-reader support.apps/dashboard/src/app/(app)/account/settings/AccountSettingsPage.tsx (1)
5-6
: Verify thatconfirmEmailWithOTP
andupdateAccount
are client-safe before importing hereThis file is a
'use client'
component. Per dashboard guidelines, helpers that retrieve auth tokens (getAuthToken()
) or otherwise rely on server-only context must not be imported directly into client bundles.
Please confirm that:
@/actions/account/confirmEmail
@/actions/account/updateAccount
either (a) contain no server-only logic/secrets or (b) are thin wrappers around public API endpoints and therefore safe for the browser. If they do touch server-only utilities, move the calls behind an API route / server action and invoke that instead.
apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/resolveAddressAndEns.tsx (1)
1-1
: Rename file to.ts
—no JSX present
The file contains no JSX or React usage, so the.tsx
extension triggers unnecessary TypeScript/React transforms during compilation. Renaming toresolveAddressAndEns.ts
keeps tooling fast and avoids misleading intent.apps/dashboard/src/@/components/contracts/contract-card/contract-card.tsx (1)
14-14
: Local relative import is fine – consider aligning with alias pattern
"./contract-publisher"
is the only relative import left after the alias refactor.
Ifcontract-publisher
is reused elsewhere, exposing it via@/components/contracts/contract-card
would let other consumers avoid deep relative hops. Minor, purely organisational.apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/getModuleInstalledParams.ts (1)
1-9
: Mark the utility as server-only and declare an explicit return typeThis helper runs only during server rendering / data-prep but currently lacks the
import "server-only";
guard.
Also, the function’s return type is inferred as{ moduleName: string; params: unknown[] }
, which is fine but undocumented.
Providing an explicit type signal helps call-sites and future refactors.+import "server-only"; import { isAddress, type ThirdwebClient } from "thirdweb"; @@ -export async function getModuleInstalledParams( +export async function getModuleInstalledParams( ext: ModuleMeta, client: ThirdwebClient, -) { +): Promise<{ moduleName: string; params: { name: string; type: string }[] }> {apps/dashboard/src/@/utils/getValidTeamPlan.tsx (1)
1-1
: Rename to.ts
– no JSX usedThe file is typed as TSX but contains no JSX or React APIs.
Renaming togetValidTeamPlan.ts
avoids unnecessary React transforms and speeds builds.apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/AddPartnerDialogButton.tsx (1)
3-7
: Minor cleanup:passHref
no longer necessary
next/link
automatically forwardshref
to the child when it’s an<a>
or a component receivinghref
.
You can safely drop thepassHref
prop.- return ( - <Link href={addPartnerUrl} passHref> + return ( + <Link href={addPartnerUrl}>apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/integration-permissions-section.tsx (1)
7-15
: Return type is implicitFor consistency with the repo’s TypeScript guidelines (“write idiomatic TS with explicit function declarations and return types”) add an explicit return type:
-export function IntegrationPermissionsSection({ +export function IntegrationPermissionsSection({ ecosystem, authToken, teamId, }: { ecosystem?: Ecosystem; authToken: string; teamId: string; -}) { +}): React.JSX.Element {apps/dashboard/src/app/(app)/account/wallets/LinkWalletUI.tsx (1)
154-166
: Variable shadowing obscures intent
unlinkWallet
returned fromuseMutation
shadows theunlinkWallet
prop, making the code harder to scan. Rename the mutation object for clarity.-const unlinkWallet = useMutation({ +const unlinkWalletMutation = useMutation({ mutationFn: props.unlinkWallet, @@ - disabled={unlinkWallet.isPending} + disabled={unlinkWalletMutation.isPending} @@ - unlinkWallet.mutate(props.wallet.id); + unlinkWalletMutation.mutate(props.wallet.id);apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-add-partner.ts (1)
79-83
: Stable queryKey constant recommended
invalidateQueries({ queryKey: ["ecosystem", variables.ecosystem.id, "partners"] })
uses an inline array.
Define a shared constant (e.g.,ecosystemPartnersKey(ecosystemId)
) to avoid typos and ensure cache hits across modules.apps/dashboard/src/@/utils/pricing.tsx (1)
1-1
: Rename file to.ts
– no JSX insideThis util exports plain data; using
.tsx
needlessly activates the JSX/React loader and increases build time.-apps/dashboard/src/@/utils/pricing.tsx +apps/dashboard/src/@/utils/pricing.tsapps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx (1)
42-48
: Only “free” can trigger upsell navigation – consider widening the check
handleNavigateToBilling
stops navigation for every plan except"free"
.
If plans like"starter"
or future free-tier variants should also prompt an upgrade, gate on a list/utility rather than a single literal.- if (props.plan !== "free") { + const upsellEligible = ["free", "starter"] as const; + if (!upsellEligible.includes(props.plan)) { return; }apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx (1)
12-15
:highlightPlan
should be optional
props.highlightPlan
is required by the type but the implementation falls back to"growth"
when it’s falsy. Making the prop optional avoids callers passing a dummy value.-export function FreePlanUpsellBannerUI(props: { - teamSlug: string; - highlightPlan: Team["billingPlan"]; -}) { +export function FreePlanUpsellBannerUI(props: { + teamSlug: string; + highlightPlan?: Team["billingPlan"]; +}) {apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/auth-options-form.client.tsx (1)
59-60
:as const satisfies AuthOption[]
is forward-thinking but fragileThe compile-time assertion breaks if the allowed auth options list in the backend diverges. Consider deriving the array from the server-authoritative enum to avoid drift.
No code change required now, just a heads-up.
apps/dashboard/src/@/api/team/team-members.ts (2)
28-48
: Surface fetch errors instead of silently returningundefined
.
Both lack-of-token and network/API failures collapse to the sameundefined
result, making it hard for callers to distinguish “unauthenticated” from “server returned 500”. Consider returning an error object or throwing an exception for non-OK responses.
52-78
: Same silent-failure pattern as above.
getMemberByAccountId
swallows fetch errors and returnsundefined
, diverging from other helpers that throw (seeteam-invites.ts
). Align the behaviour across helpers for predictability.apps/dashboard/src/@/api/team/ecosystems.ts (1)
61-74
: Consider propagating error context instead of empty array.
Returning[]
for every failure (network, 404, 500, etc.) hides the cause and forces callers to infer whether an ecosystem truly has no entries or something went wrong. Propagate the status or throw an exception for non-OK responses.apps/dashboard/src/@/api/account/linked-wallets.ts (1)
26-34
: Surface non-200 responses for easier debuggingCurrently, any non-OK response is silently swallowed by returning
null
, which obscures real issues.
Consider parsing the error body and logging or propagating it.- if (res.ok) { - const json = (await res.json()) as { data: LinkedWallet[] }; - return json.data; - } - - return null; + if (!res.ok) { + const err = await res.text(); + console.error("Failed to fetch linked wallets:", err); + return null; + } + + const json = (await res.json()) as { data: LinkedWallet[] }; + return json.data;apps/dashboard/src/@/components/contracts/contract-table/index.tsx (1)
24-33
:Promise.all
rejects on first failure – considerPromise.allSettled
If a single metadata fetch fails, the entire batch is discarded, showing a generic error even when most contracts succeed.
UsingPromise.allSettled
retains partial data and surfaces which IDs failed.- const deployedContractMetadata = await Promise.all( - contractIds.map(async (id) => { - const res = await fetchDeployMetadata(id, serverThirdwebClient); - return { contractId: id, ...res }; - }), - ).catch(() => null); + const deployedContractMetadata = ( + await Promise.allSettled( + contractIds.map(async (id) => ({ + contractId: id, + ...(await fetchDeployMetadata(id, serverThirdwebClient)), + })), + ) + ) + .filter((r): r is PromiseFulfilledResult<typeof r["value"]> => r.status === "fulfilled") + .map((r) => r.value);apps/dashboard/src/@/api/team/audit-log.ts (1)
57-58
: Minor typo in comment
artifically
→artificially
.- // artifically limit page size to 15 for now + // artificially limit page size to 15 for nowapps/dashboard/src/@/components/contracts/sources/sources-accordion.tsx (1)
29-37
: React keys risk collisions & “undefined” warnings
key={signature.filename}
can be duplicated (e.g. multipleMyContract.sol
files) or evenundefined
, causing React reconciliation issues.- <SourceAccordionItem - accordionId={`acc-${i}`} - code={signature.source.trim()} - filename={signature.filename || "Unknown"} - key={signature.filename} - lang="solidity" - /> + <SourceAccordionItem + accordionId={`acc-${i}`} + code={signature.source.trim()} + filename={signature.filename ?? "Unknown"} + /* ensure key is always defined & unique */ + key={`${signature.filename ?? "unknown"}-${i}`} + lang="solidity" + />apps/dashboard/src/@/actions/account/getAccount.ts (1)
1-7
: Consider adding"server-only"
directive for clarityThe file already starts with the
"use server"
directive, but adding the neutralimport "server-only";at the very top makes the intent explicit and prevents accidental client-side bundling if this helper is ever imported by a client component.
(No functional change required, purely defensive.)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/utils/getPublishedContractsWithPublisherMapping.ts (1)
32-41
: Swallowing all errors may hide actionable issuesThe blanket
catch { return undefined; }
suppresses every failure (network, ENS resolution, etc.), making debugging hard.Consider at least logging the error or returning a
Result
object so callers can react appropriately.- } catch { - return undefined; + } catch (err) { + console.error("[getPublishedContractsWithPublisherMapping]", err); + return undefined; }apps/dashboard/src/@/api/auth-token.ts (1)
47-54
: Duplicatecookies()
call – consider re-using
cookies()
is inexpensive but you already fetched it at the top of the function.
Reuse the earliercookiesManager
instead of calling it again.apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/common.tsx (1)
3-31
: Expose aclassName
override to stay consistent with component guidelinesMost root elements in dashboard components accept an optional
className
so callers can tweak spacing when composing layouts. Adding it here costs almost nothing and avoids wrapper<div>
work-arounds.-export function ContractDeploymentFieldset(props: { +export function ContractDeploymentFieldset(props: { legend: string; description?: React.ReactNode; headerChildren?: React.ReactNode; children: React.ReactNode; headerClassName?: string; + className?: string; }) { return ( - <fieldset className="relative rounded-lg border border-border bg-card"> + <fieldset + className={cn( + "relative rounded-lg border border-border bg-card", + props.className, + )} + >apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/trusted-forwarders-fieldset.tsx (1)
26-57
: Minor wording nit – clarify legend for end-users
legend="Gasless"
may not be self-explanatory for less technical creators. Consider something like “Gasless (Trusted Forwarders)” for clarity.No functional impact – optional copy tweak only.
apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/published-by-ui.tsx (1)
13-18
:moduleId
appears unused – prune to avoid misleading typings.
ModuleMetadataPickedKeys
definesmoduleId
, but every reference later usesm.name
instead.
Unless another consumer needs it, drop the field to keep the type minimal.-type ModuleMetadataPickedKeys = { - publisher: string; - moduleId: string; - name: string; - version: string; -}; +type ModuleMetadataPickedKeys = { + publisher: string; + name: string; + version: string; +};apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/shared-layout.tsx (1)
125-154
: Consider bounding concurrent project fetches
Promise.all(teams.map(getProjects))
fires one network request per team simultaneously.
If a workspace contains dozens of teams this may overload the backend or hit Vercel function concurrency limits.-const teamsAndProjects: MinimalTeamsAndProjects = await Promise.all( - teams.map(async (team) => ({ +// limit to 5 in-flight look-ups to avoid thundering-herd +const concurrency = 5; +const limit = (fn: () => Promise<any>) => + (inFlight < concurrency ? fn() : queue.push(fn)); + +const teamsAndProjects: MinimalTeamsAndProjects = await Promise.all( + teams.map(async (team) => limit(async () => ({ ... - })), + }))), );apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/apis/support.ts (1)
1-1
: Useimport "server-only";
for server helpersDashboard API helpers are required to start with
import "server-only";
(guideline) to guarantee they never get bundled client-side.
"use server"
is fine for Next.js, but deviates from the repo convention and may confuse static-analysis rules.-"use server"; +import "server-only";apps/dashboard/src/@/hooks/contract-hooks.ts (1)
12-16
: Consistent file namingSmall nit: neighbouring helpers follow
kebab-case
(e.g.fetch-contracts-with-versions
). Consider renamingfetchPublishedContracts{,FromDeploy}.ts
tofetch-published-contracts{,-from-deploy}.ts
for consistency with the new path.apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CreditsItem.tsx (1)
3-4
: Prefer alias import over deep relative path
ThirdwebMiniLogo
lives incomponents
, which is already aliased in the repo (@/components/**
). Importing it via six-level relative traversal hurts readability and is brittle to directory moves.-import { ThirdwebMiniLogo } from "../../../../../../components/ThirdwebMiniLogo"; +import { ThirdwebMiniLogo } from "@/components/ThirdwebMiniLogo";apps/dashboard/src/@/api/contract/verify-contract.ts (1)
3-27
: Improve type safety and error handling.The function implementation is functional but could be enhanced:
- Add explicit return type annotation for better type safety
- Improve error handling - the current approach silently swallows errors which may make debugging difficult
- Handle non-JSON responses -
response.json()
could throw if the response isn't valid JSON-export async function verifyContract(contract: ThirdwebContract) { +export async function verifyContract(contract: ThirdwebContract): Promise<unknown> { try { const response = await fetch( "https://contract.thirdweb.com/verify/contract", { body: JSON.stringify({ chainId: contract.chain.id, contractAddress: contract.address, }), headers: { "Content-Type": "application/json", }, method: "POST", }, ); if (!response.ok) { console.error(`Error verifying contract: ${response.statusText}`); + return undefined; } - return await response.json(); + try { + return await response.json(); + } catch (parseError) { + console.error(`Error parsing verification response: ${parseError}`); + return undefined; + } } catch (error) { console.error(`Error verifying contract: ${error}`); + return undefined; } }apps/dashboard/src/@/hooks/favorite-chains.ts (1)
21-28
: Consider adding staleTime configuration for better cachingThe hook implementation is clean and follows React Query best practices. However, per the coding guidelines, consider adding
staleTime
configuration since favorite chains data likely doesn't change frequently.export function useFavoriteChainIds() { const address = useActiveAccount()?.address; return useQuery({ enabled: !!address, queryFn: () => favoriteChains(), queryKey: ["favoriteChains", address], + staleTime: 5 * 60 * 1000, // 5 minutes }); }
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-partners.ts (1)
14-20
: AddstaleTime
and make the queryKey fully uniqueDashboard hooks are expected to configure React Query caching explicitly (see coding guidelines).
Consider:
- Giving the cache at least 60 s freshness so components don’t refetch on every re-mount.
- Including
teamId
in the key to avoid collisions if different teams share the sameecosystem.id
.const partnersQuery = useQuery({ queryFn: async () => { return fetchPartners({ authToken, ecosystem, teamId }); }, - queryKey: ["ecosystem", ecosystem.id, "partners"], + queryKey: ["ecosystem", teamId, ecosystem.id, "partners"], + staleTime: 60_000, // 1 minute – adjust if data is more/less volatile retry: false, });
apps/dashboard/src/@/components/contracts/contract-card/contract-card.tsx
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/create/page.tsx
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/[chain_id]/page.tsx
Show resolved
Hide resolved
.../dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/[chain_id]/page.tsx
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/layout.tsx
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review continued from previous batch...
...rd/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/[version]/page.tsx
Outdated
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/page.tsx
Outdated
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/invoices/page.tsx
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/users/page.tsx
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/page.tsx
Show resolved
Hide resolved
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/page.tsx
Show resolved
Hide resolved
4d63d24
to
f72c553
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🔭 Outside diff range comments (1)
apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/opengraph-image.tsx (1)
1-1
: Missing server-only import directive.According to the coding guidelines, server components in the dashboard app should start with
import "server-only";
to ensure they never end up in the client bundle.Add the server-only import at the top of the file:
+import "server-only"; + import { notFound } from "next/navigation";
🧹 Nitpick comments (2)
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx (2)
22-27
: Consider adding explicit return type annotation.While the function signature is clear, adding an explicit return type would improve TypeScript consistency and make the component's contract more explicit.
export function AddToProjectSelector(props: { selection: TeamAndProjectSelection; onSelectionChange: (selection: TeamAndProjectSelection) => void; teamsAndProjects: MinimalTeamsAndProjects; client: ThirdwebClient; -}) { +}): JSX.Element {
106-110
: Consider using EmptyStateCard for consistency.The "No projects" message could use the
EmptyStateCard
component from the design system for better consistency with other empty states in the dashboard.- {selectedTeam?.projects.length === 0 && ( - <div className="flex items-center justify-start px-3 py-3 text-destructive-text text-sm"> - No projects - </div> - )} + {selectedTeam?.projects.length === 0 && ( + <EmptyStateCard + title="No projects" + description="This team doesn't have any projects yet." + /> + )}Note: You'll need to import
EmptyStateCard
from@/components/ui/empty-state-card
if this suggestion is implemented.
Merge activity
|
<!-- ## title your PR with this format: "[SDK/Dashboard/Portal] Feature/Fix: Concise title for the changes" If you did not copy the branch name from Linear, paste the issue tag here (format is TEAM-0000): ## Notes for the reviewer Anything important to call out? Be sure to also clarify these in your comments. ## How to test Unit tests, playground, etc. --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a hook to fetch favorite chain IDs for user accounts. * Introduced contract verification functionality. * Added UI for saving deployed contracts to projects. * Provided new lightweight types for teams and projects. * **Bug Fixes** * Replaced NFT media cell rendering in marketplace tables for improved display and interaction. * **Refactor** * Standardized and reorganized import paths across the app for improved maintainability. * Renamed and updated fieldset components in contract deployment forms for consistency. * Centralized and simplified cookie and authentication token handling. * Removed or relocated obsolete and redundant components and types. * **Chores** * Cleaned up unused files and consolidated constants. * Updated and clarified type imports throughout the codebase. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
f72c553
to
ad2d225
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx (1)
106-110
: Consider improving the empty state check for better safety.The current check
selectedTeam?.projects.length === 0
could be more robust to handle undefined projects array.Apply this diff for safer empty state checking:
- {selectedTeam?.projects.length === 0 && ( + {selectedTeam && (!selectedTeam.projects || selectedTeam.projects.length === 0) && (
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (207)
apps/dashboard/src/@/actions/account/getAccount.ts
(1 hunks)apps/dashboard/src/@/actions/stripe-actions.ts
(1 hunks)apps/dashboard/src/@/actions/team/createTeam.ts
(1 hunks)apps/dashboard/src/@/analytics/report.ts
(1 hunks)apps/dashboard/src/@/api/account/get-account.ts
(1 hunks)apps/dashboard/src/@/api/account/linked-wallets.ts
(1 hunks)apps/dashboard/src/@/api/auth-token.ts
(1 hunks)apps/dashboard/src/@/api/contract/fetchDeployMetadata.ts
(1 hunks)apps/dashboard/src/@/api/contract/verify-contract.ts
(1 hunks)apps/dashboard/src/@/api/project/getSortedDeployedContracts.tsx
(1 hunks)apps/dashboard/src/@/api/project/projects.ts
(1 hunks)apps/dashboard/src/@/api/team/audit-log.ts
(1 hunks)apps/dashboard/src/@/api/team/dedicated-support.ts
(1 hunks)apps/dashboard/src/@/api/team/ecosystems.ts
(1 hunks)apps/dashboard/src/@/api/team/get-team.ts
(1 hunks)apps/dashboard/src/@/api/team/team-invites.ts
(1 hunks)apps/dashboard/src/@/api/team/team-members.ts
(1 hunks)apps/dashboard/src/@/api/team/verified-domain.ts
(1 hunks)apps/dashboard/src/@/components/billing/billing.tsx
(1 hunks)apps/dashboard/src/@/components/billing/pricing-card.tsx
(1 hunks)apps/dashboard/src/@/components/billing/renew-subscription-button.tsx
(1 hunks)apps/dashboard/src/@/components/blocks/GatedSwitch.stories.tsx
(1 hunks)apps/dashboard/src/@/components/blocks/GatedSwitch.tsx
(1 hunks)apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx
(1 hunks)apps/dashboard/src/@/components/blocks/TokenSelector.tsx
(1 hunks)apps/dashboard/src/@/components/blocks/upsell-wrapper.tsx
(1 hunks)apps/dashboard/src/@/components/chat/CustomChatButton.tsx
(1 hunks)apps/dashboard/src/@/components/chat/CustomChatContent.tsx
(1 hunks)apps/dashboard/src/@/components/chat/CustomChats.tsx
(1 hunks)apps/dashboard/src/@/components/connect-wallet/index.tsx
(1 hunks)apps/dashboard/src/@/components/contract-components/tables/contract-table.stories.tsx
(1 hunks)apps/dashboard/src/@/components/contract-components/tables/contract-table.tsx
(1 hunks)apps/dashboard/src/@/components/contracts/code-overview.tsx
(1 hunks)apps/dashboard/src/@/components/contracts/contract-card/contract-card.tsx
(2 hunks)apps/dashboard/src/@/components/contracts/contract-table/index.tsx
(1 hunks)apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
(2 hunks)apps/dashboard/src/@/components/contracts/import-contract/types.ts
(1 hunks)apps/dashboard/src/@/components/contracts/media-cell.tsx
(0 hunks)apps/dashboard/src/@/components/contracts/sources/sources-accordion.tsx
(1 hunks)apps/dashboard/src/@/components/contracts/sources/sources-panel.tsx
(1 hunks)apps/dashboard/src/@/components/misc/NetworkSelectorButton.tsx
(1 hunks)apps/dashboard/src/@/components/project/create-project-modal/index.tsx
(1 hunks)apps/dashboard/src/@/components/tx-button/MismatchButton.tsx
(1 hunks)apps/dashboard/src/@/constants/cookie.ts
(1 hunks)apps/dashboard/src/@/constants/cookies.ts
(0 hunks)apps/dashboard/src/@/constants/planToTierRecord.ts
(1 hunks)apps/dashboard/src/@/hooks/contract-hooks.ts
(1 hunks)apps/dashboard/src/@/hooks/favorite-chains.ts
(1 hunks)apps/dashboard/src/@/hooks/useApi.ts
(1 hunks)apps/dashboard/src/@/icons/ChainIcon.tsx
(1 hunks)apps/dashboard/src/@/storybook/stubs.ts
(1 hunks)apps/dashboard/src/@/utils/getValidTeamPlan.tsx
(1 hunks)apps/dashboard/src/@/utils/pricing.tsx
(1 hunks)apps/dashboard/src/@/utils/resolveAddressAndEns.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/server/FaucetSection.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/marketplace-table.tsx
(2 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/english-auctions/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-metadata.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/primary-dashboard-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/account/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/data-table.tsx
(2 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/shared-cross-chain-page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/ContractExplorerPage.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/getModuleInstalledParams.ts
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-lazy-mint-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-upload/batch-lazy-mint.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-upload/upload-step.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/published-by-ui.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/permissions/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/proposals/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/shared-layout.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/components/ContractSourcesPage.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/shared-sources-page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/split/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/components/client/star-button.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/(chain)/components/server/chain-icon.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/default-factory.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/factory-fieldset.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/landing-fieldset.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/page.tsx
(3 hunks)apps/dashboard/src/app/(app)/(dashboard)/explore/[category]/page.tsx
(2 hunks)apps/dashboard/src/app/(app)/(dashboard)/explore/components/contract-row/index.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/explore/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/ProfileUI.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/components/published-contracts.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/opengraph-image.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/[version]/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.stories.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/common.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/contract-metadata-fieldset.tsx
(3 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/modular-contract-default-modules-fieldset.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/platform-fee-fieldset.tsx
(3 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/primary-sale-fieldset.tsx
(3 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/royalty-fieldset.tsx
(3 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/split-fieldset.tsx
(3 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/trusted-forwarders-fieldset.tsx
(3 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-functions.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/published-contract.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/utils/getPublishedContractsWithPublisherMapping.ts
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/contract-header.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/custom-contract.tsx
(9 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/publish-based-deploy.tsx
(1 hunks)apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/components/AccountHeaderUI.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/devices/AccountDevicesPage.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/devices/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/layout.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/overview/AccountTeamsUI.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/settings/AccountSettingsPage.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/settings/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/wallets/LinkWalletUI.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/wallets/LinkWalletsUI.stories.tsx
(1 hunks)apps/dashboard/src/app/(app)/account/wallets/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/api/testnet-faucet/can-claim/route.ts
(1 hunks)apps/dashboard/src/app/(app)/api/testnet-faucet/claim/route.ts
(2 hunks)apps/dashboard/src/app/(app)/get-started/team/[team_slug]/add-members/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/get-started/team/[team_slug]/layout.tsx
(1 hunks)apps/dashboard/src/app/(app)/get-started/team/[team_slug]/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/_components/plan-selector.tsx
(1 hunks)apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/JoinTeamPage.tsx
(1 hunks)apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/entry.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/list.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CancelPlanModal.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CreditsItem.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.stories.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.tsx
(2 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/Pricing.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/invoices/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemWalletUsersChartCard.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/add-partner/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/AddPartnerDialogButton.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/add-partner-form.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/auth-options-form.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/integration-permissions-toggle.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/partner-form.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/update-partner-form.client.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/auth-options-section.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/ecosystem-partners-section.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/integration-permissions-section.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/partners-table.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartnerDetails.ts
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartners.ts
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-add-partner.ts
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-delete-partner.ts
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-ecosystem.ts
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-partner.ts
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/partners/[partner_id]/edit/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-ecosystem.ts
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-partners.ts
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/users/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/create/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/[chain_id]/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/[chain_id]/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/layout.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/projects/TeamProjectsPage.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/dedicated-support.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/domain-verification.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamSettingsSidebar.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPage.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPageUI.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/updateTeam.ts
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.stories.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.stories.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageMembersSection.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.stories.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/_common.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/notifications/page.tsx
(1 hunks)apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/page.tsx
(1 hunks)
⛔ Files not processed due to max files limit (37)
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/CreateSupportCase.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/SupportCaseDetails.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/SupportTicketForm.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/_components/case-list.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/apis/support.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/cases/[id]/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/create/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/layout.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/support/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/account-abstraction/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/rpc/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/AccountAbstractionPage.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/aa-analytics.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/factories/AccountFactories/factory-contracts.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/factories/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/layout.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/settings/SponsorshipPolicies/index.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/account-abstraction/settings/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/SecretKeySection.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/SaveLastUsedProject.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/DeployedContractsPage.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/layout.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/contracts/webhooks/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-list.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(instance)/[engineId]/layout.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/_utils/getEngineInstancePageMeta.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/layout.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/insight/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/layout.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/page.tsx
💤 Files with no reviewable changes (2)
- apps/dashboard/src/@/constants/cookies.ts
- apps/dashboard/src/@/components/contracts/media-cell.tsx
✅ Files skipped from review due to trivial changes (102)
- apps/dashboard/src/@/components/blocks/GatedSwitch.stories.tsx
- apps/dashboard/src/@/utils/pricing.tsx
- apps/dashboard/src/@/actions/stripe-actions.ts
- apps/dashboard/src/@/analytics/report.ts
- apps/dashboard/src/@/components/chat/CustomChats.tsx
- apps/dashboard/src/@/components/contract-components/tables/contract-table.stories.tsx
- apps/dashboard/src/@/components/project/create-project-modal/index.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/split/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-delete-partner.ts
- apps/dashboard/src/@/components/blocks/GatedSwitch.tsx
- apps/dashboard/src/@/components/chat/CustomChatContent.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.stories.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/components/server/FaucetSection.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/integration-permissions-toggle.client.tsx
- apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/ProfileUI.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-metadata.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/AddPartnerDialogButton.tsx
- apps/dashboard/src/@/components/blocks/TeamPlanBadge.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/english-auctions/page.tsx
- apps/dashboard/src/@/components/billing/billing.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-lazy-mint-button.tsx
- apps/dashboard/src/@/hooks/useApi.ts
- apps/dashboard/src/@/components/blocks/upsell-wrapper.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/deploy/[chain_id]/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/auth-options-section.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/_common.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/publish-based-deploy.tsx
- apps/dashboard/src/@/icons/ChainIcon.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/list.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/page.tsx
- apps/dashboard/src/app/(app)/account/wallets/LinkWalletsUI.stories.tsx
- apps/dashboard/src/app/(app)/account/settings/AccountSettingsPage.tsx
- apps/dashboard/src/@/components/tx-button/MismatchButton.tsx
- apps/dashboard/src/app/(app)/account/components/AccountHeaderUI.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/notifications/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/shared-layout.tsx
- apps/dashboard/src/@/constants/planToTierRecord.ts
- apps/dashboard/src/@/components/chat/CustomChatButton.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/[chain_id]/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/shared-sources-page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/add-partner/page.tsx
- apps/dashboard/src/@/components/contract-components/tables/contract-table.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/projects/TeamProjectsPage.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/components/server/chain-icon.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemAnalyticsPage.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamSettingsSidebar.tsx
- apps/dashboard/src/@/utils/getValidTeamPlan.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.stories.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/integration-permissions-section.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/partner-form.client.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/layout.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/ecosystem-partners-section.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/ContractExplorerPage.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-partner.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/server/partners-table.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-add-partner.ts
- apps/dashboard/src/@/api/auth-token.ts
- apps/dashboard/src/app/(app)/account/wallets/LinkWalletUI.tsx
- apps/dashboard/src/@/components/misc/NetworkSelectorButton.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/utils/getPublishedContractsWithPublisherMapping.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/components/EcosystemWalletUsersChartCard.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/FreePlanUpsellBannerUI.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/add-partner-form.client.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/overview/components/published-by-ui.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/InviteSection.tsx
- apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/contract-header.tsx
- apps/dashboard/src/app/(app)/api/testnet-faucet/can-claim/route.ts
- apps/dashboard/src/app/(app)/get-started/team/[team_slug]/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/update-partner-form.client.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/create/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.client.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/_components/entry.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/components/client/auth-options-form.client.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.client.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.stories.tsx
- apps/dashboard/src/app/(app)/account/settings/page.tsx
- apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/_components/plan-selector.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx
- apps/dashboard/src/app/(app)/account/wallets/page.tsx
- apps/dashboard/src/@/components/contracts/code-overview.tsx
- apps/dashboard/src/@/components/billing/renew-subscription-button.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/layout.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/primary-dashboard-button.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/royalty-fieldset.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/analytics/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPage.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/primary-sale-fieldset.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageMembersSection.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/dedicated-support.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/invoices/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/_components/settings-cards/domain-verification.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/custom-contract.tsx
- apps/dashboard/src/@/components/contracts/import-contract/types.ts
🚧 Files skipped from review as they are similar to previous changes (102)
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/accounts/page.tsx
- apps/dashboard/src/@/api/project/getSortedDeployedContracts.tsx
- apps/dashboard/src/@/api/account/linked-wallets.ts
- apps/dashboard/src/@/api/team/audit-log.ts
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-upload/upload-step.tsx
- apps/dashboard/src/@/api/contract/fetchDeployMetadata.ts
- apps/dashboard/src/@/api/team/team-members.ts
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/explorer/page.tsx
- apps/dashboard/src/@/api/team/verified-domain.ts
- apps/dashboard/src/@/components/contracts/sources/sources-accordion.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/account/page.tsx
- apps/dashboard/src/@/components/connect-wallet/index.tsx
- apps/dashboard/src/@/components/billing/pricing-card.tsx
- apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/components/published-contracts.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/page.tsx
- apps/dashboard/src/@/api/project/projects.ts
- apps/dashboard/src/app/(app)/account/devices/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/proposals/page.tsx
- apps/dashboard/src/@/api/team/team-invites.ts
- apps/dashboard/src/@/actions/team/createTeam.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/partners/[partner_id]/edit/page.tsx
- apps/dashboard/src/@/components/blocks/TokenSelector.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/updateTeam.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-ecosystem.ts
- apps/dashboard/src/@/actions/account/getAccount.ts
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/uri-based-deploy.tsx
- apps/dashboard/src/@/hooks/favorite-chains.ts
- apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/JoinTeamPage.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/modular-contract-default-modules-fieldset.tsx
- apps/dashboard/src/app/(app)/get-started/team/[team_slug]/add-members/page.tsx
- apps/dashboard/src/@/api/team/ecosystems.ts
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/components/batch-upload/batch-lazy-mint.tsx
- apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/factory-fieldset.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/permissions/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CancelPlanModal.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/infrastructure/layout.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/profile/[addressOrEns]/opengraph-image.tsx
- apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/default-factory.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/shared-cross-chain-page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/components/marketplace-table.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/page.tsx
- apps/dashboard/src/@/api/account/get-account.ts
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.stories.tsx
- apps/dashboard/src/@/api/team/dedicated-support.ts
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-functions.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/explore/[category]/page.tsx
- apps/dashboard/src/@/components/contracts/contract-table/index.tsx
- apps/dashboard/src/app/(app)/account/devices/AccountDevicesPage.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/layout.tsx
- apps/dashboard/src/app/(app)/account/components/AccountHeader.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/getModuleInstalledParams.ts
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/[version]/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/sources/components/ContractSourcesPage.tsx
- apps/dashboard/src/app/(app)/get-started/team/[team_slug]/select-plan/page.tsx
- apps/dashboard/src/@/components/contracts/sources/sources-panel.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/page.tsx
- apps/dashboard/src/@/utils/resolveAddressAndEns.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/hooks/use-partners.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/use-update-ecosystem.ts
- apps/dashboard/src/app/(app)/get-started/team/[team_slug]/layout.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartnerDetails.ts
- apps/dashboard/src/app/(app)/api/testnet-faucet/claim/route.ts
- apps/dashboard/src/@/components/contracts/contract-card/contract-card.tsx
- apps/dashboard/src/@/api/team/get-team.ts
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/platform-fee-fieldset.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/CreditsItem.tsx
- apps/dashboard/src/@/constants/cookie.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/Pricing.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/contract-metadata-fieldset.tsx
- apps/dashboard/src/@/storybook/stubs.ts
- apps/dashboard/src/app/(app)/(dashboard)/explore/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/configuration/hooks/fetchPartners.ts
- apps/dashboard/src/@/hooks/contract-hooks.ts
- apps/dashboard/src/app/(app)/account/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/trusted-forwarders-fieldset.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/layout.tsx
- apps/dashboard/src/app/(app)/join/team/[team_slug]/[invite_id]/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/common.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/TeamMembersSettingsPage.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/general/TeamGeneralSettingsPageUI.tsx
- apps/dashboard/src/app/(app)/(dashboard)/explore/components/contract-row/index.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/published-contract.tsx
- apps/dashboard/src/@/api/contract/verify-contract.ts
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.stories.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/add-to-project-card.tsx
- apps/dashboard/src/app/(app)/account/layout.tsx
- apps/dashboard/src/app/(app)/(dashboard)/published-contract/[publisher]/[contract_id]/components/contract-deploy-form/split-fieldset.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/contracts/publish/[publish_uri]/contract-publish-form/landing-fieldset.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/cross-chain/data-table.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/audit-log/page.tsx
- apps/dashboard/src/app/(app)/account/overview/AccountTeamsUI.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/billing/components/PlanInfoCard.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/members/page.tsx
- apps/dashboard/src/app/(app)/(dashboard)/(chain)/components/client/star-button.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/settings/page.tsx
- apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/users/page.tsx
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx}
📄 CodeRabbit Inference Engine (CLAUDE.md)
**/*.{ts,tsx}
: Write idiomatic TypeScript with explicit function declarations and return types
Limit each file to one stateless, single-responsibility function for clarity
Re-use shared types from@/types
or localtypes.ts
barrels
Prefer type aliases over interface except for nominal shapes
Avoidany
andunknown
unless unavoidable; narrow generics when possible
Choose composition over inheritance; leverage utility types (Partial
,Pick
, etc.)
Comment only ambiguous logic; avoid restating TypeScript in prose
Files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit Inference Engine (CLAUDE.md)
Load heavy dependencies inside async paths to keep initial bundle lean (lazy loading)
Files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
apps/{dashboard,playground-web}/**/*.{ts,tsx}
📄 CodeRabbit Inference Engine (CLAUDE.md)
apps/{dashboard,playground-web}/**/*.{ts,tsx}
: Import UI primitives from@/components/ui/*
(Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps
UseNavLink
for internal navigation with automatic active states in dashboard and playground apps
Use Tailwind CSS only – no inline styles or CSS modules
Usecn()
from@/lib/utils
for conditional class logic
Use design system tokens (e.g.,bg-card
,border-border
,text-muted-foreground
)
Server Components (Node edge): Start files withimport "server-only";
Client Components (browser): Begin files with'use client';
Always callgetAuthToken()
to retrieve JWT from cookies on server side
UseAuthorization: Bearer
header – never embed tokens in URLs
Return typed results (e.g.,Project[]
,User[]
) – avoidany
Wrap client-side data fetching calls in React Query (@tanstack/react-query
)
Use descriptive, stablequeryKeys
for React Query cache hits
ConfigurestaleTime
/cacheTime
in React Query based on freshness (default ≥ 60s)
Keep tokens secret via internal API routes or server actions
Never importposthog-js
in server components
Files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
🧠 Learnings (23)
📓 Common learnings
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Surface breaking changes prominently in PR descriptions
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/components/project-selector.tsx:62-76
Timestamp: 2025-06-24T21:38:03.155Z
Learning: In the project-selector.tsx component for contract imports, the addToProject.mutate() call is intentionally not awaited (fire-and-forget pattern) to allow immediate navigation to the contract page while the import happens in the background. This is a deliberate design choice to prioritize user experience.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to packages/thirdweb/src/wallets/** : EIP-1193, EIP-5792, EIP-7702 standard support in wallet modules
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to src/extensions/** : Auto-generated contracts from ABI definitions in extensions
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to **/*.test.{ts,tsx} : Use `FORKED_ETHEREUM_CHAIN` for mainnet interactions and `ANVIL_CHAIN` for isolated tests
Learnt from: MananTank
PR: thirdweb-dev/js#7177
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/settings/shared-settings-page.tsx:29-39
Timestamp: 2025-05-27T20:10:47.245Z
Learning: MananTank prefers adding error handling (try-catch) directly inside utility functions like `shouldRenderNewPublicPage` rather than requiring callers to wrap the function calls in try-catch blocks. This centralizes error handling and benefits all callers automatically.
📚 Learning: in the project-selector.tsx component for contract imports, the addtoproject.mutate() call is intent...
Learnt from: MananTank
PR: thirdweb-dev/js#7434
File: apps/dashboard/src/app/(app)/team/~/~/contract/[chain]/[contractAddress]/components/project-selector.tsx:62-76
Timestamp: 2025-06-24T21:38:03.155Z
Learning: In the project-selector.tsx component for contract imports, the addToProject.mutate() call is intentionally not awaited (fire-and-forget pattern) to allow immediate navigation to the contract page while the import happens in the background. This is a deliberate design choice to prioritize user experience.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : import ui primitives from `@/components/u...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Import UI primitives from `@/components/ui/*` (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : prefer composable primitives over custom markup: `button`, `in...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Prefer composable primitives over custom markup: `Button`, `Input`, `Select`, `Tabs`, `Card`, `Sidebar`, `Separator`, `Badge`.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: the thirdwebbarchart component in apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(side...
Learnt from: arcoraven
PR: thirdweb-dev/js#7505
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx:186-204
Timestamp: 2025-07-10T10:18:33.238Z
Learning: The ThirdwebBarChart component in apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/analytics/components/WebhookAnalyticsCharts.tsx does not accept standard accessibility props like `aria-label` and `role` in its TypeScript interface, causing compilation errors when added.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : always import from the central ui library under `@/components/...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Always import from the central UI library under `@/components/ui/*` – e.g. `import { Button } from "@/components/ui/button"`.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : reuse core ui primitives; avoid re-implementing buttons, cards...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Reuse core UI primitives; avoid re-implementing buttons, cards, modals.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : server components (node edge): start file...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Server Components (Node edge): Start files with `import "server-only";`
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: the `projectmeta` prop is not required for the server-rendered `contractdirectlistingspage` componen...
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/shared-direct-listings-page.tsx:47-52
Timestamp: 2025-05-26T16:29:54.317Z
Learning: The `projectMeta` prop is not required for the server-rendered `ContractDirectListingsPage` component in the direct listings shared page, following the same pattern as other server components in the codebase where `projectMeta` is only needed for client components.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/components/**/index.ts : group related components in their own folder and ex...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/components/**/index.ts : Group related components in their own folder and expose a single barrel `index.ts` where necessary.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: the `projectmeta` prop is not required for the server-rendered `contracttokenspage` component in the...
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/shared-page.tsx:41-48
Timestamp: 2025-05-26T16:28:50.772Z
Learning: The `projectMeta` prop is not required for the server-rendered `ContractTokensPage` component in the tokens shared page, unlike some other shared pages where it's needed for consistency.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: configuration files that import and reference react components (like icon components from lucide-rea...
Learnt from: MananTank
PR: thirdweb-dev/js#7768
File: apps/playground-web/src/app/navLinks.ts:1-1
Timestamp: 2025-07-31T16:17:42.753Z
Learning: Configuration files that import and reference React components (like icon components from lucide-react) need the "use client" directive, even if they primarily export static data, because the referenced components need to be executed in a client context when used by other client components.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*client.tsx : anything that consumes hooks from `@tanstack/react-query` or t...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Anything that consumes hooks from `@tanstack/react-query` or thirdweb SDKs.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: in the thirdweb-dev/js repository, lucide-react icons must be imported with the "icon" suffix (e.g.,...
Learnt from: saminacodes
PR: thirdweb-dev/js#7543
File: apps/portal/src/app/pay/page.mdx:4-4
Timestamp: 2025-07-07T21:21:47.488Z
Learning: In the thirdweb-dev/js repository, lucide-react icons must be imported with the "Icon" suffix (e.g., ExternalLinkIcon, RocketIcon) as required by the new linting rule, contrary to the typical lucide-react convention of importing without the suffix.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*client.tsx : interactive ui that relies on hooks (`usestate`, `useeffect`, ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Interactive UI that relies on hooks (`useState`, `useEffect`, React Query, wallet hooks).
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: the modulecarduiprops interface already includes a client prop of type thirdwebclient, so when compo...
Learnt from: MananTank
PR: thirdweb-dev/js#7227
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/modules/components/OpenEditionMetadata.tsx:26-26
Timestamp: 2025-05-30T17:14:25.332Z
Learning: The ModuleCardUIProps interface already includes a client prop of type ThirdwebClient, so when components use `Omit<ModuleCardUIProps, "children" | "updateButton">`, they inherit the client prop without needing to add it explicitly.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: in the thirdweb/js project, the react namespace is available for type annotations (like react.fc) wi...
Learnt from: MananTank
PR: thirdweb-dev/js#7356
File: apps/nebula/src/app/not-found.tsx:1-1
Timestamp: 2025-06-17T18:30:52.976Z
Learning: In the thirdweb/js project, the React namespace is available for type annotations (like React.FC) without needing to explicitly import React. This is project-specific configuration that differs from typical TypeScript/React setups.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*client.tsx : when you need access to browser apis (localstorage, window, in...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : When you need access to browser APIs (localStorage, window, IntersectionObserver etc.).
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : icons come from `lucide-react` or the project-specific `…/icon...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Icons come from `lucide-react` or the project-specific `…/icons` exports – never embed raw SVG.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/components/*.client.tsx : client components must start with `'use client';` ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/components/*.client.tsx : Client components must start with `'use client';` before imports.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : client components (browser): begin files ...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Client Components (browser): Begin files with `'use client';`
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to **/*.{ts,tsx} : choose composition over inheritance; leverage utility types (`partial`, `...
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to **/*.{ts,tsx} : Choose composition over inheritance; leverage utility types (`Partial`, `Pick`, etc.)
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
📚 Learning: applies to dashboard/**/*.{tsx,jsx} : for notices & skeletons rely on `announcementbanner`, `generic...
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : For notices & skeletons rely on `AnnouncementBanner`, `GenericLoadingPage`, `EmptyStateCard`.
Applied to files:
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
- GitHub Check: Size
- GitHub Check: Unit Tests
- GitHub Check: E2E Tests (pnpm, webpack)
- GitHub Check: E2E Tests (pnpm, vite)
- GitHub Check: Lint Packages
- GitHub Check: Build Packages
- GitHub Check: Analyze (javascript)
🔇 Additional comments (5)
apps/dashboard/src/@/components/contracts/import-contract/add-to-project-selector.tsx (5)
16-16
: LGTM: Good separation of types into dedicated module.The import of types from a dedicated
./types
module follows good modular organization practices and aligns with the coding guidelines for separating concerns.
18-20
: LGTM: Clean and simple separator component.The
SlashSeparator
component is well-implemented with appropriate Tailwind styling for a visual separator.
22-27
: LGTM: Well-structured component props with proper TypeScript types.The component props are properly typed and follow the established patterns for selection components in the codebase.
32-33
: LGTM: Proper accessibility implementation with useId.Using
useId
for form control associations is the correct approach for accessibility compliance.
35-133
: LGTM: Well-implemented team and project selector with good UX patterns.The component correctly:
- Uses UI primitives from
@/components/ui/*
as required by coding guidelines- Implements proper accessibility with labels and IDs
- Handles selection state changes appropriately
- Provides visual feedback for empty states
- Uses appropriate avatar components for visual consistency
The implementation follows React best practices and the established patterns in the codebase.
Summary by CodeRabbit
New Features
Bug Fixes
Refactor
Chores