Skip to content

[SDK] Feature: Allow for supported providers to be passed to PayEmbed #7108

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

RobbyUitbeijerse
Copy link
Contributor

@RobbyUitbeijerse RobbyUitbeijerse commented May 21, 2025

Currently the FiatScreen in PayEmbed relies on a predefined set of providers: Coinbase, Transak and Stripe. All of these providers would work if not for the reality that some tokens are only supported by a subset of these providers.

With this PR I've added an additional prop to the payOptions.buyWithFiat, supportedProviders . It's an array with FiatProvider values which can be used in tandem with the preferred provider.

If you pass an empty array, or a payOptions.buyWithFiat.preferedProvider that doesn't match with the provided values, the property will be ignored and the default set of providers is being used, making it completely optional.

If there's only a single provider passed down, the dropdown is replaced for a component rather than a and combination to handle the provider selection.


PR-Codex overview

This PR adds support for filtering fiat payment providers in the PayEmbed component and introduces a utility function to format provider labels. It enhances the user experience by allowing selection of preferred payment providers and improves code organization.

Detailed summary

  • Added preferredProvider and supportedProviders to ConnectButtonProps.ts.
  • Introduced getProviderLabel function in utils.ts for formatting provider labels.
  • Updated OnRampScreen.tsx to use getProviderLabel for displaying action text.
  • Refactored Providers.tsx to map over supportedProviders instead of FiatProviders.
  • Implemented PayProviderSelection component in PayProviderSelection.tsx to show selected providers.
  • Replaced old provider display logic in FiatScreenContent.tsx with PayProviderSelection.

✨ Ask PR-Codex anything about this PR by commenting with /codex {your question}

Summary by CodeRabbit

  • New Features

    • Added support for filtering and selecting specific fiat payment providers when buying crypto, allowing users to choose from multiple supported providers.
    • Introduced a new payment provider selection interface for a more streamlined and interactive experience.
  • Improvements

    • Enhanced provider name formatting for consistency and clarity throughout the payment flow.

@RobbyUitbeijerse RobbyUitbeijerse requested review from a team as code owners May 21, 2025 10:09
Copy link

changeset-bot bot commented May 21, 2025

🦋 Changeset detected

Latest commit: 2dab506

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
Name Type
thirdweb Patch
@thirdweb-dev/wagmi-adapter Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copy link
Contributor

graphite-app bot commented May 21, 2025

How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • merge-queue - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

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.

Copy link
Contributor

coderabbitai bot commented May 21, 2025

Warning

Rate limit exceeded

@RobbyUitbeijerse has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 8 minutes and 49 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 0c5260c and 2dab506.

📒 Files selected for processing (1)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/FiatScreenContent.tsx (6 hunks)

Walkthrough

This change adds support for specifying multiple supported fiat payment providers in the payment UI configuration. It refactors provider selection logic by introducing a new PayProviderSelection component, centralizes the supported providers list, updates related UI components to accept this list, adds a string capitalization utility, and adjusts provider display and selection behavior accordingly.

Changes

File(s) Change Summary
packages/thirdweb/src/react/core/hooks/connection/ConnectButtonProps.ts Added optional supportedProviders property to buyWithFiat in PayUIOptions type.
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/FiatScreenContent.tsx Replaced manual provider selection UI with PayProviderSelection component; computes supported providers list; defaults preferred provider; passes supported providers to drawer and child components.
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/Providers.tsx Removed fixed import of all providers; requires supportedProviders prop; iterates over this list; uses new getProviderLabel utility; simplified JSX.
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/utils.ts Added getProviderLabel utility function for string capitalization.
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/PayProviderSelection.tsx Added new PayProviderSelection component to display and select payment provider with interactivity and formatting based on supported providers.
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/OnRampScreen.tsx Replaced manual capitalization with getProviderLabel utility in StepUI component.
.changeset/small-boxes-grow.md Added patch-level changelog entry documenting support for filtering fiat payment providers.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant FiatScreenContent
  participant PayProviderSelection
  participant Providers
  participant BuyWithFiatLogic

  User->>FiatScreenContent: Opens Buy with Fiat screen
  FiatScreenContent->>PayProviderSelection: Pass supportedProviders, preferredProvider, quotedProvider
  PayProviderSelection-->>User: Display current provider (dropdown if multiple)
  User->>PayProviderSelection: Click to select provider (if multiple)
  PayProviderSelection->>Providers: Show supportedProviders list
  User->>Providers: Select a provider
  Providers->>PayProviderSelection: Update selected provider
  PayProviderSelection->>BuyWithFiatLogic: Use selected provider for payment
Loading

Suggested reviewers

  • jnsdls
✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

vercel bot commented May 21, 2025

@RobbyUitbeijerse is attempting to deploy a commit to the thirdweb Team on Vercel.

A member of the Team first needs to authorize it.

@github-actions github-actions bot added packages SDK Involves changes to the thirdweb SDK labels May 21, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🔭 Outside diff range comments (1)
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/Providers.tsx (1)

24-57: 🛠️ Refactor suggestion

Single-provider branch never hits & !! is redundant

Inside .map, props.supportedProviders.length is always ≥ 1.
Hence the <Text> fallback is unreachable and the UI shows a clickable
button even when only one provider is supplied, contradicting the PR
objective.

-            {!!props.supportedProviders.length ? (
+            {props.supportedProviders.length > 1 ? (

With this change the map renders <Button> rows only when there is a
choice; otherwise a static <Text> element is shown, matching the spec.
Also removes the unnecessary double negation highlighted by Biome.

🧰 Tools
🪛 Biome (1.9.4)

[error] 34-34: Avoid redundant double-negation.

It is not necessary to use double-negation when a value will already be coerced to a boolean.
Unsafe fix: Remove redundant double-negation

(lint/complexity/noExtraBooleanCast)

🧹 Nitpick comments (3)
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/utils.ts (1)

5-7: Handle empty-string input defensively

str.charAt(0) is "" when str === "", so the function already “works”, but returning an empty string is arguably clearer than returning "" + str.slice(1) (also "").

 export function uppercaseFirstLetter(str: string) {
-  return str.charAt(0).toUpperCase() + str.slice(1);
+  if (!str) return "";
+  return str.charAt(0).toUpperCase() + str.slice(1);
 }
packages/thirdweb/src/react/core/hooks/connection/ConnectButtonProps.ts (1)

100-103: Add a short JSDoc comment for supportedProviders

Every other option in this block is documented – adding one-liner docs keeps generated API pages consistent and avoids confusion around precedence rules with preferredProvider.

packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/FiatScreenContent.tsx (1)

222-226: Reuse the new uppercaseFirstLetter utility

Manual charAt(0).toUpperCase() duplication can drift from the helper.

-  ? `${preferredProvider.charAt(0).toUpperCase() + preferredProvider.slice(1).toLowerCase()}`
+  ? uppercaseFirstLetter(preferredProvider.toLowerCase())

Do the same for the fallback path.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 30fafd1 and 03e3354.

📒 Files selected for processing (4)
  • packages/thirdweb/src/react/core/hooks/connection/ConnectButtonProps.ts (1 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/FiatScreenContent.tsx (3 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/Providers.tsx (3 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/utils.ts (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (2)
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/FiatScreenContent.tsx (1)
packages/thirdweb/src/pay/utils/commonTypes.ts (1)
  • FiatProviders (22-22)
packages/thirdweb/src/react/core/hooks/connection/ConnectButtonProps.ts (1)
packages/thirdweb/src/pay/utils/commonTypes.ts (1)
  • FiatProvider (20-20)
🪛 Biome (1.9.4)
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/Providers.tsx

[error] 1-1: All these imports are only used as types.

Importing the types with import type ensures that they are removed by the compilers and avoids loading unnecessary modules.
Safe fix: Use import type.

(lint/style/useImportType)


[error] 34-34: Avoid redundant double-negation.

It is not necessary to use double-negation when a value will already be coerced to a boolean.
Unsafe fix: Remove redundant double-negation

(lint/complexity/noExtraBooleanCast)

@RobbyUitbeijerse RobbyUitbeijerse changed the title [OnRamp] Feature: Allow for supported providers to be passed [SDK] Feature: Allow for supported providers to be passed to PayEmbed May 21, 2025
if (!buyWithFiatOptions) return [];
const options = buyWithFiatOptions?.supportedProviders ?? [];
return options.length > 0 &&
(!preferredProvider || options.includes(preferredProvider))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if i dont pass preferredProvider, supportedProviders is not respected.

i think its because at this level preferredProvider is always defaulted to coinbase ?

would be nice to make preferredProvider default to the first one in my supportedProviders if not set

couple more nits:

  • would be nice to not have the mini modal open at all if only 1 provider is supported
  • we should probably do the first letter uppercase treatment inside the modal too :p

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep sorry, did this blind yesterday. Actually ran the Playground this time around. Here's what I did:

  • Adjusted the presentation logic to include a non interactive view of the provider name
  • Applied the uppercaseFirstLetter throughout the flow
  • Adjusted prop logic for preferred/supported provider(s)

I covered the following situations while testing just now:

  1. payOptions.buyWithFiat: undefined - assumes that buy with fiat is allowed with all providers, default list of fiat providers is now being rendered.
  2. `payOptions.buyWithFiat.preferredProvider: 'STRIPE' - allows for all providers, auto-selects stripe (or whatever you pass down)
  3. In all scenarios I tested where the supportedProviders conflicts with the preferredProvider, the default list of fiat providers is being rendered. (eg: empty supportedProviders array, preferredProvider with different value than passed in supportedProviders)

Should be quite alright now. Let me know if you find something odd.

PS In case you're wondering what's up with the coderabbitai comments; did a merge rather than a rebase and made coderabbitai throw up. I fixed that but it opened a lot of comments for things commits and changes that were already in main due to my fork it's commit history flowing differently. Resolved that, and closed those comments.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
.changeset/small-boxes-grow.md (1)

5-5: Enhance summary clarity
The summary is concise but could explicitly reference the supportedProviders prop and the UI change for single-provider cases to aid future traceability.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9630337 and b70f184.

📒 Files selected for processing (2)
  • .changeset/small-boxes-grow.md (1 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/FiatScreenContent.tsx (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/FiatScreenContent.tsx

@github-actions github-actions bot added Dashboard Involves changes to the Dashboard. Portal Involves changes to the Portal (docs) codebase. labels May 22, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🔭 Outside diff range comments (1)
apps/dashboard/src/@/api/team.ts (1)

93-96: ⚠️ Potential issue

cookies() is synchronous – remove the unnecessary await

cookies() from next/headers returns a plain ReadonlyRequestCookies object, not a Promise.
Await-ing a non-Promise compiles but triggers an ESLint/TS error (await of a non-Promise value) and hides intent.

-  const cookiesStore = await cookies();
+  const cookiesStore = cookies();

This also removes one micro-tick from the event loop.

♻️ Duplicate comments (1)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx (1)

159-176: Auth token exposure persists on the client side

The component receives and stores authToken in memory, then passes it to useUpdateEcosystem.
If an attacker XSS-es the page, they can exfiltrate this token.
Combine this feedback with the layout comment: move the mutation behind a server action or secure API route so no raw token is ever present in the browser.

🧹 Nitpick comments (20)
apps/portal/src/app/vault/sdk/guides/signing/page.mdx (1)

3-4: Add a comma after "In this guide"

For improved readability, consider adding a comma after the introductory phrase.

-In this guide we will request signatures from the Vault for common payload types:
+In this guide, we will request signatures from the Vault for common payload types:
🧰 Tools
🪛 LanguageTool

[typographical] ~3-~3: It appears that a comma is missing.
Context: ...igning Transactions & Messages In this guide we will request signatures from the Vau...

(DURING_THAT_TIME_COMMA)

apps/portal/src/app/vault/sdk/guides/access-tokens/page.mdx (1)

3-3: Consider removing hyphen from "finely-scoped"

Since "finely" is an adverb ending in "ly", standard style guides typically recommend not using a hyphen in this compound modifier.

-Access tokens let you delegate finely-scoped permissions to services, cron jobs or external partners without sharing the admin key.
+Access tokens let you delegate finely scoped permissions to services, cron jobs or external partners without sharing the admin key.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~3-~3: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ... Tokens Access tokens let you delegate finely-scoped permissions to services, cron jobs or e...

(HYPHENATED_LY_ADVERB_ADJECTIVE)

apps/dashboard/src/@/api/team.ts (1)

87-104: Minor enhancement: reuse the already-fetched cookie value

After fixing the await, the function is solid.
If you want to avoid the double network trip when the cookie is missing (currently you still call getTeamById with an undefined ID guard inside), an early return before hitting the fetch would shave off one call:

if (!lastVisitedTeamId) {
  return null;
}

Nice-to-have only.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx (1)

29-35: Fetch the team before the ecosystem to save an extra request

fetchEcosystem is executed before the team existence check.
If params.team_slug is invalid you still perform an unnecessary ecosystem fetch.
Switching the order (get team → redirect if null → fetch ecosystem) will save one network round-trip in that edge case.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx (3)

1-3: Avoid blanket ESLint disable – target specific rules instead

/* eslint-disable */ silences all linting, hiding genuine problems (such as unused vars or missing deps).
Consider replacing it with rule-specific disables (/* eslint-disable react-hooks/exhaustive-deps */, etc.) or, better, fixing the underlying issues.


198-204: Add file-size validation to prevent oversized uploads

You validate MIME type but not size. Allowing very large images can:
• Consume bandwidth & time
• Cause storage cost spikes
• Freeze the UI on base64 previews

Example addition (2 MB limit):

+const MAX_SIZE = 2 * 1024 * 1024; // 2 MB
+if (selectedFile.size > MAX_SIZE) {
+  toast.error("Image must be smaller than 2 MB");
+  return;
+}

217-234: Reset dialog state after successful update for better UX

After handleNameSave/handleUpload succeed, selectedFile and tempName remain in state.
Resetting them avoids stale values when the dialog is reopened:

setIsDialogOpen(false);
+setSelectedFile(null);

...

setIsNameDialogOpen(false);
+setTempName("");
apps/portal/src/app/knowledge-base/troubleshoot/contracts/batch-upload/page.mdx (2)

13-13: Consider standardizing spelling of "antivirus"

The term "Anti-virus" is typically written as "antivirus" in modern technical documentation.

-- **Anti-virus software** can also interfere—pause it while you upload.
++ **Antivirus software** can also interfere—pause it while you upload.
🧰 Tools
🪛 LanguageTool

[misspelling] ~13-~13: This word is normally spelled as one.
Context: ...quests—turn them off temporarily. - Anti-virus software can also interfere—pause it ...

(EN_COMPOUNDS_ANTI_VIRUS)


7-8: Provide more specific guidance on batch size limits

While the documentation mentions "100 MB per batch," it would be helpful to provide more specific guidance on the number of files or items per batch, as file count can sometimes be more relevant than total size for upload processing.

-### 1. Oversized batches  
-Although our batch uploader technically supports up to 25 GB, we recommend splitting large uploads into smaller chunks—ideally 100 MB per batch, and no more than 1–2 GB at a time. If you still see errors, try uploading just 2–3 files as a quick test.
+### 1. Oversized batches  
+Although our batch uploader technically supports up to 25 GB, we recommend splitting large uploads into smaller chunks:
+- **Size:** Ideally 100 MB per batch, and no more than 1–2 GB at a time
+- **File count:** Keep batches under 50-100 files when possible
+
+If you still see errors, try uploading just 2–3 files as a quick test.
apps/portal/src/app/knowledge-base/page.mdx (2)

1-3: Remove unused imports to clean up the MDX file
The icons (WalletIcon, FileIcon, etc.) and FeatureCard, GithubTemplateCard, Stack, Grid, ArticleCard, ArticleIconCard from @doc are never used in this page. Eliminating them will improve readability and bundle size.

-import { WalletIcon, FileIcon, MessageCircleIcon, BracesIcon, BotIcon, BlocksIcon } from "lucide-react";
-import { DocImage, createMetadata, FeatureCard, GithubTemplateCard, Stack, Grid, ArticleCard, ArticleIconCard } from "@doc";
-import { ExternalLink } from "lucide-react";
+import { DocImage, createMetadata } from "@doc";

63-63: Refine the closing call-to-action for stronger impact
Instead of “you can submit a ticket… and we’ll be happy to help you!”, consider a more active verb like “we’re here to help” to sound more supportive and concise.

-You can [submit a ticket](https://thirdweb.com/support), and we’ll be happy to help you!
+We’re here to help—[submit a ticket](https://thirdweb.com/support) and we’ll get back to you as soon as possible!
🧰 Tools
🪛 LanguageTool

[style] ~63-~63: Consider using a different verb to strengthen your wording.
Context: ...web.com/support), and we’ll be happy to help you!

(HELP_ASSIST)

apps/portal/src/app/knowledge-base/how-to/deploy-mint-template/page.mdx (1)

28-29: Improve accessibility: add meaningful alt text to images
<DocImage> relies on alt props for screen readers. Consider supplying descriptive alt text for each image to enhance accessibility.

-<DocImage src={deployGithub} />
+<DocImage src={deployGithub} alt="GitHub deployment button for NFT Minting Template" />

-<DocImage src={newVercel} />
+<DocImage src={newVercel} alt="Vercel dashboard showing projects list" />

-<DocImage src={deployVercel} />
+<DocImage src={deployVercel} alt="Successful deployment view in Vercel" />

Also applies to: 51-53

apps/portal/src/app/knowledge-base/get-started/page.mdx (2)

1-3: Remove unused imports to streamline this page
Icons and several @doc components are imported but not used. Cleaning these up will reduce confusion and bundle overhead.

-import { WalletIcon, FileIcon, MessageCircleIcon, BracesIcon, BotIcon, BlocksIcon } from "lucide-react";
-import { DocImage, createMetadata, FeatureCard, GithubTemplateCard, Stack, Grid, ArticleCard, ArticleIconCard } from "@doc";
-import { ExternalLink } from "lucide-react";
+import { DocImage, createMetadata } from "@doc";

63-63: Refine the closing call-to-action for consistency
Matching the landing page’s improved phrasing, use an active verb for the final help prompt.

-You can [submit a ticket](https://thirdweb.com/support), and we’ll be happy to help you!
+We’re here to help—[submit a ticket](https://thirdweb.com/support) and we’ll get back to you shortly!
🧰 Tools
🪛 LanguageTool

[style] ~63-~63: Consider using a different verb to strengthen your wording.
Context: ...web.com/support), and we’ll be happy to help you!

(HELP_ASSIST)

apps/dashboard/src/app/pay/page.tsx (1)

64-65: Maintain consistency with client reference.

Using payAppThirdwebClient here is good, but note that lines 58-61 use a different client variable for the client prop later passed to PayPageEmbed. Consider using the same client reference throughout for complete consistency.

const client =
  params.clientId && !Array.isArray(params.clientId)
    ? createThirdwebClient({ clientId: params.clientId })
    : payAppThirdwebClient;

const tokenContract = getContract({
-  client: payAppThirdwebClient,
+  client: client,
  // eslint-disable-next-line no-restricted-syntax
  chain: defineChain(Number(params.chainId)),
  address: params.tokenAddress,
});
apps/dashboard/src/@/api/universal-bridge/links.ts (1)

31-34: Consider using a structured error approach for consistency.

The error handling could be improved by using a structured error object (like ApiError used elsewhere in the codebase) rather than a generic Error with text.

if (!res.ok) {
  const text = await res.text();
-  throw new Error(text);
+  throw new ApiError({
+    code: "PAYMENT_LINK_ERROR",
+    message: text,
+    statusCode: res.status,
+  });
}
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/PayProviderSelection.tsx (1)

28-30: Consider adding a more descriptive fallback for provider name.

When both preferredProvider and quotedProvider are undefined, the component falls back to an empty string. This might result in rendering an empty provider name in the UI.

-        {uppercaseFirstLetter(
-          props.preferredProvider ?? props.quotedProvider ?? "",
-        )}
+        {uppercaseFirstLetter(
+          props.preferredProvider ?? props.quotedProvider ?? "Default",
+        )}
apps/dashboard/src/app/pay/components/client/PayPageEmbed.client.tsx (1)

19-29: Remove unused clientId parameter from props interface.

The clientId parameter is still in the props interface (line 28) but it's no longer used since the component now uses the imported payAppThirdwebClient instead.

export function PayPageEmbed({
  chainId,
  recipientAddress,
  paymentLinkId,
  amount,
  token,
  name,
  image,
  redirectUri,
  theme,
}: {
  chainId: number;
  recipientAddress: string;
  paymentLinkId?: string;
  amount?: bigint;
  token: { name: string; symbol: string; address: string; decimals: number };
  name?: string;
  image?: string;
  redirectUri?: string;
-  clientId: string;
  theme?: "light" | "dark";
})
packages/thirdweb/src/react/web/utils/errors.ts (2)

10-17: Consider using error-specific titles for API errors.

The code currently assigns a fixed title "Failed to Find Quote" for all ApiError instances. This may not be appropriate for all types of API errors that could occur.

export function getErrorMessage(err: any): UiError {
  if (err instanceof ApiError) {
    return {
      code: err.code,
-      title: "Failed to Find Quote",
+      title: getErrorTitleFromCode(err.code) || "API Error",
      message: getErrorMessageFromBridgeApiError(err),
    };
  }

// Add this function to map error codes to appropriate titles
function getErrorTitleFromCode(code: string): string | undefined {
  const errorTitles: Record<string, string> = {
    QUOTE_NOT_FOUND: "Failed to Find Quote",
    PROVIDER_NOT_AVAILABLE: "Provider Unavailable",
    // Add more mappings as needed
  };
  return errorTitles[code];
}

41-50: Error message cleanup looks good, but could be more robust.

The function does a good job of cleaning up technical details from error messages, but the string manipulation relies on specific patterns that might be brittle if error formats change.

function getErrorMessageFromBridgeApiError(err: ApiError) {
  let msg = err.message;
-  if (msg.includes("Details")) {
-    msg = msg.substring(0, msg.indexOf("Details"));
-  }
-  if (msg.includes("{")) {
-    msg = msg.substring(0, msg.indexOf("{"));
-  }
+  // Remove technical details using regex for more robust pattern matching
+  msg = msg.replace(/Details:?.*$/s, '').trim();
+  msg = msg.replace(/{.*$/s, '').trim();
  return msg;
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b70f184 and 83e4fc2.

⛔ Files ignored due to path filters (17)
  • apps/portal/src/app/knowledge-base/assets/add-new-vercel.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/context-filters.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/create-project-vercel.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/deploy-github.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/deploy-vercel.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/inspect-console.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/keys.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/new-project-github.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/new-project-name-github.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/new-project.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/permissions-soulbound.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/screenshot-console.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/set-approval-forall.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/soulbound-explorer.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/streamed-response.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/tab-console.png is excluded by !**/*.png
  • apps/portal/src/app/knowledge-base/assets/variables-vercel.png is excluded by !**/*.png
📒 Files selected for processing (91)
  • .changeset/blue-comics-doubt.md (1 hunks)
  • .changeset/blue-mice-prove.md (1 hunks)
  • .changeset/slick-apes-do.md (1 hunks)
  • .changeset/ten-parrots-poke.md (0 hunks)
  • .changeset/tired-rice-kiss.md (1 hunks)
  • apps/dashboard/src/@/api/team.ts (2 hunks)
  • apps/dashboard/src/@/api/universal-bridge/links.ts (1 hunks)
  • apps/dashboard/src/@3rdweb-sdk/react/hooks/useApi.ts (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TotalSponsoredCard.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.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)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/ecosystem-header.client.tsx (7 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/getAccountUsage.ts (0 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/overview/components/Usage.tsx (3 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/page.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/components/ProjectFTUX/ProjectFTUX.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/components/ProjectFTUX/SecretKeySection.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/nebula/nebula-ftux.tsx (2 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/nebula/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/page.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/settings/ProjectGeneralSettingsPage.tsx (1 hunks)
  • apps/dashboard/src/app/(app)/team/page.tsx (1 hunks)
  • apps/dashboard/src/app/nebula-app/(app)/utils/nebulaThirdwebClient.ts (2 hunks)
  • apps/dashboard/src/app/pay/[id]/page.tsx (1 hunks)
  • apps/dashboard/src/app/pay/components/client/PayPageEmbed.client.tsx (3 hunks)
  • apps/dashboard/src/app/pay/components/client/PaymentLinkForm.client.tsx (8 hunks)
  • apps/dashboard/src/app/pay/constants.ts (1 hunks)
  • apps/dashboard/src/app/pay/page.tsx (3 hunks)
  • apps/dashboard/src/constants/addresses.ts (1 hunks)
  • apps/dashboard/src/constants/urls.ts (0 hunks)
  • apps/dashboard/src/stories/stubs.ts (0 hunks)
  • apps/portal/src/app/Header.tsx (2 hunks)
  • apps/portal/src/app/knowledge-base/get-started/page.mdx (1 hunks)
  • apps/portal/src/app/knowledge-base/how-to/console-error-sharing/page.mdx (1 hunks)
  • apps/portal/src/app/knowledge-base/how-to/creating-soulbound-nfts/page.mdx (1 hunks)
  • apps/portal/src/app/knowledge-base/how-to/deploy-mint-template/page.mdx (1 hunks)
  • apps/portal/src/app/knowledge-base/layout.tsx (1 hunks)
  • apps/portal/src/app/knowledge-base/onchain-common-errors/thirdweb-cli/device-link-error/page.mdx (1 hunks)
  • apps/portal/src/app/knowledge-base/page.mdx (1 hunks)
  • apps/portal/src/app/knowledge-base/sidebar.tsx (1 hunks)
  • apps/portal/src/app/knowledge-base/troubleshoot/contracts/airdrop-contract/page.mdx (1 hunks)
  • apps/portal/src/app/knowledge-base/troubleshoot/contracts/batch-upload/page.mdx (1 hunks)
  • apps/portal/src/app/knowledge-base/troubleshoot/contracts/embed-feature-not-found/page.mdx (1 hunks)
  • apps/portal/src/app/knowledge-base/troubleshoot/page.mdx (1 hunks)
  • apps/portal/src/app/page.tsx (0 hunks)
  • apps/portal/src/app/pay/testing-pay/page.mdx (0 hunks)
  • apps/portal/src/app/vault/sdk/api-reference/page.mdx (1 hunks)
  • apps/portal/src/app/vault/sdk/guides/access-tokens/page.mdx (1 hunks)
  • apps/portal/src/app/vault/sdk/guides/creating-eoas/page.mdx (1 hunks)
  • apps/portal/src/app/vault/sdk/guides/signing/page.mdx (1 hunks)
  • apps/portal/src/app/vault/sdk/installation/page.mdx (1 hunks)
  • apps/portal/src/app/vault/sdk/page.mdx (1 hunks)
  • apps/portal/src/app/vault/sidebar.tsx (2 hunks)
  • apps/portal/src/icons/products/ContractsIcon.tsx (0 hunks)
  • packages/service-utils/src/core/authorize/service.test.ts (2 hunks)
  • packages/service-utils/src/core/authorize/service.ts (3 hunks)
  • packages/thirdweb/CHANGELOG.md (1 hunks)
  • packages/thirdweb/package.json (1 hunks)
  • packages/thirdweb/src/bridge/Buy.ts (5 hunks)
  • packages/thirdweb/src/bridge/Chains.ts (2 hunks)
  • packages/thirdweb/src/bridge/Onramp.ts (6 hunks)
  • packages/thirdweb/src/bridge/OnrampStatus.ts (2 hunks)
  • packages/thirdweb/src/bridge/Routes.test.ts (1 hunks)
  • packages/thirdweb/src/bridge/Routes.ts (2 hunks)
  • packages/thirdweb/src/bridge/Sell.ts (5 hunks)
  • packages/thirdweb/src/bridge/Status.ts (2 hunks)
  • packages/thirdweb/src/bridge/Transfer.ts (4 hunks)
  • packages/thirdweb/src/bridge/index.ts (1 hunks)
  • packages/thirdweb/src/bridge/types/BridgeAction.ts (1 hunks)
  • packages/thirdweb/src/bridge/types/Errors.ts (1 hunks)
  • packages/thirdweb/src/bridge/types/Route.ts (2 hunks)
  • packages/thirdweb/src/pay/buyWithCrypto/getQuote.ts (3 hunks)
  • packages/thirdweb/src/pay/buyWithCrypto/getTransfer.ts (2 hunks)
  • packages/thirdweb/src/pay/buyWithFiat/getPostOnRampQuote.ts (3 hunks)
  • packages/thirdweb/src/pay/buyWithFiat/getQuote.ts (2 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/BuyScreen.tsx (6 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/PayProviderSelection.tsx (1 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/PayWIthCreditCard.tsx (1 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/FiatScreenContent.tsx (9 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/OnRampScreen.tsx (8 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/Providers.tsx (2 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/swap/SwapScreenContent.tsx (5 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.tsx (3 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/swap/TransferFlow.tsx (1 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/swap/useSwapSupportedChains.ts (1 hunks)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/utils.ts (1 hunks)
  • packages/thirdweb/src/react/web/ui/PayEmbed.tsx (2 hunks)
  • packages/thirdweb/src/react/web/utils/errors.ts (2 hunks)
  • packages/wagmi-adapter/CHANGELOG.md (1 hunks)
  • packages/wagmi-adapter/package.json (1 hunks)
💤 Files with no reviewable changes (7)
  • apps/dashboard/src/constants/urls.ts
  • .changeset/ten-parrots-poke.md
  • apps/portal/src/app/pay/testing-pay/page.mdx
  • apps/dashboard/src/stories/stubs.ts
  • apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/getAccountUsage.ts
  • apps/portal/src/app/page.tsx
  • apps/portal/src/icons/products/ContractsIcon.tsx
✅ Files skipped from review due to trivial changes (27)
  • .changeset/blue-comics-doubt.md
  • .changeset/blue-mice-prove.md
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/swap/useSwapSupportedChains.ts
  • .changeset/slick-apes-do.md
  • apps/dashboard/src/constants/addresses.ts
  • packages/thirdweb/package.json
  • packages/wagmi-adapter/package.json
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/PayWIthCreditCard.tsx
  • .changeset/tired-rice-kiss.md
  • packages/thirdweb/src/bridge/index.ts
  • packages/thirdweb/src/bridge/types/Route.ts
  • packages/thirdweb/src/bridge/types/BridgeAction.ts
  • apps/dashboard/src/app/nebula-app/(app)/utils/nebulaThirdwebClient.ts
  • packages/service-utils/src/core/authorize/service.ts
  • apps/portal/src/app/knowledge-base/troubleshoot/contracts/embed-feature-not-found/page.mdx
  • packages/wagmi-adapter/CHANGELOG.md
  • apps/portal/src/app/knowledge-base/layout.tsx
  • apps/portal/src/app/knowledge-base/onchain-common-errors/thirdweb-cli/device-link-error/page.mdx
  • apps/portal/src/app/vault/sdk/guides/creating-eoas/page.mdx
  • apps/dashboard/src/app/pay/constants.ts
  • apps/portal/src/app/knowledge-base/troubleshoot/page.mdx
  • apps/portal/src/app/knowledge-base/troubleshoot/contracts/airdrop-contract/page.mdx
  • apps/portal/src/app/vault/sdk/installation/page.mdx
  • apps/dashboard/src/app/pay/components/client/PaymentLinkForm.client.tsx
  • apps/portal/src/app/knowledge-base/how-to/console-error-sharing/page.mdx
  • apps/portal/src/app/vault/sdk/api-reference/page.mdx
  • packages/thirdweb/CHANGELOG.md
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/Providers.tsx
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/utils.ts
  • packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/FiatScreenContent.tsx
🧰 Additional context used
🧬 Code Graph Analysis (16)
apps/dashboard/src/app/(app)/team/page.tsx (1)
apps/dashboard/src/@/api/team.ts (1)
  • getLastVisitedTeam (87-104)
packages/thirdweb/src/bridge/Status.ts (2)
packages/thirdweb/src/bridge/index.ts (1)
  • ApiError (20-20)
packages/thirdweb/src/bridge/types/Errors.ts (1)
  • ApiError (8-24)
packages/thirdweb/src/bridge/Routes.ts (2)
packages/thirdweb/src/bridge/index.ts (1)
  • ApiError (20-20)
packages/thirdweb/src/bridge/types/Errors.ts (1)
  • ApiError (8-24)
apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/ecosystem/[slug]/(active)/components/EcosystemSlugLayout.tsx (1)
apps/dashboard/src/@/api/team.ts (1)
  • getTeamBySlug (11-30)
packages/thirdweb/src/bridge/OnrampStatus.ts (2)
packages/thirdweb/src/bridge/index.ts (1)
  • ApiError (20-20)
packages/thirdweb/src/bridge/types/Errors.ts (1)
  • ApiError (8-24)
apps/dashboard/src/@3rdweb-sdk/react/hooks/useApi.ts (1)
apps/dashboard/src/@/actions/proxies.ts (1)
  • apiServerProxy (82-84)
packages/thirdweb/src/bridge/Transfer.ts (1)
packages/thirdweb/src/bridge/types/Errors.ts (1)
  • ApiError (8-24)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/components/ProjectFTUX/SecretKeySection.tsx (1)
apps/dashboard/src/@3rdweb-sdk/react/hooks/useApi.ts (1)
  • rotateSecretKeyClient (325-343)
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/OnRampScreen.tsx (1)
packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/utils.ts (1)
  • uppercaseFirstLetter (5-7)
apps/dashboard/src/@/api/universal-bridge/links.ts (2)
apps/dashboard/src/@/api/universal-bridge/constants.ts (1)
  • UB_BASE_URL (1-1)
apps/dashboard/src/@/constants/server-envs.ts (1)
  • DASHBOARD_THIRDWEB_SECRET_KEY (8-9)
packages/thirdweb/src/bridge/Buy.ts (1)
packages/thirdweb/src/bridge/types/Errors.ts (1)
  • ApiError (8-24)
packages/thirdweb/src/bridge/Sell.ts (2)
packages/thirdweb/src/bridge/index.ts (1)
  • ApiError (20-20)
packages/thirdweb/src/bridge/types/Errors.ts (1)
  • ApiError (8-24)
packages/thirdweb/src/bridge/Onramp.ts (2)
packages/thirdweb/src/bridge/index.ts (1)
  • ApiError (20-20)
packages/thirdweb/src/bridge/types/Errors.ts (1)
  • ApiError (8-24)
packages/thirdweb/src/react/web/utils/errors.ts (1)
packages/thirdweb/src/bridge/types/Errors.ts (1)
  • ApiError (8-24)
apps/dashboard/src/app/pay/components/client/PayPageEmbed.client.tsx (2)
apps/dashboard/src/app/pay/constants.ts (1)
  • payAppThirdwebClient (45-45)
packages/thirdweb/src/react/web/ui/PayEmbed.tsx (1)
  • PayEmbed (309-424)
apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/settings/ProjectGeneralSettingsPage.tsx (1)
apps/dashboard/src/@3rdweb-sdk/react/hooks/useApi.ts (1)
  • rotateSecretKeyClient (325-343)
🪛 LanguageTool
apps/portal/src/app/knowledge-base/get-started/page.mdx

[style] ~63-~63: Consider using a different verb to strengthen your wording.
Context: ...web.com/support), and we’ll be happy to help you!

(HELP_ASSIST)

apps/portal/src/app/knowledge-base/how-to/creating-soulbound-nfts/page.mdx

[grammar] ~26-~26: This is normally spelled as one word.
Context: ...plorer** tab. 4. Choose revokeRole under write The revokeRole function requir...

(UNDER_COMPOUNDS)

apps/portal/src/app/knowledge-base/how-to/deploy-mint-template/page.mdx

[uncategorized] ~59-~59: Loose punctuation mark.
Context: ...) - NEXT_PUBLIC_THIRDWEB_CLIENT_ID: Your thirdweb Client ID - `THIRDWEB...

(UNLIKELY_OPENING_PUNCTUATION)

apps/portal/src/app/knowledge-base/page.mdx

[style] ~63-~63: Consider using a different verb to strengthen your wording.
Context: ...web.com/support), and we’ll be happy to help you!

(HELP_ASSIST)

apps/portal/src/app/knowledge-base/troubleshoot/contracts/batch-upload/page.mdx

[misspelling] ~13-~13: This word is normally spelled as one.
Context: ...quests—turn them off temporarily. - Anti-virus software can also interfere—pause it ...

(EN_COMPOUNDS_ANTI_VIRUS)

apps/portal/src/app/vault/sdk/guides/access-tokens/page.mdx

[uncategorized] ~3-~3: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ... Tokens Access tokens let you delegate finely-scoped permissions to services, cron jobs or e...

(HYPHENATED_LY_ADVERB_ADJECTIVE)

apps/portal/src/app/vault/sdk/guides/signing/page.mdx

[typographical] ~3-~3: It appears that a comma is missing.
Context: ...igning Transactions & Messages In this guide we will request signatures from the Vau...

(DURING_THAT_TIME_COMMA)

apps/portal/src/app/vault/sdk/page.mdx

[misspelling] ~19-~19: This word is normally spelled as one.
Context: ...Create EOAs (wallets)* – generate new non-custodial accounts inside the Vault. 3. **Sign pa...

(EN_COMPOUNDS_NON_CUSTODIAL)

🔇 Additional comments (101)
apps/portal/src/app/vault/sidebar.tsx (1)

51-85: LGTM: Well-structured SDK navigation section

The TypeScript SDK navigation section is well-organized with appropriate nesting of links and logical grouping of content (overview, installation, API reference, and guides). The structure follows the same pattern as existing sections.

apps/portal/src/app/vault/sdk/page.mdx (1)

1-71: LGTM: Comprehensive SDK overview

This page provides a clear introduction to the Vault SDK, explaining its purpose, capabilities, and basic usage. The code example effectively demonstrates the core workflow of connecting to a Vault instance, creating an EOA, and signing a message.

🧰 Tools
🪛 LanguageTool

[misspelling] ~19-~19: This word is normally spelled as one.
Context: ...Create EOAs (wallets)* – generate new non-custodial accounts inside the Vault. 3. **Sign pa...

(EN_COMPOUNDS_NON_CUSTODIAL)

apps/portal/src/app/vault/sdk/guides/signing/page.mdx (1)

5-126: LGTM: Well-structured signing guide

The guide provides clear examples for signing different types of payloads with appropriate explanations and code samples. The error handling section at the end is particularly valuable for production usage.

apps/portal/src/app/vault/sdk/guides/access-tokens/page.mdx (1)

1-105: LGTM: Comprehensive access token management guide

This guide effectively explains the token lifecycle from creation to revocation, with clear distinction between base tokens and derived SATs. The best practices section provides valuable security guidance.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~3-~3: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ... Tokens Access tokens let you delegate finely-scoped permissions to services, cron jobs or e...

(HYPHENATED_LY_ADVERB_ADJECTIVE)

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TransactionsCard.tsx (1)

122-124: Improved trend calculation logic.

The change reduces the minimum required data points from 3 to 2 and uses the first data point as the baseline for trend calculation instead of a later point. This modification provides a more comprehensive view of trends over the entire time period rather than just recent changes.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/analytics/page.tsx (2)

323-328: Improved aggregate function logic for active users.

The new implementation correctly handles active users by taking the maximum value rather than summing, which makes more sense for this metric type. For active users, the peak value is more meaningful than the sum since users may be counted multiple times across different days.


330-332: Improved trend calculation consistency.

The change aligns the trend calculation with other dashboard components by reducing the minimum required data points from 3 to 2 and using the first data point as the baseline. This provides a better view of growth over the entire period.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/page.tsx (2)

379-384: Improved aggregate function logic for active users.

The implementation now correctly handles active users by returning the maximum value rather than summing values, which is more appropriate for this metric. For metrics like active users, the peak value is more meaningful than the sum.


386-388: Improved trend calculation consistency.

The modification standardizes trend calculation across dashboard components by reducing the minimum required data points from 3 to 2 and using the first data point as the baseline. This provides a more accurate representation of overall growth.

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/_components/TotalSponsoredCard.tsx (1)

121-123: Standardized trend calculation logic.

The change aligns this component's trend calculation with other dashboard components by reducing the minimum required data points from 3 to 2 and using the first data point as the baseline. This provides a more consistent user experience across the dashboard.

apps/dashboard/src/app/(app)/team/page.tsx (1)

4-7: Redirect logic looks correct and concise

The new implementation cleanly replaces the previous notFound() call with a redirect to the placeholder path. No functional or security concerns spotted here.

apps/portal/src/app/knowledge-base/how-to/creating-soulbound-nfts/page.mdx (1)

1-48: Comprehensive and well-structured documentation for Soulbound Tokens

This new documentation page effectively explains the concept of Soulbound Tokens and provides clear step-by-step instructions for implementation using thirdweb. The content is well-organized with appropriate headings, steps are numbered logically, and image references enhance comprehension.

🧰 Tools
🪛 LanguageTool

[grammar] ~26-~26: This is normally spelled as one word.
Context: ...plorer** tab. 4. Choose revokeRole under write The revokeRole function requir...

(UNDER_COMPOUNDS)

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/components/ProjectFTUX/ProjectFTUX.tsx (1)

63-68: Successfully added required team context for secret key operations

The addition of the teamId prop to the SecretKeySection component properly aligns with the API changes that now require team context for secret key rotation operations.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/nebula/page.tsx (1)

61-66: Team ID correctly propagated to NebulaFTUX component

The addition of the teamId prop to the NebulaFTUX component ensures consistent team context propagation for secret key operations, aligning with the broader API changes.

apps/portal/src/app/Header.tsx (2)

124-129: Successfully added Nebula API reference to navigation

The addition of the Nebula entry to the APIs dropdown menu provides users with easy access to the new Nebula API documentation, consistent with the introduction of Nebula-related features.


144-147: Support link updated to use internal knowledge base

The support link now points to the internal knowledge base instead of an external URL, improving the user experience by keeping users within the application ecosystem.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/nebula/nebula-ftux.tsx (2)

7-7: LGTM: Added required teamId prop to component

The addition of the teamId parameter is consistent with the pattern of explicitly passing team context to components that handle project settings.


54-54: LGTM: Correctly propagating teamId to child component

The teamId prop is properly passed down to the SecretKeySection component, ensuring the team context is available for secret key operations.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/components/ProjectFTUX/SecretKeySection.tsx (2)

9-9: LGTM: Added required teamId prop to component

The addition of the teamId parameter aligns with the changes in the parent component and the updated API requirements.


30-33: LGTM: Updated API call to include teamId parameter

The rotateSecretKeyClient function call has been correctly updated to pass both teamId and projectId as required by the updated API signature. This change ensures proper team context is available for secret key rotation operations.

apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/settings/ProjectGeneralSettingsPage.tsx (1)

168-171: LGTM: Updated API call to include teamId parameter

The rotateSecretKeyClient function call has been correctly updated to pass both teamId and projectId as required by the updated API signature. This ensures consistency with the changes in other components and proper team context for secret key operations.

apps/portal/src/app/knowledge-base/troubleshoot/contracts/batch-upload/page.mdx (1)

1-24: Good addition of troubleshooting documentation

The new troubleshooting guide provides clear, concise instructions for users experiencing batch upload issues.

🧰 Tools
🪛 LanguageTool

[misspelling] ~13-~13: This word is normally spelled as one.
Context: ...quests—turn them off temporarily. - Anti-virus software can also interfere—pause it ...

(EN_COMPOUNDS_ANTI_VIRUS)

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/page.tsx (1)

33-33: LGTM: Simplified data fetching by removing accountUsage dependency.

The code now directly uses the team capabilities data instead of relying on a separate accountUsage fetch, which streamlines the component and reduces API calls.

Also applies to: 49-49

apps/dashboard/src/app/(app)/team/[team_slug]/(team)/~/usage/overview/components/Usage.tsx (1)

7-7: LGTM: Refactored to access rate limits directly from team.capabilities.

The component now accesses rate limit information directly from the team.capabilities object instead of a separate usage prop, which is a cleaner approach. Both the gateway metrics calculation and RPC requests description now use the appropriate values from team.capabilities.

Also applies to: 50-50, 56-56, 133-133

apps/dashboard/src/@3rdweb-sdk/react/hooks/useApi.ts (1)

325-328: LGTM: Improved rotateSecretKeyClient API signature and endpoint.

The function now accepts both teamId and projectId as named parameters, making the API more explicit and maintainable. The endpoint path has been updated to follow RESTful conventions for hierarchical resources.

Also applies to: 330-331, 332-332

apps/portal/src/app/knowledge-base/sidebar.tsx (1)

1-78: Well-structured sidebar for the new knowledge base section.

The sidebar configuration provides a clear, hierarchical navigation structure for the knowledge base with logical groupings of content. The use of icons and expanded states enhances the user experience.

apps/portal/src/app/knowledge-base/how-to/deploy-mint-template/page.mdx (1)

44-44: Verify the thirdweb dashboard link placeholder
The URL https://thirdweb.com/team/~/~/ contains ~ characters as placeholders—please confirm and update it to point to the actual dashboard route (e.g., your team’s slug or a generic link).

packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/swap/TransferFlow.tsx (1)

26-26: Type definition added correctly for payment link support

The addition of the optional paymentLinkId parameter to the TransferFlowProps type allows proper propagation of payment link data through the component hierarchy.

packages/thirdweb/src/react/web/ui/PayEmbed.tsx (3)

148-151: Properly documented hidden prop for payment link support

The addition of the paymentLinkId property with the @hidden JSDoc tag indicates this is for internal use or experimental functionality.


373-373: Correctly propagating payment link ID to child component

The paymentLinkId is properly passed down to the BuyScreen component, ensuring the payment link information flows through the component hierarchy.


1-424: Inconsistency between PR objectives and implementation

The PR objectives mention adding supportedProviders to payOptions.buyWithFiat, but the changes in this file are related to payment link functionality instead.

Can you confirm if this PR is intended to include both payment link support and the supportedProviders feature? The PR description focuses on provider selection, but the changes here are for payment links.

packages/thirdweb/src/bridge/Routes.test.ts (1)

158-158: Updated error message format in test

The test's expected error message has been simplified to match the new error handling approach using the structured ApiError class instead of a string with error code prefix.

packages/thirdweb/src/pay/buyWithCrypto/getTransfer.ts (2)

64-67: Added hidden parameter for payment link support

The paymentLinkId parameter is properly added to the GetBuyWithCryptoTransferParams type with appropriate JSDoc documentation.


135-135: Correctly propagating payment link ID to API call

The paymentLinkId is properly passed to the Transfer.prepare function, ensuring the payment link information is included in the API request.

packages/thirdweb/src/pay/buyWithFiat/getQuote.ts (2)

98-102: New paymentLinkId parameter added appropriately

The addition of this hidden parameter enables support for payment links in the fiat quote flow, aligning with the broader payment link integration across the SDK.


329-329: Correctly forwarding paymentLinkId to the prepareOnramp call

The parameter is properly passed through to the underlying bridge API call, ensuring payment link context is maintained throughout the fiat onramp flow.

packages/thirdweb/src/pay/buyWithCrypto/getQuote.ts (2)

87-90: New paymentLinkId parameter added appropriately

The addition of this hidden parameter enables support for payment links in the crypto quote flow, matching the same pattern used in the fiat quote implementation.


211-211: Correctly forwarding paymentLinkId to bridge preparation calls

The parameter is properly passed to both Bridge.Buy.prepare and Bridge.Sell.prepare calls, ensuring consistent payment link propagation across different crypto transaction flows.

Also applies to: 233-233

packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.tsx (3)

55-55: New paymentLinkId prop added to component interface

The type definition is correct, allowing for either undefined or string values to maintain backward compatibility.


74-74: Properly destructured the paymentLinkId from props

Good practice to destructure at the component level for clean access throughout the component.


110-110: Correctly passing paymentLinkId to getBuyWithCryptoTransfer

The parameter is properly forwarded to the transfer function, completing the payment link propagation chain through the UI component.

packages/thirdweb/src/bridge/Routes.ts (2)

5-5: Imported structured ApiError class for improved error handling

Using a standardized error class across the bridge modules is a good practice for consistent error reporting.


166-171: Enhanced error handling with structured ApiError

The implementation properly:

  • Extracts error information from the response
  • Provides fallbacks for missing fields
  • Includes correlation ID for tracing
  • Preserves HTTP status code

This is a significant improvement over generic error strings, offering consumers of the API more detailed error information and enabling better error handling.

packages/service-utils/src/core/authorize/service.test.ts (2)

34-36: Test assertion improved for flexibility.

The test assertion has been updated to use toContain() instead of an exact match, which allows for more flexibility as error messages may now include additional context information about teams or projects.


55-57: Consistent approach to testing error messages.

This change follows the same pattern as the previous test case, using toContain() to match partial error messages. This is a good practice as it makes tests more resilient to non-functional changes in error message formatting or additional context.

packages/thirdweb/src/bridge/Chains.ts (2)

5-5: Added import for structured error handling.

The import of ApiError aligns with the broader initiative to standardize error handling across the bridge modules.


63-68: Enhanced error handling with structured ApiError.

The implementation of structured error handling using ApiError is a significant improvement over generic error strings. This approach provides more consistent, detailed error information including error codes, correlation IDs, and status codes that can be properly handled by consumers.

The fallback mechanisms for each property are well-designed:

  • Defaults to "UNKNOWN_ERROR" if no code is provided
  • Falls back to HTTP status text if no message is provided
  • Includes correlation ID when available
  • Always includes the HTTP status code
packages/thirdweb/src/bridge/OnrampStatus.ts (2)

5-5: Added import for consistent error handling.

The import of ApiError is consistent with the standardization of error handling across bridge modules.


76-81: Standardized error handling with ApiError.

This implementation of structured error handling follows the same pattern as other bridge modules, ensuring consistency in how API errors are reported and handled throughout the codebase.

The error structure includes all essential components:

  • Error code with "UNKNOWN_ERROR" fallback
  • Descriptive message with HTTP status text fallback
  • Optional correlation ID for tracking
  • HTTP status code for appropriate error handling
packages/thirdweb/src/pay/buyWithFiat/getPostOnRampQuote.ts (3)

24-29: Added optional paymentLinkId parameter.

The addition of an optional, hidden paymentLinkId parameter to the type definition enables support for payment link functionality while maintaining backward compatibility.

The @hidden JSDoc tag appropriately indicates this is an internal parameter not meant for direct API consumption.


69-70: Updated function signature with paymentLinkId.

The function signature has been updated to include the new optional parameter, maintaining consistency with the type definition.


86-87: Propagated paymentLinkId to underlying quote function.

The parameter is correctly passed through to the getBuyWithCryptoQuote call, ensuring the payment link context is maintained throughout the flow.

packages/thirdweb/src/bridge/Status.ts (2)

6-6: Good addition of the ApiError import

Importing the structured ApiError class will help standardize error handling across the bridge modules.


119-124: Great enhancement to error handling

Replacing the generic error throw with a structured ApiError instance provides more detailed error information with code, message, correlationId, and statusCode. This standardized approach will make debugging and error handling more consistent and informative.

The fallback patterns for missing error fields are well-implemented:

  • Using "UNKNOWN_ERROR" as default code
  • Falling back to response.statusText for message
  • Properly handling optional correlationId
packages/thirdweb/src/bridge/Transfer.ts (4)

7-7: Good addition of the ApiError import

Importing the structured ApiError class will help standardize error handling across the bridge modules.


193-193: Well-implemented paymentLinkId parameter

The addition of the paymentLinkId parameter to the function options and request body is properly implemented, allowing for payment link support in the transfer flow.

Also applies to: 213-213


218-223: Great enhancement to error handling

Replacing the generic error throw with a structured ApiError instance provides more detailed error information with code, message, correlationId, and statusCode. This standardized approach will make debugging and error handling more consistent and informative.

The fallback patterns for missing error fields are well-implemented:

  • Using "UNKNOWN_ERROR" as default code
  • Falling back to response.statusText for message
  • Properly handling optional correlationId

263-267: Good type definition with appropriate JSDoc tag

The paymentLinkId parameter is properly typed with string and marked as optional. The @hidden JSDoc tag correctly indicates that this is an internal parameter not meant for public API documentation.

packages/thirdweb/src/bridge/Buy.ts (5)

7-7: Good addition of the ApiError import

Importing the structured ApiError class will help standardize error handling across the bridge modules.


131-136: Great enhancement to error handling in quote function

Replacing the generic error throw with a structured ApiError instance provides more detailed error information with code, message, correlationId, and statusCode. This standardized approach will make debugging and error handling more consistent and informative.

The fallback patterns for missing error fields are well-implemented:

  • Using "UNKNOWN_ERROR" as default code
  • Falling back to response.statusText for message
  • Properly handling optional correlationId

339-339: Well-implemented paymentLinkId parameter

The addition of the paymentLinkId parameter to the prepare function options and request body is properly implemented, allowing for payment link support in the buy flow.

Also applies to: 361-361


366-371: Great enhancement to error handling in prepare function

Consistent with the quote function, the prepare function now uses the structured ApiError class with the same well-implemented fallback patterns for missing error fields.


414-417: Good type definition with appropriate JSDoc tag

The paymentLinkId parameter is properly typed with string and marked as optional. The @hidden JSDoc tag correctly indicates that this is an internal parameter not meant for public API documentation.

packages/thirdweb/src/bridge/Sell.ts (5)

7-7: Good addition of the ApiError import

Importing the structured ApiError class will help standardize error handling across the bridge modules.


130-135: Great enhancement to error handling in quote function

Replacing the generic error throw with a structured ApiError instance provides more detailed error information with code, message, correlationId, and statusCode. This standardized approach will make debugging and error handling more consistent and informative.

The fallback patterns for missing error fields are well-implemented:

  • Using "UNKNOWN_ERROR" as default code
  • Falling back to response.statusText for message
  • Properly handling optional correlationId

330-330: Well-implemented paymentLinkId parameter

The addition of the paymentLinkId parameter to the prepare function options and request body is properly implemented, allowing for payment link support in the sell flow.

Also applies to: 352-352


357-362: Great enhancement to error handling in prepare function

Consistent with the quote function, the prepare function now uses the structured ApiError class with the same well-implemented fallback patterns for missing error fields.


407-410: Good type definition with appropriate JSDoc tag

The paymentLinkId parameter is properly typed with string and marked as optional. The @hidden JSDoc tag correctly indicates that this is an internal parameter not meant for public API documentation.

apps/dashboard/src/app/pay/page.tsx (3)

8-8: Good use of centralized client instance.

Importing the centralized payAppThirdwebClient from constants is a good practice that improves consistency and maintainability, replacing the previous dynamic client creation approach.


22-22: Appropriate function renaming for clarity.

Renaming from RoutesPage to PayPage improves code readability and better reflects the component's purpose within the pay app.


61-61: Consistent client usage.

Using the centralized payAppThirdwebClient instead of dynamically creating a client ensures consistent configuration across the pay app.

packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/BuyScreen.tsx (2)

86-86: Well structured type extension for payment link support.

Good practice adding the optional paymentLinkId property to both interface types to ensure type safety throughout the component hierarchy.

Also applies to: 155-155


352-353: Consistent property propagation.

The paymentLinkId is appropriately passed down to all relevant child components, ensuring proper data flow through the component hierarchy for payment link tracking.

Also applies to: 401-402, 537-538, 593-594

packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/fiat/OnRampScreen.tsx (3)

47-47: Good use of utility function.

Importing the uppercaseFirstLetter utility function promotes code reuse and consistency across the codebase.


75-75: Complete propagation of payment link data.

The paymentLinkId is correctly propagated through all the necessary components, hooks, and API calls in the onramp flow, ensuring consistent tracking throughout the payment process.

Also applies to: 90-91, 294-295, 329-330, 623-624, 655-656


217-218: Improved string formatting with utility function.

Replacing manual string capitalization with the uppercaseFirstLetter utility function improves code maintainability and consistency.

packages/thirdweb/src/bridge/types/Errors.ts (2)

1-7: Well-defined error type system.

The ErrorCode type clearly defines specific error categories, making error handling more predictable and structured throughout the application.


8-24: Excellent structured error handling implementation.

The ApiError class extends the native Error class with additional typed properties, providing a consistent structure for API-related errors. This improves error reporting, debugging, and user feedback throughout the application.

Consider adding a static factory method for common error patterns to simplify error creation in API handlers:

static fromApiResponse(response: {
  status: number;
  data: { code: ErrorCode; message: string; correlationId?: string }
}): ApiError {
  return new ApiError({
    code: response.data.code,
    message: response.data.message,
    statusCode: response.status,
    correlationId: response.data.correlationId
  });
}
apps/dashboard/src/@/api/universal-bridge/links.ts (4)

1-4: Clean server-side module import and constant declarations.

The server-only import and constants are properly set up for a server-side API module.


6-18: Well-structured PaymentLink type definition.

The PaymentLink type is comprehensive and properly typed, with appropriate handling for the bigint amount field.


20-35: API endpoint connection properly implemented.

The function correctly accepts a payment ID and constructs an authenticated request to the universal bridge API endpoint.


36-45: Proper data transformation from API response.

The function correctly extracts and transforms the API response data, especially the bigint conversion for the amount field.

apps/dashboard/src/app/pay/[id]/page.tsx (3)

1-8: Well-organized imports and dependencies.

All necessary imports are properly defined for the payment page functionality.


9-19: Clear metadata definition for SEO.

The page metadata is properly defined with title and description for both regular and OpenGraph contexts.


56-68: Payment page component with proper props forwarding.

The component correctly forwards all necessary props to the PayPageEmbed component, including the new paymentLinkId.

packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/swap/SwapScreenContent.tsx (4)

57-57: New paymentLinkId prop added.

The paymentLinkId prop is properly added to the component props interface.


124-124: Payment link ID correctly integrated into quote parameters.

The paymentLinkId is properly forwarded to the bridge API via the quote parameters.


290-297: Simplified error message display.

The error message display has been streamlined to consistently show both the error title and message.


363-363: Improved consistency in spinner theming.

The spinner color has been updated from "accentText" to "accentButtonText" for better consistency with the button styling.

packages/thirdweb/src/bridge/Onramp.ts (6)

6-6: Improved error handling with ApiError import.

The structured ApiError class is now used instead of generic Error instances, which will provide more consistent error handling.


55-55: Added paymentLinkId to API request body interface.

The paymentLinkId field is properly added to the OnrampApiRequestBody interface.


147-147: PaymentLinkId properly destructured from options.

The paymentLinkId is correctly extracted from the function options.


186-188: Conditional inclusion of paymentLinkId in request body.

The paymentLinkId is properly added to the API request body only when it's defined.


200-205: Enhanced error handling with structured ApiError.

The error handling has been improved by using the structured ApiError class, which includes error code, message, correlation ID, and status code.


250-254: Proper documentation for paymentLinkId parameter.

The paymentLinkId parameter is correctly documented with the @hidden tag to indicate it's not part of the public API.

packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/PayProviderSelection.tsx (2)

13-18: Props structure looks appropriate for provider selection.

The component accepts a clear set of props that match the PR objectives: allowing for supported providers to be passed to PayEmbed. The supportedProviders array is required while preferredProvider and quotedProvider are optional, which provides good flexibility.


55-65: Conditional rendering based on provider count looks good.

The component intelligently switches between a clickable button with dropdown (for multiple providers) and a static text element (for single provider). This matches the PR objective of streamlining the UI when there's no need for provider selection.

apps/dashboard/src/app/pay/components/client/PayPageEmbed.client.tsx (3)

2-7: Client instantiation refactoring looks good.

The component now uses the centralized payAppThirdwebClient instance instead of creating dynamic clients. This is a good practice for consistency and performance.

Also applies to: 43-45


12-13: Added payment link support as described in PR objectives.

The component correctly introduces the optional paymentLinkId parameter and passes it to the PayEmbed component.

Also applies to: 22-24, 47-48


57-58: Amount handling updated appropriately.

The code now handles the optional amount parameter by providing a default value when none is provided.

packages/thirdweb/src/react/web/utils/errors.ts (1)

1-7: Good addition of structured error handling.

Using the imported ApiError type and defining a consistent UiError type improves error handling throughout the application.

@RobbyUitbeijerse RobbyUitbeijerse force-pushed the feature/payembed-supported-fiat-providers branch from 83e4fc2 to f729aab Compare May 22, 2025 13:42
@RobbyUitbeijerse RobbyUitbeijerse force-pushed the feature/payembed-supported-fiat-providers branch from f729aab to 2bc1f09 Compare May 22, 2025 13:43
@joaquim-verges joaquim-verges merged commit dd2fb1b into thirdweb-dev:main May 23, 2025
13 of 19 checks passed
@joaquim-verges joaquim-verges mentioned this pull request May 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Dashboard Involves changes to the Dashboard. packages Portal Involves changes to the Portal (docs) codebase. SDK Involves changes to the thirdweb SDK
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants