{
setShowBurgerMenu(false);
diff --git a/apps/portal/src/app/bundler/layout.tsx b/apps/portal/src/app/bundler/layout.tsx
new file mode 100644
index 00000000000..adeddc59448
--- /dev/null
+++ b/apps/portal/src/app/bundler/layout.tsx
@@ -0,0 +1,15 @@
+import { DocLayout } from "@/components/Layouts/DocLayout";
+
+export default async function Layout(props: { children: React.ReactNode }) {
+ return (
+
+ {props.children}
+
+ );
+}
diff --git a/apps/portal/src/app/bundler/page.mdx b/apps/portal/src/app/bundler/page.mdx
new file mode 100644
index 00000000000..c4506badbaf
--- /dev/null
+++ b/apps/portal/src/app/bundler/page.mdx
@@ -0,0 +1,490 @@
+# Thirdweb Bundler - API Reference
+
+The Thirdweb Bundler is a service that provides Account Abstraction (ERC-4337 and EIP-7702) bundler functionality with integrated paymaster services, zkSync chains support, and EIP-7702 transaction delegation.
+
+## Table of Contents
+
+- [Url format](#url-format)
+- [Authentication](#authentication)
+- [Request Format](#request-format)
+- [Paymaster Methods](#paymaster-methods)
+- [User Operation Methods](#user-operation-methods)
+- [Gas Price Methods](#gas-price-methods)
+- [Status and Tracking Methods](#status-and-tracking-methods)
+- [zkSync-Specific Methods](#zksync-specific-methods)
+- [EIP-7702 Methods](#eip-7702-methods)
+- [Standard ERC-4337 Methods](#standard-erc-4337-methods)
+- [Error Responses](#error-responses)
+- [Policy Enforcement](#policy-enforcement)
+
+## Url format
+
+- **Chain Parameter**: the chain id is always specified in the subdomain (e.g., `.bundler.thirdweb.com`)
+- **Version Parameter**: the version is specified in the path, we recommend using `/v2`
+
+```
+https://.bundler.thirdweb.com/v2
+```
+
+## Authentication
+
+All requests require authentication via:
+
+- **Client ID**: Provided as `X-Client-Id: ` header - used for frontend authentication
+- **Secret Key**: Provided as `X-Secret-Key: ` header - used for backend authentication
+
+## Request Format
+
+All RPC requests follow the JSON-RPC 2.0 specification:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "method": "",
+ "params": [...]
+}
+```
+
+## Paymaster Methods
+
+### `pm_sponsorUserOperation`
+
+**Purpose**: Sponsors a user operation by providing paymaster data to cover gas costs.
+
+**Parameters**:
+
+```json
+[
+ {
+ "sender": "0x...", // Address of the smart account
+ "nonce": "0x...", // Nonce for the operation
+ "initCode": "0x...", // Account initialization code (if needed)
+ "callData": "0x...", // The call data to execute
+ "callGasLimit": "0x...", // Gas limit for the call
+ "verificationGasLimit": "0x...", // Gas limit for verification
+ "preVerificationGas": "0x...", // Pre-verification gas
+ "maxFeePerGas": "0x...", // Maximum fee per gas
+ "maxPriorityFeePerGas": "0x...", // Maximum priority fee per gas
+ "paymasterAndData": "0x...", // Paymaster data (EntryPoint v0.6)
+ // OR for EntryPoint v0.7:
+ "paymaster": "0x...", // Paymaster address
+ "paymasterData": "0x...", // Paymaster data
+ "paymasterVerificationGasLimit": "0x...",
+ "paymasterPostOpGasLimit": "0x..."
+ },
+ "0x...", // Entry point address
+ "0x...", // Chain ID (hex)
+]
+```
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "paymaster": "0x...", // Paymaster address
+ "paymasterData": "0x...", // Paymaster data
+ "paymasterAndData": "0x..." // Combined paymaster data (v0.6)
+ }
+}
+```
+
+### `pm_getPaymasterData`
+
+**Purpose**: Gets paymaster data for sponsoring a user operation (functionally equivalent to `pm_sponsorUserOperation`).
+
+**Parameters**: Same as `pm_sponsorUserOperation`
+**Response**: Same as `pm_sponsorUserOperation`
+
+### `pm_getPaymasterStubData`
+
+**Purpose**: Gets stub paymaster data for gas estimation purposes without actual sponsorship.
+
+**Parameters**: Same as `pm_sponsorUserOperation`
+**Response**: Similar to `pm_sponsorUserOperation` but with placeholder data for estimation.
+
+### `pm_getAcceptedPaymentTokens`
+
+**Purpose**: Returns the list of tokens accepted for gas payments by the paymaster.
+
+**Parameters**: `[]`
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "acceptedTokens": []
+ }
+}
+```
+
+## User Operation Methods
+
+### `eth_estimateUserOperationGas`
+
+**Purpose**: Estimates gas limits required for a user operation.
+
+**Parameters**:
+
+```json
+[
+ {
+ "sender": "0x...", // Smart account address
+ "nonce": "0x...", // Account nonce
+ "initCode": "0x...", // Initialization code (if deploying)
+ "callData": "0x...", // Transaction call data
+ "maxFeePerGas": "0x...", // Maximum fee per gas
+ "maxPriorityFeePerGas": "0x..." // Maximum priority fee
+ },
+ "0x...", // Entry point address
+ {} // State overrides (optional)
+]
+```
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "preVerificationGas": "0x...", // Pre-verification gas
+ "verificationGasLimit": "0x...", // Verification gas limit
+ "callGasLimit": "0x...", // Call gas limit
+ // For EntryPoint v0.7:
+ "paymasterVerificationGasLimit": "0x...",
+ "paymasterPostOpGasLimit": "0x..."
+ }
+}
+```
+
+### `eth_sendUserOperation`
+
+**Purpose**: Submits a user operation to the bundler for execution on-chain.
+
+**Parameters**: Same format as the user operation object used in other methods.
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": "0x..." // User operation hash
+}
+```
+
+## Gas Price Methods
+
+### `thirdweb_getUserOperationGasPrice`
+
+**Purpose**: Gets current gas prices optimized for user operations.
+
+**Parameters**: `[]`
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "maxFeePerGas": "0x...", // Recommended max fee per gas
+ "maxPriorityFeePerGas": "0x..." // Recommended priority fee
+ }
+}
+```
+
+## Status and Tracking Methods
+
+### `thirdweb_getUserOperationStatus`
+
+**Purpose**: Gets the current status of a submitted user operation.
+
+**Parameters**:
+
+```json
+["0x..."] // User operation hash (hex string)
+```
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "status": "not_found|not_submitted|submitted|rejected|included|failed|queued",
+ "transactionHash": "0x..." // Transaction hash (null if not yet included)
+ }
+}
+```
+
+**Status Values**:
+
+- `not_found`: User operation not found
+- `not_submitted`: Not yet submitted to mempool
+- `submitted`: Submitted to mempool
+- `rejected`: Rejected by bundler
+- `included`: Successfully included in a block
+- `failed`: Transaction failed on-chain
+- `queued`: Queued for processing
+
+## zkSync-Specific Methods
+
+### `zk_paymasterData`
+
+**Purpose**: Gets paymaster data for zkSync chains to enable gasless transactions.
+
+**Parameters**:
+
+```json
+[
+ {
+ "nonce": "0x...", // Transaction nonce
+ "from": "0x...", // Sender address
+ "to": "0x...", // Recipient address
+ "gas": "0x...", // Gas limit
+ "gasPrice": "0x...", // Gas price
+ "value": "0x...", // ETH value to send
+ "data": "0x...", // Transaction data
+ "maxFeePerGas": "0x...", // EIP-1559 max fee
+ "maxPriorityFeePerGas": "0x...", // EIP-1559 priority fee
+ "chainId": "0x..." // Chain ID
+ }
+]
+```
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "paymaster": "0x...", // Paymaster contract address
+ "paymasterInput": "0x..." // Encoded paymaster input data
+ }
+}
+```
+
+### `zk_broadcastTransaction`
+
+**Purpose**: Broadcasts a signed transaction on zkSync chains.
+
+**Parameters**:
+
+```json
+[
+ {
+ "nonce": "0x...",
+ "from": "0x...",
+ "to": "0x...",
+ "gas": "0x...",
+ "gasPrice": "0x...",
+ "value": "0x...",
+ "data": "0x...",
+ "maxFeePerGas": "0x...",
+ "maxPriorityFeePerGas": "0x...",
+ "chainId": "0x...",
+ "signedTransaction": "0x..." // Raw signed transaction bytes
+ }
+]
+```
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": "0x..." // Transaction hash
+}
+```
+
+## EIP-7702 Methods
+
+### `tw_execute`
+
+**Purpose**: Executes transactions using EIP-7702 (Account Abstraction via Authorization Lists). This enables EOAs to temporarily act as smart contracts.
+
+**Parameters**:
+
+```json
+[
+ "0x...", // EOA address that will execute the calls
+ {
+ "calls": [
+ {
+ "target": "0x...", // Contract address to call
+ "value": "0x...", // ETH value to send (hex)
+ "data": "0x..." // Call data
+ }
+ // ... more calls
+ ],
+ "uid": "0x..." // Unique identifier for the batch (bytes32)
+ },
+ "0x...", // Signature authorizing the execution
+ {
+ // Authorization list (optional)
+ "chainId": 1,
+ "address": "0x...",
+ "nonce": "0x...",
+ "yParity": 0,
+ "r": "0x...",
+ "s": "0x..."
+ }
+]
+```
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "queueId": "..." // Queue ID for tracking the transaction
+ }
+}
+```
+
+### `tw_getTransactionHash`
+
+**Purpose**: Gets the transaction hash for a queued EIP-7702 transaction.
+
+**Parameters**:
+
+```json
+["queue_id"] // Queue ID returned from tw_execute
+```
+
+**Response**:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "transactionHash": "0x..." // Transaction hash (null if not yet mined)
+ }
+}
+```
+
+## Standard ERC-4337 Methods
+
+The service supports all the standard ERC-4337 bundler methods:
+
+- `eth_chainId` - Returns the current chain ID
+- `eth_getUserOperationByHash` - Retrieves user operation by hash
+- `eth_getUserOperationReceipt` - Gets the receipt for a user operation
+- `eth_supportedEntryPoints` - Lists supported EntryPoint contracts
+- Any other standard bundler RPC methods defined in ERC-4337
+
+## Error Responses
+
+All methods may return error responses following the JSON-RPC 2.0 error format:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "error": {
+ "code": 400,
+ "message": "Detailed error description"
+ }
+}
+```
+
+### Common Error Codes
+
+- **400**: Invalid parameters, malformed request, or unsupported chain
+- **401**: Invalid authentication credentials or insufficient permissions
+- **500**: Internal server error
+- **502**: Upstream bundler provider error
+
+### Example Error Scenarios
+
+```json
+// Invalid chain
+{
+ "error": "Invalid chain: unsupported_chain",
+ "chain": "unsupported_chain",
+ "code": 400
+}
+
+// Mainnet access denied
+{
+ "error": "Mainnets not enabled for this account, please enable billing...",
+ "code": 401
+}
+
+// Invalid user operation hash
+{
+ "error": "Invalid userOpHash parameter",
+ "code": 400
+}
+```
+
+## Policy Enforcement
+
+Paymaster methods support policy-based access control. When a transaction is subject to policy evaluation:
+
+### Policy Check Process
+
+1. The system evaluates paymaster requests against configured policies
+2. Policies can restrict based on:
+ - Contract addresses being called
+ - Transaction data
+ - Gas limits
+ - Sender addresses
+ - Custom endpoint logic
+
+### Policy Rejection Response
+
+If a request is rejected by policy, the response format is:
+
+```json
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": {
+ "policyId": "policy_123", // ID of the policy that rejected the request
+ "reason": "Transaction rejected by policy: Unauthorized contract call"
+ }
+}
+```
+
+### Affected Methods
+
+Policy enforcement applies to:
+
+- `pm_sponsorUserOperation`
+- `pm_getPaymasterData`
+- `zk_paymasterData`
+
+## Rate Limits and Quotas
+
+- Rate limits may apply based on your billing plan
+- Mainnet access requires billing information
+- Testnet access is available on free plans
+
+## Supported Networks
+
+For the most up-to-date list of supported chains, check the [thirdweb dashboard](https://thirdweb.com/dashboard).
+
+## SDK Integration
+
+For easier integration, consider using the thirdweb SDKs:
+
+- [JavaScript/TypeScript SDK](/typescript)
+- [React SDK](/react)
+- [Unity SDK](/unity)
+- [Dotnet SDK](/dotnet)
+- [Unreal Engine SDK](/unreal)
diff --git a/apps/portal/src/app/globals.css b/apps/portal/src/app/globals.css
index 27d4126ef12..f30a76a1ea5 100644
--- a/apps/portal/src/app/globals.css
+++ b/apps/portal/src/app/globals.css
@@ -108,6 +108,16 @@
}
}
+@layer utilities {
+ .no-scrollbar::-webkit-scrollbar {
+ display: none;
+ }
+ .no-scrollbar {
+ -ms-overflow-style: none;
+ scrollbar-width: none;
+ }
+}
+
code span {
color: var(--code-light-color);
}
diff --git a/apps/portal/src/app/page.tsx b/apps/portal/src/app/page.tsx
index 8d90dffc9e2..0ece28fb5e5 100644
--- a/apps/portal/src/app/page.tsx
+++ b/apps/portal/src/app/page.tsx
@@ -133,7 +133,7 @@ function ReferenceSection() {
title="Wallets"
/>
diff --git a/apps/portal/src/app/payments/custom-data/page.mdx b/apps/portal/src/app/payments/custom-data/page.mdx
index 3debbc743f6..f42d36fc4fb 100644
--- a/apps/portal/src/app/payments/custom-data/page.mdx
+++ b/apps/portal/src/app/payments/custom-data/page.mdx
@@ -195,7 +195,7 @@ To connect with other auth strategies, use external wallets, or sponsor gas for
- [Buy.prepare](/references/typescript/v5/buy/prepare)
- [Sell.prepare](/references/typescript/v5/sell/prepare)
-- [BuyWidget](/references/typescript/v5/buywidget)
-- [CheckoutWidget](/references/typescript/v5/checkoutwidget)
-- [TransactionWidget](/references/typescript/v5/transactionwidget)
+- [BuyWidget](/references/typescript/v5/widgets/BuyWidget)
+- [CheckoutWidget](/references/typescript/v5/widgets/CheckoutWidget)
+- [TransactionWidget](/references/typescript/v5/widgets/TransactionWidget)
diff --git a/apps/portal/src/app/payments/faq/page.mdx b/apps/portal/src/app/payments/faq/page.mdx
new file mode 100644
index 00000000000..b748d948cde
--- /dev/null
+++ b/apps/portal/src/app/payments/faq/page.mdx
@@ -0,0 +1,126 @@
+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. [Learn more about the supported onramp providers.](/connect/pay/onramp-providers).
+
+
+
+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/payments/page.mdx b/apps/portal/src/app/payments/page.mdx
index 80ced244839..670d7ba615b 100644
--- a/apps/portal/src/app/payments/page.mdx
+++ b/apps/portal/src/app/payments/page.mdx
@@ -46,7 +46,7 @@ thirdweb Payments allow developers to create advanced payment flows to monetize
- HTTP API
+ HTTP
@@ -190,7 +190,7 @@ thirdweb Payments allow developers to create advanced payment flows to monetize
- The quickest way to setup payments in your React app is with the [`BuyWidget`](/references/typescript/v5/buywidget), [`CheckoutWidget`](/references/typescript/v5/checkoutwidget), and [`TransactionWidget`](/references/typescript/v5/transactionwidget) components.
+ The quickest way to setup payments in your React app is with the [`BuyWidget`](/references/typescript/v5/widgets/BuyWidget), [`CheckoutWidget`](/references/typescript/v5/widgets/CheckoutWidget), and [`TransactionWidget`](/references/typescript/v5/widgets/TransactionWidget) components.
### Installation
Install the thirdweb SDK in your React project:
diff --git a/apps/portal/src/app/payments/products/page.mdx b/apps/portal/src/app/payments/products/page.mdx
index de5d63a08e8..9516da99604 100644
--- a/apps/portal/src/app/payments/products/page.mdx
+++ b/apps/portal/src/app/payments/products/page.mdx
@@ -23,7 +23,7 @@ export const metadata = createMetadata({
Accept crypto and fiat payments for any product using the `CheckoutWidget`.
-
+
diff --git a/apps/portal/src/app/payments/send/page.mdx b/apps/portal/src/app/payments/send/page.mdx
index fc6d22eca0e..96907225acb 100644
--- a/apps/portal/src/app/payments/send/page.mdx
+++ b/apps/portal/src/app/payments/send/page.mdx
@@ -272,10 +272,9 @@ Send a payment between users using any combination of chains or tokens. thirdweb
## Going further
-- [Other auth strategies](/connect/wallet/sign-in-methods/configure)
-- [Sponsor Gas](/connect/account-abstraction/overview)
-- [Implement Sign In with Ethereum](/connect/auth)
-- [External Wallets](/connect/wallet/sign-in-methods/external-wallets) (e.g. MetaMask, WalletConnect, Coinbase Wallet, etc.)
+- [Sell a Product](/payments/products)
+- [Token Prices](/payments/tokens)
+- [Routes](/payments/routes)
## Explore API References
diff --git a/apps/portal/src/app/references/components/TDoc/utils/getSidebarLinkgroups.ts b/apps/portal/src/app/references/components/TDoc/utils/getSidebarLinkgroups.ts
index 7fc05bb004f..8350ca208d4 100644
--- a/apps/portal/src/app/references/components/TDoc/utils/getSidebarLinkgroups.ts
+++ b/apps/portal/src/app/references/components/TDoc/utils/getSidebarLinkgroups.ts
@@ -258,12 +258,10 @@ export function getSidebarLinkGroups(doc: TransformedDoc, path: string) {
const bridgeGroups = bridge.reduce(
(acc, d) => {
const [, moduleName] = getCustomTag(d) || [];
- if (moduleName) {
- if (!acc[moduleName]) {
- acc[moduleName] = [];
- }
- acc[moduleName]?.push(d);
+ if (!acc[moduleName ?? "common"]) {
+ acc[moduleName ?? "common"] = [];
}
+ acc[moduleName ?? "common"]?.push(d);
return acc;
},
{} as Record,
diff --git a/apps/portal/src/app/wallets/faq/page.mdx b/apps/portal/src/app/wallets/faq/page.mdx
index 4166c38e32d..d7de9dc11f3 100644
--- a/apps/portal/src/app/wallets/faq/page.mdx
+++ b/apps/portal/src/app/wallets/faq/page.mdx
@@ -39,10 +39,6 @@ Yes, you can easily use account abstraction with in-app wallets to enable sponso
Thirdweb wallets can be used as a signer to a smart contract account (account abstraction), but it can also be used as a standalone EOA.
-### Is there a way to display the logged-in email address in the Wallet component, similar to the wallet address?
-
-Yes, we show the email by default in the details modal after you connect. To display the email anywhere else using React or React Native, [check out the code snippets for all platforms](/connect/in-app-wallet/how-to/interact-with-wallets#get-the-user-email).
-
### What happens if thirdweb ceases to exist? Will my users be able to access their wallets?
In the event that thirdweb ceases to exist, we have committed to keeping our in-app wallet service running for a period of at least 12 months after the shutdown announcement. During this time users will be able to access their wallet and transfer their assets out, or export their private key which they can then import into a different client.
@@ -58,7 +54,7 @@ Users can also link their account to a different auth method (e.g. email, phone,
### How is the private key managed?
-You can learn more about the architecture of how thirdweb wallets are created and stored [here](/connect/wallet/security)
+You can learn more about the architecture of how thirdweb wallets are created and stored [here](/wallets/security).
### What happens if thirdweb or my database gets breached?
diff --git a/apps/portal/src/app/wallets/link-profiles/page.mdx b/apps/portal/src/app/wallets/link-profiles/page.mdx
index 384502b39ba..ccd55d7a778 100644
--- a/apps/portal/src/app/wallets/link-profiles/page.mdx
+++ b/apps/portal/src/app/wallets/link-profiles/page.mdx
@@ -261,4 +261,4 @@ List linkedAccounts = await inAppWallet.GetLinkedAccounts();
-For fetching linked profile information from the backend, see [Fetch Users](/connect/wallet/get-users).
+For fetching linked profile information from the backend, see [Fetch Users](/wallets/get-users).
diff --git a/apps/portal/src/app/wallets/page.mdx b/apps/portal/src/app/wallets/page.mdx
index f3b3e8fe17d..0f9628009b2 100644
--- a/apps/portal/src/app/wallets/page.mdx
+++ b/apps/portal/src/app/wallets/page.mdx
@@ -584,10 +584,10 @@ Create wallets for your users, authenticate with your backend, connect to extern
To connect with other auth strategies, use external wallets, or sponsor gas for users, check out the following guides:
-- [Other auth strategies](/connect/wallet/sign-in-methods/configure)
-- [Sponsor Gas](/connect/account-abstraction/overview)
-- [Implement Sign In with Ethereum](/connect/auth)
-- [External Wallets](/connect/wallet/sign-in-methods/external-wallets) (e.g. MetaMask, WalletConnect, Coinbase Wallet, etc.)
+- [Authentication Methods](/connect/wallet/sign-in-methods/configure)
+- [Sponsor Gas](/wallets/sponsor-gas)
+- [Implement Sign In with Ethereum](/wallets/auth)
+- [External Wallets](/wallets/external-wallets) (e.g. MetaMask, WalletConnect, Coinbase Wallet, etc.)
## Explore Full API References
diff --git a/apps/portal/src/app/wallets/server/page.mdx b/apps/portal/src/app/wallets/server/page.mdx
index 637af9d9a27..cbb3cfe28ad 100644
--- a/apps/portal/src/app/wallets/server/page.mdx
+++ b/apps/portal/src/app/wallets/server/page.mdx
@@ -20,7 +20,7 @@ Server wallets are wallets that are managed by your own application, like a trea
- HTTP API
+ HTTP
diff --git a/apps/portal/src/components/Document/DocLink.tsx b/apps/portal/src/components/Document/DocLink.tsx
index 037ae71e929..f7a402c9861 100644
--- a/apps/portal/src/components/Document/DocLink.tsx
+++ b/apps/portal/src/components/Document/DocLink.tsx
@@ -10,7 +10,7 @@ export function DocLink(props: {
return (
-
-
0
+ ? props.showTableOfContents !== false
+ ? "xl:grid-cols-[220px_720px_1fr]"
+ : "xl:grid-cols-[220px_1160px]"
+ : props.showTableOfContents !== false
+ ? "xl:grid-cols-[960px_1fr]"
+ : "",
)}
style={{
minHeight: "calc(100vh - var(--sticky-top-height))",
}}
>
-
+ {props.sideBar.links.length > 0 && (
+
+ )}
diff --git a/apps/portal/src/components/others/Sidebar.tsx b/apps/portal/src/components/others/Sidebar.tsx
index 88602fe2f49..92bbeee8d05 100644
--- a/apps/portal/src/components/others/Sidebar.tsx
+++ b/apps/portal/src/components/others/Sidebar.tsx
@@ -150,12 +150,12 @@ function DocSidebarNonCollapsible(props: {
return (