diff --git a/apps/portal/src/app/account/account-info/page.mdx b/apps/portal/src/app/account/account-info/page.mdx
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/apps/portal/src/app/engine/v2/configure-wallets/aws-kms/page.mdx b/apps/portal/src/app/engine/v2/configure-wallets/aws-kms/page.mdx
index 5581924f7f2..cf90be03058 100644
--- a/apps/portal/src/app/engine/v2/configure-wallets/aws-kms/page.mdx
+++ b/apps/portal/src/app/engine/v2/configure-wallets/aws-kms/page.mdx
@@ -7,12 +7,12 @@ export const metadata = {
};
-## AWS KMS wallet
+# AWS KMS wallet
An AWS KMS Wallet is a wallet securely stored in your AWS account. Engine can create and transact with the wallet, but not delete it.
- AWS KMS wallets are not currently supported on Engine Cloud. They are currently supported on Engine Dedicated v2, and will be available soon with Dedicated v3.
+ AWS KMS wallets are not currently supported on Engine Cloud. They are currently supported on Engine Dedicated v2, and will be available soon with Dedicated v3.
diff --git a/apps/portal/src/app/engine/v2/configure-wallets/circle-wallet/page.mdx b/apps/portal/src/app/engine/v2/configure-wallets/circle-wallet/page.mdx
index f9e3087151c..b5769c951c9 100644
--- a/apps/portal/src/app/engine/v2/configure-wallets/circle-wallet/page.mdx
+++ b/apps/portal/src/app/engine/v2/configure-wallets/circle-wallet/page.mdx
@@ -6,7 +6,7 @@ export const metadata = {
"Learn how to set up a Circle wallet with thirdweb Engine.",
};
-## Circle Wallet
+# Circle Wallet
[Circle Programmable Wallets](https://developers.circle.com/w3s/programmable-wallets) is a Wallet as a Service (WaaS) solution designed to simplify the creation and management of secure Web3 wallets and their private keys. Engine can create and transact with the wallet, but not delete it.
diff --git a/apps/portal/src/app/engine/v2/configure-wallets/gcp-kms/page.mdx b/apps/portal/src/app/engine/v2/configure-wallets/gcp-kms/page.mdx
index 58e72dd2843..5fdc4eb2462 100644
--- a/apps/portal/src/app/engine/v2/configure-wallets/gcp-kms/page.mdx
+++ b/apps/portal/src/app/engine/v2/configure-wallets/gcp-kms/page.mdx
@@ -1,6 +1,6 @@
import { Details } from "@doc";
-## Google Cloud KMS wallet
+# Google Cloud KMS wallet
A Google Cloud KMS Wallet is a wallet securely stored in your Google Cloud account. Engine can create and transact with the wallet, but not delete it.
diff --git a/apps/portal/src/app/engine/v2/configure-wallets/server-wallet/page.mdx b/apps/portal/src/app/engine/v2/configure-wallets/server-wallet/page.mdx
index 87ce8b017b9..559381acac0 100644
--- a/apps/portal/src/app/engine/v2/configure-wallets/server-wallet/page.mdx
+++ b/apps/portal/src/app/engine/v2/configure-wallets/server-wallet/page.mdx
@@ -1,6 +1,6 @@
import { Details } from "@doc";
-## Smart Server Wallets
+# Smart Server Wallets
Smart server wallets are the recommended way to perform blockchain operations with Engine. Each smart server wallet consists of an EOA (managed internally by Engine) and a smart account (using thirdweb's default account implementation).
diff --git a/apps/portal/src/app/engine/v2/features/backend-wallets/page.mdx b/apps/portal/src/app/engine/v2/features/backend-wallets/page.mdx
index 560f6a2b455..5212095a51b 100644
--- a/apps/portal/src/app/engine/v2/features/backend-wallets/page.mdx
+++ b/apps/portal/src/app/engine/v2/features/backend-wallets/page.mdx
@@ -7,7 +7,7 @@ export const metadata = createMetadata({
"Engine performs blockchain actions using server wallets that you own and manage.",
});
-## Create a wallet
+# Create a wallet
For AWS or Google Cloud KMS wallets, you must provide your credentials.
diff --git a/apps/portal/src/app/nebula/api-reference/chat/page.mdx b/apps/portal/src/app/nebula/api-reference/chat/page.mdx
index 11faeb82d91..c808d4a072e 100644
--- a/apps/portal/src/app/nebula/api-reference/chat/page.mdx
+++ b/apps/portal/src/app/nebula/api-reference/chat/page.mdx
@@ -1,11 +1,12 @@
import { EndpointMetadata } from './EndpointMetadata';
-
# Chat Actions
Chat actions represent blockchain transactions or operations that Nebula has prepared in response to your request. The response includes both a detailed explanation in the `message` field and the actual transaction data in the `actions` array.
+
+
**Example Response with Chat Action:**
```json
{
diff --git a/apps/portal/src/app/nebula/api-reference/clear-session/page.mdx b/apps/portal/src/app/nebula/api-reference/clear-session/page.mdx
index c019dd83bd1..6f9e4fec7b8 100644
--- a/apps/portal/src/app/nebula/api-reference/clear-session/page.mdx
+++ b/apps/portal/src/app/nebula/api-reference/clear-session/page.mdx
@@ -1,3 +1,5 @@
import { EndpointMetadata } from './EndpointMetadata';
+# Clear Session
+
\ No newline at end of file
diff --git a/apps/portal/src/app/nebula/api-reference/create-session/page.mdx b/apps/portal/src/app/nebula/api-reference/create-session/page.mdx
index c019dd83bd1..ef8dae5cb16 100644
--- a/apps/portal/src/app/nebula/api-reference/create-session/page.mdx
+++ b/apps/portal/src/app/nebula/api-reference/create-session/page.mdx
@@ -1,3 +1,5 @@
import { EndpointMetadata } from './EndpointMetadata';
+# Create Session
+
\ No newline at end of file
diff --git a/apps/portal/src/app/nebula/api-reference/delete-session/page.mdx b/apps/portal/src/app/nebula/api-reference/delete-session/page.mdx
index c019dd83bd1..0e3883e59d5 100644
--- a/apps/portal/src/app/nebula/api-reference/delete-session/page.mdx
+++ b/apps/portal/src/app/nebula/api-reference/delete-session/page.mdx
@@ -1,3 +1,5 @@
import { EndpointMetadata } from './EndpointMetadata';
+# Delete Session
+
\ No newline at end of file
diff --git a/apps/portal/src/app/nebula/api-reference/execute/page.mdx b/apps/portal/src/app/nebula/api-reference/execute/page.mdx
index c019dd83bd1..7840ffe8c4a 100644
--- a/apps/portal/src/app/nebula/api-reference/execute/page.mdx
+++ b/apps/portal/src/app/nebula/api-reference/execute/page.mdx
@@ -1,3 +1,5 @@
import { EndpointMetadata } from './EndpointMetadata';
+# Execute Action
+
\ No newline at end of file
diff --git a/apps/portal/src/app/nebula/api-reference/get-session/page.mdx b/apps/portal/src/app/nebula/api-reference/get-session/page.mdx
index c019dd83bd1..3118c8ecf43 100644
--- a/apps/portal/src/app/nebula/api-reference/get-session/page.mdx
+++ b/apps/portal/src/app/nebula/api-reference/get-session/page.mdx
@@ -1,3 +1,5 @@
import { EndpointMetadata } from './EndpointMetadata';
+# Get Session
+
\ No newline at end of file
diff --git a/apps/portal/src/app/nebula/api-reference/list-session/page.mdx b/apps/portal/src/app/nebula/api-reference/list-session/page.mdx
index c019dd83bd1..c49f63aa9a4 100644
--- a/apps/portal/src/app/nebula/api-reference/list-session/page.mdx
+++ b/apps/portal/src/app/nebula/api-reference/list-session/page.mdx
@@ -1,3 +1,5 @@
import { EndpointMetadata } from './EndpointMetadata';
+# List Sessions
+
\ No newline at end of file
diff --git a/apps/portal/src/app/nebula/api-reference/update-session/page.mdx b/apps/portal/src/app/nebula/api-reference/update-session/page.mdx
index c019dd83bd1..bd3f8a49d4f 100644
--- a/apps/portal/src/app/nebula/api-reference/update-session/page.mdx
+++ b/apps/portal/src/app/nebula/api-reference/update-session/page.mdx
@@ -1,3 +1,5 @@
import { EndpointMetadata } from './EndpointMetadata';
+# Update Session
+
\ No newline at end of file
diff --git a/apps/portal/src/app/pay/customization/connectbutton/page.mdx b/apps/portal/src/app/pay/customization/connectbutton/page.mdx
deleted file mode 100644
index e939585ca9a..00000000000
--- a/apps/portal/src/app/pay/customization/connectbutton/page.mdx
+++ /dev/null
@@ -1,162 +0,0 @@
-import { createMetadata, DocImage } from "@doc";
-export const metadata = createMetadata({
- image: {
- title: "thirdweb Payments - Customize ConnectButton",
- icon: "thirdweb",
- },
- title: "thirdweb Payments - Customize ConnectButton - thirdweb",
- description:
- "thirdweb Payments - Customizing ConnectButton onramps and crypto purchase flows",
-});
-
-# Customize ConnectButton
-
-Learn how to customize Payments within the `ConnectButton` interface. You can find a selection of popular customizations below. For the full list of props, you can [view the full reference](/references/typescript/v5/ConnectButtonProps).
-
----
-
-## Customize Supported Tokens
-
-You can enable users to select your token on a given chain by passing an array of `SupportedTokens`. Note that this array overrides all default tokens listed for that chain. Note that this will also show these tokens in the 'Send' screen to transfer tokens.
-
-```tsx
-
-```
-
----
-
-## Prefill Destination Token
-
-In the case you want your users to purchase your token by default in your application, you can choose to pre-fill the Payments purchase flow with `prefillBuy` .
-
-For example, if you wanted users to only purchase Ethereum on Base network, you could do as follows:
-
-```tsx
-import { base } from "thirdweb/chains";
-
-;
-```
-
-If you'd like to prefill a purchase with a native token, you can set the chain without passing a token:
-
-```tsx
-
-```
-
----
-
-## Preferred Provider
-
-You can specify which onramp provider to present to your users. By default, we choose a recommended provider based on the location of the user, KYC status, and currency. Please make sure your set provider is [available in your country](../onramp-providers).
-
-```tsx
-
-```
-
----
-
-## Disable Payment Methods
-
-In some cases, you may only want to show users fiat or crypto payment options for your onchain goods or services. You can do this by setting either `buyWithCrypto` or `buyWithFiat` to `false`.
-
-#### Disable Buy With Crypto
-
-```tsx
-
-```
-
-#### Disable Buy With Fiat
-
-```tsx
-
-```
-
----
-
-## Theme
-
-You can set the theme for the Payments component, which is set to `"dark"` by default. theme can be set to either `"dark"` , `"light"` or a custom theme object.
-
-We have [`lightTheme`](/references/typescript/v5/lightTheme) or [`darkTheme`](/references/typescript/v5/darkTheme) providers that you can override to kickstart customization.
-
-You can refer to our [`Theme`](/references/typescript/v5/Theme) page for a full view of customizable options if you’d prefer to create a custom theme from scratch.
-
-#### Provided Themes
-
-```tsx
-
-
-
-```
-
-#### Custom Theme
-
-```tsx
-import { darkTheme } from 'thirdweb/react';
-
-// Using custom theme
-
-
-```
diff --git a/apps/portal/src/app/pay/customization/send-transaction/page.mdx b/apps/portal/src/app/pay/customization/send-transaction/page.mdx
deleted file mode 100644
index 5c3c536ff16..00000000000
--- a/apps/portal/src/app/pay/customization/send-transaction/page.mdx
+++ /dev/null
@@ -1,153 +0,0 @@
-import { createMetadata, DocImage } from "@doc";
-export const metadata = createMetadata({
- image: {
- title: "thirdweb Payments - Customize sendTransaction",
- icon: "thirdweb",
- },
- title: "thirdweb Payments - Customize sendTransaction - thirdweb",
- description:
- "thirdweb Payments- Customizing point of sale onramps and crypto purchase flows",
-});
-
-# useSendTransaction Customization
-
-Learn how to customize the Payments interface when executing a transaction with `useSendTransaction`. You can find a selection of popular customizations below. For the full list of props, you can [view the full reference](/references/typescript/v5/SendTransactionConfig).
-
----
-
-## Customize Supported Tokens
-
-You can enable users to select your token on a given chain by passing an array of `SupportedTokens`. Note that this array overrides all default tokens listed for that chain.
-
-```tsx
-const { mutate: sendTransaction } = useSendTransaction({
- payModal: {
- supportedTokens: {
- "1": [
- {
- address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
- name: "USD Coin",
- symbol: "USDC",
- icon: usdcIcon,
- },
- ],
- },
- },
-});
-```
-
----
-
-## Prefill Destination Token
-
-In the case you want your users to purchase your token by default in your application, you can choose to pre-fill the Pay purchase flow with `prefillBuy` .
-
-For example, if you wanted users to only purchase Ethereum on Base network, you could do as follows:
-
-```tsx
-import { base } from "thirdweb/chains";
-
-const { mutate: sendTransaction } = useSendTransaction({
- payModal: {
- prefillBuy: {
- token: {
- address: "0x866a087038f7C12cf33EF91aC5b1AcE6Ac1DA788",
- name: "Base ETH",
- symbol: "ETH",
- icon: "...", // optional
- },
- chain: base,
- allowEdits: {
- amount: true, // allow editing buy amount
- token: false, // disable selecting buy token
- chain: false, // disable selecting buy chain
- },
- },
- },
-});
-```
-
-If you'd like to prefill a purchase with a native token, you can set the chain without passing a token:
-
-```tsx
-const { mutate: sendTransaction } = useSendTransaction({
- payModal: {
- prefillBuy: {
- chain: base,
- },
- },
-});
-```
-
----
-
-## Preferred Provider
-
-You can specify which onramp provider to present to your users. By default, we choose a recommended provider based on the location of the user, KYC status, and currency. Please make sure your set provider is [available in your country](../onramp-providers).
-
-```tsx
-const { mutate: sendTransaction } = useSendTransaction({
- payModal: {
- preferredProvider: "COINBASE" | "STRIPE" | "TRANSAK",
- },
-});
-```
-
----
-
-## Disable Payment Methods
-
-In some cases, you may only want to show users fiat or crypto payment options for your onchain goods or services. You can do this by setting either `buyWithCrypto` or `buyWithFiat` to `false`.
-
-#### Disable Buy With Crypto
-
-```tsx
-const { mutate: sendTransaction } = useSendTransaction({
- payModal: {
- buyWithCrypto: false,
- },
-});
-```
-
-#### Disable Buy With Fiat
-
-```tsx
-const { mutate: sendTransaction } = useSendTransaction({
- payModal: {
- buyWithFiat: false,
- },
-});
-```
-
----
-
-## Theme
-
-You can set the theme for the component, which is set to `"dark"` by default. theme can be set to either `"dark"` , `"light"` or a custom theme object.
-
-We have [`lightTheme`](/references/typescript/v5/lightTheme) or [`darkTheme`](/references/typescript/v5/darkTheme) providers that you can override to kickstart customization.
-
-You can refer to our [`Theme`](/references/typescript/v5/Theme) page for a full view of customizable options if you’d prefer to create a custom theme from scratch.
-
-#### Provided Themes
-
-```tsx
-const { mutate: sendTransaction } = useSendTransaction({
- payModal: {
- theme: "dark", // or "light"
- },
-});
-```
-
-#### Custom Theme
-
-```tsx
-import { darkTheme } from 'thirdweb/react';
-
-// Using custom theme
-const { mutate: sendTransaction } = useSendTransaction({
- payModal: {
- theme: darkTheme({ ... },
- }}
-);
-```
diff --git a/apps/portal/src/app/pay/faqs/page.mdx b/apps/portal/src/app/pay/faqs/page.mdx
deleted file mode 100644
index c44218bd365..00000000000
--- a/apps/portal/src/app/pay/faqs/page.mdx
+++ /dev/null
@@ -1,126 +0,0 @@
-import { createMetadata, Details } from "@doc";
-
-export const metadata = createMetadata({
- image: {
- title: "thirdweb Payments - FAQs",
- icon: "thirdweb",
- },
- title: "thirdweb Payments - FAQs - thirdweb",
- description: "thirdweb Payments - Frequently Asked Questions",
-});
-
-# FAQs
-
-
-thirdweb does not charge any fees for buy with fiat. Any fees on onramping are based on the onramp provider.
-
-
-
-For buying with crypto or swap fees, thirdweb charges a 0.3% protocol fee. Developers may monetize their application by charging additional fees on swap transactions. To set a fee in your project page, navigate to Payments > Settings to set this fee.
-
-
-
-Network fees, also referred to as miner fees, are paid to the miner for processing crypto transactions and securing the respective network. These fees do not go to thirdweb.
-
-
-
-Payments is an asset router that combines thirdweb's own onchain infrastructure with existing bridging and swapping protocols to find the optimal route for any given transaction.
-This can include intents, native bridges, third party bridges, cross-chain messaging protocols, thirdweb's custom bridges, and more. All routes are monitored and planned continuously for
-health, price, and speed to guarantee the best path every time.
-
-
-
-Payments is able to support most token that meet the following criteria:
-
-- The token must have sufficient liquidity
-- The token must be on a [supported Payments Chain](https://thirdweb.com/chainlist?service=pay).
-
-To request support for a token, please visit the Payments tab in your project dashboard > Settings > "Don't see your token listed?" component and fill out the chain and token address information.
-
-Payments will automatically kick off the token route discovery process. Please check back the Payments modal after 20-40 minutes for the requested token.
-
-
-
-Yes, Payments is designed to be agnostic to wallet infrastructure. You can use it with any wallet service.
-
-
-
-Apple Pay and Google Pay are supported through the onramp providers depending on region. Coinbase, Stripe, and Transak currently support Apple Pay. Transak supports Google Pay.
-
-
-
-Onramp options all require minimal KYC. This is done to comply with local regulations and to ensure the safety of our users.
-Please note: onramping with Coinbase does not require KYC for a purchase below $500 with debit card.
-
-
-
-We currently require a $1 minimum purchase for both stablecoin and non-stablecoin purchases through Buy With Fiat.
-
-Our transaction maximum starts from $1500 per week for new users and can increase over time to $10,000 per week.
-
-
-
-**Buy With Fiat** is available 160+ countries. The following countries are _UNSUPPORTED_:
-
-- Afghanistan
-- Africa (All Countries)
-- Belarus
-- Bolivia
-- China
-- Cuba
-- Colombia
-- Haiti
-- Honduras
-- Iran
-- Iraq
-- Latvia
-- Lebanon
-- Myanmar
-- Pakistan
-- Qatar
-- Russia
-- Ukraine
-- United Arab Emirates
-- Venezuela
-- Yemen
-
-All United States are supported, excluding Hawaii.
-
-
-
-We offer direct onramping **internationally** to the following tokens:
-
-- Mainnet (Ethereum)
-- Avalanche
-- Polygon
-
-We offer direct onramping to the following tokens in the **US only**:
-
-- ETH (Base)\*
-- USDC (Ethereum)
-- USDC (Polygon)\*
-- USDC (Avalanche)\*
-- USDC (Base)\*
-
-All other tokens will require an additional Buy With Crypto step.
-
-\* Not available in New York or the EU.
-
-
-
-Users will be required to complete KYC verification for their first purchase using 'Buy with Fiat.' After that, no further KYC will be needed for future purchases on the same platform.
-
-
-
-Payments can support any currency on our [supported chains](https://thirdweb.com/chainlist?service=pay).
-
-
-
-Prices are set depending on the liquidity provider used to route your transaction.
-
-
-
-Fiat payouts are not currently available.
-
-
-
diff --git a/apps/portal/src/app/pay/fees/page.mdx b/apps/portal/src/app/pay/fees/page.mdx
deleted file mode 100644
index 757a5d39c4f..00000000000
--- a/apps/portal/src/app/pay/fees/page.mdx
+++ /dev/null
@@ -1,55 +0,0 @@
-import {DocImage} from "@doc";
-import FeeShare from './assets/fee-dash.png';
-
-
-# Understanding fees
-
-Understand how protocol, developer, and onramp fees work with Payments.
-
-### Developer Fee
-
-To monetize applications or games, you are able to set a developer fee on each crypto-to-crypto or swap transaction. You may set this percentage
-through Project > Payments > Settings.
-
-
-
-### Protocol Fee
-
-Our protocol fee is a flat 30 basis points (0.30%) applied on the source token amount.
-This fee is independent of network gas fees and does not fluctuate.
-
-#### Setting fees using buy or sell
-
-You can configure who pays the protocol fee for buy or sell transactions by specifying the input amount `sell` or `buy`.
-
-See full reference for [`buy`](https://portal.thirdweb.com/references/typescript/v5/buy/prepare) and [`sell`](https://portal.thirdweb.com/references/typescript/v5/sell/prepare).
-
-#### Setting fees on transfers or purchase mode
-
-You can configure who pays the protocol fee for transfers or purchase mode using the `feePayer` setting. This affects the
-total amount paid by the user and the amount received by the destination (e.g., a seller, app, or partner).
-
-feePayer=buyer (Default) i.e. the user covers the protocol fee.
-
-Example: If the source token is 10 USDC, the user pays 10.30 USDC.
-
-- thirdweb receives: 0.30 USDC
-
-- Receiver receives: 10.00 USDC
-
-feePayer=receiver i.e. the receiver covers the protocol fee.
-
-Example: The user pays 10.00 USDC.
-
-- thirdweb receives: 0.30 USDC
-
-- Receiver receives: 9.70 USDC
-
-[See full reference.](https://bridge.thirdweb.com/reference#tag/transfer/POST/v1/transfer/prepare)
-
-### Onramp Fee
-
-When onramping to crypto using the Payments, a fee is charged by the third-party provider. This fee is determined by the provider and is typically a percentage
-of the amount being onramped. This fee may vary based on the provider and payment method used.
-
-There are no protocol fees on onramp transactions.
\ No newline at end of file
diff --git a/apps/portal/src/app/pay/guides/cross-chain-swapping/page.mdx b/apps/portal/src/app/pay/guides/cross-chain-swapping/page.mdx
deleted file mode 100644
index d1afcc5bc5c..00000000000
--- a/apps/portal/src/app/pay/guides/cross-chain-swapping/page.mdx
+++ /dev/null
@@ -1,224 +0,0 @@
-import {
- createMetadata,
- Callout,
- DocImage,
- InstallTabs,
- Steps,
- Step,
-} from "@doc";
-import OnrampStepOne from "../../assets/avax-to-usd.png";
-
-export const metadata = createMetadata({
- image: {
- title: "thirdweb Payments - Cross-Chain Swapping",
- icon: "thirdweb",
- },
- title: "thirdweb Payments - Cross-Chain Swapping | thirdweb",
- description:
- "Learn how to build a custom cross-chain swapping experience with thirdweb Payments.",
-});
-
-# Leverage Cross-Chain Swaps with Payments
-
-Learn how to enable your users to swap from any asset to any other with thirdweb's Payments.
-
-In this guide, we'll show you how to purchase 10 USDC on Optimism in Typescript.
-
----
-
-
-
-
-
-
-Log in to the [thirdweb dashboard](https://thirdweb.com/team). Click on Create New > Project to get your **Client ID**. You'll need your Client ID to interact with the TypeScript SDK.
-
-
-
-
-Before your user can select which tokens they'd like to swap, they'll need to find available routes.
-
-You can do this using the `routes` function in our `Bridge` namespace. You or your users can filter by origin and destination chains and/or tokens. Pagination is also built-in to the function.
-
-```tsx
-import { Bridge, NATIVE_TOKEN_ADDRESS } from "thirdweb";
-
-// Get all available routes
-const allRoutes = await Bridge.routes({
- client: thirdwebClient,
-});
-
-// Filter routes for a specific token or chain
-const filteredRoutes = await Bridge.routes({
- originChainId: 1, // From Ethereum
- originTokenAddress: NATIVE_TOKEN_ADDRESS,
- destinationChainId: 10, // To Optimism
- client: thirdwebClient,
-});
-
-// Paginate through routes
-const paginatedRoutes = await Bridge.routes({
- limit: 10,
- offset: 0,
- client: thirdwebClient,
-});
-```
-
-This will return an array of `Route` objects, which will include information such as `symbol`, `address`, and `chainId` for both the origin and destination tokens.
-
-
-
-Once you know which routes are available, you can retrieve a quote to show the user how much they can expect to pay for a given swap.
-
-In this example, we'll use the `Buy.quote` function to get a quote for buying 10 USDC on Optimism for Base ETH.
-
-
- The `Buy` namespace is purpose-built for when you want to obtain a specific amount of the output token.
- If you have a specific input amount and are flexible on the output amount, you can use the `Sell` namespace.
- Learn more about sells [here](https://portal.thirdweb.com/references/typescript/v5/sell/prepare).
-
-
-Quote allows us to get an expected amount before the user has connected their wallet. This quote won't come with executable transactions, and won't be a guaranteed price.
-
-
-```tsx
-import { Bridge, NATIVE_TOKEN_ADDRESS } from "thirdweb";
-
-const buyQuote = await Bridge.Buy.quote({
- originChainId: 8453, // Base
- originTokenAddress: NATIVE_TOKEN_ADDRESS,
- destinationChainId: 10, // Optimism
- destinationTokenAddress: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", // Optimism USDC
- amount: 10000000n, // 10 USDC
- client: thirdwebClient,
-});
-
-console.log(
- `To get ${buyQuote.destinationAmount} wei on destination chain, you need to pay ${buyQuote.originAmount} wei`,
-);
-```
-
-This will return a `Quote` object, which will include the `originAmount` and `destinationAmount` in wei, along with some more useful information about the predicted quote.
-
-
-Now that we know how much the user can expect to pay, we can have them connect their wallet and execute the swap.
-
-To get a prepared quote, we'll use the `Buy.prepare` function. The key difference with this function is it requires a `sender` and `receiver` to be specified.
-
-```tsx
-import { Bridge, NATIVE_TOKEN_ADDRESS } from "thirdweb";
-
-const preparedBuy = await Bridge.Buy.prepare({
- originChainId: 8453, // Base
- originTokenAddress: NATIVE_TOKEN_ADDRESS,
- destinationChainId: 10, // Optimism
- destinationTokenAddress: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", // Optimism USDC
- amount: 10000000n, // 10 USDC
- sender: "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709", // Your user's wallet address
- receiver: "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709", // Recipient address (can be the same as sender)
- client: thirdwebClient,
-});
-
-// The prepared quote contains the steps and transactions you need to execute
-console.log(`Steps: ${preparedBuy.steps.length}`);
-```
-
-This will return a `PreparedQuote` object. It will look very similar to the `Quote` you received in the previous step, but it will include a `steps` array containing all the transactions you need to execute to complete the swap.
-
-
-To execute the swap, we'll need to send all transactions in each step one after the other. The SDK automatically includes any necessary approvals in the transactions array.
-
-```tsx
-import { sendAndConfirmTransaction } from "thirdweb";
-
-const preparedBuy = await Bridge.Buy.prepare({
- originChainId: 8453, // Base
- originTokenAddress: NATIVE_TOKEN_ADDRESS,
- destinationChainId: 10, // Optimism
- destinationTokenAddress: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", // Optimism USDC
- amount: 10000000n, // 10 USDC
- sender: "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709", // Your user's wallet address
- receiver: "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709", // Recipient address (can be the same as sender)
- client: thirdwebClient,
-});
-
-// Execute all transactions in sequence
-for (const step of preparedBuy.steps) {
- for (const transaction of step.transactions) {
- // Handle approvals first
- if (transaction.action === "approval") {
- const result = await sendAndConfirmTransaction({
- transaction,
- account: wallet.account
- });
- console.log("Approval sent:", result.transactionHash);
- } else {
- // Execute the main swap transaction
- const result = await sendAndConfirmTransaction({
- transaction,
- account: wallet.account
- });
- console.log("Swap transaction sent:", result.transactionHash);
-
- // Wait for completion before continuing
- let swapStatus;
- do {
- swapStatus = await Bridge.status({
- transactionHash: result.transactionHash,
- chainId: transaction.chainId,
- client: thirdwebClient,
- });
- if (swapStatus.status === "PENDING") {
- await new Promise(resolve => setTimeout(resolve, 3000)); // Wait 3 seconds
- }
- } while (swapStatus.status === "PENDING");
-
- if (swapStatus.status === "FAILED") {
- throw new Error("Swap transaction failed");
- }
- }
- }
-}
-```
-
- The transactions come pre-configured with all necessary parameters including gas estimation. Each transaction has an `action` property that indicates whether it's an "approval" or the main swap transaction.
-
-
-
-
-You can get the status of any swap using the transaction hash and chain ID of its origin transaction.
-
-When sending transactions in a prepared quote, you **must** use `Bridge.status` to confirm `COMPLETED` status before moving to the next transaction. This ensures both origin and destination transactions have completed successfully.
-
-```tsx
-import { Bridge } from "thirdweb";
-
-// Check the status of a bridge transaction
-const bridgeStatus = await Bridge.status({
- transactionHash: "0x5959b9321ec581640db531b80bac53cbd968f3d34fc6cb1d5f4ea75f26df2ad7",
- chainId: 137, // The chain ID where the transaction was initiated
- client: thirdwebClient,
-});
-
-// The status will be one of: "COMPLETED", "PENDING", "FAILED", or "NOT_FOUND"
-if (bridgeStatus.status === "COMPLETED") {
- console.log(`
- Bridge completed!
- Sent: ${bridgeStatus.originAmount} wei on chain ${bridgeStatus.originChainId}
- Received: ${bridgeStatus.destinationAmount} wei on chain ${bridgeStatus.destinationChainId}
- `);
-} else if (bridgeStatus.status === "PENDING") {
- console.log("Bridge transaction is still pending...");
-} else if (bridgeStatus.status === "FAILED") {
- console.log("Bridge transaction failed");
-} else {
- console.log("Transaction not found");
-}
-```
-
-
-
diff --git a/apps/portal/src/app/pay/guides/nft-checkout/page.mdx b/apps/portal/src/app/pay/guides/nft-checkout/page.mdx
deleted file mode 100644
index eaf035d1afb..00000000000
--- a/apps/portal/src/app/pay/guides/nft-checkout/page.mdx
+++ /dev/null
@@ -1,706 +0,0 @@
-import {
- createMetadata,
- Callout,
- DocImage,
- InstallTabs,
- Steps,
- Step,
- Tabs,
- TabsList,
- TabsTrigger,
- TabsContent,
-} from "@doc";
-
-export const metadata = createMetadata({
- image: {
- title: "thirdweb Payments - NFT Checkout",
- icon: "thirdweb",
- },
- title: "thirdweb Payments - NFT Checkout | thirdweb",
- description:
- "Learn how to build a complete NFT checkout flow with in-app wallet login, onramp, and minting using Payments.",
-});
-
-# NFT Checkout with Payments
-
-Learn how to build a seamless NFT checkout experience that combines in-app wallet authentication, fiat-to-crypto onramps, and NFT minting. This tutorial demonstrates a complete user flow where users can purchase NFTs directly with fiat currency.
-
-This pattern is perfect for NFT marketplaces, gaming platforms, and any application where you want to minimize friction for new crypto users.
-
----
-
-
-
-
-
-
-
-Configure your client and prepare an NFT contract for minting:
-
-```typescript
-import { createThirdwebClient } from "thirdweb";
-import { getContract } from "thirdweb";
-import { sepolia } from "thirdweb/chains"; // Using testnet for demo
-
-const client = createThirdwebClient({
- clientId: "your_client_id"
-});
-
-// Your NFT contract (ERC721 or ERC1155)
-const nftContract = getContract({
- client,
- chain: sepolia,
- address: "0x...", // Your NFT contract address
-});
-
-// NFT pricing configuration
-const NFT_PRICE_ETH = "0.01"; // 0.01 ETH per NFT
-const NFT_METADATA = {
- name: "Awesome NFT Collection",
- description: "A limited edition NFT with exclusive benefits",
- image: "https://your-domain.com/nft-image.png",
- attributes: [
- { trait_type: "Rarity", value: "Rare" },
- { trait_type: "Collection", value: "Genesis" },
- ],
-};
-```
-
-
- For production, deploy your NFT contract on mainnet and update the chain configuration. You can use thirdweb's contract deployment tools to create ERC721 or ERC1155 contracts easily.
-
-
-
-
-
-Set up seamless wallet authentication for new users:
-
-```typescript
-import { inAppWallet } from "thirdweb/wallets/in-app";
-import { ConnectButton, useActiveAccount, useConnect } from "thirdweb/react";
-
-// Configure in-app wallet for seamless onboarding
-const wallet = inAppWallet({
- auth: {
- options: ["google", "apple", "facebook", "email"],
- },
-});
-
-// Authentication component
-function WalletAuth({ onConnect }: { onConnect: (address: string) => void }) {
- const account = useActiveAccount();
- const { connect } = useConnect();
-
- const handleConnect = async () => {
- try {
- const connectedAccount = await connect(async () => {
- const account = await wallet.connect({
- client,
- strategy: "google", // or other auth methods
- });
- return account;
- });
-
- console.log("Wallet connected:", connectedAccount.address);
- onConnect(connectedAccount.address);
- } catch (error) {
- console.error("Connection failed:", error);
- }
- };
-
- if (account) {
- onConnect(account.address); // Auto-proceed when wallet is connected
- return (
-
- We couldn't complete your NFT purchase. Please try again.
-
-
-
- Error details
-
-
- {error}
-
-
-
-
-
-
-
-
-
- );
-}
-```
-
-
-
-
-Put it all together in your main application:
-
-```typescript
-import { ThirdwebProvider } from "thirdweb/react";
-// Import all the components we defined earlier
-import { NFTCheckout, WalletAuth, PaymentOptions, ProcessingStep, SuccessStep, ErrorStep } from "./nft-checkout-components";
-
-function App() {
- return (
-
-
-
-
-
- NFT Marketplace
-
-
- Buy NFTs seamlessly with fiat currency
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default App;
-```
-
-
\ No newline at end of file
diff --git a/apps/portal/src/app/pay/guides/onramp-integration/page.mdx b/apps/portal/src/app/pay/guides/onramp-integration/page.mdx
deleted file mode 100644
index 7357c80238a..00000000000
--- a/apps/portal/src/app/pay/guides/onramp-integration/page.mdx
+++ /dev/null
@@ -1,199 +0,0 @@
-import {
- createMetadata,
- Callout,
- DocImage,
- InstallTabs,
- Steps,
- Step,
- Tabs,
- TabsList,
- TabsTrigger,
- TabsContent,
-} from "@doc";
-
-export const metadata = createMetadata({
- image: {
- title: "thirdweb Payments - Onramp Integration",
- icon: "thirdweb",
- },
- title: "thirdweb Payments - Onramp Integration | thirdweb",
- description:
- "Learn how to integrate fiat-to-crypto onramps using Stripe, Coinbase, and Transak with Payments.",
-});
-
-# Fiat-to-Crypto Onramp Integration
-
-Learn how to integrate seamless fiat-to-crypto onramps using Payments. This guide covers integration with Stripe, Coinbase, and Transak providers, enabling your users to purchase crypto directly with fiat currency.
-
-Payments's onramp functionality provides a unified interface across multiple providers, automatic routing to the best rates, and comprehensive status tracking.
-
----
-
-
-
-
-
-
-
-Configure your client and understand the available onramp providers:
-
-```typescript
-import { createThirdwebClient } from "thirdweb";
-import { Bridge, NATIVE_TOKEN_ADDRESS } from "thirdweb";
-
-const client = createThirdwebClient({
- clientId: "your_client_id"
-});
-```
-
-
-
-
-Create a basic onramp experience for your users:
-
-
-
-Stripe
-Coinbase
-Transak
-
-
-
-
-```typescript
-import { Bridge, NATIVE_TOKEN_ADDRESS, toWei } from "thirdweb";
-
- const onrampSession = await Bridge.Onramp.prepare({
- client,
- onramp: "stripe",
- chainId: 1, // Ethereum
- tokenAddress: NATIVE_TOKEN_ADDRESS, // ETH
- receiver: userAddress,
- amount: toWei("0.1"), // 0.1 ETH
- currency: "USD",
- country: "US", // User's country - important for compliance
- });
-
- window.open(onrampSession.link);
-```
-
-
-
-
-
-```typescript
-import { Bridge, NATIVE_TOKEN_ADDRESS, toWei } from "thirdweb";
-
-async function createCoinbaseOnramp(userAddress: string) {
- try {
- const onrampSession = await Bridge.Onramp.prepare({
- client,
- onramp: "coinbase",
- chainId: 8453, // Base (Coinbase's L2)
- tokenAddress: NATIVE_TOKEN_ADDRESS, // ETH on Base
- receiver: userAddress,
- amount: toWei("0.05"), // 0.05 ETH
- currency: "USD",
- country: "US",
- });
-
- console.log("Coinbase onramp session:", onrampSession.id);
- console.log("Estimated cost:", `$${onrampSession.currencyAmount}`);
-
- // Redirect to Coinbase onramp
- window.location.href = onrampSession.link;
-
- return onrampSession;
- } catch (error) {
- console.error("Failed to create Coinbase onramp:", error);
- throw error;
- }
-}
-```
-
-
-
-
-```typescript
-import { Bridge, NATIVE_TOKEN_ADDRESS, toWei } from "thirdweb";
-
-async function createTransakOnramp(userAddress: string) {
- try {
- const onrampSession = await Bridge.Onramp.prepare({
- client,
- onramp: "transak",
- chainId: 137, // Polygon
- tokenAddress: NATIVE_TOKEN_ADDRESS, // MATIC
- receiver: userAddress,
- amount: toWei("10"), // 10 MATIC
- currency: "USD",
- country: "US",
- });
-
- // Redirect to Transak
- window.open(onrampSession.link);
-
- return onrampSession;
- } catch (error) {
- console.error("Failed to create Transak onramp:", error);
- throw error;
- }
-}
-```
-
-
-
-
-
-Monitor onramp transactions and handle completion:
-
-```typescript
-import { Bridge } from "thirdweb";
-
-// Monitor onramp status
- const status = await Bridge.Onramp.status({
- sessionId,
- client,
- });
-
- switch (status.status) {
- case "COMPLETED":
- console.log("Onramp completed successfully!");
- console.log("Transaction hash:", status.transactionHash);
- console.log("Amount received:", status.destinationAmount);
- // Update your UI to show success
- break;
-
- case "PENDING":
- console.log("Onramp in progress...");
- // Show loading state to user
- setTimeout(() => monitorOnrampStatus(sessionId), 10000); // Check again in 10s
- break;
-
- case "FAILED":
- console.log("Onramp failed:", status.error);
- // Show error message to user
- break;
-
- case "CANCELLED":
- console.log("Onramp was cancelled by user");
- // Handle cancellation
- break;
-
- default:
- console.log("Unknown status:", status.status);
- }
-```
-
-
-
-## Next Steps
-
-- **[Onramp Providers](/pay/onramp-providers)** - Detailed provider comparison and features
-- **[Webhooks](/pay/webhooks)** - Set up real-time onramp status notifications
-- **[Testing](/pay/testing-pay)** - Test onramp flows in development mode
-- **[Payments API](https://bridge.thirdweb.com/reference)** - Complete API reference
diff --git a/apps/portal/src/app/pay/guides/smart-accounts/page.mdx b/apps/portal/src/app/pay/guides/smart-accounts/page.mdx
deleted file mode 100644
index b4ee08330b1..00000000000
--- a/apps/portal/src/app/pay/guides/smart-accounts/page.mdx
+++ /dev/null
@@ -1,154 +0,0 @@
-import {
- createMetadata,
- Callout,
- DocImage,
- InstallTabs,
- Steps,
- Step,
-} from "@doc";
-
-export const metadata = createMetadata({
- image: {
- title: "thirdweb Payments - Smart Accounts",
- icon: "thirdweb",
- },
- title: "thirdweb Payments - Smart Accounts | thirdweb",
- description:
- "Learn how to use EIP7702 smart accounts with batched transactions for seamless Payments experiences.",
-});
-
-# Smart Accounts with Payments
-
-Learn how to leverage EIP7702 smart accounts to batch Payments transactions for optimal user experience. This approach enables gasless transactions, batched execution, and seamless cross-chain operations.
-
-Smart accounts with EIP7702 allow you to upgrade any EOA (Externally Owned Account) into a smart account without code changes, enabling advanced features like transaction batching and gas sponsorship.
-
----
-
-
-
-
-
-
-
-Configure an in-app wallet with EIP7702 execution mode to enable smart account features:
-
-```typescript
-import { createThirdwebClient } from "thirdweb";
-import { inAppWallet } from "thirdweb/wallets/in-app";
-
-const client = createThirdwebClient({
- clientId: "your_client_id"
-});
-
-// Create in-app wallet with EIP7702 smart account features
-const wallet = inAppWallet({
- executionMode: {
- mode: "EIP7702",
- sponsorGas: true, // Enable gas sponsorship
- },
-});
-
-// Connect the wallet
-const account = await wallet.connect({
- client,
- strategy: "google", // or other auth strategies
-});
-```
-
-
- EIP7702 execution mode upgrades your EOA into a smart account, enabling batched transactions, gas sponsorship, and other advanced features without requiring contract deployment.
-
-
-
-
-
-Use Payments to prepare transactions, then batch them per step (since each step may be on a different chain):
-
-```typescript
-import { Bridge, NATIVE_TOKEN_ADDRESS, toWei } from "thirdweb";
-import { sendBatchTransaction } from "thirdweb";
-
-const bridgePreparation = await Bridge.Buy.prepare({
- originChainId: 1, // Ethereum
- originTokenAddress: NATIVE_TOKEN_ADDRESS,
- destinationChainId: 137, // Polygon
- destinationTokenAddress: NATIVE_TOKEN_ADDRESS,
- amount: toWei("0.1"), // 0.1 MATIC
- sender: account.address,
- receiver: account.address,
- client,
-});
-```
-
-
- **Key Rule**: You can only batch transactions that are on the same chain. Since Payments steps may span multiple chains, you must batch transactions within each step separately, not across steps.
-
-
-
-
-
-Execute transactions in batches per step (same chain), proceeding through steps sequentially:
-
-```typescript
-import { sendBatchTransaction, waitForReceipt } from "thirdweb";
-// Execute each step's transactions as a batch (same chain)
-for (let i = 0; i < bridgePreparation.steps.length; i++) {
- const step = bridgePreparation.steps[i];
-
- // Batch all transactions within this step (they're all on the same chain)
- const stepBatchResult = await sendBatchTransaction({
- transactions: step.transactions,
- account,
- });
-
- console.log(`Step ${i + 1} batch sent:`, stepBatchResult.transactionHash);
-
- const receipt = await waitForReceipt({
- client,
- chain: step.transactions[0].chain,
- transactionHash: stepBatchResult.transactionHash,
- });
-
- console.log(`Step ${i + 1} completed:`, receipt.status);
-
- // Monitor bridge completion status for this step
- let bridgeStatus;
- do {
- bridgeStatus = await Bridge.status({
- transactionHash: stepBatchResult.transactionHash,
- chainId: step.transactions[0].chainId,
- client,
- });
-
- if (bridgeStatus.status === "PENDING") {
- console.log(`Bridge step ${i + 1} still pending...`);
- await new Promise((resolve) => setTimeout(resolve, 5000));
- }
- } while (bridgeStatus.status === "PENDING");
-
- if (bridgeStatus.status === "COMPLETED") {
- console.log(`Bridge step ${i + 1} completed!`);
- } else if (bridgeStatus.status === "FAILED") {
- throw new Error(`Bridge step ${i + 1} failed`);
- }
-}
-```
-
-
- With EIP7702 smart accounts, transactions within each step execute atomically. Steps execute sequentially, ensuring proper cross-chain coordination. Gas sponsorship applies to all batched transactions.
-
-
-
-
-
-## Next Steps
-
-- **[EIP7702 Documentation](/wallets/sponsor-gas)** - Learn more about smart account features
-- **[Batching Transactions](/typescript/v5/account-abstraction/batching-transactions)** - Explore advanced batching patterns
-- **[Gas Sponsorship](/wallets/sponsor-gas)** - Set up custom gas sponsorship rules
-- **[Payments API](/payments/webhooks)** - Monitor cross-chain operations with webhooks
diff --git a/apps/portal/src/app/pay/onramp-providers/page.mdx b/apps/portal/src/app/pay/onramp-providers/page.mdx
deleted file mode 100644
index d6f58651257..00000000000
--- a/apps/portal/src/app/pay/onramp-providers/page.mdx
+++ /dev/null
@@ -1,41 +0,0 @@
-import { createMetadata } from "@doc";
-
-export const metadata = createMetadata({
- image: {
- title: "thirdweb Payments - Onramp Providers",
- icon: "thirdweb",
- },
- title: "thirdweb Payments - Onramp Providers | thirdweb",
- description:
- "Integrate onramp providers for any onchain transaction and set preferred providers",
-});
-
-# Onramp Providers
-
-**Onramp Providers** are services that allow users to buy crypto with fiat.
-Payments supports the following onramp providers:
-
-- **Coinbase**
-- **Transak**
-- **Stripe**
-
-## Provider Fees
-
-Each provider has different fees associated with their services which often depend on various factors. Onramp provider fees are set by the provider and are not controlled by thirdweb.
-
-| Provider | Fees |
-| -------- | ---- |
-| Coinbase | [Learn more about Coinbase Fees](https://help.coinbase.com/en/coinbase/trading-and-funding/pricing-and-fees/fees) |
-| Transak | [Learn more about Transak Fees](https://support.transak.com/en/articles/7845942-how-does-transak-calculate-prices-and-fees)|
-| Stripe | [Learn more about Stripe Fees](https://stripe.com/legal/crypto-onramp). |
-
-
-## Provider Regions
-
-Each provider has different regions they support. You can learn more about the supported regions for each provider in the links below.
-
-| Provider | Regions |
-| -------- | ------- |
-| Coinbase | [View Regions](https://docs.cdp.coinbase.com/onramp/docs/api-configurations) |
-| Transak | [View Regions](https://transak.com/global-coverage) |
-| Stripe | [View Regions](https://support.stripe.com/questions/crypto-supportability-and-availability-by-region) |
diff --git a/apps/portal/src/app/pay/supported-chains/page.mdx b/apps/portal/src/app/pay/supported-chains/page.mdx
deleted file mode 100644
index f4f6113dbd5..00000000000
--- a/apps/portal/src/app/pay/supported-chains/page.mdx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { createMetadata } from "@doc";
-
-export const metadata = createMetadata({
- image: {
- title: "Supported Chains",
- icon: "payments",
- },
- title: "thirdweb Payments - Supported Chains | thirdweb",
- description: "List of chains supported by Payments.",
-});
-
-# Supported Chains
-
-[View all supported chains with Payments](https://thirdweb.com/chainlist?service=pay).
-
-If you’d like to suggest a chain for us to support, [contact us](https://thirdweb.com/contact-us).
diff --git a/apps/portal/src/app/pay/troubleshoot/page.mdx b/apps/portal/src/app/pay/troubleshoot/page.mdx
deleted file mode 100644
index 22bf3c858b1..00000000000
--- a/apps/portal/src/app/pay/troubleshoot/page.mdx
+++ /dev/null
@@ -1,20 +0,0 @@
-import {Details} from "@doc";
-
-# Payments Troubleshoot Articles
-
-
-When using onramp providers, you may encounter an error stating "There was an issue processing your payment and you have not been charged. Your card does not support this type of purchase."
-
-This typically means that your card issuer does not allow cryptocurrency purchases.
-
-To work around this issue, you can try using a different card or payment method, such as debit card, if available.
-
-
-
-If you encounter an "Error 500: Internal Server Error" or if the modal shows "Something went wrong" it may indicate you are using an
-outdated version of the Payments service.
-
-To resolve this issue, please upgrade your SDK to the latest version in your project. You can download the latest version with `npm install thirdweb@latest` or `yarn add thirdweb@latest`.
-
-If the issue persists after upgrade, please [contact our support team](https://thirdweb.com/support) for further assistance.
-
\ No newline at end of file
diff --git a/apps/portal/src/app/pay/webhooks/page.mdx b/apps/portal/src/app/pay/webhooks/page.mdx
deleted file mode 100644
index b885151554f..00000000000
--- a/apps/portal/src/app/pay/webhooks/page.mdx
+++ /dev/null
@@ -1,126 +0,0 @@
-import { createMetadata, DocImage, Callout } from "@doc";
-import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";
-
-export const metadata = createMetadata({
- title: "Payments Webhooks Implementation Guide — thirdweb Docs",
- description:
- "Learn how to set up webhooks for any Payments transactions.",
-});
-
-# Webhooks
-
-
-**When using webhooks to distribute purchased items, always verify that the proper amount was paid to the proper address onchain using the provided transaction hash. Do not make any assumptions regarding onchain data based on webhook payloads.**
-
-
-You can create a webhook in your project dashboard under the Payments tab. You'll be prompted to copy a secret key before saving the webhook. This will be used for verification on all webhook requests received by your backend.
-
-## Response Objects
-
-To get the TypeScript type for webhook responses, see the [`Webhook.Payload`](https://portal.thirdweb.com/typescript/v5/webhook/payload) type in the SDK.
-
-### Example Payloads
-
-
-
-
- Bridge & Swap
- Onramp
-
-
-```json
-{
- "version": 2,
- "data": {
- "id": "d5d33244-f855-441d-af62-4593094a3eb1",
- "onramp": "stripe",
- "token": {
- "chainId": 8453,
- "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
- "symbol": "USDC",
- "name": "USD Coin",
- "decimals": 6,
- "priceUsd": 0.99995,
- "iconUri": "https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694"
- },
- "amount": "5100000",
- "currency": "USDC",
- "currencyAmount": 5.36,
- "receiver": "0xa5a484Af10FF67257A06DDbf8DdE6A99a483f098",
- "status": "PENDING",
- "purchaseData": null
- }
-}
-```
-
-
-
-```json
-{
- "version": 2,
- "data": {
- "transactionId": "0x7baae858e28628fe57cb0ca93c86fcda68f556563199cb4472044bfd9fbe5ec8",
- "paymentId": "0xbea711bf1da223b29b176cff7f01596834dd63c7ad85477a3504f4b9285b33a2",
- "clientId": "c56b27030ad22846003fafbb4302b5d7",
- "action": "SELL",
- "status": "COMPLETED",
- "originToken": {
- "chainId": 466,
- "address": "0x675C3ce7F43b00045a4Dab954AF36160fb57cB45",
- "symbol": "USDC",
- "name": "USD Coin",
- "decimals": 6,
- "priceUsd": 0.99995,
- "iconUri": "https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694"
- },
- "originAmount": "24875000",
- "destinationToken": {
- "chainId": 8453,
- "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
- "symbol": "USDC",
- "name": "USD Coin",
- "decimals": 6,
- "priceUsd": 0.99995,
- "iconUri": "https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694"
- },
- "destinationAmount": "24794905",
- "sender": "0xb4523A0D69612B9A4629A70E42021B2F384CC8Fa",
- "receiver": "0x044A83bA68f36CF1F27836Cb93614f86d8B0ea96",
- "type": "sell",
- "transactions": [
- {
- "chainId": 466,
- "transactionHash": "0xc507bde1da0832d097c2160aacc2c9333ac3a0516c8dca4fb955f4c949da1ef6"
- },
- {
- "chainId": 8453,
- "transactionHash": "0xc44b372284061a11ec96c67acfc96a67cc6180d14753b55a93c1f780d16ddc95"
- }
- ],
- "developerFeeBps": 20,
- "developerFeeRecipient": "0x66d3d733e597bdf8b794ab6e13c8f2be0fcda39b"
- }
-}
-```
-
-
-
-## Webhook Verification
-
-There are two ways to verify a webhook request authenticity:
-1. Checking that the bearer token in the `Authorization` header matches the secret key received when you created the webhook.
-2. Decrypting the payload signature from the `x-payload-signature` header and verifying it against the received webhook body.
-
-### Decrypting the Payload Signature
-
-The payload signature is constructed using the `x-timestamp` header and the webhook's full body:
-```ts
-const signature = crypto
- .createHmac("sha256", decryptedSecret)
- .update(`${timestamp}.${payload}`)
- .digest("hex");
-```
-The `x-timestamp` header is a UNIX timestamp in seconds, and the webhook body is the JSON payload received by your webhook endpoint.
-
-Then verify that the signature matches the `x-payload-signature` header.
-
diff --git a/apps/portal/src/app/tokens/modular-contracts/tutorials/deploy-erc721-core/page.mdx b/apps/portal/src/app/tokens/modular-contracts/tutorials/deploy-erc721-core/page.mdx
deleted file mode 100644
index e69de29bb2d..00000000000