diff --git a/bun.lockb b/bun.lockb
index 7404e8a..1cee772 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/docs/pages/FAQ.mdx b/docs/pages/FAQ.mdx
index d1f19ff..6d0be12 100644
--- a/docs/pages/FAQ.mdx
+++ b/docs/pages/FAQ.mdx
@@ -1,51 +1,60 @@
## What networks are supported?
-- Base
-- Arbitrum
-- Optimism
-- Zora
-- Polygon
-- BNB
-- Avalanche
-- ETH mainnet (not preferred for use, due to gas cost)
+
+* Base
+* Arbitrum
+* Optimism
+* Zora
+* Polygon
+* BNB
+* Avalanche
+* ETH mainnet (not preferred for use, due to gas cost)
**Testnets**
-- Sepolia
-- Base Sepolia
-## How does Smart Wallet work with Coinbase Wallet mobile app and extension?
+* Sepolia
+* Base Sepolia
+
+## How does Smart Wallet work with Coinbase Wallet mobile app and extension?
+
For now, Smart Wallet is separate from wallet mobile and extension. Users sign on [keys.coinbase.com](https://keys.coinbase.com/)
-and can view and manage assets at [homebase.coinbase.com](https://homebase.coinbase.com/).
+and can view and manage assets at [homebase.coinbase.com](https://homebase.coinbase.com/).
-See [makeWeb3Provider](/sdk/makeWeb3Provider#parameters) documentation for nuances based on different configurations.
+See [makeWeb3Provider](/sdk/makeWeb3Provider#parameters) documentation for nuances based on different configurations.
-## Do users have the same address across chains?
-Yes, a user's Smart Wallet address will be the same across all the chains we support.
+## Do users have the same address across chains?
+
+Yes, a user's Smart Wallet address will be the same across all the chains we support.
## How much does it cost?
-Smart Wallet is free to use for both developers and users.
-## Is Smart Wallet more expensive to use?
-Smart contract wallets use more gas per transaction than EOA wallets. This means they should be avoided on networks like Ethereum mainnet,
-but elsewhere the cost difference is negligible.
+Smart Wallet is free to use for both developers and users.
+
+## Is Smart Wallet more expensive to use?
+
+Smart contract wallets use more gas per transaction than EOA wallets. This means they should be avoided on networks like Ethereum mainnet,
+but elsewhere the cost difference is negligible.
For example, some current transaction costs on Base using Smart Wallet
-- ETH transfer: $0.03
-- ERC-20 transfer: $0.06
+
+* ETH transfer: $0.03
+* ERC-20 transfer: $0.06
## Who is holding the keys?
-Smart wallets are secured by passkeys stored on the user's device.
-Passkeys are backed up with passkey providers such as Apple, Chrome, or 1Password,
-or on hardware such as YubiKeys.
-Passkey signatures are validated directly onchain via an [open source and audited smart contract](https://github.com/base-org/webauthn-sol).
+
+Smart wallets are secured by passkeys stored on the user's device.
+Passkeys are backed up with passkey providers such as Apple, Chrome, or 1Password,
+or on hardware such as YubiKeys.
+Passkey signatures are validated directly onchain via an [open source and audited smart contract](https://github.com/base-org/webauthn-sol).
Coinbase never holds keys and never has access to user funds.
-## What is a passkey?
+## What is a passkey?
+
Passkeys are alternatives to passwords or other encrypted methods like recovery phrases, that are extremely easy to create and highly secure.
They are end-to-end encrypted and linked to your Google or iCloud account, Chrome profile, or hardware device such as a YubiKey.
This means users no longer have to deal with passwords or recovery phrases. Instead they can use common methods of authorization like touch or faceID, and be more resistant to phishing attempts.
-## What happens if a user loses their passkey?
+## What happens if a user loses their passkey?
Every Smart Wallet supports multiple owners, and our client will soon allow users to add a backup recovery key for the unlikely case they lose their passkey.
diff --git a/docs/pages/base-gasless-campaign.mdx b/docs/pages/base-gasless-campaign.mdx
index 89d3807..aaf218b 100644
--- a/docs/pages/base-gasless-campaign.mdx
+++ b/docs/pages/base-gasless-campaign.mdx
@@ -1,11 +1,11 @@
# Base Gasless Campaign
-Base is offering gas credits to help developers make the most of
-Smart Wallet's [paymaster (sponsored transactions)](/guides/paymasters) features.
+Base is offering gas credits to help developers make the most of
+Smart Wallet's [paymaster (sponsored transactions)](/guides/paymasters) features.
| Partner Tier | Base Gas Credit Incentive | Requirements | Actions |
|--------------|---------------------------|--------------|----------|
| 1 | $15k |
- Support Coinbase Smart Wallet
- Onboard to Coinbase Paymaster
- Preferred placement in your UI (ie “Create Wallet” button)
|
1. Bump your Coinbase SDK to add Coinbase Smart Wallet to your app, or bump to latest version of any [supporting wallet library](/wallet-library-support).
2. Sign in / up for [Coinbase Developer Platform](https://www.coinbase.com/developer-platform) (takes less than 2 minutes). No KYC needed - just email and phone.
3. Check out the Paymaster product where the Base Mainnet Paymaster is enabled by default. Set and change your gas policy at any time.
4. Complete [this form](https://docs.google.com/forms/d/1yPnBFW0bVUNLUN_w3ctCqYM9sjdIQO3Typ53KXlsS5g/viewform?edit_requested=true) and email basegascredits@coinbase.com that you’ve completed, along with evidence that you’ll have the “Create Wallet” button in your UI
Credits will land within 1 week of completion
|
| 2 | $10k |
- Support Coinbase Smart Wallet
- Onboard to Coinbase Paymaster
|
1. Bump your Coinbase SDK to add Coinbase Smart Wallet to your app, or bump to latest version of any [supporting wallet library](/wallet-library-support).
2. Sign in / up for [Coinbase Developer Platform](https://www.coinbase.com/developer-platform) (takes less than 2 minutes). No KYC needed - just email and phone.
3. Check out the Paymaster product where the Base Mainnet Paymaster is enabled by default. Set and change your gas policy at any time.
4. Complete [this form](https://docs.google.com/forms/d/1yPnBFW0bVUNLUN_w3ctCqYM9sjdIQO3Typ53KXlsS5g/viewform?edit_requested=true) and email basegascredits@coinbase.com that you’ve completed.
Credits will land within 1 week of completion
|
| 3 | $3k |
- Support Coinbase Smart Wallet
- Provide Contract Address
|
1. Bump your Coinbase SDK to add Coinbase Smart Wallet to your app, or bump to latest version of any [supporting wallet library](/wallet-library-support).
2. Provide your contract address(es) in [this form](https://docs.google.com/forms/d/1wiEf01LCA4FBQ2Yh_K20TC9USgDPR95LkVVfe_o2-Is/viewform?edit_requested=true).
3. For additional credits, sign in / up for [Coinbase Developer Platform](https://www.coinbase.com/developer-platform) (takes less than 2 minutes). No KYC needed - just email and phone.
|
-| Bonus | $1k |
- Release demo
| Create a demo of your Coinbase Smart wallet integration, post on social (Warpcast and/or X) and tag Coinbase Wallet and/or Base|
\ No newline at end of file
+| Bonus | $1k |
- Release demo
| Create a demo of your Coinbase Smart wallet integration, post on social (Warpcast and/or X) and tag Coinbase Wallet and/or Base|
diff --git a/docs/pages/checklist.mdx b/docs/pages/checklist.mdx
index 378465f..19d6dc6 100644
--- a/docs/pages/checklist.mdx
+++ b/docs/pages/checklist.mdx
@@ -1,35 +1,43 @@
-# Smart Wallet Launch-Ready Checklist
+# Smart Wallet Launch-Ready Checklist
+
## The Basics
:::steps
### Test your app with Smart Wallet
-
+
Test your app with Smart Wallet enabled. See [our guide](/guides/update-existing-app).
### Ensure Smart Wallet compatible Signature Validation
-
-If your app does any offchain signature validation (such as Sign-In With Ethereum) or your smart contracts
-do any signature validation, ensure your app is [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492) compliant.
-See [our guide](/guides/signature-verification).
+
+If your app does any offchain signature validation (such as Sign-In With Ethereum) or your smart contracts
+do any signature validation, ensure your app is [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492) compliant.
+See [our guide](/guides/signature-verification).
### Magic Spend Compatible
+
Magic Spend enables users to get "just in time" transaction funding from their Coinbase account.
-This is currently supported for ETH only on Base.
-To give users the best experience, apps should make use of the `auxiliaryFunds` capability
+This is currently supported for ETH only on Base.
+To give users the best experience, apps should make use of the `auxiliaryFunds` capability
and ensure they are not blocking actions based solely on onchain balance checks. See [our guide](/guides/magic-spend).
### Use SDK 4.0.3 or later
+
Ensure your app is using SDK version 4.0.3. Check [Wallet Library Support](/wallet-library-support) to ensure readiness.
:::
## Bonus: Make the most of Smart Wallet!
+
:::steps
+
### Batch Transactions
-Improve your app's UX by using batch transactions, allowing, for examples,
+
+Improve your app's UX by using batch transactions, allowing, for examples,
approvals and swaps to happen in a single transaction. See [our guide](/guides/batch-transactions).
+
### Paymasters (sponsored transactions)
+
Smart Wallet is one of the first wallets to support app-defined paymasters. This enables sponsoring
-certain transactions for your users, so they do not have to know or think about gas cost.
+certain transactions for your users, so they do not have to know or think about gas cost.
See [our guide](/guides/paymasters).
-:::
\ No newline at end of file
+:::
diff --git a/docs/pages/guides/batch-transactions.mdx b/docs/pages/guides/batch-transactions.mdx
index 877627e..1b4aa89 100644
--- a/docs/pages/guides/batch-transactions.mdx
+++ b/docs/pages/guides/batch-transactions.mdx
@@ -7,11 +7,12 @@ You can submit batch transactions by using new `wallet_sendCalls` RPC, defined [
## Using Wagmi
:::warning
-The `useWriteContracts` and `useCapabilities` hooks used below rely on new wallet RPC and are not yet supported in most wallets.
-It is recommended to have a fallback function if your app supports wallets other than Smart Wallet.
+The `useWriteContracts` and `useCapabilities` hooks used below rely on new wallet RPC and are not yet supported in most wallets.
+It is recommended to have a fallback function if your app supports wallets other than Smart Wallet.
:::
:::steps
+
### (Optional) Check for atomic batching support
Smart Wallet will submit multiple calls as part of a single transaction. However, if your app supports other wallets, and you want to check that multiple calls will be submitted atomically (in a single transaction), check the wallet's capabilities.
@@ -175,4 +176,4 @@ function App() {
}
```
-:::
\ No newline at end of file
+:::
diff --git a/docs/pages/guides/components/App.tsx b/docs/pages/guides/components/App.tsx
new file mode 100644
index 0000000..9b26634
--- /dev/null
+++ b/docs/pages/guides/components/App.tsx
@@ -0,0 +1,18 @@
+'use client';
+
+import type { ReactNode } from 'react';
+
+
+export default function App({ children }: { children: ReactNode }) {
+ const isServer = typeof window === 'undefined';
+ if (isServer) {
+ return null;
+ }
+ return (
+
+
+ {children}
+
+
+ );
+}
\ No newline at end of file
diff --git a/docs/pages/guides/components/RequestAccountsButton.tsx b/docs/pages/guides/components/RequestAccountsButton.tsx
new file mode 100644
index 0000000..4ea8ec8
--- /dev/null
+++ b/docs/pages/guides/components/RequestAccountsButton.tsx
@@ -0,0 +1,15 @@
+import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'
+
+export const sdk = new CoinbaseWalletSDK({
+ appName: 'My App Name',
+ appChainIds: [8453]
+});
+
+export default function RequestAccountsButton() {
+ const provider = sdk.makeWeb3Provider({options: 'smartWalletOnly'});
+ return(
+
+ )
+}
diff --git a/docs/pages/guides/components/create-wallet-button.mdx b/docs/pages/guides/components/create-wallet-button.mdx
index 6b07ba1..27e579e 100644
--- a/docs/pages/guides/components/create-wallet-button.mdx
+++ b/docs/pages/guides/components/create-wallet-button.mdx
@@ -12,18 +12,17 @@ For the best onboarding experience, we recommend adding a highly visible 'Create
Adding a 'Create Wallet' button to a page streamlines the onboarding experience for a new user and gets them ready to use your dapp in a few seconds.
-
-We're offering additional incentives to dapps who implement this new approach. By integrating a create wallet button on the front page of your app, you are eligible for:
+
+ We're offering additional incentives to dapps who implement this new approach. By integrating a create wallet button on the front page of your app, you are eligible for:
-- Increased volume of gas credits via our Cloud paymaster
-- Comarketing and promotional opportunities with Coinbase
-- Featured placement in our dapp listings on homebase.coinbase.com
-
-For more information, please [fill out the
-form](https://docs.google.com/forms/d/e/1FAIpQLSdmTnSjbI-wkkf2TzmuSEv3iYzkbZBsY08xPdK-54J0Ipt4PA/viewform)
-on [coinbase.com/smart-wallet](http://coinbase.com/smart-wallet) so our team can get
-in touch with you.
+ * Increased volume of gas credits via our Cloud paymaster
+ * Comarketing and promotional opportunities with Coinbase
+ * Featured placement in our dapp listings on homebase.coinbase.com
+ For more information, please [fill out the
+ form](https://docs.google.com/forms/d/e/1FAIpQLSdmTnSjbI-wkkf2TzmuSEv3iYzkbZBsY08xPdK-54J0Ipt4PA/viewform)
+ on [coinbase.com/smart-wallet](http://coinbase.com/smart-wallet) so our team can get
+ in touch with you.
## Implementation
@@ -31,7 +30,7 @@ in touch with you.
**We recommend two paths for implementation:**
1. Match our branded Create Wallet button
-1. Match your own apps look and feel in the Create button
+2. Match your own apps look and feel in the Create button
Example:
@@ -39,6 +38,7 @@ Example:
@@ -277,8 +277,8 @@ declare module 'wagmi' {
#### Notes
-- For more detail, view the [`useConnect` documentation](https://wagmi.sh/react/api/hooks/useConnect).
-- Upon successful connection, account information can be accessed via [data](https://wagmi.sh/react/api/hooks/useConnect#data)
+* For more detail, view the [`useConnect` documentation](https://wagmi.sh/react/api/hooks/useConnect).
+* Upon successful connection, account information can be accessed via [data](https://wagmi.sh/react/api/hooks/useConnect#data)
returned from `useConnect`, or via [`useAccount`](https://wagmi.sh/react/api/hooks/useAccount).
### With CoinbaseWalletSDK only
diff --git a/docs/pages/guides/create-app/using-boat.mdx b/docs/pages/guides/create-app/using-boat.mdx
index 7023b93..06db11f 100644
--- a/docs/pages/guides/create-app/using-boat.mdx
+++ b/docs/pages/guides/create-app/using-boat.mdx
@@ -1,24 +1,32 @@
-# Getting started with Build Onchain Apps Template
+# Getting started with Build Onchain Apps Template
+
This guide uses [Build Onchain Apps Template](https://buildonchainapps.xyz/).
::::steps
+
## Create project
-Run the command below and proceed through the following steps, choosing "yes"
+
+Run the command below and proceed through the following steps, choosing "yes"
when asked "Do you want to use Smart Wallet?".
+
```bash
npx @coinbase/build-onchain-apps@latest create
```
-## Setup project
+## Setup project
+
Open your newly created project, and create a new `.env` file in the `web` folder. Add the following to this file.
+
```bash
NEXT_PUBLIC_RPC_URL=https://sepolia.base.org
ENVIRONMENT=localhost
```
-## Install dependencies and run dev
+## Install dependencies and run dev
+
```bash
yarn install && yarn dev
```
+
Visit your site locally and click the "Connect Wallet" button. You'll see a popup window with a Smart Wallet
connection option.
-::::
\ No newline at end of file
+::::
diff --git a/docs/pages/guides/create-app/using-wagmi.mdx b/docs/pages/guides/create-app/using-wagmi.mdx
index 5adfee6..d7b8d77 100644
--- a/docs/pages/guides/create-app/using-wagmi.mdx
+++ b/docs/pages/guides/create-app/using-wagmi.mdx
@@ -3,6 +3,7 @@
This guide covers creating a new Wagmi template project that uses Smart Wallet.
::::steps
+
## Run the following command and proceed through the prompts.
:::code-group
@@ -66,4 +67,4 @@ Temporarily disable the Extension to connect with Smart Wallet.
## Keep building
You can find everything you need here: https://wagmi.sh/react/api/hooks
-::::
\ No newline at end of file
+::::
diff --git a/docs/pages/guides/magic-spend.mdx b/docs/pages/guides/magic-spend.mdx
index 75111ce..47b4c93 100644
--- a/docs/pages/guides/magic-spend.mdx
+++ b/docs/pages/guides/magic-spend.mdx
@@ -28,6 +28,6 @@ function App() {
}
```
-If your app supports Smart Wallet and sees that the `auxiliaryFunds` capability is supported on a given chain,
-it means that a user might have funds available for use onchain on Coinbase.
-As a result, your app should not block user actions on the basis of balance checks.
\ No newline at end of file
+If your app supports Smart Wallet and sees that the `auxiliaryFunds` capability is supported on a given chain,
+it means that a user might have funds available for use onchain on Coinbase.
+As a result, your app should not block user actions on the basis of balance checks.
diff --git a/docs/pages/guides/paymasters.mdx b/docs/pages/guides/paymasters.mdx
index c110ec2..f64afb3 100644
--- a/docs/pages/guides/paymasters.mdx
+++ b/docs/pages/guides/paymasters.mdx
@@ -6,11 +6,12 @@ The code below is also in our [Wagmi Smart Wallet template](https://github.com/w
## Using Wagmi + Permissionless in a Next.js app
:::warning
-The `useWriteContracts` and `useCapabilities` hooks used below rely on new wallet RPC and are not yet supported in most wallets.
-It is recommended to have a fallback function if your app supports wallets other than Smart Wallet.
+The `useWriteContracts` and `useCapabilities` hooks used below rely on new wallet RPC and are not yet supported in most wallets.
+It is recommended to have a fallback function if your app supports wallets other than Smart Wallet.
:::
::::steps
+
### Choose a paymaster service provider
As a prerequisite, you'll need to obtain a paymaster service URL from a paymaster service provider. To be compatible with Smart Wallet, the paymaster provider you choose must be ERC-7677-compliant.
@@ -22,23 +23,26 @@ Once you choose a paymaster service provider and obtain a paymaster service URL,
### (Recommended) Setup your paymaster proxy
-Creating an API to proxy calls to your paymaster service is important for two reasons.
-1. Allows you to protect any API secret.
-2. Allows you to add extra validation on what requests you want to sponsor.
+Creating an API to proxy calls to your paymaster service is important for two reasons.
+
+1. Allows you to protect any API secret.
+2. Allows you to add extra validation on what requests you want to sponsor.
#### Validate UserOperation
-:::info
-`willSponsor` can be simplified or removed entirely if your paymaster service supports allowlisting which
-contracts and function calls should be sponsored. [Coinbase Developer Platform](https://www.coinbase.com/developer-platform) supports this.
+
+:::info
+`willSponsor` can be simplified or removed entirely if your paymaster service supports allowlisting which
+contracts and function calls should be sponsored. [Coinbase Developer Platform](https://www.coinbase.com/developer-platform) supports this.
:::
Before we write our proxy, let's write a `willSponsor` function to add some extra validation.
-The policies on many paymaster services are quite simple and limited. As your API will be exposed on the web,
-you want to make sure in cannot abused: called to sponsor transaction you do not want to fund. The checks below
+The policies on many paymaster services are quite simple and limited. As your API will be exposed on the web,
+you want to make sure in cannot abused: called to sponsor transaction you do not want to fund. The checks below
are a bit tedious, but highly recommended to be safe. See "Trust and Validation" [here](https://hackmd.io/@AhweV9sISeevhvrtVPCGDw/BynRsX7Ca#Trust-and-Validation)
-for more on this.
+for more on this.
-The code below is built specifically for Smart Wallet. It would need to be updated to support other smart accounts.
+The code below is built specifically for Smart Wallet. It would need to be updated to support other smart accounts.
:::code-group
+
```ts twoslash [utils.ts]
import { ENTRYPOINT_ADDRESS_V06, UserOperation } from "permissionless";
import {
@@ -148,6 +152,7 @@ export async function willSponsor({
}
}
```
+
```ts twoslash [constants.ts] filename="constants.ts"
export const coinbaseSmartWalletProxyBytecode =
"0x363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f3";
@@ -192,6 +197,7 @@ export const coinbaseSmartWalletABI = [
},
];
```
+
```ts twoslash [myNFT.ts] filename="myNFT.ts"
export const myNFTABI = [
{
@@ -206,6 +212,7 @@ export const myNFTABI = [
export const myNFTAddress = "0x119Ea671030FBf79AB93b436D2E20af6ea469a19";
```
+
```ts twoslash [config.ts] filename="config.ts"
import { createPublicClient, http } from "viem";
import { baseSepolia } from "viem/chains";
@@ -215,11 +222,14 @@ export const client = createPublicClient({
transport: http(),
});
```
+
:::
#### Create Proxy
+
The proxy you create will need to handle the `pm_getPaymasterStubData` and `pm_getPaymasterData` JSON-RPC requests specified by ERC-7677.
:::code-group
+
```ts twoslash [route.ts]
import { paymasterClient } from "./config";
// @noErrors
@@ -249,6 +259,7 @@ export async function POST(r: Request) {
}
```
+
```ts twoslash [config.ts] filename="config.ts"
const process = { env: { PAYMASTER_SERVICE_URL: '' } }
// ---cut---
@@ -264,6 +275,7 @@ export const paymasterClient = createClient({
transport: http(paymasterService),
}).extend(paymasterActionsEip7677(ENTRYPOINT_ADDRESS_V06));
```
+
:::
### Send EIP-5792 requests with a paymaster service capability
@@ -273,6 +285,7 @@ Once you have your paymaster service set up, you can now pass its URL along to W
If you set up a proxy in your app's backend as recommended in step (2) above, you'll want to pass in the proxy URL you created.
:::code-group
+
```ts twoslash [App.tsx]
import { useAccount } from "wagmi";
import { useCapabilities, useWriteContracts } from "wagmi/experimental";
@@ -333,6 +346,7 @@ export function App() {
);
}
```
+
```ts twoslash [myNFT.ts] filename="myNFT.ts"
export const myNFTABI = [
{
@@ -347,9 +361,10 @@ export const myNFTABI = [
export const myNFTAddress = "0x119Ea671030FBf79AB93b436D2E20af6ea469a19";
```
+
:::
-That's it! Smart Wallet will handle the rest. If your paymaster service is able to sponsor the transaction,
-in the UI Smart Wallet will indicate to your user that the transaction is sponsored.
+That's it! Smart Wallet will handle the rest. If your paymaster service is able to sponsor the transaction,
+in the UI Smart Wallet will indicate to your user that the transaction is sponsored.
-::::
\ No newline at end of file
+::::
diff --git a/docs/pages/guides/signature-verification.mdx b/docs/pages/guides/signature-verification.mdx
index 2b493fe..67a02e7 100644
--- a/docs/pages/guides/signature-verification.mdx
+++ b/docs/pages/guides/signature-verification.mdx
@@ -2,44 +2,49 @@
There are important details to verifying smart contract wallet signatures. The smart contract itself
cannot produce a signature. Instead, the contract has a function
+
```solidity
function isValidSignature(bytes32 _hash, bytes memory _signature) returns (bytes4 magicValue);
```
+
which can be called to determine if signature should be considered valid (defined in [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271)).
In the case of Smart Wallet, a signature is considered valid if it was signed by a current signer (aka "owner") of the Smart Wallet.
For example, a user can sign a message with their passkey, and when `isValidSignature` is called on their Smart Wallet,
-it would return that the signature is valid because their passkey is an owner.
+it would return that the signature is valid because their passkey is an owner.
There is also an additional complexity: users receive their Smart Wallet address immediately upon passkey registration,
and are able to begin signing for their Smart Wallet,
but their Smart Wallet is not deployed on a chain until the first transaction on that chain.
-[ERC-6492](https://eips.ethereum.org/EIPS/eip-6492) describes
-> With the rising popularity of account abstraction, we often find that the best user experience
-for contract wallets is to defer contract deployment until the first user transaction,
-therefore not burdening the user with an additional deploy step before they can use their account.
-However, at the same time, many dApps expect signatures, not only for interactions, but also just for logging in.
+[ERC-6492](https://eips.ethereum.org/EIPS/eip-6492) describes
+
+> With the rising popularity of account abstraction, we often find that the best user experience
+> for contract wallets is to defer contract deployment until the first user transaction,
+> therefore not burdening the user with an additional deploy step before they can use their account.
+> However, at the same time, many dApps expect signatures, not only for interactions, but also just for logging in.
So the challenge is, how do we verify signatures in a way that works for both deployed and undeployed Smart Wallets?
-ERC-6492 has a solution for this, which Smart Wallet has adopted.
+ERC-6492 has a solution for this, which Smart Wallet has adopted.
We won't go unto all the details here, read the ERC linked above, if you're looking for that.
Below we cover the minimum work needed to support on and off chain signature validation for Smart Wallet.
## Offchain
-For purely offchain signature verification––such as "Sign-In With Ethereum"––ensure you are using
-a ERC-6492-compliant signature verification library.
-We recommend Viem's [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage#verifymessage) ([example](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/SignMessage.tsx#L28))
+
+For purely offchain signature verification––such as "Sign-In With Ethereum"––ensure you are using
+a ERC-6492-compliant signature verification library.
+We recommend Viem's [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage#verifymessage) ([example](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/SignMessage.tsx#L28))
and [verifyTypedData](https://viem.sh/docs/actions/public/verifyTypedData) ([example](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/TypedSign.tsx#L46)).
See our [Sign-In with Ethereum guide](/guides/siwe) for a detailed example.
## Onchain
-For signatures that will be used onchain, such as with [Permit2](https://github.com/Uniswap/permit2)
-or [Seaport](https://github.com/ProjectOpenSea/seaport) developers will need to inspect the signature offchain
-and remove unneeded ERC-6492 data, if it is present.
-We recommend using the [parseErc6492Signature](https://viem.sh/experimental/erc6492/parseErc6492Signature#parseerc6492signature)
-util from Viem. Abbreviated example below. See full example [here](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/Permit2.tsx).
+
+For signatures that will be used onchain, such as with [Permit2](https://github.com/Uniswap/permit2)
+or [Seaport](https://github.com/ProjectOpenSea/seaport) developers will need to inspect the signature offchain
+and remove unneeded ERC-6492 data, if it is present.
+We recommend using the [parseErc6492Signature](https://viem.sh/experimental/erc6492/parseErc6492Signature#parseerc6492signature)
+util from Viem. Abbreviated example below. See full example [here](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/Permit2.tsx).
```ts [example.tsx]
import { useMemo, useState } from "react";
diff --git a/docs/pages/guides/siwe.mdx b/docs/pages/guides/siwe.mdx
index bf8cf21..5d2c90b 100644
--- a/docs/pages/guides/siwe.mdx
+++ b/docs/pages/guides/siwe.mdx
@@ -13,6 +13,7 @@ This guide covers creating a new Sign-In with Ethereum template project that use
::::steps
+
## Create a project
Follow the [Wagmi guide](/guides/create-app/using-wagmi) to set up a template project and connect a Smart Wallet.
@@ -31,12 +32,10 @@ bun install siwe
:::
-
## Create a new SIWE component
:::code-group
-
```tsx twoslash [src/SignInWithEthereum.tsx]
import React from 'react';
@@ -99,8 +98,8 @@ export default App
:::
-
## Prompt to sign and store signature
+
Wagmi's `signMessage` function will open the Smart Wallet popup to sign the message. The signature is stored in the component's state.
```tsx twoslash [src/SignInWithEthereum.tsx]
@@ -205,5 +204,6 @@ export function SignInWithEthereum() {
```
## Sign in with Ethereum
+
Visit your local server and click "Sign In with Ethereum"
-::::
\ No newline at end of file
+::::
diff --git a/docs/pages/guides/tips/inspect-txn-simulation.mdx b/docs/pages/guides/tips/inspect-txn-simulation.mdx
index f525ad0..94799c5 100644
--- a/docs/pages/guides/tips/inspect-txn-simulation.mdx
+++ b/docs/pages/guides/tips/inspect-txn-simulation.mdx
@@ -1,11 +1,13 @@
# Transaction Simulation Data
+
There is a hidden feature which enables you to easily copy transaction simulation request and response data which can then be pasted it in a text editor to inspect.
## Instructions
-- Click the area defined in red **_five times_**, then paste the copied data in a text editor.
+
+* Click the area defined in red ***five times***, then paste the copied data in a text editor.
![Copy transaction simulation data click zone](/copyTxnSimClickZone.png)
-
\ No newline at end of file
+
diff --git a/docs/pages/guides/tips/popup-tips.mdx b/docs/pages/guides/tips/popup-tips.mdx
index 1c7c83d..00e02c4 100644
--- a/docs/pages/guides/tips/popup-tips.mdx
+++ b/docs/pages/guides/tips/popup-tips.mdx
@@ -1,34 +1,38 @@
# Popup Tips
## Overview
-When a Smart Wallet is connected and Coinbase Wallet SDK receives a request, it opens
-[keys.coinbase.com](https://keys.coinbase.com/) in a popup window and passes the request to the popup for handling.
+
+When a Smart Wallet is connected and Coinbase Wallet SDK receives a request, it opens
+[keys.coinbase.com](https://keys.coinbase.com/) in a popup window and passes the request to the popup for handling.
Keep the following points in mind when working with the Smart Wallet popup.
## Default blocking behavior
-- Most modern browsers block all popups by default, unless they are triggered by a click.
-- If a popup is blocked the browser shows a notification to the user, allowing them to manage popup settings.
+
+* Most modern browsers block all popups by default, unless they are triggered by a click.
+* If a popup is blocked the browser shows a notification to the user, allowing them to manage popup settings.
### What to do about it
-- Ensure there is no additional logic between the button click and the request to open the Smart Wallet popup,
-as browsers might perceive the request as programmatically initiated.
-- If logic is unavoidable, keep it minimal and test thoroughly in all supported browsers.
-## `Cross-Origin-Opener-Policy`
-If the Smart Wallet popup opens and displays an error or infinite spinner, it may be due to the dapp's `Cross-Origin-Opener-Policy`. Be sure to use a directive that allows the Smart Wallet popup to function.
+* Ensure there is no additional logic between the button click and the request to open the Smart Wallet popup,
+ as browsers might perceive the request as programmatically initiated.
+* If logic is unavoidable, keep it minimal and test thoroughly in all supported browsers.
-- ✅ Allows Smart Wallet popup to function
- - `unsafe-none` (default)
- - `same-origin-allow-popups` (recommended)
-- ❌ Breaks Smart Wallet popup
- - `same-origin`
+## `Cross-Origin-Opener-Policy`
-For more detailed information refer to the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy).
+If the Smart Wallet popup opens and displays an error or infinite spinner, it may be due to the dapp's `Cross-Origin-Opener-Policy`. Be sure to use a directive that allows the Smart Wallet popup to function.
+* ✅ Allows Smart Wallet popup to function
+ * `unsafe-none` (default)
+ * `same-origin-allow-popups` (recommended)
+* ❌ Breaks Smart Wallet popup
+ * `same-origin`
+
+For more detailed information refer to the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy).
## Smart Wallet popup 'linger' behavior
-- Sometimes a dapp may programmatically make a followup request based on the response to a previous request.
-Normally, browsers block these programmatic requests to open popups.
-- To address this, after the Smart Wallet popup responds to a request, it will linger for 200ms to listen for another incoming request before closing.
- - If a request is received *during* this 200ms window, it will be received and handled within the same popup window.
- - If a request is received *after* the 200ms window and the popup has closed, opening the Smart Wallet popup will be blocked by the browser.
\ No newline at end of file
+
+* Sometimes a dapp may programmatically make a followup request based on the response to a previous request.
+ Normally, browsers block these programmatic requests to open popups.
+* To address this, after the Smart Wallet popup responds to a request, it will linger for 200ms to listen for another incoming request before closing.
+ * If a request is received *during* this 200ms window, it will be received and handled within the same popup window.
+ * If a request is received *after* the 200ms window and the popup has closed, opening the Smart Wallet popup will be blocked by the browser.
diff --git a/docs/pages/guides/update-existing-app.mdx b/docs/pages/guides/update-existing-app.mdx
index 70fda53..7caa4cc 100644
--- a/docs/pages/guides/update-existing-app.mdx
+++ b/docs/pages/guides/update-existing-app.mdx
@@ -1,7 +1,9 @@
# Update an Existing Project
-## Direct dependency
+## Direct dependency
+
Follow the [installation instructions](/sdk/install).
-## Wagmi
-1. Upgrade Wagmi to version `2.9.5` or higher.
\ No newline at end of file
+## Wagmi
+
+1. Upgrade Wagmi to version `2.9.5` or higher.
diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx
index 2940343..de2faae 100644
--- a/docs/pages/index.mdx
+++ b/docs/pages/index.mdx
@@ -6,4 +6,4 @@ export default function Redirect() {
}, []);
return null;
-}
\ No newline at end of file
+}
diff --git a/docs/pages/quick-start.mdx b/docs/pages/quick-start.mdx
index 8aef1d7..e4083e1 100644
--- a/docs/pages/quick-start.mdx
+++ b/docs/pages/quick-start.mdx
@@ -1,7 +1,9 @@
-# Quick Start
-You can try Smart Wallet today on [any supported chain](/FAQ#what-networks-are-supported)! Checkout our guides
-- [Create a new app using Build Onchain Template](/guides/create-app/using-boat)
-- [Create a new app using Wagmi Template](/guides/create-app/using-wagmi)
-- [Update an existing app](/guides/update-existing-app)
+# Quick Start
-Reach out to us in the `#smart-wallet` channel on [Discord](https://discord.com/invite/cdp/) if you have any questions.
\ No newline at end of file
+You can try Smart Wallet today on [any supported chain](/FAQ#what-networks-are-supported)! Checkout our guides
+
+* [Create a new app using Build Onchain Template](/guides/create-app/using-boat)
+* [Create a new app using Wagmi Template](/guides/create-app/using-wagmi)
+* [Update an existing app](/guides/update-existing-app)
+
+Reach out to us in the `#smart-wallet` channel on [Discord](https://discord.com/invite/cdp/) if you have any questions.
diff --git a/docs/pages/sdk/CoinbaseWalletProvider/eth2.mdx b/docs/pages/sdk/CoinbaseWalletProvider/eth2.mdx
new file mode 100644
index 0000000..93c3326
--- /dev/null
+++ b/docs/pages/sdk/CoinbaseWalletProvider/eth2.mdx
@@ -0,0 +1,15 @@
+import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'
+
+export const sdk = new CoinbaseWalletSDK({
+ appName: 'My App Name',
+ appChainIds: [8453]
+});
+
+export default function Test() {
+ const provider = sdk.makeWeb3Provider({options: 'smartWalletOnly'});
+ return(
+
+ )
+}
diff --git a/docs/pages/sdk/CoinbaseWalletProvider/overview.mdx b/docs/pages/sdk/CoinbaseWalletProvider/overview.mdx
new file mode 100644
index 0000000..e8268bc
--- /dev/null
+++ b/docs/pages/sdk/CoinbaseWalletProvider/overview.mdx
@@ -0,0 +1,5 @@
+# Overview
+
+CoinbaseWalletProvider is an [Ethereum Javascript provider](https://eips.ethereum.org/EIPS/eip-1193) provider.
+Most RPC requests received are passed directly to the wallet, creating a popup window, in the case of Smart Wallet.
+In this section we document the known RPC requests which the SDK is intended to service.
diff --git a/docs/pages/sdk/CoinbaseWalletProvider/request/eth_requestAccounts.mdx b/docs/pages/sdk/CoinbaseWalletProvider/request/eth_requestAccounts.mdx
new file mode 100644
index 0000000..796b25d
--- /dev/null
+++ b/docs/pages/sdk/CoinbaseWalletProvider/request/eth_requestAccounts.mdx
@@ -0,0 +1,6 @@
+import App from '../../../guides/components/App';
+import RequestAccountsButton from '../../../guides/components/RequestAccountsButton';
+
+
+
+
diff --git a/docs/pages/sdk/eth1.mdx b/docs/pages/sdk/eth1.mdx
new file mode 100644
index 0000000..fa741f3
--- /dev/null
+++ b/docs/pages/sdk/eth1.mdx
@@ -0,0 +1,6 @@
+import App from '../guides/components/App';
+import RequestAccountsButton from '../guides/components/RequestAccountsButton';
+
+
+
+
diff --git a/docs/pages/sdk/install.mdx b/docs/pages/sdk/install.mdx
index 3e4707c..15cdd33 100644
--- a/docs/pages/sdk/install.mdx
+++ b/docs/pages/sdk/install.mdx
@@ -1,6 +1,7 @@
# Install
-## Command
+## Command
+
:::code-group
```bash [npm]
@@ -18,5 +19,5 @@ yarn add @coinbase/wallet-sdk
```bash [bun]
bun i @coinbase/wallet-sdk
```
-:::
+:::
diff --git a/docs/pages/sdk/makeWeb3Provider.mdx b/docs/pages/sdk/makeWeb3Provider.mdx
index d8decab..5121fca 100644
--- a/docs/pages/sdk/makeWeb3Provider.mdx
+++ b/docs/pages/sdk/makeWeb3Provider.mdx
@@ -1,8 +1,11 @@
-# makeWeb3Provider
-Creates a new `CoinbaseWalletProvider` instance using a `CoinbaseWalletSDK` instance.
+# makeWeb3Provider
+
+Creates a new `CoinbaseWalletProvider` instance using a `CoinbaseWalletSDK` instance.
## Usage
+
:::code-group
+
```ts twoslash [provider.ts]
import {sdk} from "./setup";
@@ -11,6 +14,7 @@ const provider = sdk.makeWeb3Provider({options: 'smartWalletOnly'});
// Use provider
const addresses = provider.request({method: 'eth_requestAccounts'});
```
+
```ts twoslash [setup.ts] filename="setup.ts"
import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'
@@ -19,31 +23,36 @@ export const sdk = new CoinbaseWalletSDK({
appChainIds: [8453]
});
```
+
:::
-## Returns
+## Returns
+
A new `CoinbaseWalletProvider` instance, which is an [Ethereum Javascript provider](https://eips.ethereum.org/EIPS/eip-1193) provider.
-## Parameters
+## Parameters
### options (optional)
-- Type: `'all' | 'smartWalletOnly' | 'eoaOnly'`
-Determines which connection options users will see. Defaults to `all`.
+* Type: `'all' | 'smartWalletOnly' | 'eoaOnly'`
+Determines which connection options users will see. Defaults to `all`.
#### `all`
-Users will see Smart Wallet and mobile app connection options.
+
+Users will see Smart Wallet and mobile app connection options.
:::info
-If a user is using a browser with Coinbase Wallet Extension installed, they will be taken straight to the
-Coinbase Wallet Extension and not see any choice.
+If a user is using a browser with Coinbase Wallet Extension installed, they will be taken straight to the
+Coinbase Wallet Extension and not see any choice.
:::
#### `smartWalletOnly`
-With this option, users will only see an option to create a Smart Wallet or sign into their Smart Wallet.
+
+With this option, users will only see an option to create a Smart Wallet or sign into their Smart Wallet.
#### `eoaOnly`
-Users will only see the mobile app connection option. If the user is on mobile, they will be taken directly
-to the Coinbase Wallet app. If the user is using a browser with Coinbase Wallet Extension, they will be taken
-directly to the Extension.
\ No newline at end of file
+
+Users will only see the mobile app connection option. If the user is on mobile, they will be taken directly
+to the Coinbase Wallet app. If the user is using a browser with Coinbase Wallet Extension, they will be taken
+directly to the Extension.
diff --git a/docs/pages/sdk/setup.mdx b/docs/pages/sdk/setup.mdx
index 1353101..2b8b48e 100644
--- a/docs/pages/sdk/setup.mdx
+++ b/docs/pages/sdk/setup.mdx
@@ -1,5 +1,6 @@
-# Setup
-Create a new `CoinbaseWalletSDK` instance.
+# Setup
+
+Create a new `CoinbaseWalletSDK` instance.
```ts twoslash
import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'
@@ -10,21 +11,24 @@ const sdk = new CoinbaseWalletSDK({
});
```
-## Parameters
+## Parameters
+
### appName (optional)
-- Type: `string`
+
+* Type: `string`
The app name. This will be displayed to users on connection, transacting, and signing requests.
### appChainIds (optional)
-- Type: `number[]`
+
+* Type: `number[]`
Array of chain IDs your app supports. Default value is `[1]`.
[What networks are supported?](/FAQ#what-networks-are-supported)
### appLogoUrl (optional)
-- Type: `string`
-App logo image URL. Favicon is used if unspecified.
+* Type: `string`
+App logo image URL. Favicon is used if unspecified.
diff --git a/docs/pages/sdk/v3-to-v4-changes.mdx b/docs/pages/sdk/v3-to-v4-changes.mdx
index c2c5b4f..600aed8 100644
--- a/docs/pages/sdk/v3-to-v4-changes.mdx
+++ b/docs/pages/sdk/v3-to-v4-changes.mdx
@@ -17,69 +17,76 @@ type CoinbaseWalletSDKOptions = {
#### New (v4 only):
-- `appChainIds?: number[]`
- - An array of chain IDs your dapp supports
- - The first chain in this array will be used as the default chain.
- - Removes the need for non-mainnet dapps to request switching chains before making first request.
- - Default value is `[1]` (mainnet)
+* `appChainIds?: number[]`
+ * An array of chain IDs your dapp supports
+ * The first chain in this array will be used as the default chain.
+ * Removes the need for non-mainnet dapps to request switching chains before making first request.
+ * Default value is `[1]` (mainnet)
#### Deprecated (v3 only):
-- `enableMobileWalletLink` (enabled by default in v4)
-- `jsonRpcUrl`
-- `reloadOnDisconnect`
-- `uiConstructor`
-- `overrideIsMetaMask`
-- `overrideIsCoinbaseWallet`
-- `diagnosticLogger`
-- `reloadOnDisconnect`
-- `headlessMode`
+* `enableMobileWalletLink` (enabled by default in v4)
+* `jsonRpcUrl`
+* `reloadOnDisconnect`
+* `uiConstructor`
+* `overrideIsMetaMask`
+* `overrideIsCoinbaseWallet`
+* `diagnosticLogger`
+* `reloadOnDisconnect`
+* `headlessMode`
### Deprecated functions
-- `CoinbaseWalletSDK.disconnect()` is deprecated
- - dapps should call `CoinbaseWalletProvider.disconnect()` instead
-- `CoinbaseWalletSDK.setAppInfo()` is deprecated
- - Dapps should pass in `appName` and `appLogoUrl` via `CoinbaseWalletSDKOptions`
+
+* `CoinbaseWalletSDK.disconnect()` is deprecated
+ * dapps should call `CoinbaseWalletProvider.disconnect()` instead
+* `CoinbaseWalletSDK.setAppInfo()` is deprecated
+ * Dapps should pass in `appName` and `appLogoUrl` via `CoinbaseWalletSDKOptions`
### `makeWeb3Provider`
#### Signature
- ```ts
- // v3
- makeWeb3Provider(jsonRpcUrl?: string, chainId?: number): CoinbaseWalletProvider
- // v4 // [!code focus]
- makeWeb3Provider(preference: Preference = { options: 'all' }): ProviderInterface // [!code focus]
- ```
+```ts
+// v3
+makeWeb3Provider(jsonRpcUrl?: string, chainId?: number): CoinbaseWalletProvider
+
+// v4 // [!code focus]
+makeWeb3Provider(preference: Preference = { options: 'all' }): ProviderInterface // [!code focus]
+```
+
#### Parameters
- ```ts
- interface Preference {
- options: 'all' | 'smartWalletOnly' | 'eoaOnly';
- }
- ```
- - `options`
- - `'all'` (default) show both smart wallet and EOA options
- - `'smartWalletOnly'` only show smart wallet option
- - `'eoaOnly'` only show EOA option
+
+```ts
+interface Preference {
+ options: 'all' | 'smartWalletOnly' | 'eoaOnly';
+}
+```
+
+* `options`
+ * `'all'` (default) show both smart wallet and EOA options
+ * `'smartWalletOnly'` only show smart wallet option
+ * `'eoaOnly'` only show EOA option
#### Return type
- ```ts
- export interface ProviderInterface extends EventEmitter {
- request(args: RequestArguments): Promise;
- disconnect(): Promise;
- on(event: 'connect', listener: (info: ProviderConnectInfo) => void): this;
- on(event: 'disconnect', listener: (error: ProviderRpcError) => void): this;
- on(event: 'chainChanged', listener: (chainId: string) => void): this;
- on(event: 'accountsChanged', listener: (accounts: string[]) => void): this;
- on(event: 'message', listener: (message: ProviderMessage) => void): this;
- }
- ```
+
+```ts
+export interface ProviderInterface extends EventEmitter {
+ request(args: RequestArguments): Promise;
+ disconnect(): Promise;
+ on(event: 'connect', listener: (info: ProviderConnectInfo) => void): this;
+ on(event: 'disconnect', listener: (error: ProviderRpcError) => void): this;
+ on(event: 'chainChanged', listener: (chainId: string) => void): this;
+ on(event: 'accountsChanged', listener: (accounts: string[]) => void): this;
+ on(event: 'message', listener: (message: ProviderMessage) => void): this;
+}
+```
## CoinbaseWalletProvider
### `connect` event fix
-- v3 returned `chainIdStr` instead of `chainId`.
-- v4 is [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193#connect) compliant.
+
+* v3 returned `chainIdStr` instead of `chainId`.
+* v4 is [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193#connect) compliant.
```ts
// v4
@@ -88,40 +95,39 @@ on(event: 'connect', listener: (info: ProviderConnectInfo) => void): this;
```
### `eth_accounts` when disconnected
-- v3 returned an empty array.
-- v4 throws an error.
- - `Error: Must call 'eth_requestAccounts' before other methods`
-
+* v3 returned an empty array.
+* v4 throws an error.
+ * `Error: Must call 'eth_requestAccounts' before other methods`
### Deprecated functionality
#### Instance properties
-- `isCoinbaseBrowser: boolean`
-- `qrUrl?: string | null`
-- `reloadOnDisconnect: boolean`
+* `isCoinbaseBrowser: boolean`
+* `qrUrl?: string | null`
+* `reloadOnDisconnect: boolean`
#### Getter methods
-- `selectedAddress`
-- `networkVersion`
-- `isWalletLink`
-- `ismetaMask`
-- `host`
+* `selectedAddress`
+* `networkVersion`
+* `isWalletLink`
+* `ismetaMask`
+* `host`
#### Methods
-- `disableReloadOnDisconnect`
-- `setProviderInfo`
-- `setAppInfo`
-- `close`
-- `send`
-- `sendAsync`
-- `scanQRCode`
-- `genericRequest`
-- `connectAndSignIn`
-- `selectProvider`
-- `supportsSubscriptions`
-- `subscribe`
-- `unsubscribe`
+* `disableReloadOnDisconnect`
+* `setProviderInfo`
+* `setAppInfo`
+* `close`
+* `send`
+* `sendAsync`
+* `scanQRCode`
+* `genericRequest`
+* `connectAndSignIn`
+* `selectProvider`
+* `supportsSubscriptions`
+* `subscribe`
+* `unsubscribe`
diff --git a/docs/pages/wallet-library-support.mdx b/docs/pages/wallet-library-support.mdx
index 1aa31a4..c62b017 100644
--- a/docs/pages/wallet-library-support.mdx
+++ b/docs/pages/wallet-library-support.mdx
@@ -1,10 +1,11 @@
-# Wallet Library Support
-Below are some popular wallet libraries and what we know of their plans for day 1 support for Smart Wallet.
+# Wallet Library Support
+
+Below are some popular wallet libraries and what we know of their plans for day 1 support for Smart Wallet.
| Name | Support |
|------|---------|
| [Dynamic](https://docs.dynamic.xyz/wallets/advanced-wallets/coinbase-smart-wallet) | ✅ |
-| [Privy]( https://docs.privy.io/guide/react/recipes/misc/coinbase-smart-wallets) | ✅ |
+| [Privy](https://docs.privy.io/guide/react/recipes/misc/coinbase-smart-wallets) | ✅ |
| [ThirdWeb](http://portal.thirdweb.com/connect) | ✅ |
| [ConnectKit](https://docs.family.co/connectkit) | ✅ |
| [Web3Modal](https://docs.walletconnect.com/web3modal/react/smart-accounts) | ✅ |
diff --git a/docs/pages/why.mdx b/docs/pages/why.mdx
index d3d0260..53fea13 100644
--- a/docs/pages/why.mdx
+++ b/docs/pages/why.mdx
@@ -1,29 +1,35 @@
# Why Smart Wallet?
## Instant Onboarding
+
Smart Wallet enables users to create an account in seconds with no app or extension required.
-This is possible because Smart Wallet uses passkeys for signing.
-Passkeys are generated and stored securely on users' devices.
-If the user has iCloud or Google Password Manager, their passkeys will also be
-backed up and synced across devices [1](https://developer.apple.com/passkeys/), [2](https://developers.google.com/identity/passkeys/supported-environments).
+This is possible because Smart Wallet uses passkeys for signing.
+Passkeys are generated and stored securely on users' devices.
+If the user has iCloud or Google Password Manager, their passkeys will also be
+backed up and synced across devices [1](https://developer.apple.com/passkeys/), [2](https://developers.google.com/identity/passkeys/supported-environments).
+
+Note this is *not* passkey authentication to some server where we store a users key:
+users' on device passkey is what is [validated for signing onchain](https://github.com/base-org/webauthn-sol).
-Note this is *not* passkey authentication to some server where we store a users key:
-users' on device passkey is what is [validated for signing onchain](https://github.com/base-org/webauthn-sol).
+## Zero Cost
-## Zero Cost
Smart Wallet is free for both developers and users.
## Unified Account Across Apps
-Smart Wallet users can use the same account and address across all onchain apps.
+
+Smart Wallet users can use the same account and address across all onchain apps.
## Magic Spend
-Smart Wallet users can connect their coinbase.com account and spend their coinbase.com held ETH from
+
+Smart Wallet users can connect their coinbase.com account and spend their coinbase.com held ETH from
their Smart Account (Base only, for now).
## Batch Transactions, Paymasters, and more!
+
Our Smart Wallet is ERC-4337 compliant and our SDK supports batch transactions and app-defined paymasters.
## Coinbase Security
+
Users will see transaction and signing previews that will help keep them safe.
-Our smart contracts have been audited 4 times by leading audit teams.
+Our smart contracts have been audited 4 times by leading audit teams.
diff --git a/package.json b/package.json
index cb43437..abae9b8 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
"dev": "vocs dev",
"build": "vocs build",
"preview": "vocs preview",
- "format": "dprint fmt",
+ "format": "remark . -qfo && remark . -e mdx -u mdx -qfo",
"prepare": "bun x simple-git-hooks"
},
"dependencies": {
@@ -15,17 +15,20 @@
"react": "latest",
"react-dom": "latest",
"typescript": "latest",
- "vocs": "latest"
+ "vocs": "^1.0.0-alpha.55"
},
"devDependencies": {
"dprint": "^0.45.1",
"permissionless": "^0.1.29",
+ "remark": "^15.0.1",
+ "remark-cli": "^12.0.1",
+ "remark-mdx": "^3.0.1",
"simple-git-hooks": "^2.11.1",
"siwe": "^2.3.2",
"viem": "^2.9.28",
"wagmi": "^2.9.0"
},
"simple-git-hooks": {
- "pre-commit": "bun dprint check"
+ "pre-commit": "bun format"
}
}
diff --git a/vocs.config.tsx b/vocs.config.tsx
index 163d917..045a6b3 100644
--- a/vocs.config.tsx
+++ b/vocs.config.tsx
@@ -127,6 +127,18 @@ export default defineConfig({
text: "Upgrading from 3.x",
link: "/sdk/v3-to-v4-changes",
},
+ {
+ text: "CoinbaseWalletProvider",
+ items: [
+ { text: "Overview", link: "/sdk/CoinbaseWalletProvider/overview" },
+ {
+ text: "request",
+ items: [
+ { text: "eth_requestAccounts", link: "/sdk/CoinbaseWalletProvider/request/eth_requestAccounts" },
+ ],
+ },
+ ],
+ },
],
},
{
diff --git a/vocs.config.tsx.timestamp-1721664812368-04bdf23977d11.mjs b/vocs.config.tsx.timestamp-1721664812368-04bdf23977d11.mjs
new file mode 100644
index 0000000..2f73454
--- /dev/null
+++ b/vocs.config.tsx.timestamp-1721664812368-04bdf23977d11.mjs
@@ -0,0 +1,159 @@
+// vocs.config.tsx
+import { defineConfig } from "file:///Users/wilsoncusack/code/coinbase-smart-wallet-documentation/node_modules/vocs/_lib/index.js";
+import { jsx } from "file:///Users/wilsoncusack/code/coinbase-smart-wallet-documentation/node_modules/react/jsx-runtime.js";
+var vocs_config_default = defineConfig({
+ head() {
+ return /* @__PURE__ */ jsx("script", { defer: true, src: process.env.VERCEL_ENV == "production" ? "/_vercel/insights/script.js" : "" });
+ },
+ theme: {
+ colorScheme: "system",
+ variables: {
+ color: {
+ textAccent: { light: "#2394ff", dark: "#e9e9ea" },
+ backgroundDark: { light: "#ebeaee", dark: "black" },
+ background: { light: "#f6f5f8", dark: "black" },
+ // f6f5f8 /ebf1f8
+ heading: { light: "black", dark: "#e9e9ea" },
+ text3: { light: "black", dark: "#e9e9ea" },
+ background5: { light: "#dee8ff", dark: "#3c393f" }
+ }
+ }
+ },
+ ogImageUrl: "https://vocs.dev/api/og?logo=%logo&title=%title&description=%description",
+ title: "Smart Wallet",
+ description: "Smart Wallet Documentation",
+ // logoUrl: '/logo.svg',
+ iconUrl: "/logo.svg",
+ topNav: [
+ { text: "Demo", link: "https://smart-wallet.xyz/" },
+ { text: "SDK Playground", link: "https://coinbase.github.io/coinbase-wallet-sdk/" },
+ { text: "Github", link: "https://github.com/coinbase/coinbase-wallet-sdk" },
+ { text: "Discord", link: "https://discord.com/invite/cdp/" }
+ ],
+ sidebar: [
+ {
+ text: "Why Smart Wallet?",
+ link: "/why"
+ },
+ {
+ text: "Quick Start",
+ link: "/quick-start"
+ },
+ {
+ text: "FAQ",
+ link: "/FAQ"
+ },
+ {
+ text: "Launch Ready Checklist",
+ link: "/checklist"
+ },
+ {
+ text: "Wallet Library Support",
+ link: "/wallet-library-support"
+ },
+ {
+ text: "Base Gasless Campaign",
+ link: "/base-gasless-campaign"
+ },
+ {
+ text: "Guides",
+ collapsed: false,
+ items: [
+ {
+ text: "Create a New App",
+ items: [
+ { text: "Using Build Onchain Template", link: "/guides/create-app/using-boat" },
+ { text: "Using Wagmi Template", link: "/guides/create-app/using-wagmi" }
+ ]
+ },
+ {
+ text: "Update an Existing App",
+ link: "/guides/update-existing-app"
+ },
+ {
+ text: "Create Wallet Button",
+ link: "/guides/components/create-wallet-button"
+ },
+ {
+ text: "Signature Verification",
+ link: "/guides/signature-verification"
+ },
+ {
+ text: "Sign-In with Ethereum",
+ link: "/guides/siwe"
+ },
+ {
+ text: "Batch Transactions",
+ link: "/guides/batch-transactions"
+ },
+ {
+ text: "Paymasters (Sponsored Transactions)",
+ link: "/guides/paymasters"
+ },
+ {
+ text: "Magic Spend Support",
+ link: "/guides/magic-spend"
+ },
+ {
+ text: "Tips & Tricks",
+ items: [
+ {
+ text: "Inspect Transaction Simulation",
+ link: "/guides/tips/inspect-txn-simulation"
+ },
+ {
+ text: "Popup Tips",
+ link: "/guides/tips/popup-tips"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ text: "SDK",
+ collapsed: false,
+ items: [
+ {
+ text: "Install",
+ link: "/sdk/install"
+ },
+ {
+ text: "Setup",
+ link: "/sdk/setup"
+ },
+ {
+ text: "makeWeb3Provider",
+ link: "/sdk/makeWeb3Provider"
+ },
+ {
+ text: "Upgrading from 3.x",
+ link: "/sdk/v3-to-v4-changes"
+ },
+ {
+ text: "CoinbaseWalletProvider",
+ items: [
+ { text: "Overview", link: "/sdk/CoinbaseWalletProvider/overview" },
+ {
+ text: "request",
+ items: [
+ { text: "eth_requestAccounts", link: "/sdk/CoinbaseWalletProvider/request/eth_requestAccounts" }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ text: "Smart Contracts",
+ collapsed: false,
+ items: [
+ { text: "Smart Wallet", link: "https://github.com/coinbase/smart-wallet" },
+ { text: "Magic Spend", link: "https://github.com/coinbase/magic-spend" }
+ ]
+ }
+ ]
+});
+export {
+ vocs_config_default as default
+};
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkKCkge1xuICAgIHJldHVybiA8c2NyaXB0IGRlZmVyIHNyYz17cHJvY2Vzcy5lbnYuVkVSQ0VMX0VOViA9PSBcInByb2R1Y3Rpb25cIiA/IFwiL192ZXJjZWwvaW5zaWdodHMvc2NyaXB0LmpzXCIgOiBcIlwifT48L3NjcmlwdD47XG4gIH0sXG4gIHRoZW1lOiB7XG4gICAgY29sb3JTY2hlbWU6IFwic3lzdGVtXCIsXG4gICAgdmFyaWFibGVzOiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICB0ZXh0QWNjZW50OiB7IGxpZ2h0OiBcIiMyMzk0ZmZcIiwgZGFyazogXCIjZTllOWVhXCIgfSxcbiAgICAgICAgYmFja2dyb3VuZERhcms6IHsgbGlnaHQ6IFwiI2ViZWFlZVwiLCBkYXJrOiBcImJsYWNrXCIgfSxcbiAgICAgICAgYmFja2dyb3VuZDogeyBsaWdodDogXCIjZjZmNWY4XCIsIGRhcms6IFwiYmxhY2tcIiB9LCAvLyBmNmY1ZjggL2ViZjFmOFxuICAgICAgICBoZWFkaW5nOiB7IGxpZ2h0OiBcImJsYWNrXCIsIGRhcms6IFwiI2U5ZTllYVwiIH0sXG4gICAgICAgIHRleHQzOiB7IGxpZ2h0OiBcImJsYWNrXCIsIGRhcms6IFwiI2U5ZTllYVwiIH0sXG4gICAgICAgIGJhY2tncm91bmQ1OiB7IGxpZ2h0OiBcIiNkZWU4ZmZcIiwgZGFyazogXCIjM2MzOTNmXCIgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgb2dJbWFnZVVybDogXCJodHRwczovL3ZvY3MuZGV2L2FwaS9vZz9sb2dvPSVsb2dvJnRpdGxlPSV0aXRsZSZkZXNjcmlwdGlvbj0lZGVzY3JpcHRpb25cIixcbiAgdGl0bGU6IFwiU21hcnQgV2FsbGV0XCIsXG4gIGRlc2NyaXB0aW9uOiBcIlNtYXJ0IFdhbGxldCBEb2N1bWVudGF0aW9uXCIsXG4gIC8vIGxvZ29Vcmw6ICcvbG9nby5zdmcnLFxuICBpY29uVXJsOiBcIi9sb2dvLnN2Z1wiLFxuICB0b3BOYXY6IFtcbiAgICB7IHRleHQ6IFwiRGVtb1wiLCBsaW5rOiBcImh0dHBzOi8vc21hcnQtd2FsbGV0Lnh5ei9cIiB9LFxuICAgIHsgdGV4dDogXCJTREsgUGxheWdyb3VuZFwiLCBsaW5rOiBcImh0dHBzOi8vY29pbmJhc2UuZ2l0aHViLmlvL2NvaW5iYXNlLXdhbGxldC1zZGsvXCIgfSxcbiAgICB7IHRleHQ6IFwiR2l0aHViXCIsIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2NvaW5iYXNlL2NvaW5iYXNlLXdhbGxldC1zZGtcIiB9LFxuICAgIHsgdGV4dDogXCJEaXNjb3JkXCIsIGxpbms6IFwiaHR0cHM6Ly9kaXNjb3JkLmNvbS9pbnZpdGUvY2RwL1wiIH0sXG4gIF0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIldoeSBTbWFydCBXYWxsZXQ/XCIsXG4gICAgICBsaW5rOiBcIi93aHlcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiUXVpY2sgU3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrLXN0YXJ0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZBUVwiLFxuICAgICAgbGluazogXCIvRkFRXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkxhdW5jaCBSZWFkeSBDaGVja2xpc3RcIixcbiAgICAgIGxpbms6IFwiL2NoZWNrbGlzdFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJXYWxsZXQgTGlicmFyeSBTdXBwb3J0XCIsXG4gICAgICBsaW5rOiBcIi93YWxsZXQtbGlicmFyeS1zdXBwb3J0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkJhc2UgR2FzbGVzcyBDYW1wYWlnblwiLFxuICAgICAgbGluazogXCIvYmFzZS1nYXNsZXNzLWNhbXBhaWduXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlc1wiLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNyZWF0ZSBhIE5ldyBBcHBcIixcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgeyB0ZXh0OiBcIlVzaW5nIEJ1aWxkIE9uY2hhaW4gVGVtcGxhdGVcIiwgbGluazogXCIvZ3VpZGVzL2NyZWF0ZS1hcHAvdXNpbmctYm9hdFwiIH0sXG4gICAgICAgICAgICB7IHRleHQ6IFwiVXNpbmcgV2FnbWkgVGVtcGxhdGVcIiwgbGluazogXCIvZ3VpZGVzL2NyZWF0ZS1hcHAvdXNpbmctd2FnbWlcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlVwZGF0ZSBhbiBFeGlzdGluZyBBcHBcIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvdXBkYXRlLWV4aXN0aW5nLWFwcFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJDcmVhdGUgV2FsbGV0IEJ1dHRvblwiLFxuICAgICAgICAgIGxpbms6IFwiL2d1aWRlcy9jb21wb25lbnRzL2NyZWF0ZS13YWxsZXQtYnV0dG9uXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNpZ25hdHVyZSBWZXJpZmljYXRpb25cIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvc2lnbmF0dXJlLXZlcmlmaWNhdGlvblwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTaWduLUluIHdpdGggRXRoZXJldW1cIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvc2l3ZVwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJCYXRjaCBUcmFuc2FjdGlvbnNcIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvYmF0Y2gtdHJhbnNhY3Rpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlBheW1hc3RlcnMgKFNwb25zb3JlZCBUcmFuc2FjdGlvbnMpXCIsXG4gICAgICAgICAgbGluazogXCIvZ3VpZGVzL3BheW1hc3RlcnNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiTWFnaWMgU3BlbmQgU3VwcG9ydFwiLFxuICAgICAgICAgIGxpbms6IFwiL2d1aWRlcy9tYWdpYy1zcGVuZFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJUaXBzICYgVHJpY2tzXCIsXG4gICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogXCJJbnNwZWN0IFRyYW5zYWN0aW9uIFNpbXVsYXRpb25cIixcbiAgICAgICAgICAgICAgbGluazogXCIvZ3VpZGVzL3RpcHMvaW5zcGVjdC10eG4tc2ltdWxhdGlvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogXCJQb3B1cCBUaXBzXCIsXG4gICAgICAgICAgICAgIGxpbms6IFwiL2d1aWRlcy90aXBzL3BvcHVwLXRpcHNcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIlNES1wiLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkluc3RhbGxcIixcbiAgICAgICAgICBsaW5rOiBcIi9zZGsvaW5zdGFsbFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTZXR1cFwiLFxuICAgICAgICAgIGxpbms6IFwiL3Nkay9zZXR1cFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJtYWtlV2ViM1Byb3ZpZGVyXCIsXG4gICAgICAgICAgbGluazogXCIvc2RrL21ha2VXZWIzUHJvdmlkZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXBncmFkaW5nIGZyb20gMy54XCIsXG4gICAgICAgICAgbGluazogXCIvc2RrL3YzLXRvLXY0LWNoYW5nZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiQ29pbmJhc2VXYWxsZXRQcm92aWRlclwiLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICB7IHRleHQ6IFwiT3ZlcnZpZXdcIiwgbGluazogXCIvc2RrL0NvaW5iYXNlV2FsbGV0UHJvdmlkZXIvb3ZlcnZpZXdcIiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXh0OiBcInJlcXVlc3RcIixcbiAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7IHRleHQ6IFwiZXRoX3JlcXVlc3RBY2NvdW50c1wiLCBsaW5rOiBcIi9zZGsvQ29pbmJhc2VXYWxsZXRQcm92aWRlci9yZXF1ZXN0L2V0aF9yZXF1ZXN0QWNjb3VudHNcIiB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiU21hcnQgQ29udHJhY3RzXCIsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAgeyB0ZXh0OiBcIlNtYXJ0IFdhbGxldFwiLCBsaW5rOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9jb2luYmFzZS9zbWFydC13YWxsZXRcIiB9LFxuICAgICAgICB7IHRleHQ6IFwiTWFnaWMgU3BlbmRcIiwgbGluazogXCJodHRwczovL2dpdGh1Yi5jb20vY29pbmJhc2UvbWFnaWMtc3BlbmRcIiB9LFxuICAgICAgXSxcbiAgICB9LFxuICBdLFxufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxvQkFBb0I7QUFJbEI7QUFGWCxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixPQUFPO0FBQ0wsV0FBTyxvQkFBQyxZQUFPLE9BQUssTUFBQyxLQUFLLFFBQVEsSUFBSSxjQUFjLGVBQWUsZ0NBQWdDLElBQUk7QUFBQSxFQUN6RztBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0wsYUFBYTtBQUFBLElBQ2IsV0FBVztBQUFBLE1BQ1QsT0FBTztBQUFBLFFBQ0wsWUFBWSxFQUFFLE9BQU8sV0FBVyxNQUFNLFVBQVU7QUFBQSxRQUNoRCxnQkFBZ0IsRUFBRSxPQUFPLFdBQVcsTUFBTSxRQUFRO0FBQUEsUUFDbEQsWUFBWSxFQUFFLE9BQU8sV0FBVyxNQUFNLFFBQVE7QUFBQTtBQUFBLFFBQzlDLFNBQVMsRUFBRSxPQUFPLFNBQVMsTUFBTSxVQUFVO0FBQUEsUUFDM0MsT0FBTyxFQUFFLE9BQU8sU0FBUyxNQUFNLFVBQVU7QUFBQSxRQUN6QyxhQUFhLEVBQUUsT0FBTyxXQUFXLE1BQU0sVUFBVTtBQUFBLE1BQ25EO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFlBQVk7QUFBQSxFQUNaLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQTtBQUFBLEVBRWIsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLElBQ04sRUFBRSxNQUFNLFFBQVEsTUFBTSw0QkFBNEI7QUFBQSxJQUNsRCxFQUFFLE1BQU0sa0JBQWtCLE1BQU0sa0RBQWtEO0FBQUEsSUFDbEYsRUFBRSxNQUFNLFVBQVUsTUFBTSxrREFBa0Q7QUFBQSxJQUMxRSxFQUFFLE1BQU0sV0FBVyxNQUFNLGtDQUFrQztBQUFBLEVBQzdEO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FB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
diff --git a/vocs.config.tsx.timestamp-1721664812402-d54ccbe5c3c78.mjs b/vocs.config.tsx.timestamp-1721664812402-d54ccbe5c3c78.mjs
new file mode 100644
index 0000000..2f73454
--- /dev/null
+++ b/vocs.config.tsx.timestamp-1721664812402-d54ccbe5c3c78.mjs
@@ -0,0 +1,159 @@
+// vocs.config.tsx
+import { defineConfig } from "file:///Users/wilsoncusack/code/coinbase-smart-wallet-documentation/node_modules/vocs/_lib/index.js";
+import { jsx } from "file:///Users/wilsoncusack/code/coinbase-smart-wallet-documentation/node_modules/react/jsx-runtime.js";
+var vocs_config_default = defineConfig({
+ head() {
+ return /* @__PURE__ */ jsx("script", { defer: true, src: process.env.VERCEL_ENV == "production" ? "/_vercel/insights/script.js" : "" });
+ },
+ theme: {
+ colorScheme: "system",
+ variables: {
+ color: {
+ textAccent: { light: "#2394ff", dark: "#e9e9ea" },
+ backgroundDark: { light: "#ebeaee", dark: "black" },
+ background: { light: "#f6f5f8", dark: "black" },
+ // f6f5f8 /ebf1f8
+ heading: { light: "black", dark: "#e9e9ea" },
+ text3: { light: "black", dark: "#e9e9ea" },
+ background5: { light: "#dee8ff", dark: "#3c393f" }
+ }
+ }
+ },
+ ogImageUrl: "https://vocs.dev/api/og?logo=%logo&title=%title&description=%description",
+ title: "Smart Wallet",
+ description: "Smart Wallet Documentation",
+ // logoUrl: '/logo.svg',
+ iconUrl: "/logo.svg",
+ topNav: [
+ { text: "Demo", link: "https://smart-wallet.xyz/" },
+ { text: "SDK Playground", link: "https://coinbase.github.io/coinbase-wallet-sdk/" },
+ { text: "Github", link: "https://github.com/coinbase/coinbase-wallet-sdk" },
+ { text: "Discord", link: "https://discord.com/invite/cdp/" }
+ ],
+ sidebar: [
+ {
+ text: "Why Smart Wallet?",
+ link: "/why"
+ },
+ {
+ text: "Quick Start",
+ link: "/quick-start"
+ },
+ {
+ text: "FAQ",
+ link: "/FAQ"
+ },
+ {
+ text: "Launch Ready Checklist",
+ link: "/checklist"
+ },
+ {
+ text: "Wallet Library Support",
+ link: "/wallet-library-support"
+ },
+ {
+ text: "Base Gasless Campaign",
+ link: "/base-gasless-campaign"
+ },
+ {
+ text: "Guides",
+ collapsed: false,
+ items: [
+ {
+ text: "Create a New App",
+ items: [
+ { text: "Using Build Onchain Template", link: "/guides/create-app/using-boat" },
+ { text: "Using Wagmi Template", link: "/guides/create-app/using-wagmi" }
+ ]
+ },
+ {
+ text: "Update an Existing App",
+ link: "/guides/update-existing-app"
+ },
+ {
+ text: "Create Wallet Button",
+ link: "/guides/components/create-wallet-button"
+ },
+ {
+ text: "Signature Verification",
+ link: "/guides/signature-verification"
+ },
+ {
+ text: "Sign-In with Ethereum",
+ link: "/guides/siwe"
+ },
+ {
+ text: "Batch Transactions",
+ link: "/guides/batch-transactions"
+ },
+ {
+ text: "Paymasters (Sponsored Transactions)",
+ link: "/guides/paymasters"
+ },
+ {
+ text: "Magic Spend Support",
+ link: "/guides/magic-spend"
+ },
+ {
+ text: "Tips & Tricks",
+ items: [
+ {
+ text: "Inspect Transaction Simulation",
+ link: "/guides/tips/inspect-txn-simulation"
+ },
+ {
+ text: "Popup Tips",
+ link: "/guides/tips/popup-tips"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ text: "SDK",
+ collapsed: false,
+ items: [
+ {
+ text: "Install",
+ link: "/sdk/install"
+ },
+ {
+ text: "Setup",
+ link: "/sdk/setup"
+ },
+ {
+ text: "makeWeb3Provider",
+ link: "/sdk/makeWeb3Provider"
+ },
+ {
+ text: "Upgrading from 3.x",
+ link: "/sdk/v3-to-v4-changes"
+ },
+ {
+ text: "CoinbaseWalletProvider",
+ items: [
+ { text: "Overview", link: "/sdk/CoinbaseWalletProvider/overview" },
+ {
+ text: "request",
+ items: [
+ { text: "eth_requestAccounts", link: "/sdk/CoinbaseWalletProvider/request/eth_requestAccounts" }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ text: "Smart Contracts",
+ collapsed: false,
+ items: [
+ { text: "Smart Wallet", link: "https://github.com/coinbase/smart-wallet" },
+ { text: "Magic Spend", link: "https://github.com/coinbase/magic-spend" }
+ ]
+ }
+ ]
+});
+export {
+ vocs_config_default as default
+};
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkKCkge1xuICAgIHJldHVybiA8c2NyaXB0IGRlZmVyIHNyYz17cHJvY2Vzcy5lbnYuVkVSQ0VMX0VOViA9PSBcInByb2R1Y3Rpb25cIiA/IFwiL192ZXJjZWwvaW5zaWdodHMvc2NyaXB0LmpzXCIgOiBcIlwifT48L3NjcmlwdD47XG4gIH0sXG4gIHRoZW1lOiB7XG4gICAgY29sb3JTY2hlbWU6IFwic3lzdGVtXCIsXG4gICAgdmFyaWFibGVzOiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICB0ZXh0QWNjZW50OiB7IGxpZ2h0OiBcIiMyMzk0ZmZcIiwgZGFyazogXCIjZTllOWVhXCIgfSxcbiAgICAgICAgYmFja2dyb3VuZERhcms6IHsgbGlnaHQ6IFwiI2ViZWFlZVwiLCBkYXJrOiBcImJsYWNrXCIgfSxcbiAgICAgICAgYmFja2dyb3VuZDogeyBsaWdodDogXCIjZjZmNWY4XCIsIGRhcms6IFwiYmxhY2tcIiB9LCAvLyBmNmY1ZjggL2ViZjFmOFxuICAgICAgICBoZWFkaW5nOiB7IGxpZ2h0OiBcImJsYWNrXCIsIGRhcms6IFwiI2U5ZTllYVwiIH0sXG4gICAgICAgIHRleHQzOiB7IGxpZ2h0OiBcImJsYWNrXCIsIGRhcms6IFwiI2U5ZTllYVwiIH0sXG4gICAgICAgIGJhY2tncm91bmQ1OiB7IGxpZ2h0OiBcIiNkZWU4ZmZcIiwgZGFyazogXCIjM2MzOTNmXCIgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgb2dJbWFnZVVybDogXCJodHRwczovL3ZvY3MuZGV2L2FwaS9vZz9sb2dvPSVsb2dvJnRpdGxlPSV0aXRsZSZkZXNjcmlwdGlvbj0lZGVzY3JpcHRpb25cIixcbiAgdGl0bGU6IFwiU21hcnQgV2FsbGV0XCIsXG4gIGRlc2NyaXB0aW9uOiBcIlNtYXJ0IFdhbGxldCBEb2N1bWVudGF0aW9uXCIsXG4gIC8vIGxvZ29Vcmw6ICcvbG9nby5zdmcnLFxuICBpY29uVXJsOiBcIi9sb2dvLnN2Z1wiLFxuICB0b3BOYXY6IFtcbiAgICB7IHRleHQ6IFwiRGVtb1wiLCBsaW5rOiBcImh0dHBzOi8vc21hcnQtd2FsbGV0Lnh5ei9cIiB9LFxuICAgIHsgdGV4dDogXCJTREsgUGxheWdyb3VuZFwiLCBsaW5rOiBcImh0dHBzOi8vY29pbmJhc2UuZ2l0aHViLmlvL2NvaW5iYXNlLXdhbGxldC1zZGsvXCIgfSxcbiAgICB7IHRleHQ6IFwiR2l0aHViXCIsIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2NvaW5iYXNlL2NvaW5iYXNlLXdhbGxldC1zZGtcIiB9LFxuICAgIHsgdGV4dDogXCJEaXNjb3JkXCIsIGxpbms6IFwiaHR0cHM6Ly9kaXNjb3JkLmNvbS9pbnZpdGUvY2RwL1wiIH0sXG4gIF0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIldoeSBTbWFydCBXYWxsZXQ/XCIsXG4gICAgICBsaW5rOiBcIi93aHlcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiUXVpY2sgU3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrLXN0YXJ0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZBUVwiLFxuICAgICAgbGluazogXCIvRkFRXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkxhdW5jaCBSZWFkeSBDaGVja2xpc3RcIixcbiAgICAgIGxpbms6IFwiL2NoZWNrbGlzdFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJXYWxsZXQgTGlicmFyeSBTdXBwb3J0XCIsXG4gICAgICBsaW5rOiBcIi93YWxsZXQtbGlicmFyeS1zdXBwb3J0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkJhc2UgR2FzbGVzcyBDYW1wYWlnblwiLFxuICAgICAgbGluazogXCIvYmFzZS1nYXNsZXNzLWNhbXBhaWduXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlc1wiLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNyZWF0ZSBhIE5ldyBBcHBcIixcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgeyB0ZXh0OiBcIlVzaW5nIEJ1aWxkIE9uY2hhaW4gVGVtcGxhdGVcIiwgbGluazogXCIvZ3VpZGVzL2NyZWF0ZS1hcHAvdXNpbmctYm9hdFwiIH0sXG4gICAgICAgICAgICB7IHRleHQ6IFwiVXNpbmcgV2FnbWkgVGVtcGxhdGVcIiwgbGluazogXCIvZ3VpZGVzL2NyZWF0ZS1hcHAvdXNpbmctd2FnbWlcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlVwZGF0ZSBhbiBFeGlzdGluZyBBcHBcIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvdXBkYXRlLWV4aXN0aW5nLWFwcFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJDcmVhdGUgV2FsbGV0IEJ1dHRvblwiLFxuICAgICAgICAgIGxpbms6IFwiL2d1aWRlcy9jb21wb25lbnRzL2NyZWF0ZS13YWxsZXQtYnV0dG9uXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNpZ25hdHVyZSBWZXJpZmljYXRpb25cIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvc2lnbmF0dXJlLXZlcmlmaWNhdGlvblwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTaWduLUluIHdpdGggRXRoZXJldW1cIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvc2l3ZVwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJCYXRjaCBUcmFuc2FjdGlvbnNcIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvYmF0Y2gtdHJhbnNhY3Rpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlBheW1hc3RlcnMgKFNwb25zb3JlZCBUcmFuc2FjdGlvbnMpXCIsXG4gICAgICAgICAgbGluazogXCIvZ3VpZGVzL3BheW1hc3RlcnNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiTWFnaWMgU3BlbmQgU3VwcG9ydFwiLFxuICAgICAgICAgIGxpbms6IFwiL2d1aWRlcy9tYWdpYy1zcGVuZFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJUaXBzICYgVHJpY2tzXCIsXG4gICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogXCJJbnNwZWN0IFRyYW5zYWN0aW9uIFNpbXVsYXRpb25cIixcbiAgICAgICAgICAgICAgbGluazogXCIvZ3VpZGVzL3RpcHMvaW5zcGVjdC10eG4tc2ltdWxhdGlvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogXCJQb3B1cCBUaXBzXCIsXG4gICAgICAgICAgICAgIGxpbms6IFwiL2d1aWRlcy90aXBzL3BvcHVwLXRpcHNcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIlNES1wiLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkluc3RhbGxcIixcbiAgICAgICAgICBsaW5rOiBcIi9zZGsvaW5zdGFsbFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTZXR1cFwiLFxuICAgICAgICAgIGxpbms6IFwiL3Nkay9zZXR1cFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJtYWtlV2ViM1Byb3ZpZGVyXCIsXG4gICAgICAgICAgbGluazogXCIvc2RrL21ha2VXZWIzUHJvdmlkZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXBncmFkaW5nIGZyb20gMy54XCIsXG4gICAgICAgICAgbGluazogXCIvc2RrL3YzLXRvLXY0LWNoYW5nZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiQ29pbmJhc2VXYWxsZXRQcm92aWRlclwiLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICB7IHRleHQ6IFwiT3ZlcnZpZXdcIiwgbGluazogXCIvc2RrL0NvaW5iYXNlV2FsbGV0UHJvdmlkZXIvb3ZlcnZpZXdcIiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXh0OiBcInJlcXVlc3RcIixcbiAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7IHRleHQ6IFwiZXRoX3JlcXVlc3RBY2NvdW50c1wiLCBsaW5rOiBcIi9zZGsvQ29pbmJhc2VXYWxsZXRQcm92aWRlci9yZXF1ZXN0L2V0aF9yZXF1ZXN0QWNjb3VudHNcIiB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiU21hcnQgQ29udHJhY3RzXCIsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAgeyB0ZXh0OiBcIlNtYXJ0IFdhbGxldFwiLCBsaW5rOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9jb2luYmFzZS9zbWFydC13YWxsZXRcIiB9LFxuICAgICAgICB7IHRleHQ6IFwiTWFnaWMgU3BlbmRcIiwgbGluazogXCJodHRwczovL2dpdGh1Yi5jb20vY29pbmJhc2UvbWFnaWMtc3BlbmRcIiB9LFxuICAgICAgXSxcbiAgICB9LFxuICBdLFxufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxvQkFBb0I7QUFJbEI7QUFGWCxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixPQUFPO0FBQ0wsV0FBTyxvQkFBQyxZQUFPLE9BQUssTUFBQyxLQUFLLFFBQVEsSUFBSSxjQUFjLGVBQWUsZ0NBQWdDLElBQUk7QUFBQSxFQUN6RztBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0wsYUFBYTtBQUFBLElBQ2IsV0FBVztBQUFBLE1BQ1QsT0FBTztBQUFBLFFBQ0wsWUFBWSxFQUFFLE9BQU8sV0FBVyxNQUFNLFVBQVU7QUFBQSxRQUNoRCxnQkFBZ0IsRUFBRSxPQUFPLFdBQVcsTUFBTSxRQUFRO0FBQUEsUUFDbEQsWUFBWSxFQUFFLE9BQU8sV0FBVyxNQUFNLFFBQVE7QUFBQTtBQUFBLFFBQzlDLFNBQVMsRUFBRSxPQUFPLFNBQVMsTUFBTSxVQUFVO0FBQUEsUUFDM0MsT0FBTyxFQUFFLE9BQU8sU0FBUyxNQUFNLFVBQVU7QUFBQSxRQUN6QyxhQUFhLEVBQUUsT0FBTyxXQUFXLE1BQU0sVUFBVTtBQUFBLE1BQ25EO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFlBQVk7QUFBQSxFQUNaLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQTtBQUFBLEVBRWIsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLElBQ04sRUFBRSxNQUFNLFFBQVEsTUFBTSw0QkFBNEI7QUFBQSxJQUNsRCxFQUFFLE1BQU0sa0JBQWtCLE1BQU0sa0RBQWtEO0FBQUEsSUFDbEYsRUFBRSxNQUFNLFVBQVUsTUFBTSxrREFBa0Q7QUFBQSxJQUMxRSxFQUFFLE1BQU0sV0FBVyxNQUFNLGtDQUFrQztBQUFBLEVBQzdEO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLFFBQ0w7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxZQUNMLEVBQUUsTUFBTSxnQ0FBZ0MsTUFBTSxnQ0FBZ0M7QUFBQSxZQUM5RSxFQUFFLE1BQU0sd0JBQXdCLE1BQU0saUNBQWlDO0FBQUEsVUFDekU7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsWUFDTDtBQUFBLGNBQ0UsTUFBTTtBQUFBLGNBQ04sTUFBTTtBQUFBLFlBQ1I7QUFBQSxZQUNBO0FBQUEsY0FDRSxNQUFNO0FBQUEsY0FDTixNQUFNO0FBQUEsWUFDUjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxPQUFPO0FBQUEsUUFDTDtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsWUFDTCxFQUFFLE1BQU0sWUFBWSxNQUFNLHVDQUF1QztBQUFBLFlBQ2pFO0FBQUEsY0FDRSxNQUFNO0FBQUEsY0FDTixPQUFPO0FBQUEsZ0JBQ0wsRUFBRSxNQUFNLHVCQUF1QixNQUFNLDBEQUEwRDtBQUFBLGNBQ2pHO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxPQUFPO0FBQUEsUUFDTCxFQUFFLE1BQU0sZ0JBQWdCLE1BQU0sMkNBQTJDO0FBQUEsUUFDekUsRUFBRSxNQUFNLGVBQWUsTUFBTSwwQ0FBMEM7QUFBQSxNQUN6RTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K
diff --git a/vocs.config.tsx.timestamp-1721664812403-69810770e0acc.mjs b/vocs.config.tsx.timestamp-1721664812403-69810770e0acc.mjs
new file mode 100644
index 0000000..2f73454
--- /dev/null
+++ b/vocs.config.tsx.timestamp-1721664812403-69810770e0acc.mjs
@@ -0,0 +1,159 @@
+// vocs.config.tsx
+import { defineConfig } from "file:///Users/wilsoncusack/code/coinbase-smart-wallet-documentation/node_modules/vocs/_lib/index.js";
+import { jsx } from "file:///Users/wilsoncusack/code/coinbase-smart-wallet-documentation/node_modules/react/jsx-runtime.js";
+var vocs_config_default = defineConfig({
+ head() {
+ return /* @__PURE__ */ jsx("script", { defer: true, src: process.env.VERCEL_ENV == "production" ? "/_vercel/insights/script.js" : "" });
+ },
+ theme: {
+ colorScheme: "system",
+ variables: {
+ color: {
+ textAccent: { light: "#2394ff", dark: "#e9e9ea" },
+ backgroundDark: { light: "#ebeaee", dark: "black" },
+ background: { light: "#f6f5f8", dark: "black" },
+ // f6f5f8 /ebf1f8
+ heading: { light: "black", dark: "#e9e9ea" },
+ text3: { light: "black", dark: "#e9e9ea" },
+ background5: { light: "#dee8ff", dark: "#3c393f" }
+ }
+ }
+ },
+ ogImageUrl: "https://vocs.dev/api/og?logo=%logo&title=%title&description=%description",
+ title: "Smart Wallet",
+ description: "Smart Wallet Documentation",
+ // logoUrl: '/logo.svg',
+ iconUrl: "/logo.svg",
+ topNav: [
+ { text: "Demo", link: "https://smart-wallet.xyz/" },
+ { text: "SDK Playground", link: "https://coinbase.github.io/coinbase-wallet-sdk/" },
+ { text: "Github", link: "https://github.com/coinbase/coinbase-wallet-sdk" },
+ { text: "Discord", link: "https://discord.com/invite/cdp/" }
+ ],
+ sidebar: [
+ {
+ text: "Why Smart Wallet?",
+ link: "/why"
+ },
+ {
+ text: "Quick Start",
+ link: "/quick-start"
+ },
+ {
+ text: "FAQ",
+ link: "/FAQ"
+ },
+ {
+ text: "Launch Ready Checklist",
+ link: "/checklist"
+ },
+ {
+ text: "Wallet Library Support",
+ link: "/wallet-library-support"
+ },
+ {
+ text: "Base Gasless Campaign",
+ link: "/base-gasless-campaign"
+ },
+ {
+ text: "Guides",
+ collapsed: false,
+ items: [
+ {
+ text: "Create a New App",
+ items: [
+ { text: "Using Build Onchain Template", link: "/guides/create-app/using-boat" },
+ { text: "Using Wagmi Template", link: "/guides/create-app/using-wagmi" }
+ ]
+ },
+ {
+ text: "Update an Existing App",
+ link: "/guides/update-existing-app"
+ },
+ {
+ text: "Create Wallet Button",
+ link: "/guides/components/create-wallet-button"
+ },
+ {
+ text: "Signature Verification",
+ link: "/guides/signature-verification"
+ },
+ {
+ text: "Sign-In with Ethereum",
+ link: "/guides/siwe"
+ },
+ {
+ text: "Batch Transactions",
+ link: "/guides/batch-transactions"
+ },
+ {
+ text: "Paymasters (Sponsored Transactions)",
+ link: "/guides/paymasters"
+ },
+ {
+ text: "Magic Spend Support",
+ link: "/guides/magic-spend"
+ },
+ {
+ text: "Tips & Tricks",
+ items: [
+ {
+ text: "Inspect Transaction Simulation",
+ link: "/guides/tips/inspect-txn-simulation"
+ },
+ {
+ text: "Popup Tips",
+ link: "/guides/tips/popup-tips"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ text: "SDK",
+ collapsed: false,
+ items: [
+ {
+ text: "Install",
+ link: "/sdk/install"
+ },
+ {
+ text: "Setup",
+ link: "/sdk/setup"
+ },
+ {
+ text: "makeWeb3Provider",
+ link: "/sdk/makeWeb3Provider"
+ },
+ {
+ text: "Upgrading from 3.x",
+ link: "/sdk/v3-to-v4-changes"
+ },
+ {
+ text: "CoinbaseWalletProvider",
+ items: [
+ { text: "Overview", link: "/sdk/CoinbaseWalletProvider/overview" },
+ {
+ text: "request",
+ items: [
+ { text: "eth_requestAccounts", link: "/sdk/CoinbaseWalletProvider/request/eth_requestAccounts" }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ text: "Smart Contracts",
+ collapsed: false,
+ items: [
+ { text: "Smart Wallet", link: "https://github.com/coinbase/smart-wallet" },
+ { text: "Magic Spend", link: "https://github.com/coinbase/magic-spend" }
+ ]
+ }
+ ]
+});
+export {
+ vocs_config_default as default
+};
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidm9jcy5jb25maWcudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidm9jc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBoZWFkKCkge1xuICAgIHJldHVybiA8c2NyaXB0IGRlZmVyIHNyYz17cHJvY2Vzcy5lbnYuVkVSQ0VMX0VOViA9PSBcInByb2R1Y3Rpb25cIiA/IFwiL192ZXJjZWwvaW5zaWdodHMvc2NyaXB0LmpzXCIgOiBcIlwifT48L3NjcmlwdD47XG4gIH0sXG4gIHRoZW1lOiB7XG4gICAgY29sb3JTY2hlbWU6IFwic3lzdGVtXCIsXG4gICAgdmFyaWFibGVzOiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICB0ZXh0QWNjZW50OiB7IGxpZ2h0OiBcIiMyMzk0ZmZcIiwgZGFyazogXCIjZTllOWVhXCIgfSxcbiAgICAgICAgYmFja2dyb3VuZERhcms6IHsgbGlnaHQ6IFwiI2ViZWFlZVwiLCBkYXJrOiBcImJsYWNrXCIgfSxcbiAgICAgICAgYmFja2dyb3VuZDogeyBsaWdodDogXCIjZjZmNWY4XCIsIGRhcms6IFwiYmxhY2tcIiB9LCAvLyBmNmY1ZjggL2ViZjFmOFxuICAgICAgICBoZWFkaW5nOiB7IGxpZ2h0OiBcImJsYWNrXCIsIGRhcms6IFwiI2U5ZTllYVwiIH0sXG4gICAgICAgIHRleHQzOiB7IGxpZ2h0OiBcImJsYWNrXCIsIGRhcms6IFwiI2U5ZTllYVwiIH0sXG4gICAgICAgIGJhY2tncm91bmQ1OiB7IGxpZ2h0OiBcIiNkZWU4ZmZcIiwgZGFyazogXCIjM2MzOTNmXCIgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgb2dJbWFnZVVybDogXCJodHRwczovL3ZvY3MuZGV2L2FwaS9vZz9sb2dvPSVsb2dvJnRpdGxlPSV0aXRsZSZkZXNjcmlwdGlvbj0lZGVzY3JpcHRpb25cIixcbiAgdGl0bGU6IFwiU21hcnQgV2FsbGV0XCIsXG4gIGRlc2NyaXB0aW9uOiBcIlNtYXJ0IFdhbGxldCBEb2N1bWVudGF0aW9uXCIsXG4gIC8vIGxvZ29Vcmw6ICcvbG9nby5zdmcnLFxuICBpY29uVXJsOiBcIi9sb2dvLnN2Z1wiLFxuICB0b3BOYXY6IFtcbiAgICB7IHRleHQ6IFwiRGVtb1wiLCBsaW5rOiBcImh0dHBzOi8vc21hcnQtd2FsbGV0Lnh5ei9cIiB9LFxuICAgIHsgdGV4dDogXCJTREsgUGxheWdyb3VuZFwiLCBsaW5rOiBcImh0dHBzOi8vY29pbmJhc2UuZ2l0aHViLmlvL2NvaW5iYXNlLXdhbGxldC1zZGsvXCIgfSxcbiAgICB7IHRleHQ6IFwiR2l0aHViXCIsIGxpbms6IFwiaHR0cHM6Ly9naXRodWIuY29tL2NvaW5iYXNlL2NvaW5iYXNlLXdhbGxldC1zZGtcIiB9LFxuICAgIHsgdGV4dDogXCJEaXNjb3JkXCIsIGxpbms6IFwiaHR0cHM6Ly9kaXNjb3JkLmNvbS9pbnZpdGUvY2RwL1wiIH0sXG4gIF0sXG4gIHNpZGViYXI6IFtcbiAgICB7XG4gICAgICB0ZXh0OiBcIldoeSBTbWFydCBXYWxsZXQ/XCIsXG4gICAgICBsaW5rOiBcIi93aHlcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiUXVpY2sgU3RhcnRcIixcbiAgICAgIGxpbms6IFwiL3F1aWNrLXN0YXJ0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkZBUVwiLFxuICAgICAgbGluazogXCIvRkFRXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkxhdW5jaCBSZWFkeSBDaGVja2xpc3RcIixcbiAgICAgIGxpbms6IFwiL2NoZWNrbGlzdFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogXCJXYWxsZXQgTGlicmFyeSBTdXBwb3J0XCIsXG4gICAgICBsaW5rOiBcIi93YWxsZXQtbGlicmFyeS1zdXBwb3J0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkJhc2UgR2FzbGVzcyBDYW1wYWlnblwiLFxuICAgICAgbGluazogXCIvYmFzZS1nYXNsZXNzLWNhbXBhaWduXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIkd1aWRlc1wiLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkNyZWF0ZSBhIE5ldyBBcHBcIixcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgeyB0ZXh0OiBcIlVzaW5nIEJ1aWxkIE9uY2hhaW4gVGVtcGxhdGVcIiwgbGluazogXCIvZ3VpZGVzL2NyZWF0ZS1hcHAvdXNpbmctYm9hdFwiIH0sXG4gICAgICAgICAgICB7IHRleHQ6IFwiVXNpbmcgV2FnbWkgVGVtcGxhdGVcIiwgbGluazogXCIvZ3VpZGVzL2NyZWF0ZS1hcHAvdXNpbmctd2FnbWlcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlVwZGF0ZSBhbiBFeGlzdGluZyBBcHBcIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvdXBkYXRlLWV4aXN0aW5nLWFwcFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJDcmVhdGUgV2FsbGV0IEJ1dHRvblwiLFxuICAgICAgICAgIGxpbms6IFwiL2d1aWRlcy9jb21wb25lbnRzL2NyZWF0ZS13YWxsZXQtYnV0dG9uXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlNpZ25hdHVyZSBWZXJpZmljYXRpb25cIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvc2lnbmF0dXJlLXZlcmlmaWNhdGlvblwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTaWduLUluIHdpdGggRXRoZXJldW1cIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvc2l3ZVwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJCYXRjaCBUcmFuc2FjdGlvbnNcIixcbiAgICAgICAgICBsaW5rOiBcIi9ndWlkZXMvYmF0Y2gtdHJhbnNhY3Rpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIlBheW1hc3RlcnMgKFNwb25zb3JlZCBUcmFuc2FjdGlvbnMpXCIsXG4gICAgICAgICAgbGluazogXCIvZ3VpZGVzL3BheW1hc3RlcnNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiTWFnaWMgU3BlbmQgU3VwcG9ydFwiLFxuICAgICAgICAgIGxpbms6IFwiL2d1aWRlcy9tYWdpYy1zcGVuZFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJUaXBzICYgVHJpY2tzXCIsXG4gICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogXCJJbnNwZWN0IFRyYW5zYWN0aW9uIFNpbXVsYXRpb25cIixcbiAgICAgICAgICAgICAgbGluazogXCIvZ3VpZGVzL3RpcHMvaW5zcGVjdC10eG4tc2ltdWxhdGlvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogXCJQb3B1cCBUaXBzXCIsXG4gICAgICAgICAgICAgIGxpbms6IFwiL2d1aWRlcy90aXBzL3BvcHVwLXRpcHNcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiBcIlNES1wiLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiBcIkluc3RhbGxcIixcbiAgICAgICAgICBsaW5rOiBcIi9zZGsvaW5zdGFsbFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJTZXR1cFwiLFxuICAgICAgICAgIGxpbms6IFwiL3Nkay9zZXR1cFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogXCJtYWtlV2ViM1Byb3ZpZGVyXCIsXG4gICAgICAgICAgbGluazogXCIvc2RrL21ha2VXZWIzUHJvdmlkZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiVXBncmFkaW5nIGZyb20gMy54XCIsXG4gICAgICAgICAgbGluazogXCIvc2RrL3YzLXRvLXY0LWNoYW5nZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IFwiQ29pbmJhc2VXYWxsZXRQcm92aWRlclwiLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICB7IHRleHQ6IFwiT3ZlcnZpZXdcIiwgbGluazogXCIvc2RrL0NvaW5iYXNlV2FsbGV0UHJvdmlkZXIvb3ZlcnZpZXdcIiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXh0OiBcInJlcXVlc3RcIixcbiAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7IHRleHQ6IFwiZXRoX3JlcXVlc3RBY2NvdW50c1wiLCBsaW5rOiBcIi9zZGsvQ29pbmJhc2VXYWxsZXRQcm92aWRlci9yZXF1ZXN0L2V0aF9yZXF1ZXN0QWNjb3VudHNcIiB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6IFwiU21hcnQgQ29udHJhY3RzXCIsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAgeyB0ZXh0OiBcIlNtYXJ0IFdhbGxldFwiLCBsaW5rOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9jb2luYmFzZS9zbWFydC13YWxsZXRcIiB9LFxuICAgICAgICB7IHRleHQ6IFwiTWFnaWMgU3BlbmRcIiwgbGluazogXCJodHRwczovL2dpdGh1Yi5jb20vY29pbmJhc2UvbWFnaWMtc3BlbmRcIiB9LFxuICAgICAgXSxcbiAgICB9LFxuICBdLFxufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxvQkFBb0I7QUFJbEI7QUFGWCxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixPQUFPO0FBQ0wsV0FBTyxvQkFBQyxZQUFPLE9BQUssTUFBQyxLQUFLLFFBQVEsSUFBSSxjQUFjLGVBQWUsZ0NBQWdDLElBQUk7QUFBQSxFQUN6RztBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0wsYUFBYTtBQUFBLElBQ2IsV0FBVztBQUFBLE1BQ1QsT0FBTztBQUFBLFFBQ0wsWUFBWSxFQUFFLE9BQU8sV0FBVyxNQUFNLFVBQVU7QUFBQSxRQUNoRCxnQkFBZ0IsRUFBRSxPQUFPLFdBQVcsTUFBTSxRQUFRO0FBQUEsUUFDbEQsWUFBWSxFQUFFLE9BQU8sV0FBVyxNQUFNLFFBQVE7QUFBQTtBQUFBLFFBQzlDLFNBQVMsRUFBRSxPQUFPLFNBQVMsTUFBTSxVQUFVO0FBQUEsUUFDM0MsT0FBTyxFQUFFLE9BQU8sU0FBUyxNQUFNLFVBQVU7QUFBQSxRQUN6QyxhQUFhLEVBQUUsT0FBTyxXQUFXLE1BQU0sVUFBVTtBQUFBLE1BQ25EO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFlBQVk7QUFBQSxFQUNaLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQTtBQUFBLEVBRWIsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLElBQ04sRUFBRSxNQUFNLFFBQVEsTUFBTSw0QkFBNEI7QUFBQSxJQUNsRCxFQUFFLE1BQU0sa0JBQWtCLE1BQU0sa0RBQWtEO0FBQUEsSUFDbEYsRUFBRSxNQUFNLFVBQVUsTUFBTSxrREFBa0Q7QUFBQSxJQUMxRSxFQUFFLE1BQU0sV0FBVyxNQUFNLGtDQUFrQztBQUFBLEVBQzdEO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FB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