From fd3d73b420cae89a1f78daae68fe667e6fc6fa54 Mon Sep 17 00:00:00 2001
From: Dan Cortes <3639170+dgca@users.noreply.github.com>
Date: Thu, 12 Jun 2025 16:04:50 -0600
Subject: [PATCH] Migrate Mintlify docs project to base/docs
---
.cursor/rules/mintlify.mdc | 368 +
.github/workflows/chromatic.yml | 19 +
.gitignore | 107 +-
.nvmrc | 1 -
.yarnrc.yml | 1 -
README.md | 33 +-
{docs/pages => _pages}/arbitration.mdx | 0
{docs/pages => _pages}/base-services-hub.mdx | 0
.../buildathons/2025-02-flash.mdx | 77 +-
.../builderkits/agentkit/index.mdx | 0
.../builderkits/minikit/debugging.mdx | 15 +-
.../builderkits/minikit/overview.mdx | 22 +-
.../builderkits/minikit/quickstart.mdx | 117 +-
.../builderkits/minikit/thinking-social.mdx | 5 +-
.../api/build-deposit-to-morpho-tx.mdx | 5 +-
.../onchainkit/api/build-mint-transaction.mdx | 11 +-
.../onchainkit/api/build-swap-transaction.mdx | 11 +-
.../api/build-withdraw-from-morpho-tx.mdx | 5 +-
.../onchainkit/api/get-mint-details.mdx | 11 +-
.../onchainkit/api/get-portfolios.mdx | 21 +-
.../onchainkit/api/get-swap-quote.mdx | 11 +-
.../onchainkit/api/get-token-details.mdx | 11 +-
.../builderkits/onchainkit/api/get-tokens.mdx | 23 +-
.../builderkits/onchainkit/api/types.mdx | 0
.../onchainkit/appchain/bridge.mdx | 28 +-
.../builderkits/onchainkit/appchain/types.mdx | 0
.../builderkits/onchainkit/buy/buy.mdx | 16 +-
.../builderkits/onchainkit/buy/types.mdx | 0
.../onchainkit/checkout/checkout.mdx | 130 +-
.../builderkits/onchainkit/checkout/types.mdx | 0
.../builderkits/onchainkit/config/is-base.mdx | 37 +
.../onchainkit/config/is-ethereum.mdx | 37 +
.../onchainkit/config/onchainkit-provider.mdx | 5 +-
.../config/supplemental-providers.mdx | 8 +-
.../builderkits/onchainkit/config/types.mdx | 0
.../create-a-basename-profile-component.mdx | 5 +-
.../builderkits/onchainkit/earn/earn.mdx | 17 +-
.../builderkits/onchainkit/earn/types.mdx | 0
.../onchainkit/fund/fetch-onramp-config.mdx | 11 +-
.../onchainkit/fund/fetch-onramp-options.mdx | 11 +-
.../onchainkit/fund/fetch-onramp-quote.mdx | 11 +-
.../fund/fetch-onramp-transaction-status.mdx | 11 +-
.../onchainkit/fund/fund-button.mdx | 120 +-
.../builderkits/onchainkit/fund/fund-card.mdx | 25 +-
.../onchainkit/fund/get-onramp-buy-url.mdx | 11 +-
.../fund/setup-onramp-event-listeners.mdx | 11 +-
.../builderkits/onchainkit/fund/types.mdx | 0
.../onchainkit/getting-started.mdx | 14 +-
.../onchainkit/guides/ai-prompting-guide.mdx | 7 +-
.../onchainkit/guides/build-onchain-apps.mdx | 98 +
.../onchainkit/guides/contribution.mdx | 0
.../onchainkit/guides/lifecycle-status.mdx | 0
.../onchainkit/guides/reporting-bug.mdx | 22 +-
.../onchainkit/guides/tailwind.mdx | 100 +
.../onchainkit/guides/telemetry.mdx | 0
.../builderkits/onchainkit/guides/themes.mdx | 0
.../onchainkit/guides/troubleshooting.mdx | 5 +-
.../guides/use-basename-in-onchain-app.mdx | 29 +-
.../guides/using-ai-powered-ides.mdx | 0
.../hooks/use-build-deposit-to-morpho-tx.mdx | 5 +-
.../use-build-withdraw-from-morpho-tx.mdx | 5 +-
.../onchainkit/hooks/use-earn-context.mdx | 5 +-
.../onchainkit/hooks/use-mint-details.mdx | 11 +-
.../onchainkit/hooks/use-morpho-vault.mdx | 5 +-
.../onchainkit/hooks/use-token-details.mdx | 11 +-
.../onchainkit/identity/address.mdx | 5 +-
.../onchainkit/identity/avatar.mdx | 5 +-
.../builderkits/onchainkit/identity/badge.mdx | 11 +-
.../onchainkit/identity/get-address.mdx | 16 +-
.../onchainkit/identity/get-attestations.mdx | 11 +-
.../onchainkit/identity/get-avatar.mdx | 16 +-
.../onchainkit/identity/get-avatars.mdx | 23 +-
.../onchainkit/identity/get-name.mdx | 23 +-
.../onchainkit/identity/get-names.mdx | 23 +-
.../onchainkit/identity/identity-card.mdx | 0
.../onchainkit/identity/identity.mdx | 0
.../builderkits/onchainkit/identity/name.mdx | 5 +-
.../onchainkit/identity/socials.mdx | 0
.../builderkits/onchainkit/identity/types.mdx | 0
.../onchainkit/identity/use-address.mdx | 5 +-
.../onchainkit/identity/use-avatar.mdx | 5 +-
.../onchainkit/identity/use-avatars.mdx | 17 +-
.../onchainkit/identity/use-name.mdx | 17 +-
.../onchainkit/identity/use-names.mdx | 17 +-
.../builderkits/onchainkit/installation.mdx | 2 +-
.../onchainkit/installation/astro.mdx | 198 +
.../onchainkit/installation/nextjs.mdx | 175 +
.../onchainkit/installation/remix.mdx | 196 +
.../onchainkit/installation/vite.mdx | 158 +
.../builderkits/onchainkit/mint/nft-card.mdx | 89 +-
.../onchainkit/mint/nft-mint-card.mdx | 92 +-
.../builderkits/onchainkit/mint/types.mdx | 0
.../onchainkit/paymaster/erc20-paymaster.mdx | 0
.../onchainkit/paymaster/errors.mdx | 0
.../gasless-transactions-with-paymaster.mdx | 51 +-
.../paymaster/how-to-contribute.mdx | 0
.../onchainkit/paymaster/quickstart-guide.mdx | 0
.../paymaster/quickstart-headless.mdx | 0
.../onchainkit/paymaster/security.mdx | 0
.../onchainkit/paymaster/troubleshooting.mdx | 0
.../onchainkit/paymaster/welcome.mdx | 0
.../builderkits/onchainkit/restricted.mdx | 0
.../onchainkit/signature/signature.mdx | 6 +-
.../onchainkit/signature/types.mdx | 0
.../onchainkit/swap/swap-settings.mdx | 0
.../builderkits/onchainkit/swap/swap.mdx | 6 +-
.../builderkits/onchainkit/swap/types.mdx | 0
.../onchainkit/token/format-amount.mdx | 11 +-
.../onchainkit/token/token-chip.mdx | 5 +-
.../onchainkit/token/token-image.mdx | 5 +-
.../onchainkit/token/token-row.mdx | 5 +-
.../onchainkit/token/token-search.mdx | 5 +-
.../token/token-select-dropdown.mdx | 5 +-
.../builderkits/onchainkit/token/types.mdx | 0
.../onchainkit/transaction/transaction.mdx | 397 +
.../onchainkit/transaction/types.mdx | 0
.../use-coinbase-smart-wallet-and-eoas.mdx | 17 +-
.../wallet/is-valid-aa-entrypoint.mdx | 11 +-
.../is-wallet-a-coinbase-smart-wallet.mdx | 11 +-
.../builderkits/onchainkit/wallet/types.mdx | 0
.../wallet/wallet-dropdown-basename.mdx | 5 +-
.../wallet/wallet-dropdown-disconnect.mdx | 5 +-
.../wallet/wallet-dropdown-fund-link.mdx | 7 +-
.../wallet/wallet-dropdown-link.mdx | 5 +-
.../onchainkit/wallet/wallet-island.mdx | 15 +-
.../onchainkit/wallet/wallet-modal.mdx | 126 +-
.../builderkits/onchainkit/wallet/wallet.mdx | 315 +-
.../chain/account-abstraction.md | 0
.../chain/account-abstraction.mdx | 0
.../chain/app-blocklist.mdx | 0
.../pages => _pages}/chain/base-contracts.mdx | 0
.../chain/block-explorers.mdx | 0
.../chain/bridge-an-l1-token-to-base.mdx | 0
.../chain/bridges-mainnet.mdx | 9 +-
.../chain/builder-anniversary-nft.mdx | 0
{docs/pages => _pages}/chain/contracts.mdx | 5 +-
{docs/pages => _pages}/chain/cross-chain.md | 0
{docs/pages => _pages}/chain/cross-chain.mdx | 0
{docs/pages => _pages}/chain/data-indexers.md | 0
.../pages => _pages}/chain/data-indexers.mdx | 0
.../decentralizing-base-with-optimism.mdx | 5 +
.../chain/deploy-on-base-quickstart.mdx | 20 +-
.../differences-between-ethereum-and-base.mdx | 0
{docs/pages => _pages}/chain/fees.mdx | 0
{docs/pages => _pages}/chain/flashblocks.mdx | 0
{docs/pages => _pages}/chain/index.mdx | 0
.../chain/network-faucets.mdx | 40 +-
.../chain/network-information.mdx | 10 +-
.../pages => _pages}/chain/node-providers.mdx | 0
{docs/pages => _pages}/chain/onboarding.mdx | 0
{docs/pages => _pages}/chain/onramps.mdx | 0
{docs/pages => _pages}/chain/oracles.mdx | 5 +-
{docs/pages => _pages}/chain/registry-api.mdx | 5 +-
{docs/pages => _pages}/chain/registry-faq.mdx | 0
.../report.md => _pages/chain/report.mdx | 0
.../chain/run-a-base-node.mdx | 20 +-
.../chain/security-council.mdx | 0
_pages/chain/security.mdx | 5 +
.../chain/using-base.mdx | 0
.../wallet.md => _pages/chain/wallet.mdx | 14 +-
.../why-base.md => _pages/chain/why-base.mdx | 2 +-
_pages/cookbook/IPFS/deploy-with-fleek.mdx | 183 +
...unt-abstraction-on-base-using-biconomy.mdx | 319 +
...raction-on-base-using-particle-network.mdx | 588 +
...ase-using-privy-and-the-base-paymaster.mdx | 734 +
.../gasless-transactions-with-paymaster.mdx | 360 +
.../introduction-to-providers.mdx | 297 +
.../cookbook/client-side-development/viem.mdx | 20 +-
.../cookbook/client-side-development/web3.mdx | 112 +
.../bridge-tokens-with-layerzero.mdx | 70 +-
...essages-and-tokens-from-base-chainlink.mdx | 612 +
.../cookbook/nfts/complex-onchain-nfts.mdx | 15 +-
.../cookbook/nfts/dynamic-nfts.mdx | 0
.../cookbook/nfts/signature-mint.mdx | 23 +-
.../cookbook/nfts/simple-onchain-nfts.mdx | 10 +-
.../nfts/thirdweb-unreal-nft-items.mdx | 59 +-
.../foundry/deploy-with-foundry.mdx | 314 +
.../generate-random-numbers-contracts.mdx | 408 +
.../foundry/setup-with-base.mdx | 0
.../foundry/testing-smart-contracts.mdx | 0
.../foundry/verify-contract-with-basescan.mdx | 296 +
.../hardhat/analyzing-test-coverage.mdx | 0
.../hardhat/debugging-smart-contracts.mdx | 0
.../hardhat/deploy-with-hardhat.mdx | 27 +-
.../hardhat/optimizing-gas-usage.mdx | 0
.../hardhat/reducing-contract-size.mdx | 0
.../remix/deploy-with-remix.mdx | 27 +-
.../tenderly/deploy-with-tenderly.mdx | 15 +-
.../thirdweb/build-with-thirdweb.mdx | 10 +-
.../thirdweb/deploy-with-thirdweb.mdx | 5 +-
.../thirdweb/thirdweb-cli.mdx | 15 +-
.../thirdweb/thirdweb-sdk.mdx | 10 +-
.../gate-irl-events-with-nouns.mdx | 12 +-
.../cookbook/use-case-guides/cast-actions.mdx | 5 +-
.../commerce/build-an-ecommerce-app.mdx | 6 +-
.../commerce/deploy-a-shopify-storefront.mdx | 20 +-
.../create-email-campaigns.mdx | 20 +-
.../convert-farcaster-frame-to-open-frame.mdx | 17 +-
.../creator/nft-minting-with-zora.mdx | 5 +-
.../use-case-guides/deploy-to-vercel.mdx | 10 +-
...-real-time-asset-data-pyth-price-feeds.mdx | 248 +
.../access-real-world-data-chainlink.mdx | 232 +
.../build-a-smart-wallet-funding-app.mdx | 164 +
.../use-case-guides/gating-and-redirects.mdx | 5 +-
.../cookbook/use-case-guides/hyperframes.mdx | 5 +-
.../cookbook/use-case-guides/nft-minting.mdx | 22 +-
.../use-case-guides/no-code-minting.mdx | 0
.../cookbook/use-case-guides/transactions.mdx | 10 +-
{docs/pages => _pages}/cookie-policy.mdx | 0
{docs/pages => _pages}/docs.mdx | 0
_pages/feedback.mdx | 4 +
.../identity/basenames/basenames-faq.mdx | 10 +-
.../basenames-onchainkit-tutorial.mdx | 7 +-
.../basenames/basenames-wagmi-tutorial.mdx | 17 +-
{docs/pages => _pages}/identity/index.mdx | 0
.../identity/mobile-wallet-protocol/batch.mdx | 5 +-
.../mobile-wallet-protocol/encryption.mdx | 5 +-
.../mobile-wallet-protocol/handshake.mdx | 5 +-
.../messages-example.mdx | 0
.../messages-request.mdx | 5 +-
.../messages-response.mdx | 5 +-
.../mobile-wallet-protocol/messages.mdx | 5 +-
.../mobile-wallet-protocol/multi-chain.mdx | 5 +-
.../mobile-wallet-protocol/network.mdx | 5 +-
.../mobile-wallet-protocol/spec-overview.mdx | 0
.../mobile-wallet-protocol/verification.mdx | 5 +-
.../concepts/base-gasless-campaign.mdx | 5 +-
.../concepts/features/built-in/MagicSpend.mdx | 5 +-
.../concepts/features/built-in/networks.mdx | 7 +-
.../concepts/features/built-in/passkeys.mdx | 8 +-
.../features/built-in/recovery-keys.mdx | 7 +-
.../features/built-in/single-sign-on.mdx | 5 +-
.../features/optional/batch-operations.mdx | 5 +-
.../features/optional/custom-gas-tokens.mdx | 5 +-
.../optional/gas-free-transactions.mdx | 5 +-
.../features/optional/spend-permissions.mdx | 5 +-
.../features/optional/sub-accounts.mdx | 12 +-
.../concepts/usage-details/gas-usage.mdx | 5 +-
.../concepts/usage-details/popups.mdx | 5 +-
.../concepts/usage-details/self-calls.mdx | 5 +-
.../usage-details/signature-verification.mdx | 5 +-
.../concepts/usage-details/simulations.mdx | 5 +-
.../usage-details/wallet-library-support.mdx | 5 +-
.../concepts/what-is-smart-wallet.mdx | 5 +-
.../contribute-to-smart-wallet-docs.mdx | 26 +-
.../contribute/security-and-bug-bounty.mdx | 5 +-
.../smart-wallet/examples/coin-a-joke-app.mdx | 12 +-
.../guides/batch-transactions.mdx | 183 +
.../components/create-wallet-button.mdx | 21 +-
.../smart-wallet/guides/erc20-paymasters.mdx | 5 +-
.../smart-wallet/guides/magic-spend.mdx | 5 +-
.../smart-wallet/guides/paymasters.mdx | 262 +
.../guides/signature-verification.mdx | 5 +-
.../guides/signing-and-verifying-messages.mdx | 25 +-
_pages/identity/smart-wallet/guides/siwe.mdx | 202 +
.../smart-wallet/guides/spend-permissions.mdx | 619 +
.../guides/sub-accounts/index.mdx | 2 +-
.../guides/sub-accounts/setup.mdx | 15 +-
.../sub-accounts/using-sub-accounts.mdx | 2 +-
.../guides/tips/inspect-txn-simulation.mdx | 5 +-
.../smart-wallet/guides/tips/popup-tips.mdx | 5 +-
.../ai-tools-available-for-devs.mdx | 5 +-
.../smart-wallet/quickstart/index.mdx | 5 +-
.../quickstart/nextjs-project.mdx | 20 +-
.../smart-wallet/quickstart/quick-demo.mdx | 14 +-
.../quickstart/react-native-project.mdx | 56 +-
.../sdk/CoinbaseWalletProvider/Overview.mdx | 103 +
.../CoinbaseWalletProvider/eth_accounts.mdx | 5 +-
.../eth_blockNumber.mdx | 5 +-
.../CoinbaseWalletProvider/eth_chainId.mdx | 5 +-
.../CoinbaseWalletProvider/eth_coinbase.mdx | 5 +-
.../eth_estimateGas.mdx | 5 +-
.../CoinbaseWalletProvider/eth_feeHistory.mdx | 5 +-
.../CoinbaseWalletProvider/eth_gasPrice.mdx | 5 +-
.../CoinbaseWalletProvider/eth_getBalance.mdx | 5 +-
.../eth_getBlockByHash.mdx | 5 +-
.../eth_getBlockByNumber.mdx | 5 +-
.../eth_getBlockTransactionCountByHash.mdx | 5 +-
.../eth_getBlockTransactionCountByNumber.mdx | 5 +-
.../CoinbaseWalletProvider/eth_getCode.mdx | 5 +-
.../CoinbaseWalletProvider/eth_getLogs.mdx | 5 +-
.../CoinbaseWalletProvider/eth_getProof.mdx | 5 +-
.../eth_getStorageAt.mdx | 5 +-
.../eth_getTransactionByBlockHashAndIndex.mdx | 5 +-
...th_getTransactionByBlockNumberAndIndex.mdx | 5 +-
.../eth_getTransactionByHash.mdx | 5 +-
.../eth_getTransactionCount.mdx | 5 +-
.../eth_getTransactionReceipt.mdx | 5 +-
.../eth_getUncleCountByBlockHash.mdx | 5 +-
.../eth_getUncleCountByBlockNumber.mdx | 5 +-
.../eth_requestAccounts.mdx | 5 +-
.../eth_sendRawTransaction.mdx | 5 +-
.../eth_sendTransaction.mdx | 5 +-
.../eth_signTypedData_v4.mdx | 5 +-
.../CoinbaseWalletProvider/personal_sign.mdx | 5 +-
.../request-overview.mdx | 96 +
.../CoinbaseWalletProvider/sdk-overview.mdx | 14 +
.../wallet_addEthereumChain.mdx | 5 +-
.../wallet_addSubAccount.mdx | 5 +-
.../CoinbaseWalletProvider/wallet_connect.mdx | 5 +-
.../wallet_switchEthereumChain.mdx | 5 +-
.../wallet_watchAsset.mdx | 5 +-
.../web3_clientVersion.mdx | 5 +-
.../technical-reference/sdk/index.mdx | 22 +-
.../sdk/sub-account-reference.mdx | 12 +-
.../coinbase-fetchpermissions.mdx | 115 +
.../spendpermissionmanager.mdx | 11 +-
.../adding-tokens-to-coinbase-wallet.mdx | 14 +-
.../wallet-sdk/android-api-reference.mdx | 6 +-
.../android-establishing-a-connection.mdx | 6 +-
.../identity/wallet-sdk/android-install.mdx | 0
.../wallet-sdk/android-making-requests.mdx | 0
.../identity/wallet-sdk/android-setup.mdx | 12 +-
.../wallet-sdk/developer-settings.mdx | 15 +-
.../wallet-sdk/disconnecting-links.mdx | 0
.../identity/wallet-sdk/environments.mdx | 0
.../identity/wallet-sdk/errors.mdx | 0
.../existing-welcome-page-features.mdx | 5 +
.../identity/wallet-sdk/faq.mdx | 0
.../wallet-sdk/getting-eth-accounts.mdx | 6 +-
.../wallet-sdk/injected-provider-guidance.mdx | 0
.../identity/wallet-sdk/injected-provider.mdx | 0
.../identity/wallet-sdk/installing.mdx | 5 +-
.../identity/wallet-sdk/ios-api-reference.mdx | 0
.../ios-establishing-a-connection.mdx | 0
.../identity/wallet-sdk/ios-install.mdx | 0
.../wallet-sdk/ios-making-requests.mdx | 0
.../identity/wallet-sdk/ios-setup.mdx | 0
.../message-payment-xmtp-content-type.mdx | 5 +-
...bile-dapp-integration-via-deep-linking.mdx | 5 +
.../wallet-sdk/mobile-sdk-overview.mdx | 5 +-
.../wallet-sdk/sample-applications.mdx | 0
.../identity/wallet-sdk/setup.mdx | 10 +-
_pages/identity/wallet-sdk/smart-wallet.mdx | 6 +
.../wallet-sdk/solana-adapter-guide.mdx | 15 +-
.../wallet-sdk/solana-connecting-accounts.mdx | 0
.../identity/wallet-sdk/solana-overview.mdx | 0
.../wallet-sdk/solana-provider-api.mdx | 15 +-
.../identity/wallet-sdk/solana-provider.mdx | 5 +-
.../solana-sending-transactions.mdx | 5 +-
.../wallet-sdk/solana-signing-messages.mdx | 5 +-
.../wallet-sdk/solana-wallet-adapter.mdx | 0
.../wallet-sdk/supported-environments.mdx | 5 +
.../identity/wallet-sdk/sw-rainbowkit.mdx | 0
.../identity/wallet-sdk/sw-setup.mdx | 5 +-
.../identity/wallet-sdk/switching-chains.mdx | 0
.../identity/wallet-sdk/tracking-assets.mdx | 0
_pages/identity/wallet-sdk/ux-guidelines.mdx | 6 +
.../identity/wallet-sdk/ux-tips.mdx | 5 +-
.../identity/wallet-sdk/wallet-features.mdx | 0
.../identity/wallet-sdk/wallet-mobile-sdk.mdx | 5 +
.../wallet-sdk-existing-section.mdx | 5 +
.../wallet-sdk/wallet-sdk-mobile-sdk.mdx | 5 +
.../identity/wallet-sdk/welcome.mdx | 7 +-
.../wallet-sdk/whitelisted-networks.mdx | 0
_pages/identity/wallet-sdk/xmtp.mdx | 5 +
{docs/pages => _pages}/index.mdx | 4 +-
.../address-and-payable.mdx | 0
.../function-modifiers-vid.mdx | 2 +-
.../advanced-functions/function-modifiers.mdx | 10 +-
.../function-visibility-vid.mdx | 2 +-
.../function-visibility.mdx | 5 +-
.../learn/arrays/array-storage-layout-vid.mdx | 2 +-
.../learn/arrays/arrays-exercise.mdx | 20 +-
.../learn/arrays/arrays-in-solidity-vid.mdx | 2 +-
.../learn/arrays/arrays-in-solidity.mdx | 0
.../learn/arrays/filtering-an-array-sbs.mdx | 5 +-
.../learn/arrays/fixed-size-arrays-vid.mdx | 2 +-
.../arrays/writing-arrays-in-solidity-vid.mdx | 2 +-
.../basic-functions-exercise.mdx | 5 +-
.../basic-types.mdx | 7 +-
.../hello-world-step-by-step.mdx | 0
.../intro-to-contracts-vid.mdx | 2 +-
.../control-structures-exercise.mdx | 5 +-
.../control-structures/control-structures.mdx | 10 +-
.../learn/control-structures/loops-vid.mdx | 2 +-
.../require-revert-error-vid.mdx | 2 +-
.../standard-control-structures-vid.mdx | 2 +-
.../contract-verification-sbs.mdx | 5 +-
.../deployment-to-base-sepolia-sbs.mdx | 12 +-
.../deployment-to-testnet-exercise.mdx | 10 +-
.../overview-of-test-networks-vid.mdx | 2 +-
.../deployment-to-testnet/test-networks.mdx | 0
.../learn/development-tools/overview.mdx | 0
.../erc-20-token/analyzing-erc-20-vid.mdx | 2 +-
.../learn/erc-20-token/erc-20-exercise.mdx | 31 +-
.../learn/erc-20-token/erc-20-standard.mdx | 0
.../learn/erc-20-token/erc-20-testing-vid.mdx | 2 +-
.../learn/erc-20-token/erc-20-token-sbs.mdx | 5 +-
.../erc-20-token/openzeppelin-erc-20-vid.mdx | 2 +-
.../learn/erc-721-token/erc-721-exercise.mdx | 17 +-
.../erc-721-token/erc-721-on-opensea-vid.mdx | 2 +-
.../learn/erc-721-token/erc-721-sbs.mdx | 12 +-
.../erc-721-token/erc-721-standard-video.mdx | 2 +-
.../learn/erc-721-token/erc-721-standard.mdx | 0
.../implementing-an-erc-721-vid.mdx | 2 +-
.../openzeppelin-erc-721-vid.mdx | 2 +-
.../error-triage-exercise-source.sol | 0
.../error-triage/error-triage-exercise.mdx | 5 +-
.../learn/error-triage/error-triage-vid.mdx | 2 +-
.../learn/error-triage/error-triage.mdx | 22 +-
.../ethereum-virtual-machine/evm-diagram.mdx | 0
.../learn/etherscan/etherscan-sbs.mdx | 5 +-
.../learn/etherscan/etherscan-vid.mdx | 2 +-
.../learn/events/hardhat-events-sbs.mdx | 5 +-
.../learn/exercise-contracts.mdx | 0
.../building-an-onchain-app.mdx | 32 +-
.../learn/frontend-setup/overview.mdx | 0
.../frontend-setup/wallet-connectors.mdx | 10 +-
.../learn/hardhat-deploy/deployment-vid.mdx | 11 +
.../hardhat-deploy/hardhat-deploy-sbs.mdx | 262 +
.../installing-hardhat-deploy-vid.mdx | 11 +
.../setup-deploy-script-vid.mdx | 11 +
.../test-network-configuration-vid.mdx | 11 +
.../testing-our-deployment-vid.mdx | 11 +
.../learn/hardhat-forking/hardhat-forking.mdx | 0
.../hardhat-forking/mainnet-forking-vid.mdx | 11 +
.../creating-a-project-vid.mdx | 2 +-
.../hardhat-overview-vid.mdx | 2 +-
.../hardhat-setup-overview-sbs.mdx | 0
.../contract-abi-and-testing-vid.mdx | 11 +
.../hardhat-testing/hardhat-testing-sbs.mdx | 0
.../hardhat-testing/testing-overview-vid.mdx | 11 +
.../hardhat-testing/writing-tests-vid.mdx | 11 +
.../hardhat-tools-and-testing/overview.mdx | 0
.../hardhat-verify/hardhat-verify-sbs.mdx | 0
.../hardhat-verify/hardhat-verify-vid.mdx | 11 +
.../learn/help-on-discord.mdx | 0
.../learn/imports/imports-exercise.mdx | 15 +-
.../learn/imports/imports-sbs.mdx | 5 +-
.../learn/imports/imports-vid.mdx | 2 +-
.../inheritance/abstract-contracts-sbs.mdx | 0
.../inheritance/abstract-contracts-vid.mdx | 2 +-
.../inheritance/inheritance-exercise.mdx | 15 +-
.../learn/inheritance/inheritance-sbs.mdx | 0
.../learn/inheritance/inheritance-vid.mdx | 2 +-
.../inheritance/multiple-inheritance-vid.mdx | 2 +-
.../inheritance/multiple-inheritance.mdx | 0
.../calling-another-contract-vid.mdx | 7 +-
.../contract-to-contract-interaction.mdx | 5 +-
.../interfaces/intro-to-interfaces-vid.mdx | 7 +-
.../interfaces/testing-the-interface-vid.mdx | 7 +-
.../intro-to-tokens/intro-to-tokens-vid.mdx | 2 +-
.../misconceptions-about-tokens-vid.mdx | 2 +-
.../learn/intro-to-tokens/tokens-overview.mdx | 0
.../ethereum-applications.mdx | 0
.../ethereum-dev-overview-vid.mdx | 2 +-
.../introduction-to-ethereum/evm-diagram.mdx | 5 +-
.../gas-use-in-eth-transactions.mdx | 0
.../intro-to-ethereum-vid.mdx | 2 +-
.../anatomy-of-a-smart-contract-vid.mdx | 2 +-
.../deployment-in-remix-vid.mdx | 2 +-
.../deployment-in-remix.mdx | 0
.../introduction-to-remix-vid.mdx | 2 +-
.../introduction-to-remix.mdx | 5 +-
.../introduction-to-solidity-overview.mdx | 0
.../introduction-to-solidity-vid.mdx | 2 +-
.../solidity-overview.mdx | 7 +-
_pages/learn/learning-objectives.mdx | 258 +
.../mappings/how-mappings-are-stored-vid.mdx | 2 +-
.../learn/mappings/mappings-exercise.mdx | 5 +-
.../learn/mappings/mappings-sbs.mdx | 0
.../learn/mappings/mappings-vid.mdx | 2 +-
.../learn/mappings/using-msg-sender-vid.mdx | 2 +-
.../creating-a-minimal-token-vid.mdx | 2 +-
.../minimal-tokens/minimal-token-sbs.mdx | 5 +-
.../minimal-tokens-exercise.mdx | 10 +-
.../transferring-a-minimal-token-vid.mdx | 2 +-
.../creating-a-new-contract-vid.mdx | 2 +-
.../new-keyword/new-keyword-exercise.mdx | 15 +-
.../learn/new-keyword/new-keyword-sbs.mdx | 5 +-
.../configuring-useReadContract.mdx | 5 +-
.../useAccount.mdx | 0
.../useReadContract.mdx | 15 +-
.../learn/storage/how-storage-works-video.mdx | 2 +-
.../learn/storage/how-storage-works.mdx | 0
.../learn/storage/simple-storage-sbs.mdx | 5 +-
.../learn/storage/simple-storage-video.mdx | 2 +-
.../learn/storage/storage-exercise.mdx | 12 +-
.../learn/structs/structs-exercise.mdx | 5 +-
.../learn/structs/structs-sbs.mdx | 0
.../learn/structs/structs-vid.mdx | 2 +-
{docs/pages => _pages}/learn/welcome.mdx | 3 +-
.../useSimulateContract.mdx | 0
.../writing-to-contracts/useWriteContract.mdx | 15 +-
.../privacy-policy.mdx | 0
_pages/quickstart.mdx | 250 +
.../terms-of-service.mdx | 0
_pages/use-cases/accept-crypto-payments.mdx | 231 +
_pages/use-cases/ai-instructions/eliza.mdx | 23 +
.../ai-instructions/langchain-local.mdx | 65 +
.../ai-instructions/langchain-replit.mdx | 30 +
.../use-cases/decentralize-social-app.mdx | 59 +-
.../use-cases/defi-your-app.mdx | 48 +-
.../pages => _pages}/use-cases/go-gasless.mdx | 41 +-
.../use-cases/launch-ai-agents.mdx | 0
.../use-cases/onboard-any-user.mdx | 154 +-
.../pages => _pages}/wallet-app/mini-apps.mdx | 10 +-
api/submitFeedback.ts | 73 -
contexts/Theme.tsx | 62 -
docs.json | 402 +
docs/_docs.json | 550 +
docs/base-chain/flashblocks/apps.mdx | 195 +
.../base-chain/flashblocks/node-providers.mdx | 48 +
.../network-information/base-contracts.mdx | 131 +
.../diffs-ethereum-base.mdx | 16 +
.../ecosystem-contracts.mdx | 81 +
.../network-information/network-fees.mdx | 28 +
.../node-operators/performance-tuning.mdx | 103 +
.../node-operators/run-a-base-node.mdx | 113 +
docs/base-chain/node-operators/snapshots.mdx | 78 +
.../node-operators/troubleshooting.mdx | 130 +
docs/base-chain/quickstart/bridge-token.mdx | 27 +
.../quickstart/connecting-to-base.mdx | 35 +
docs/base-chain/quickstart/deploy-on-base.mdx | 143 +
docs/base-chain/quickstart/why-base.mdx | 79 +
.../security/avoid-malicious-flags.mdx | 33 +
docs/base-chain/security/bug-bounty.mdx | 3 +
.../security/report-vulnerability.mdx | 19 +
docs/base-chain/security/security-council.mdx | 141 +
docs/base-chain/tools/account-abstraction.mdx | 53 +
docs/base-chain/tools/base-products.mdx | 24 +
docs/base-chain/tools/block-explorers.mdx | 59 +
docs/base-chain/tools/cross-chain.mdx | 77 +
docs/base-chain/tools/data-indexers.mdx | 209 +
docs/base-chain/tools/network-faucets.mdx | 75 +
docs/base-chain/tools/node-providers.mdx | 197 +
.../base-chain/tools/onchain-registry-api.mdx | 157 +
docs/base-chain/tools/onramps.mdx | 28 +
docs/base-chain/tools/oracles.mdx | 141 +
docs/base-chain/tools/tokens-in-wallet.mdx | 129 +
docs/components/App.tsx | 75 -
docs/config/guides.ts | 16 -
docs/constants.ts | 1 -
docs/contexts/AppProviders.tsx | 14 -
docs/contexts/CookieBannerWrapper.tsx | 71 -
docs/cookbook/accept-crypto-payments.mdx | 394 +
docs/cookbook/ai-prompting.mdx | 10 +
docs/cookbook/base-builder-mcp.mdx | 10 +
docs/cookbook/defi-your-app.mdx | 326 +
.../defi/access-real-time-asset-data.mdx | 7 +
docs/cookbook/defi/access-real-world-data.mdx | 7 +
docs/cookbook/defi/add-in-app-funding.mdx | 7 +
docs/cookbook/deploy-a-chain.mdx | 286 +
docs/cookbook/go-gasless.mdx | 406 +
docs/cookbook/growth/cast-actions.mdx | 6 +
docs/cookbook/growth/deploy-to-vercel.mdx | 6 +
docs/cookbook/growth/email-campaigns.mdx | 6 +
docs/cookbook/growth/gating-and-redirects.mdx | 6 +
docs/cookbook/growth/hyperframes.mdx | 6 +
docs/cookbook/growth/retaining-users.mdx | 6 +
docs/cookbook/launch-ai-agents.mdx | 460 +
docs/cookbook/launch-tokens.mdx | 423 +
docs/cookbook/nfts/complex-onchain-nfts.mdx | 6 +
docs/cookbook/nfts/dynamic-nfts.mdx | 6 +
docs/cookbook/nfts/nft-minting-zora.mdx | 6 +
docs/cookbook/nfts/signature-mint.mdx | 6 +
docs/cookbook/nfts/simple-onchain-nfts.mdx | 619 +
.../nfts/thirdweb-unreal-nft-items.mdx | 6 +
docs/cookbook/onboard-any-user.mdx | 143 +
docs/cookbook/onchain-social.mdx | 374 +
.../cookbook/payments/build-ecommerce-app.mdx | 6 +
.../payments/deploy-shopify-storefront.mdx | 6 +
docs/cookbook/payments/transaction-guide.mdx | 6 +
.../social/convert-farcaster-frame.mdx | 436 +
.../social/farcaster-nft-minting-guide.mdx | 419 +
.../social/farcaster-no-code-nft-minting.mdx | 6 +
docs/custom.css | 34 +
docs/docs.json | 1028 +
docs/footer.tsx | 26 -
docs/get-started/ai-prompting.mdx | 9 +
docs/get-started/base.mdx | 85 +
docs/get-started/build-app.mdx | 250 +
docs/get-started/concepts.mdx | 13 +
docs/get-started/deploy-chain.mdx | 286 +
docs/get-started/deploy-smart-contracts.mdx | 144 +
docs/get-started/get-funded.mdx | 205 +
docs/get-started/launch-token.mdx | 423 +
docs/get-started/products.mdx | 19 +
docs/get-started/prompt-library.mdx | 9 +
docs/get-started/use-cases.mdx | 24 +
docs/get-started/use-cases/agents.mdx | 3 +
docs/get-started/use-cases/defi.mdx | 3 +
docs/get-started/use-cases/gasless.mdx | 3 +
docs/get-started/use-cases/onboarding.mdx | 3 +
docs/get-started/use-cases/payments.mdx | 3 +
docs/get-started/use-cases/social.mdx | 3 +
docs/iframe-theme.js | 62 +
.../account-abstraction/privy-console.png | Bin
.../privy-dashboard-page.png | Bin
.../privy-login-methods.png | Bin
.../account-abstraction/privy-login-modal.png | Bin
.../account-abstraction/privy-login-page.png | Bin
docs/{public => }/images/base-docs-og.png | Bin
.../basename-profile-home.png | Bin
.../basenames-frame-final.png | Bin
.../basenames-tutorial/basenames-homepage.png | Bin
.../confirm-textrecord-update.png | Bin
.../images/basenames-tutorial/confirm-txn.png | Bin
.../edit-basename-profile.png | Bin
.../basenames-tutorial/final-basename.png | Bin
.../basenames-tutorial/frame-preview.png | Bin
.../basenames-tutorial/frames-selector.png | Bin
.../basenames-tutorial/preview-frame.png | Bin
.../profile-component-dropdown.png | Bin
.../basenames-tutorial/show-preview.png | Bin
.../images/basenames-tutorial/try-now.png | Bin
.../images/build-with-nouns/auction.png | Bin
.../images/build-with-nouns/create-dao.png | Bin
.../build-with-thirdweb/car-color-nft.gif | Bin
.../build-with-thirdweb/deploy-contract.png | Bin
.../build-with-thirdweb/get-nft-colors.png | Bin
.../hex-to-linear-color.png | Bin
.../import-image-instance.png | Bin
.../images/build-with-thirdweb/mint-nft.png | Bin
.../open-thirdweb-manager.png | Bin
.../open-unreal-project.png | Bin
.../build-with-thirdweb/perform-nft-claim.png | Bin
.../build-with-thirdweb/play-button.png | Bin
.../images/build-with-thirdweb/scene-game.png | Bin
.../token-airdrop-dashboard.png | Bin
.../images/build-with-zora/cdp-pick-node.png | Bin
.../images/build-with-zora/dashboard.png | Bin
.../builder-anniversary-nft-preview.webp | Bin
.../add-project-information.png | Bin
.../alchemy-new-app.png | Bin
.../blockdaemon-create-key.png | Bin
.../connected.png | Bin
.../quicknode-select-chain.png | Bin
.../rainbowkit-modal.png | Bin
.../wallet-connect-create-button.png | Bin
.../base-confirm-transaction.png | Bin
.../compiler-debug-log.png | Bin
.../deployment-with-remix/editor-pane.png | Bin
.../remix-base-goerli-connected.png | Bin
.../deployment-with-remix/remix-home.png | Bin
.../deployment-with-remix/remix-terminal.png | Bin
.../deployment-with-remix/select-provider.png | Bin
.../verify-and-publish.png | Bin
.../configuration.png | Bin
.../create-template.png | Bin
.../debugger-button.png | Bin
.../devnet-project-slug.png | Bin
.../github-actions.png | Bin
.../modifying-source.png | Bin
.../deployment-with-tenderly/output.png | Bin
.../deployment-with-tenderly/overrides.png | Bin
.../result-of-expression.png | Bin
.../result-of-simulation.png | Bin
.../deployment-with-tenderly/setgreeting.png | Bin
.../deployment-with-tenderly/simulation.png | Bin
.../simulator-button.png | Bin
.../images/dynamic-nfts/NFT_level_1.png | Bin
.../images/dynamic-nfts/NFT_level_2.png | Bin
.../images/dynamic-nfts/NFT_level_3.png | Bin
.../images/dynamic-nfts/all-characters.png | Bin
.../images/dynamic-nfts/base-dynamic-nft.zip | Bin
.../images/dynamic-nfts/image-level-1.png | Bin
.../images/dynamic-nfts/image-level-2.png | Bin
.../images/dynamic-nfts/image-level-3.png | Bin
.../dynamic-nfts/mutable-references.png | Bin
.../images/dynamic-nfts/open-sea-mockup.jpg | Bin
.../images/dynamic-nfts/refresh-metadata.png | Bin
.../images/frames/100-lines-frame.png | Bin
.../images/frames/2024-a-base-odyssey.png | Bin
.../images/frames/first-frame.png | Bin
.../images/frames/gave-me-away.png | Bin
.../images/frames/install-action.png | Bin
.../images/frames/link-button-test.png | Bin
docs/{public => }/images/frames/real-nft.png | Bin
.../{public => }/images/frames/story-time.png | Bin
.../images/frames/updated-100-lines.png | Bin
.../images/frames/vercel-build.png | Bin
.../images/frames/vercel-import.png | Bin
.../images/frames/vercel-install.png | Bin
.../images/frames/vercel-projects.png | Bin
...t 2024-07-11 at 3.10.17\342\200\257PM.png" | Bin
...t 2024-07-11 at 8.05.25\342\200\257AM.png" | Bin
.../cdp-allowlist-contract.png | Bin
.../cdp-config.png | Bin
.../cdp-global-user-limits.png | Bin
.../gasless-transaction-on-base/cdp-home.png | Bin
.../cdp-paymaster.png | Bin
.../cdp-select-network.png | Bin
.../cdp-select-project.png | Bin
.../cdp-userops-10.png | Bin
.../hardhat-test-coverage/coverage-report.png | Bin
docs/images/hero.png | Bin 0 -> 870663 bytes
.../images/homepage/hero-background.png | Bin
.../add-injected-provider.png | Bin
.../learn/deployment-to-testnet/balance.png | Bin
.../base-confirm-transaction.png | Bin
.../compiler-debug-log.png | Bin
.../confirm-transaction.png | Bin
.../learn/deployment-to-testnet/connected.png | Bin
.../deployment-transaction.png | Bin
.../importance-of-testnets.png | Bin
.../remix-base-goerli-connected.png | Bin
.../deployment-to-testnet/select-provider.png | Bin
.../testnet-comparison.png | Bin
.../verify-and-publish.png | Bin
.../view-transaction.png | Bin
.../images/learn/erc-20/deployed-token.png | Bin
.../learn/erc-20/erc20-dev-perspective.png | Bin
.../learn/erc-20/erc20-user-perspective.png | Bin
.../learn/erc-20/evolution-eth-erc20.png | Bin
.../images/learn/erc-721/erc-721-standard.png | Bin
.../learn/erc-721/evolution-eth-erc721.png | Bin
.../error-triage/array-out-of-bounds.png | Bin
.../images/learn/error-triage/debugger.png | Bin
.../learn/error-triage/divide-by-zero.png | Bin
.../images/learn/error-triage/gas-limit.png | Bin
.../learn/error-triage/highlight-code.png | Bin
.../images/learn/error-triage/underflow.png | Bin
.../evm-architecture-execution.png | Bin
.../evm-execution-basic.png | Bin
.../evm-stack-memory.png | Bin
.../opcode-execution.png | Bin
.../images/learn/etherscan/bayc-query.png | Bin
.../images/learn/etherscan/bayc-read.png | Bin
.../images/learn/etherscan/bayc-verified.png | Bin
.../learn/etherscan/bayc-write-connected.png | Bin
.../images/learn/etherscan/bayc-write.png | Bin
.../images/learn/etherscan/bayc.png | Bin
.../images/learn/etherscan/blocks.png | Bin
.../etherscan/etherscan-user-interface.png | Bin
.../learn/hardhat-deploying/new-deploy.png | Bin
.../learn/hardhat-forking/hardhat-forking.png | Bin
.../autocomplete-unlockTime.png | Bin
.../hardhat-verify/hardhat-verify-success.png | Bin
.../learn/hardhat-verify/hardhat-verify.png | Bin
.../harhat-verify-create-key.png | Bin
.../images/learn/icons/coding-white.svg | 0
.../images/learn/icons/coding.svg | 0
.../images/learn/icons/quizzes-white.svg | 0
.../images/learn/icons/quizzes.svg | 0
.../images/learn/icons/reading-white.svg | 0
.../images/learn/icons/reading.svg | 0
.../images/learn/icons/stepbystep-white.svg | 0
.../images/learn/icons/stepbystep.svg | 0
.../images/learn/icons/video-white.svg | 0
.../{public => }/images/learn/icons/video.svg | 0
.../btc-eth-comparison.png | Bin
.../introduction-to-ethereum/gas-costs.png | Bin
.../web2-web3-development.png | Bin
.../web2-web3-limitations.png | Bin
.../learn/introduction-to-solidity/delete.png | Bin
.../deploy-button.png | Bin
.../introduction-to-solidity/editor-pane.png | Bin
.../key-value-store.png | Bin
.../remix-contract-buttons.png | Bin
.../remix-deploy-chevron.png | Bin
.../remix-deploy-log.png | Bin
.../introduction-to-solidity/remix-editor.png | Bin
.../introduction-to-solidity/remix-home.png | Bin
.../remix-retrieve.png | Bin
.../remix-settings.png | Bin
.../remix-terminal.png | Bin
.../remix-transaction-console.png | Bin
.../variable-order-inefficient.png | Bin
.../variable-order-optimized.png | Bin
.../variable-packing.png | Bin
.../learn/introduction-to-tokens/erc-1155.png | Bin
.../learn/introduction-to-tokens/erc-20.png | Bin
.../learn/introduction-to-tokens/erc-721.png | Bin
.../images/learn/minimal-tokens/balance.png | Bin
.../learn/minimal-tokens/split-balances.png | Bin
.../learn/minimal-tokens/transferred.png | Bin
.../images/learn/new-keyword/at-address.png | Bin
.../images/learn/new-keyword/deployed.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_01.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_02.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_03.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_04.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_05.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_06.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_07.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_08.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_09.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_10.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_11.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_12.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_13.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_14.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_15.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_16.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_17.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_18.png | Bin
.../learn/nft-pins}/Base_Camp_NFT_19.png | Bin
.../learn/nft-pins}/TestPin.png | Bin
.../issues-console-log.png | Bin
.../missing-data.png | Bin
.../learn/storage/deployment-with-params.png | Bin
.../images/learn/welcome/Base_Learn_Hero.png | Bin
.../images/minikit/example_embed.png | Bin
.../images/minikit/manifest-setup.png | Bin
.../images/minikit/minikit-cli.gif | Bin
.../mobile-wallet-protocol/diffie-hellman.png | Bin
.../mobile-wallet-protocol/handshake.png | Bin
.../mobile-wallet-protocol/overview.png | Bin
.../onchain-generative-nfts/architecture.png | Bin
.../onchain-generative-nfts/first_pass.png | Bin
.../images/onchain-generative-nfts/mockup.png | Bin
.../onchain-generative-nfts/progress.png | Bin
.../fund-funding-options.png | Bin
.../fund-onramp-config.png | Bin
.../fund-wallet-balance.png | Bin
.../pay-commerce-products.png | Bin
.../pay-copy-product-link.png | Bin
.../pay-create-product-details.png | Bin
.../pay-final-product.png | Bin
.../images/onchainkit/NFTCard.gif | Bin
.../images/onchainkit/NFTMintCard.gif | Bin
docs/{public => }/images/onchainkit/buy.gif | Bin
.../images/onchainkit/checkout.gif | Bin
.../images/onchainkit/commerce-1.png | Bin
.../images/onchainkit/commerce-2.png | Bin
.../images/onchainkit/commerce-3.png | Bin
.../images/onchainkit/commerce-4.png | Bin
.../images/onchainkit/copy-api-key-guide.png | Bin
.../images/onchainkit/copy-project-id.png | Bin
.../images/onchainkit/cursor-dir.gif | Bin
.../images/onchainkit/fetch-frame-part-II.png | Bin
.../images/onchainkit/fetch-frame.png | Bin
docs/{public => }/images/onchainkit/frame.png | Bin
.../images/onchainkit/fund-card.gif | Bin
.../getting-started-create-env-file.png | Bin
.../onchainkit/onchain-app-template-1.png | Bin
.../images/onchainkit/onchain-figma.png | Bin
...chainkit-components-paymaster-endpoint.png | Bin
...hainkit-components-transaction-anatomy.png | Bin
.../onchainkit-figma-design-components.png | Bin
.../onchainkit-figma-design-how-to-use.png | Bin
.../onchainkit/onchainkit-figma-design.png | Bin
.../images/onchainkit/onchainkit-identity.png | Bin
.../onchainkit-lifecycle-status-vibes.png | Bin
.../images/onchainkit/onchainkit-template.png | Bin
.../images/onchainkit/onchainkit-themes.gif | Bin
.../images/onchainkit/onchainkit-token.png | Bin
.../images/onchainkit/onchainkit-wallet-1.png | Bin
.../images/onchainkit/onchainkit-wallet-2.png | Bin
.../images/onchainkit/onramp-secure-init.png | Bin
.../images/onchainkit/pay-button.png | Bin
.../images/onchainkit/quickstart.png | Bin
.../onchainkit/use-onchain-app-template.png | Bin
.../images/onchainkit/wallet-island.gif | Bin
.../images/onchainkit/wallet-modal.gif | Bin
.../images/onchainkit/wallet-modal.png | Bin
.../images/onchainkit/warpcast-logo.png | Bin
.../debugger-of-not-valid-zoom.png | Bin
.../openframes-fc/debugger-of-not-valid.png | Bin
.../openframes-fc/debugger-of-valid.png | Bin
.../debugger-protocol-selector.png | Bin
.../openframes-fc/frame-custom-no-url.png | Bin
.../images/openframes-fc/frame-custom-url.png | Bin
.../images/paymaster/pb-paymaster-chainid.png | Bin
.../pb-paymaster-config-highlight.png | Bin
.../images/paymaster/pb-paymaster-config.png | Bin
.../pb-paymaster-policy-erc20-flow.png | Bin
.../paymaster/pb-paymaster-policy-erc20.png | Bin
.../pb-paymaster-tenderly-dev-debug.png | Bin
.../pb-paymaster-tenderly-entrypoint.png | Bin
.../images/paymaster/pb-sponsorship-scw.png | Bin
.../resend-email-campaigns/ock-dashboard.png | Bin
.../ock-use-template.png | Bin
.../resend-email-campaigns/resend-1.gif | Bin
.../resend-api-keys.png | Bin
.../resend-contact-added.png | Bin
.../resend-mailing-list-prompt.png | Bin
.../resend-user-subscribed.png | Bin
.../resend-email-campaigns/site-load.png | Bin
.../vercel-import-project.png | Bin
.../resend-email-campaigns/verel-login.png | Bin
.../wc-project-page.png | Bin
.../shopify-install-commerce.gif | Bin
docs/images/showcase/aerodrome.svg | 31 +
docs/images/showcase/blocklords.svg | 23 +
docs/images/showcase/cat-town.svg | 15 +
docs/images/showcase/heyelsa.svg | 29 +
docs/images/showcase/morpho.svg | 28 +
docs/images/showcase/opensea.svg | 29 +
.../images/smart-wallet/CDPSteps.png | Bin
.../smart-wallet/PaymasterAllowlist.png | Bin
.../images/smart-wallet/PaymasterCDP.png | Bin
.../images/smart-wallet/ReownSteps.png | Bin
.../images/smart-wallet/accountRecovery.png | Bin
.../smart-wallet/buttonPlacementExamples.png | Bin
.../smart-wallet/copyTxnSimClickZone.png | Bin
.../images/smart-wallet/create-a-passkey.png | Bin
.../smart-wallet/createWalletButtonBlack.png | Bin
.../smart-wallet/createWalletButtonBlue.png | Bin
.../smart-wallet/customized-rainbow.png | Bin
.../smart-wallet/customized-wallet-list.png | Bin
.../images/smart-wallet/examplePlacement.png | Bin
.../{public => }/images/smart-wallet/logo.svg | 0
.../images/smart-wallet/meme-vs-content.png | Bin
.../smart-wallet/onchainkit-default-eoa.png | Bin
.../smart-wallet/onchainkit-default-smart.png | Bin
.../images/smart-wallet/one-click-pay.png | Bin
.../smart-wallet/pendingOwnershipChange.png | Bin
.../smart-wallet/rainbow-smart-wallet.png | Bin
.../smart-wallet/rainbowkit-default.png | Bin
.../images/smart-wallet/random-color-nft.png | Bin
.../smart-wallet/recoveryKeyAddPasskey.png | Bin
.../smart-wallet/recoveryKeyCreated.png | Bin
.../smart-wallet/recoveryKeyScamWarning.png | Bin
.../images/smart-wallet/recoveryKeySignIn.png | Bin
.../images/smart-wallet/sponsored-by-base.png | Bin
.../images/smart-wallet/sub-account-demo.gif | Bin
.../images/smart-wallet/sub-account-popup.png | Bin
.../images/smart-wallet/submitRecoveryKey.png | Bin
.../smart-wallet/wagmi-template-normal.png | Bin
.../attestation-creation-flow.png | Bin
.../coinbase-verification-flow.png | Bin
.../verifications/developer-data-flow.png | Bin
.../verifications/onchain-attestation.png | Bin
.../images/verifications/rpc-endpoint.png | Bin
.../basescan-apikey-page-add.png | Bin
.../basescan-apikey-page.png | Bin
.../basescan-menu.png | Bin
.../cbw-show-private-key.png | Bin
.../cdp-node-full.png | Bin
.../verify-with-basescan-api/cdp-rpc-url.png | Bin
.../developer-settings-overview.gif | Bin
.../images/wallet-sdk/dynamic-coinbase.jpg | Bin
.../images/wallet-sdk/dynamic.jpg | Bin
.../images/wallet-sdk/plaid-link-demo.png | Bin
.../wallet-sdk/show-private-key (1).gif | Bin
.../images/wallet-sdk/show-private-key.gif | Bin
.../smart-wallet-create-passkey-2.png | Bin
.../smart-wallet-create-passkey.png | Bin
.../images/wallet-sdk/smart-wallet-entry.png | Bin
.../images/wallet-sdk/testnet-assets.png | Bin
.../images/wallet-sdk/testnets.png | Bin
.../images/wallet-sdk/wagmi_custom_modal.png | Bin
.../images/wallet-sdk/wallet-onboard.png | Bin
.../images/wallet-sdk/web3-onboard_modal.png | Bin
.../wallet-sdk/web3-react_custom_modal.png | Bin
.../images/wallet-sdk/web3modal_modal.png | Bin
docs/index.mdx | 117 +
docs/layout.tsx | 40 -
.../address-and-payable.mdx | 91 +
.../function-modifiers-vid.mdx | 9 +
.../advanced-functions/function-modifiers.mdx | 151 +
.../function-visibility-vid.mdx | 9 +
.../function-visibility.mdx | 130 +
.../learn/arrays/array-storage-layout-vid.mdx | 9 +
docs/learn/arrays/arrays-exercise.mdx | 93 +
docs/learn/arrays/arrays-in-solidity-vid.mdx | 9 +
docs/learn/arrays/arrays-in-solidity.mdx | 142 +
docs/learn/arrays/filtering-an-array-sbs.mdx | 230 +
docs/learn/arrays/fixed-size-arrays-vid.mdx | 10 +
.../arrays/writing-arrays-in-solidity-vid.mdx | 10 +
docs/learn/client-side-development.mdx | 3 +
.../basic-functions-exercise.mdx | 38 +
.../basic-types.mdx | 221 +
.../hello-world-step-by-step.mdx | 205 +
.../intro-to-contracts-vid.mdx | 9 +
.../control-structures-exercise.mdx | 57 +
.../control-structures/control-structures.mdx | 233 +
docs/learn/control-structures/loops-vid.mdx | 9 +
.../require-revert-error-vid.mdx | 9 +
.../standard-control-structures-vid.mdx | 10 +
docs/learn/cross-chain-development.mdx | 3 +
.../contract-verification-sbs.mdx | 68 +
.../deployment-to-base-sepolia-sbs.mdx | 108 +
.../deployment-to-testnet-exercise.mdx | 36 +
.../overview-of-test-networks-vid.mdx | 9 +
.../deployment-to-testnet/test-networks.mdx | 97 +
.../erc-20-token/analyzing-erc-20-vid.mdx | 10 +
docs/learn/erc-20-token/erc-20-exercise.mdx | 124 +
docs/learn/erc-20-token/erc-20-standard.mdx | 103 +
.../learn/erc-20-token/erc-20-testing-vid.mdx | 10 +
docs/learn/erc-20-token/erc-20-token-sbs.mdx | 141 +
.../erc-20-token/openzeppelin-erc-20-vid.mdx | 10 +
docs/learn/erc-721-token/erc-721-exercise.mdx | 87 +
.../erc-721-token/erc-721-on-opensea-vid.mdx | 10 +
docs/learn/erc-721-token/erc-721-sbs.mdx | 295 +
.../erc-721-token/erc-721-standard-video.mdx | 10 +
docs/learn/erc-721-token/erc-721-standard.mdx | 100 +
.../implementing-an-erc-721-vid.mdx | 10 +
.../openzeppelin-erc-721-vid.mdx | 10 +
.../error-triage-exercise-source.sol | 60 +
.../error-triage/error-triage-exercise.mdx | 97 +
docs/learn/error-triage/error-triage-vid.mdx | 9 +
docs/learn/error-triage/error-triage.mdx | 449 +
docs/learn/ethereum-applications.mdx | 193 +
docs/learn/ethereum-dev-overview.mdx | 9 +
docs/learn/events/hardhat-events-sbs.mdx | 285 +
docs/learn/evm-diagram.mdx | 109 +
docs/learn/exercise-contracts.mdx | 26 +
.../foundry/deploy-with-foundry.mdx | 0
.../generate-random-numbers-contracts.md | 0
.../learn/foundry/introduction-to-foundry.mdx | 5 +
docs/learn/foundry/setup-with-base.mdx | 148 +
.../learn/foundry/testing-smart-contracts.mdx | 215 +
docs/learn/foundry/testing.mdx | 5 +
.../foundry/verify-contract-with-basescan.md | 0
docs/learn/gas-use-in-eth-transactions.mdx | 117 +
docs/learn/guide-to-base.mdx | 4 +
.../learn/hardhat/analyzing-test-coverage.mdx | 238 +
.../hardhat}/contract-abi-and-testing-vid.mdx | 2 +-
docs/learn/hardhat/contract-abi-testing.mdx | 5 +
docs/learn/hardhat/creating-project.mdx | 5 +
.../hardhat/debugging-smart-contracts.mdx | 407 +
docs/learn/hardhat/deploy-with-hardhat.mdx | 367 +
docs/learn/hardhat/deployment-guide.mdx | 4 +
.../hardhat}/deployment-vid.mdx | 2 +-
docs/learn/hardhat/deployment.mdx | 4 +
docs/learn/hardhat/etherscan-guide.mdx | 4 +
docs/learn/hardhat/etherscan-video.mdx | 4 +
docs/learn/hardhat/fork-guide.mdx | 4 +
docs/learn/hardhat/fork-video.mdx | 4 +
.../hardhat}/hardhat-deploy-sbs.mdx | 0
docs/learn/hardhat/hardhat-forking.mdx | 179 +
docs/learn/hardhat/hardhat-testing-sbs.mdx | 340 +
docs/learn/hardhat/hardhat-verify-sbs.mdx | 111 +
.../hardhat}/hardhat-verify-vid.mdx | 2 +-
docs/learn/hardhat/installing-deploy.mdx | 4 +
.../installing-hardhat-deploy-vid.mdx | 2 +-
.../hardhat}/mainnet-forking-vid.mdx | 2 +-
docs/learn/hardhat/network-configuration.mdx | 4 +
docs/learn/hardhat/optimizing-gas-usage.md | 423 +
docs/learn/hardhat/overview.mdx | 74 +
docs/learn/hardhat/reducing-contract-size.md | 502 +
.../hardhat}/setup-deploy-script-vid.mdx | 2 +-
docs/learn/hardhat/setup-deploy-script.mdx | 4 +
docs/learn/hardhat/setup.mdx | 5 +
.../test-network-configuration-vid.mdx | 2 +-
docs/learn/hardhat/testing-deployment.mdx | 4 +
docs/learn/hardhat/testing-guide.mdx | 3 +
.../hardhat}/testing-our-deployment-vid.mdx | 2 +-
.../hardhat}/testing-overview-vid.mdx | 2 +-
docs/learn/hardhat/testing.mdx | 5 +
docs/learn/hardhat/verify-guide.mdx | 4 +
docs/learn/hardhat/verify-video.mdx | 4 +
.../hardhat}/writing-tests-vid.mdx | 2 +-
docs/learn/hardhat/writing-tests.mdx | 5 +
docs/learn/imports/imports-exercise.mdx | 91 +
docs/learn/imports/imports-sbs.mdx | 98 +
docs/learn/imports/imports-vid.mdx | 10 +
.../inheritance/abstract-contracts-sbs.mdx | 77 +
.../inheritance/abstract-contracts-vid.mdx | 9 +
.../inheritance/inheritance-exercise.mdx | 123 +
docs/learn/inheritance/inheritance-sbs.mdx | 183 +
docs/learn/inheritance/inheritance-vid.mdx | 10 +
.../inheritance/multiple-inheritance-vid.mdx | 10 +
.../inheritance/multiple-inheritance.mdx | 267 +
.../calling-another-contract-vid.mdx | 11 +
.../contract-to-contract-interaction.mdx | 266 +
.../interfaces/intro-to-interfaces-vid.mdx | 11 +
.../interfaces/testing-the-interface-vid.mdx | 11 +
.../intro-to-tokens/intro-to-tokens-vid.mdx | 10 +
.../misconceptions-about-tokens-vid.mdx | 9 +
.../learn/intro-to-tokens/tokens-overview.mdx | 100 +
docs/learn/introduction-to-ethereum.mdx | 9 +
.../anatomy-of-a-smart-contract-vid.mdx | 9 +
.../deployment-in-remix-vid.mdx | 9 +
.../deployment-in-remix.mdx | 110 +
.../introduction-to-remix-vid.mdx | 9 +
.../introduction-to-remix.mdx | 93 +
.../introduction-to-solidity-overview.mdx | 77 +
.../introduction-to-solidity-vid.mdx | 10 +
.../solidity-overview.mdx | 168 +
.../mappings/how-mappings-are-stored-vid.mdx | 9 +
docs/learn/mappings/mappings-exercise.mdx | 74 +
docs/learn/mappings/mappings-sbs.mdx | 212 +
docs/learn/mappings/mappings-vid.mdx | 10 +
docs/learn/mappings/using-msg-sender-vid.mdx | 9 +
.../creating-a-minimal-token-vid.mdx | 10 +
.../minimal-tokens/minimal-token-sbs.mdx | 174 +
.../minimal-tokens-exercise.mdx | 72 +
.../transferring-a-minimal-token-vid.mdx | 10 +
.../creating-a-new-contract-vid.mdx | 10 +
.../new-keyword/new-keyword-exercise.mdx | 92 +
docs/learn/new-keyword/new-keyword-sbs.mdx | 116 +
.../account-abstraction.mdx | 3 +
...unt-abstraction-on-base-using-biconomy.mdx | 0
...raction-on-base-using-particle-network.mdx | 0
...ase-using-privy-and-the-base-paymaster.mdx | 0
.../gasless-transactions-with-paymaster.mdx | 0
.../introduction-to-providers.mdx | 0
.../client-side-development/viem.mdx | 116 +
.../client-side-development/web3.mdx | 2 +-
.../bridge-tokens-with-layerzero.mdx | 646 +
...essages-and-tokens-from-base-chainlink.mdx | 3 +-
.../deploy-with-fleek.mdx | 0
...-real-time-asset-data-pyth-price-feeds.mdx | 0
.../access-real-world-data-chainlink.mdx | 0
.../build-a-smart-wallet-funding-app.mdx | 0
.../onchain-concepts/building-onchain-ai.mdx | 14 +
.../building-onchain-frontend-development.mdx | 34 +
.../onchain-concepts/building-onchain-gas.mdx | 22 +
.../building-onchain-identity.mdx | 40 +
.../building-onchain-nodes.mdx | 74 +
.../building-onchain-onramps.mdx | 22 +
.../building-onchain-social-networks.mdx | 52 +
.../building-onchain-wallets.mdx | 46 +
.../continue-building-onchain.mdx | 14 +
docs/learn/onchain-concepts/core-concepts.mdx | 21 +
.../onchain-concepts/development-flow.mdx | 90 +
.../understanding-the-onchain-tech-stack.mdx | 73 +
docs/learn/solidity/anatomy.mdx | 5 +
docs/learn/solidity/basic-types.mdx | 5 +
docs/learn/solidity/deployment-in-remix.mdx | 5 +
docs/learn/solidity/exercise-basics.mdx | 5 +
docs/learn/solidity/hello-world.mdx | 5 +
.../solidity/introduction-to-contracts.mdx | 5 +
docs/learn/solidity/introduction-to-remix.mdx | 5 +
docs/learn/solidity/introduction.mdx | 5 +
docs/learn/solidity/overview.mdx | 5 +
docs/learn/solidity/remix-guide.mdx | 5 +
docs/learn/solidity/step-by-step.mdx | 5 +
docs/learn/solidity/video-tutorial.mdx | 5 +
.../learn/storage/how-storage-works-video.mdx | 9 +
docs/learn/storage/how-storage-works.mdx | 236 +
docs/learn/storage/simple-storage-sbs.mdx | 222 +
docs/learn/storage/simple-storage-video.mdx | 9 +
docs/learn/storage/storage-exercise.mdx | 118 +
docs/learn/structs/structs-exercise.mdx | 81 +
docs/learn/structs/structs-sbs.mdx | 325 +
docs/learn/structs/structs-vid.mdx | 9 +
docs/learn/welcome.mdx | 26 +
docs/{public => }/llms-full.txt | 53 +-
docs/logo/favicon.svg | 3 +
docs/logo/logo_dark.svg | 4 +
docs/logo/logo_light.svg | 4 +
.../api/build-deposit-to-morpho-tx.mdx | 27 +
.../onchainkit/api/build-mint-transaction.mdx | 50 +
.../onchainkit/api/build-swap-transaction.mdx | 131 +
.../api/build-withdraw-from-morpho-tx.mdx | 27 +
docs/onchainkit/api/get-mint-details.mdx | 64 +
docs/onchainkit/api/get-portfolios.mdx | 62 +
docs/onchainkit/api/get-swap-quote.mdx | 92 +
docs/onchainkit/api/get-token-details.mdx | 53 +
docs/onchainkit/api/get-tokens.mdx | 108 +
docs/onchainkit/api/types.mdx | 158 +
docs/onchainkit/appchain/bridge.mdx | 393 +
docs/onchainkit/appchain/types.mdx | 199 +
docs/onchainkit/buy/buy.mdx | 116 +
docs/onchainkit/buy/types.mdx | 31 +
docs/onchainkit/checkout/checkout.mdx | 491 +
docs/onchainkit/checkout/types.mdx | 73 +
.../onchainkit/config/is-base.mdx | 11 +-
.../onchainkit/config/is-ethereum.mdx | 11 +-
.../onchainkit/config/onchainkit-provider.mdx | 149 +
.../config/supplemental-providers.mdx | 86 +
docs/onchainkit/config/types.mdx | 73 +
.../create-a-basename-profile-component.mdx | 304 +
docs/onchainkit/earn/earn.mdx | 263 +
docs/onchainkit/earn/types.mdx | 300 +
docs/onchainkit/fund/fetch-onramp-config.mdx | 58 +
docs/onchainkit/fund/fetch-onramp-options.mdx | 78 +
docs/onchainkit/fund/fetch-onramp-quote.mdx | 112 +
.../fund/fetch-onramp-transaction-status.mdx | 66 +
docs/onchainkit/fund/fund-button.mdx | 249 +
docs/onchainkit/fund/fund-card.mdx | 252 +
docs/onchainkit/fund/get-onramp-buy-url.mdx | 42 +
.../fund/setup-onramp-event-listeners.mdx | 60 +
docs/onchainkit/fund/types.mdx | 376 +
docs/onchainkit/getting-started.mdx | 58 +
docs/onchainkit/guides/ai-prompting-guide.mdx | 258 +
docs/onchainkit/guides/build-onchain-apps.mdx | 105 +
docs/onchainkit/guides/contribution.mdx | 142 +
docs/onchainkit/guides/lifecycle-status.mdx | 170 +
docs/onchainkit/guides/reporting-bug.mdx | 28 +
docs/onchainkit/guides/tailwind.mdx | 99 +
docs/onchainkit/guides/telemetry.mdx | 79 +
docs/onchainkit/guides/themes.mdx | 202 +
docs/onchainkit/guides/troubleshooting.mdx | 141 +
.../guides/use-basename-in-onchain-app.mdx | 96 +
.../guides/using-ai-powered-ides.mdx | 29 +
.../hooks/use-build-deposit-to-morpho-tx.mdx | 32 +
.../use-build-withdraw-from-morpho-tx.mdx | 33 +
docs/onchainkit/hooks/use-earn-context.mdx | 35 +
docs/onchainkit/hooks/use-mint-details.mdx | 85 +
docs/onchainkit/hooks/use-morpho-vault.mdx | 32 +
docs/onchainkit/hooks/use-token-details.mdx | 75 +
docs/onchainkit/identity/address.mdx | 64 +
docs/onchainkit/identity/avatar.mdx | 159 +
docs/onchainkit/identity/badge.mdx | 179 +
docs/onchainkit/identity/get-address.mdx | 45 +
docs/onchainkit/identity/get-attestations.mdx | 86 +
docs/onchainkit/identity/get-avatar.mdx | 51 +
docs/onchainkit/identity/get-avatars.mdx | 78 +
docs/onchainkit/identity/get-name.mdx | 67 +
docs/onchainkit/identity/get-names.mdx | 77 +
docs/onchainkit/identity/identity-card.mdx | 181 +
docs/onchainkit/identity/identity.mdx | 219 +
docs/onchainkit/identity/name.mdx | 108 +
docs/onchainkit/identity/socials.mdx | 165 +
docs/onchainkit/identity/types.mdx | 252 +
docs/onchainkit/identity/use-address.mdx | 30 +
docs/onchainkit/identity/use-avatar.mdx | 31 +
docs/onchainkit/identity/use-avatars.mdx | 68 +
docs/onchainkit/identity/use-name.mdx | 56 +
docs/onchainkit/identity/use-names.mdx | 68 +
docs/onchainkit/installation.mdx | 12 +
docs/onchainkit/installation/astro.mdx | 201 +
docs/onchainkit/installation/nextjs.mdx | 178 +
docs/onchainkit/installation/remix.mdx | 199 +
docs/onchainkit/installation/vite.mdx | 161 +
docs/onchainkit/mint/nft-card.mdx | 311 +
docs/onchainkit/mint/nft-mint-card.mdx | 326 +
docs/onchainkit/mint/types.mdx | 142 +
docs/onchainkit/paymaster/erc20-paymaster.mdx | 271 +
docs/onchainkit/paymaster/errors.mdx | 94 +
.../gasless-transactions-with-paymaster.mdx | 679 +
.../paymaster/how-to-contribute.mdx | 0
.../onchainkit/paymaster/quickstart-guide.mdx | 115 +
.../paymaster/quickstart-headless.mdx | 195 +
docs/onchainkit/paymaster/security.mdx | 24 +
docs/onchainkit/paymaster/troubleshooting.mdx | 106 +
docs/onchainkit/paymaster/welcome.mdx | 10 +
docs/onchainkit/restricted.mdx | 16 +
docs/onchainkit/signature/signature.mdx | 317 +
docs/onchainkit/signature/types.mdx | 166 +
docs/onchainkit/swap/swap-settings.mdx | 386 +
docs/onchainkit/swap/swap.mdx | 702 +
docs/onchainkit/swap/types.mdx | 238 +
.../templates/onchain-commerce-app.mdx | 4 +
docs/onchainkit/templates/onchain-nft-app.mdx | 4 +
.../templates/onchain-social-profile.mdx | 4 +
docs/onchainkit/token/format-amount.mdx | 30 +
docs/onchainkit/token/token-chip.mdx | 48 +
docs/onchainkit/token/token-image.mdx | 148 +
docs/onchainkit/token/token-row.mdx | 186 +
docs/onchainkit/token/token-search.mdx | 55 +
.../token/token-select-dropdown.mdx | 103 +
docs/onchainkit/token/types.mdx | 109 +
docs/onchainkit/transaction/transaction.mdx | 394 +
docs/onchainkit/transaction/types.mdx | 204 +
.../use-coinbase-smart-wallet-and-eoas.mdx | 215 +
.../wallet/is-valid-aa-entrypoint.mdx | 35 +
.../is-wallet-a-coinbase-smart-wallet.mdx | 44 +
docs/onchainkit/wallet/types.mdx | 180 +
.../wallet/wallet-dropdown-basename.mdx | 114 +
.../wallet/wallet-dropdown-disconnect.mdx | 138 +
.../wallet/wallet-dropdown-fund-link.mdx | 226 +
.../wallet/wallet-dropdown-link.mdx | 217 +
docs/onchainkit/wallet/wallet-island.mdx | 271 +
docs/onchainkit/wallet/wallet-modal.mdx | 152 +
docs/onchainkit/wallet/wallet.mdx | 377 +
docs/openapi/onchainkit.yaml | 1047 +
.../onchainkit/guides/build-onchain-apps.mdx | 103 -
.../onchainkit/guides/tailwind.mdx | 106 -
.../onchainkit/installation/astro.mdx | 213 -
.../onchainkit/installation/nextjs.mdx | 183 -
.../onchainkit/installation/remix.mdx | 203 -
.../onchainkit/installation/vite.mdx | 166 -
.../onchainkit/transaction/transaction.mdx | 401 -
.../decentralizing-base-with-optimism.mdx | 2 -
docs/pages/chain/security.mdx | 2 -
docs/pages/feedback.mdx | 1 -
.../guides/batch-transactions.mdx | 179 -
.../smart-wallet/guides/paymasters.mdx | 267 -
.../identity/smart-wallet/guides/siwe.mdx | 210 -
.../smart-wallet/guides/spend-permissions.mdx | 621 -
.../existing-welcome-page-features.mdx | 2 -
...bile-dapp-integration-via-deep-linking.mdx | 2 -
.../identity/wallet-sdk/smart-wallet.mdx | 3 -
.../wallet-sdk/supported-environments.mdx | 2 -
.../identity/wallet-sdk/ux-guidelines.mdx | 3 -
.../identity/wallet-sdk/wallet-mobile-sdk.mdx | 2 -
.../wallet-sdk-existing-section.mdx | 2 -
.../wallet-sdk/wallet-sdk-mobile-sdk.mdx | 2 -
docs/pages/identity/wallet-sdk/xmtp.mdx | 2 -
docs/pages/quickstart.mdx | 252 -
.../use-cases/accept-crypto-payments.mdx | 237 -
.../ai-instructions/langchain-local.mdx | 67 -
.../ai-instructions/langchain-replit.mdx | 31 -
docs/public/builderkits/minikit/llms.txt | 677 -
docs/public/builderkits/onchainkit/llms.txt | 12499 -----------
docs/public/favicon.ico | Bin 15406 -> 0 bytes
docs/public/fonts/CoinbaseSans-Medium.woff2 | Bin 43756 -> 0 bytes
docs/public/fonts/CoinbaseSans-Regular.woff | Bin 70536 -> 0 bytes
.../public/fonts/Coinbase_Mono-Bold-web.woff2 | Bin 37872 -> 0 bytes
.../fonts/Coinbase_Mono-Extra_Light-web.woff2 | Bin 34452 -> 0 bytes
.../fonts/Coinbase_Mono-Light-web.woff2 | Bin 35148 -> 0 bytes
.../fonts/Coinbase_Mono-Medium-web.woff2 | Bin 37592 -> 0 bytes
.../fonts/Coinbase_Mono-Regular-web.woff2 | Bin 35268 -> 0 bytes
.../fonts/Coinbase_Sans-Bold-web-1.32.woff2 | Bin 38440 -> 0 bytes
.../Coinbase_Sans-Bold_Italic-web-1.32.woff2 | Bin 40144 -> 0 bytes
.../Coinbase_Sans-Extra_Light-web-1.32.woff2 | Bin 36968 -> 0 bytes
...ase_Sans-Extra_Light_Italic-web-1.32.woff2 | Bin 38420 -> 0 bytes
.../fonts/Coinbase_Sans-Light-web-1.32.woff2 | Bin 40956 -> 0 bytes
.../Coinbase_Sans-Light_Italic-web-1.32.woff2 | Bin 42616 -> 0 bytes
...Coinbase_Sans-Medium_Italic-web-1.32.woff2 | Bin 41936 -> 0 bytes
...oinbase_Sans-Regular_Italic-web-1.32.woff2 | Bin 43000 -> 0 bytes
docs/public/logo.svg | 4 -
docs/public/placeholder.svg | 1 -
docs/public/serve.json | 174 -
docs/showcase.mdx | 68 +
.../concepts/base-gasless-campaign.mdx | 13 +
.../concepts/features/built-in/MagicSpend.mdx | 24 +
.../concepts/features/built-in/networks.mdx | 26 +
.../concepts/features/built-in/passkeys.mdx | 26 +
.../features/built-in/recovery-keys.mdx | 20 +
.../features/built-in/single-sign-on.mdx | 12 +
.../features/optional/batch-operations.mdx | 11 +
.../features/optional/custom-gas-tokens.mdx | 12 +
.../optional/gas-free-transactions.mdx | 11 +
.../features/optional/spend-limits.mdx | 68 +
.../features/optional/sub-accounts.mdx | 36 +
.../concepts/usage-details/gas-usage.mdx | 21 +
.../concepts/usage-details/popups.mdx | 37 +
.../usage-details/signature-verification.mdx | 44 +
.../concepts/usage-details/simulations.mdx | 16 +
.../usage-details/unsupported-calls.mdx | 28 +
.../usage-details/wallet-library-support.mdx | 16 +
.../concepts/what-is-smart-wallet.mdx | 19 +
.../contribute-to-smart-wallet-docs.mdx | 177 +
.../contribute/security-and-bug-bounty.mdx | 18 +
.../smart-wallet/examples/coin-a-joke-app.mdx | 213 +
.../guides/batch-transactions.mdx | 183 +
.../components/create-wallet-button.mdx | 537 +
docs/smart-wallet/guides/erc20-paymasters.mdx | 188 +
docs/smart-wallet/guides/magic-spend.mdx | 36 +
docs/smart-wallet/guides/paymasters.mdx | 266 +
.../guides/signature-verification.mdx | 90 +
.../guides/signing-and-verifying-messages.mdx | 349 +
docs/smart-wallet/guides/siwe.mdx | 202 +
docs/smart-wallet/guides/spend-limits.mdx | 619 +
docs/smart-wallet/guides/sub-accounts.mdx | 49 +
...add-sub-accounts-to-onchainkit-minikit.mdx | 250 +
.../guides/sub-accounts/index.mdx | 63 +
.../guides/sub-accounts/setup.mdx | 223 +
.../sub-accounts/sub-accounts-with-privy.mdx | 142 +
.../sub-accounts/using-sub-accounts.mdx | 278 +
.../guides/tips/inspect-txn-simulation.mdx | 16 +
docs/smart-wallet/guides/tips/popup-tips.mdx | 37 +
.../identity => }/smart-wallet/llms.txt | 6 +-
docs/smart-wallet/quickstart.mdx | 50 +
.../ai-tools-available-for-devs.mdx | 117 +
.../quickstart/nextjs-project.mdx | 210 +
docs/smart-wallet/quickstart/quick-demo.mdx | 117 +
.../quickstart/react-native-project.mdx | 206 +
docs/smart-wallet/technical-reference/sdk.mdx | 117 +
.../sdk/CoinbaseWalletProvider/Overview.mdx | 0
.../CoinbaseWalletProvider/eth_accounts.mdx | 60 +
.../eth_blockNumber.mdx | 51 +
.../CoinbaseWalletProvider/eth_chainId.mdx | 59 +
.../CoinbaseWalletProvider/eth_coinbase.mdx | 47 +
.../eth_estimateGas.mdx | 88 +
.../CoinbaseWalletProvider/eth_feeHistory.mdx | 106 +
.../CoinbaseWalletProvider/eth_gasPrice.mdx | 51 +
.../CoinbaseWalletProvider/eth_getBalance.mdx | 58 +
.../eth_getBlockByHash.mdx | 179 +
.../eth_getBlockByNumber.mdx | 180 +
.../eth_getBlockTransactionCountByHash.mdx | 66 +
.../eth_getBlockTransactionCountByNumber.mdx | 75 +
.../CoinbaseWalletProvider/eth_getCode.mdx | 81 +
.../CoinbaseWalletProvider/eth_getLogs.mdx | 152 +
.../CoinbaseWalletProvider/eth_getProof.mdx | 129 +
.../eth_getStorageAt.mdx | 68 +
.../eth_getTransactionByBlockHashAndIndex.mdx | 146 +
...th_getTransactionByBlockNumberAndIndex.mdx | 158 +
.../eth_getTransactionByHash.mdx | 137 +
.../eth_getTransactionCount.mdx | 61 +
.../eth_getTransactionReceipt.mdx | 127 +
.../eth_getUncleCountByBlockHash.mdx | 66 +
.../eth_getUncleCountByBlockNumber.mdx | 77 +
.../eth_requestAccounts.mdx | 53 +
.../eth_sendRawTransaction.mdx | 56 +
.../eth_sendTransaction.mdx | 94 +
.../eth_signTypedData_v4.mdx | 130 +
.../CoinbaseWalletProvider/personal_sign.mdx | 73 +
.../request-overview.mdx | 0
.../CoinbaseWalletProvider/sdk-overview.mdx | 0
.../wallet_addEthereumChain.mdx | 105 +
.../wallet_addSubAccount.mdx | 104 +
.../CoinbaseWalletProvider/wallet_connect.mdx | 99 +
.../wallet_sendCalls.mdx | 133 +
.../wallet_switchEthereumChain.mdx | 72 +
.../wallet_watchAsset.mdx | 116 +
.../web3_clientVersion.mdx | 47 +
.../coinbase-fetchpermissions.mdx | 4 +-
.../spendpermissionmanager.mdx | 152 +
.../sub-account-reference.mdx | 177 +
docs/snippets/BrowseCard.mdx | 18 +
docs/snippets/BrowseUseCaseCard.mdx | 18 +
docs/snippets/Button/index.mdx | 67 +
docs/snippets/GithubRepoCard.mdx | 40 +
docs/snippets/HomeHeader.mdx | 8 +
docs/snippets/HomeWrapper.mdx | 7 +
docs/snippets/VideoPlayer.mdx | 29 +
.../ai-instructions/eliza.mdx | 3 -
.../ai-instructions/langchain-local.mdx | 60 +
.../ai-instructions/langchain-replit.mdx | 30 +
docs/snippets/ai-powered.mdx | 25 +
docs/snippets/base-org/Icon/Icon.mdx | 535 +
docs/snippets/danger.mdx | 37 +
docs/snippets/headerNoToc.mdx | 7 +
docs/snippets/installation-options.mdx | 47 +
.../learning-objectives.mdx | 2 -
docs/snippets/prompt-library.mdx | 217 +
docs/snippets/start-building.mdx | 12 +
docs/snippets/svg/agentKitSvg.mdx | 12 +
docs/snippets/svg/agentSvg.mdx | 21 +
docs/snippets/svg/depositSvg.mdx | 15 +
docs/snippets/svg/gaslessSvg.mdx | 21 +
docs/snippets/svg/miniKitSvg.mdx | 9 +
docs/snippets/svg/onboardingSvg.mdx | 9 +
docs/snippets/svg/onchainKitSvg.mdx | 7 +
docs/snippets/svg/paymasterSvg.mdx | 24 +
docs/snippets/svg/paymentsSvg.mdx | 11 +
docs/snippets/svg/smartWalletSvg.mdx | 6 +
docs/snippets/svg/socialSvg.mdx | 34 +
docs/snippets/svg/verificationsSvg.mdx | 14 +
docs/styles.css | 330 -
docs/utils/logEvent.ts | 147 -
.../build-with-minikit/debugging.mdx | 147 +
.../existing-app-integration.mdx | 472 +
.../build-with-minikit/overview.mdx | 361 +
.../build-with-minikit/quickstart.mdx | 396 +
docs/wallet-app/guides/thinking-social.mdx | 285 +
docs/wallet-app/introduction/beta-faq.mdx | 102 +
.../introduction/getting-started.mdx | 291 +
docs/wallet-app/introduction/mini-apps.mdx | 203 +
package.json | 46 -
postcss.config.js | 6 -
scripts/clean-frontmatter.ts | 73 -
scripts/remove-feedback.ts | 57 -
sidebar.ts | 1872 --
storybook/.gitignore | 43 +
storybook/.storybook/main.ts | 23 +
storybook/.storybook/preview-head.html | 19 +
storybook/.storybook/preview.ts | 103 +
storybook/README.md | 33 +
storybook/eslint.config.mjs | 16 +
storybook/next.config.ts | 7 +
storybook/package-lock.json | 18622 ++++++++++++++++
storybook/package.json | 52 +
storybook/postcss.config.mjs | 5 +
storybook/public/file.svg | 1 +
storybook/public/globe.svg | 1 +
storybook/public/next.svg | 1 +
storybook/public/vercel.svg | 1 +
storybook/public/window.svg | 1 +
storybook/src/app/favicon.ico | Bin 0 -> 25931 bytes
storybook/src/app/globals.css | 26 +
storybook/src/app/layout.tsx | 34 +
storybook/src/app/page.tsx | 3 +
storybook/stories/App.tsx | 85 +
storybook/stories/BuyWrapper.stories.tsx | 49 +
storybook/stories/CafeUnitTest.stories.tsx | 116 +
storybook/stories/Checkout.stories.tsx | 80 +
storybook/stories/Earn.stories.tsx | 39 +
storybook/stories/Fund/FundButton.stories.tsx | 116 +
storybook/stories/Fund/FundCard.stories.tsx | 92 +
.../stories/Fund/FundWrapper.stories.tsx | 57 +
storybook/stories/GithubRepoCard.stories.tsx | 36 +
.../stories/Identity/Identity.stories.tsx | 141 +
.../Identity/IdentityAddress.stories.tsx | 45 +
.../Identity/IdentityAvatar.stories.tsx | 88 +
.../Identity/IdentityBadge.stories.tsx | 86 +
.../stories/Identity/IdentityCard.stories.tsx | 78 +
.../stories/Identity/IdentityName.stories.tsx | 63 +
.../Identity/IdentitySocials.stories.tsx | 78 +
storybook/stories/NFT/NFTCard.stories.tsx | 46 +
storybook/stories/NFT/NFTMintCard.stories.tsx | 46 +
.../stories/SignatureComponents.stories.tsx | 29 +
storybook/stories/SubAccount.stories.tsx | 21 +
storybook/stories/Swap/Swap.stories.tsx | 203 +
.../stories/Swap/SwapSettings.stories.tsx | 247 +
storybook/stories/Swap/SwapWallet.stories.tsx | 66 +
.../stories/ThemeProvider.tsx | 28 +-
storybook/stories/Token/TokenChip.stories.tsx | 36 +
.../stories/Token/TokenImage.stories.tsx | 53 +
storybook/stories/Token/TokenRow.stories.tsx | 112 +
.../stories/Token/TokenSearch.stories.tsx | 30 +
.../Token/TokenSelectDropdown.stories.tsx | 60 +
storybook/stories/Transaction.stories.tsx | 87 +
storybook/stories/Wallet/Wallet.stories.tsx | 153 +
.../stories/Wallet/WalletBasename.stories.tsx | 87 +
.../Wallet/WalletDisconnect.stories.tsx | 107 +
.../stories/Wallet/WalletFundLink.stories.tsx | 155 +
.../stories/Wallet/WalletIsland.stories.tsx | 69 +
.../stories/Wallet/WalletLink.stories.tsx | 208 +
.../stories/Wallet/WalletModal.stories.tsx | 62 +
storybook/stories/components/App.tsx | 75 +
.../stories}/components/AppDemo.tsx | 7 +-
.../components/AppWithWalletModal.tsx | 8 +-
.../stories}/components/BrowseCard.tsx | 0
.../stories}/components/BrowseUseCaseCard.tsx | 0
.../stories}/components/Button/index.tsx | 32 +-
.../stories}/components/Button/types.ts | 0
.../stories}/components/BuyWrapper.tsx | 0
.../deployments/base-goerli/ArraysUT.json | 0
.../base-goerli/BasicMathUnitTest.json | 0
.../base-goerli/ControlStructuresUT.json | 0
.../deployments/base-goerli/ERC20UT.json | 0
.../deployments/base-goerli/ERC721UT.json | 0
.../base-goerli/ErrorTriageUT.json | 0
.../deployments/base-goerli/ImportsUT.json | 0
.../base-goerli/InheritanceUnitTest.json | 0
.../deployments/base-goerli/MappingsUT.json | 0
.../base-goerli/MinimalTokenUT.json | 0
.../assets/deployments/base-goerli/NewUT.json | 0
.../deployments/base-goerli/StorageUT.json | 0
.../deployments/base-goerli/StructsUT.json | 0
.../deployments/base-sepolia/ArraysUT.json | 0
.../base-sepolia/BasicMathUnitTest.json | 0
.../base-sepolia/ControlStructuresUT.json | 0
.../deployments/base-sepolia/ERC20UT.json | 0
.../deployments/base-sepolia/ERC721UT.json | 0
.../base-sepolia/ErrorTriageUT.json | 0
.../deployments/base-sepolia/ImportsUT.json | 0
.../base-sepolia/InheritanceUT.json | 0
.../deployments/base-sepolia/MappingsUT.json | 0
.../base-sepolia/MinimalTokenUT.json | 0
.../deployments/base-sepolia/NewUT.json | 0
.../deployments/base-sepolia/StorageUT.json | 0
.../deployments/base-sepolia/StructsUT.json | 0
.../assets/images}/Base_Camp_NFT_01.png | Bin
.../assets/images}/Base_Camp_NFT_02.png | Bin
.../assets/images}/Base_Camp_NFT_03.png | Bin
.../assets/images}/Base_Camp_NFT_04.png | Bin
.../assets/images}/Base_Camp_NFT_05.png | Bin
.../assets/images}/Base_Camp_NFT_06.png | Bin
.../assets/images}/Base_Camp_NFT_07.png | Bin
.../assets/images}/Base_Camp_NFT_08.png | Bin
.../assets/images}/Base_Camp_NFT_09.png | Bin
.../assets/images}/Base_Camp_NFT_10.png | Bin
.../assets/images}/Base_Camp_NFT_11.png | Bin
.../assets/images}/Base_Camp_NFT_12.png | Bin
.../assets/images}/Base_Camp_NFT_13.png | Bin
.../assets/images}/Base_Camp_NFT_14.png | Bin
.../assets/images}/Base_Camp_NFT_15.png | Bin
.../assets/images}/Base_Camp_NFT_16.png | Bin
.../assets/images}/Base_Camp_NFT_17.png | Bin
.../assets/images}/Base_Camp_NFT_18.png | Bin
.../assets/images}/Base_Camp_NFT_19.png | Bin
.../CafeUnitTest/assets/images}/TestPin.png | Bin
.../components/CafeUnitTest/index.jsx | 248 +-
.../CafeUnitTest/nft-exercise-data.js | 0
.../ClientAnalyticsScript.tsx | 0
.../ClientAnalyticsScript/initCCA.ts | 0
storybook/stories/components/ConnectUI.tsx | 14 +
.../CookieManager/CookieManagerProvider.tsx | 0
.../CookieManager/cookieManagerConfig.ts | 0
.../stories}/components/EarnComponents.tsx | 0
.../stories}/components/FundWrapper.tsx | 0
.../stories}/components/GithubRepoCard.tsx | 0
.../stories}/components/HomePage/Hero.tsx | 0
.../components/HomePage/ProductCard.tsx | 0
.../components/HomePage/ProductsSection.tsx | 0
.../components/HomePage/QuickLink.tsx | 0
.../components/HomePage/QuickStartSection.tsx | 0
.../components/HomePage/ResourcesSection.tsx | 0
.../components/InstallationOptions.tsx | 0
.../stories}/components/NFTComponents.tsx | 0
.../components/SignatureComponents.tsx | 2 +-
.../components/SmartWalletAITools.tsx | 0
.../SmartWalletQuickstartOptions.tsx | 0
.../stories}/components/StartBuilding.tsx | 0
.../stories}/components/SwapWrapper.tsx | 0
.../components/TokenSelectorContainer.tsx | 0
.../components/TransactionWrapper.tsx | 0
.../stories}/components/VideoPlayer.jsx | 0
.../stories}/components/WalletComponents.tsx | 0
.../components/base-org/Icon/Icon.tsx | 0
.../stories}/components/index.d.ts | 0
.../stories}/components/landing/BuyDemo.tsx | 0
.../components/landing/CheckoutDemo.tsx | 0
.../components/landing/ComponentPreview.tsx | 0
.../stories}/components/landing/FundDemo.tsx | 0
.../components/landing/IdentityCardDemo.tsx | 0
.../components/landing/LandingFooter.tsx | 0
.../components/landing/NavigationList.tsx | 0
.../components/landing/NftMintCardDemo.tsx | 0
.../stories}/components/landing/SwapDemo.tsx | 0
.../components/landing/TransactionDemo.tsx | 0
.../stories}/components/landing/Tweets.tsx | 0
.../components/landing/WalletDemo.tsx | 0
.../components/landing/getHighlightedCode.tsx | 0
.../components/smart-wallet/Illustration.tsx | 0
.../components/smart-wallet/SubAccount.tsx | 46 +-
.../stories}/components/svg/AgentKitSvgSW.tsx | 0
.../stories}/components/svg/CopySvg.tsx | 0
.../stories}/components/svg/LLMsTxtSvg.tsx | 0
.../stories}/components/svg/McpSvg.tsx | 0
.../stories}/components/svg/NextjsSvgSW.tsx | 0
.../stories}/components/svg/OnchainKit.svg | 0
.../components/svg/OnchainKitSvgSW.tsx | 0
.../components/svg/ReactNativeSvg.tsx | 0
.../stories}/components/svg/agentKitSvg.tsx | 0
.../stories}/components/svg/agentSvg.tsx | 0
.../stories}/components/svg/appchainsSvg.tsx | 0
.../stories}/components/svg/astroSvg.tsx | 0
.../stories}/components/svg/checkSvg.tsx | 0
.../stories}/components/svg/closeSvg.tsx | 0
.../components/svg/coinbasePaySvg.tsx | 0
.../stories}/components/svg/depositSvg.tsx | 0
.../stories}/components/svg/fundSvg.tsx | 0
.../stories}/components/svg/gaslessSvg.tsx | 0
.../stories}/components/svg/identitySvg.tsx | 0
.../stories}/components/svg/miniKitSvg.tsx | 0
.../stories}/components/svg/nextjsSvg.tsx | 0
.../stories}/components/svg/onboardingSvg.tsx | 0
.../stories}/components/svg/onchainKitSvg.tsx | 0
.../stories}/components/svg/paymasterSvg.tsx | 0
.../stories}/components/svg/paymentsSvg.tsx | 0
.../stories}/components/svg/remixSvg.tsx | 0
.../components/svg/smartWalletSvg.tsx | 0
.../stories}/components/svg/socialSvg.tsx | 0
.../stories}/components/svg/swapSvg.tsx | 0
.../stories}/components/svg/tokensSvg.tsx | 0
.../components/svg/transactionSvg.tsx | 0
.../components/svg/verificationsSvg.tsx | 0
.../stories}/components/svg/viteSvg.tsx | 0
.../walletDropdownLinkCustomBaseIconSvg.tsx | 0
.../stories}/components/svg/walletSvg.tsx | 0
storybook/tsconfig.json | 27 +
styles/globals.css | 3 -
tailwind.config.js | 34 -
tsconfig.json | 52 -
utils/check-image-refs.js | 65 -
utils/check-image-refs.ts | 70 -
utils/use-check-image-refs.js | 20 -
vite-env.d.ts | 1 -
vocs.config.tsx | 197 -
yarn.lock | 13001 -----------
1623 files changed, 87211 insertions(+), 35215 deletions(-)
create mode 100644 .cursor/rules/mintlify.mdc
create mode 100644 .github/workflows/chromatic.yml
delete mode 100644 .nvmrc
delete mode 100644 .yarnrc.yml
rename {docs/pages => _pages}/arbitration.mdx (100%)
rename {docs/pages => _pages}/base-services-hub.mdx (100%)
rename {docs/pages => _pages}/buildathons/2025-02-flash.mdx (65%)
rename {docs/pages => _pages}/builderkits/agentkit/index.mdx (100%)
rename {docs/pages => _pages}/builderkits/minikit/debugging.mdx (97%)
rename {docs/pages => _pages}/builderkits/minikit/overview.mdx (95%)
rename {docs/pages => _pages}/builderkits/minikit/quickstart.mdx (87%)
rename {docs/pages => _pages}/builderkits/minikit/thinking-social.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/build-deposit-to-morpho-tx.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/build-mint-transaction.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/build-swap-transaction.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/build-withdraw-from-morpho-tx.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/get-mint-details.mdx (96%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/get-portfolios.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/get-swap-quote.mdx (97%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/get-token-details.mdx (95%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/get-tokens.mdx (96%)
rename {docs/pages => _pages}/builderkits/onchainkit/api/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/appchain/bridge.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/appchain/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/buy/buy.mdx (97%)
rename {docs/pages => _pages}/builderkits/onchainkit/buy/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/checkout/checkout.mdx (86%)
rename {docs/pages => _pages}/builderkits/onchainkit/checkout/types.mdx (100%)
create mode 100644 _pages/builderkits/onchainkit/config/is-base.mdx
create mode 100644 _pages/builderkits/onchainkit/config/is-ethereum.mdx
rename {docs/pages => _pages}/builderkits/onchainkit/config/onchainkit-provider.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/config/supplemental-providers.mdx (96%)
rename {docs/pages => _pages}/builderkits/onchainkit/config/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/create-a-basename-profile-component.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/earn/earn.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/earn/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/fund/fetch-onramp-config.mdx (96%)
rename {docs/pages => _pages}/builderkits/onchainkit/fund/fetch-onramp-options.mdx (96%)
rename {docs/pages => _pages}/builderkits/onchainkit/fund/fetch-onramp-quote.mdx (97%)
rename {docs/pages => _pages}/builderkits/onchainkit/fund/fetch-onramp-transaction-status.mdx (96%)
rename {docs/pages => _pages}/builderkits/onchainkit/fund/fund-button.mdx (78%)
rename {docs/pages => _pages}/builderkits/onchainkit/fund/fund-card.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/fund/get-onramp-buy-url.mdx (95%)
rename {docs/pages => _pages}/builderkits/onchainkit/fund/setup-onramp-event-listeners.mdx (95%)
rename {docs/pages => _pages}/builderkits/onchainkit/fund/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/getting-started.mdx (89%)
rename {docs/pages => _pages}/builderkits/onchainkit/guides/ai-prompting-guide.mdx (99%)
create mode 100644 _pages/builderkits/onchainkit/guides/build-onchain-apps.mdx
rename {docs/pages => _pages}/builderkits/onchainkit/guides/contribution.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/guides/lifecycle-status.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/guides/reporting-bug.mdx (61%)
create mode 100644 _pages/builderkits/onchainkit/guides/tailwind.mdx
rename {docs/pages => _pages}/builderkits/onchainkit/guides/telemetry.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/guides/themes.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/guides/troubleshooting.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/guides/use-basename-in-onchain-app.mdx (95%)
rename {docs/pages => _pages}/builderkits/onchainkit/guides/using-ai-powered-ides.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/hooks/use-build-deposit-to-morpho-tx.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/hooks/use-build-withdraw-from-morpho-tx.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/hooks/use-earn-context.mdx (95%)
rename {docs/pages => _pages}/builderkits/onchainkit/hooks/use-mint-details.mdx (97%)
rename {docs/pages => _pages}/builderkits/onchainkit/hooks/use-morpho-vault.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/hooks/use-token-details.mdx (97%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/address.mdx (97%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/avatar.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/badge.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/get-address.mdx (92%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/get-attestations.mdx (97%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/get-avatar.mdx (93%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/get-avatars.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/get-name.mdx (93%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/get-names.mdx (93%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/identity-card.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/identity.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/name.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/socials.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/use-address.mdx (96%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/use-avatar.mdx (96%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/use-avatars.mdx (95%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/use-name.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/identity/use-names.mdx (95%)
rename {docs/pages => _pages}/builderkits/onchainkit/installation.mdx (74%)
create mode 100644 _pages/builderkits/onchainkit/installation/astro.mdx
create mode 100644 _pages/builderkits/onchainkit/installation/nextjs.mdx
create mode 100644 _pages/builderkits/onchainkit/installation/remix.mdx
create mode 100644 _pages/builderkits/onchainkit/installation/vite.mdx
rename {docs/pages => _pages}/builderkits/onchainkit/mint/nft-card.mdx (88%)
rename {docs/pages => _pages}/builderkits/onchainkit/mint/nft-mint-card.mdx (88%)
rename {docs/pages => _pages}/builderkits/onchainkit/mint/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/paymaster/erc20-paymaster.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/paymaster/errors.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/paymaster/gasless-transactions-with-paymaster.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/paymaster/how-to-contribute.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/paymaster/quickstart-guide.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/paymaster/quickstart-headless.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/paymaster/security.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/paymaster/troubleshooting.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/paymaster/welcome.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/restricted.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/signature/signature.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/signature/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/swap/swap-settings.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/swap/swap.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/swap/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/token/format-amount.mdx (89%)
rename {docs/pages => _pages}/builderkits/onchainkit/token/token-chip.mdx (97%)
rename {docs/pages => _pages}/builderkits/onchainkit/token/token-image.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/token/token-row.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/token/token-search.mdx (97%)
rename {docs/pages => _pages}/builderkits/onchainkit/token/token-select-dropdown.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/token/types.mdx (100%)
create mode 100644 _pages/builderkits/onchainkit/transaction/transaction.mdx
rename {docs/pages => _pages}/builderkits/onchainkit/transaction/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/use-coinbase-smart-wallet-and-eoas.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/is-valid-aa-entrypoint.mdx (91%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/is-wallet-a-coinbase-smart-wallet.mdx (94%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/types.mdx (100%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/wallet-dropdown-basename.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/wallet-dropdown-disconnect.mdx (98%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/wallet-dropdown-fund-link.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/wallet-dropdown-link.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/wallet-island.mdx (99%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/wallet-modal.mdx (61%)
rename {docs/pages => _pages}/builderkits/onchainkit/wallet/wallet.mdx (61%)
rename {docs/pages => _pages}/chain/account-abstraction.md (100%)
rename {docs/pages => _pages}/chain/account-abstraction.mdx (100%)
rename docs/pages/chain/app-blocklist.md => _pages/chain/app-blocklist.mdx (100%)
rename {docs/pages => _pages}/chain/base-contracts.mdx (100%)
rename {docs/pages => _pages}/chain/block-explorers.mdx (100%)
rename {docs/pages => _pages}/chain/bridge-an-l1-token-to-base.mdx (100%)
rename {docs/pages => _pages}/chain/bridges-mainnet.mdx (98%)
rename {docs/pages => _pages}/chain/builder-anniversary-nft.mdx (100%)
rename {docs/pages => _pages}/chain/contracts.mdx (99%)
rename {docs/pages => _pages}/chain/cross-chain.md (100%)
rename {docs/pages => _pages}/chain/cross-chain.mdx (100%)
rename {docs/pages => _pages}/chain/data-indexers.md (100%)
rename {docs/pages => _pages}/chain/data-indexers.mdx (100%)
create mode 100644 _pages/chain/decentralizing-base-with-optimism.mdx
rename {docs/pages => _pages}/chain/deploy-on-base-quickstart.mdx (98%)
rename {docs/pages => _pages}/chain/differences-between-ethereum-and-base.mdx (100%)
rename {docs/pages => _pages}/chain/fees.mdx (100%)
rename {docs/pages => _pages}/chain/flashblocks.mdx (100%)
rename {docs/pages => _pages}/chain/index.mdx (100%)
rename {docs/pages => _pages}/chain/network-faucets.mdx (95%)
rename {docs/pages => _pages}/chain/network-information.mdx (98%)
rename {docs/pages => _pages}/chain/node-providers.mdx (100%)
rename {docs/pages => _pages}/chain/onboarding.mdx (100%)
rename {docs/pages => _pages}/chain/onramps.mdx (100%)
rename {docs/pages => _pages}/chain/oracles.mdx (99%)
rename {docs/pages => _pages}/chain/registry-api.mdx (99%)
rename {docs/pages => _pages}/chain/registry-faq.mdx (100%)
rename docs/pages/chain/report.md => _pages/chain/report.mdx (100%)
rename {docs/pages => _pages}/chain/run-a-base-node.mdx (98%)
rename {docs/pages => _pages}/chain/security-council.mdx (100%)
create mode 100644 _pages/chain/security.mdx
rename docs/pages/chain/using-base.md => _pages/chain/using-base.mdx (100%)
rename docs/pages/chain/wallet.md => _pages/chain/wallet.mdx (99%)
rename docs/pages/chain/why-base.md => _pages/chain/why-base.mdx (98%)
create mode 100644 _pages/cookbook/IPFS/deploy-with-fleek.mdx
create mode 100644 _pages/cookbook/account-abstraction/account-abstraction-on-base-using-biconomy.mdx
create mode 100644 _pages/cookbook/account-abstraction/account-abstraction-on-base-using-particle-network.mdx
create mode 100644 _pages/cookbook/account-abstraction/account-abstraction-on-base-using-privy-and-the-base-paymaster.mdx
create mode 100644 _pages/cookbook/account-abstraction/gasless-transactions-with-paymaster.mdx
create mode 100644 _pages/cookbook/client-side-development/introduction-to-providers.mdx
rename {docs/pages => _pages}/cookbook/client-side-development/viem.mdx (98%)
create mode 100644 _pages/cookbook/client-side-development/web3.mdx
rename {docs/pages => _pages}/cookbook/cross-chain/bridge-tokens-with-layerzero.mdx (99%)
create mode 100644 _pages/cookbook/cross-chain/send-messages-and-tokens-from-base-chainlink.mdx
rename {docs/pages => _pages}/cookbook/nfts/complex-onchain-nfts.mdx (99%)
rename {docs/pages => _pages}/cookbook/nfts/dynamic-nfts.mdx (100%)
rename {docs/pages => _pages}/cookbook/nfts/signature-mint.mdx (99%)
rename {docs/pages => _pages}/cookbook/nfts/simple-onchain-nfts.mdx (99%)
rename {docs/pages => _pages}/cookbook/nfts/thirdweb-unreal-nft-items.mdx (99%)
create mode 100644 _pages/cookbook/smart-contract-development/foundry/deploy-with-foundry.mdx
create mode 100644 _pages/cookbook/smart-contract-development/foundry/generate-random-numbers-contracts.mdx
rename {docs/pages => _pages}/cookbook/smart-contract-development/foundry/setup-with-base.mdx (100%)
rename {docs/pages => _pages}/cookbook/smart-contract-development/foundry/testing-smart-contracts.mdx (100%)
create mode 100644 _pages/cookbook/smart-contract-development/foundry/verify-contract-with-basescan.mdx
rename {docs/pages => _pages}/cookbook/smart-contract-development/hardhat/analyzing-test-coverage.mdx (100%)
rename {docs/pages => _pages}/cookbook/smart-contract-development/hardhat/debugging-smart-contracts.mdx (100%)
rename docs/pages/cookbook/smart-contract-development/hardhat/deploy-with-hardhat.md => _pages/cookbook/smart-contract-development/hardhat/deploy-with-hardhat.mdx (99%)
rename docs/pages/cookbook/smart-contract-development/hardhat/optimizing-gas-usage.md => _pages/cookbook/smart-contract-development/hardhat/optimizing-gas-usage.mdx (100%)
rename docs/pages/cookbook/smart-contract-development/hardhat/reducing-contract-size.md => _pages/cookbook/smart-contract-development/hardhat/reducing-contract-size.mdx (100%)
rename {docs/pages => _pages}/cookbook/smart-contract-development/remix/deploy-with-remix.mdx (98%)
rename {docs/pages => _pages}/cookbook/smart-contract-development/tenderly/deploy-with-tenderly.mdx (99%)
rename {docs/pages => _pages}/cookbook/smart-contract-development/thirdweb/build-with-thirdweb.mdx (99%)
rename {docs/pages => _pages}/cookbook/smart-contract-development/thirdweb/deploy-with-thirdweb.mdx (99%)
rename {docs/pages => _pages}/cookbook/smart-contract-development/thirdweb/thirdweb-cli.mdx (97%)
rename {docs/pages => _pages}/cookbook/smart-contract-development/thirdweb/thirdweb-sdk.mdx (99%)
rename {docs/pages => _pages}/cookbook/token-gating/gate-irl-events-with-nouns.mdx (99%)
rename {docs/pages => _pages}/cookbook/use-case-guides/cast-actions.mdx (99%)
rename {docs/pages => _pages}/cookbook/use-case-guides/commerce/build-an-ecommerce-app.mdx (99%)
rename {docs/pages => _pages}/cookbook/use-case-guides/commerce/deploy-a-shopify-storefront.mdx (97%)
rename {docs/pages => _pages}/cookbook/use-case-guides/create-email-campaigns.mdx (99%)
rename {docs/pages => _pages}/cookbook/use-case-guides/creator/convert-farcaster-frame-to-open-frame.mdx (98%)
rename {docs/pages => _pages}/cookbook/use-case-guides/creator/nft-minting-with-zora.mdx (99%)
rename {docs/pages => _pages}/cookbook/use-case-guides/deploy-to-vercel.mdx (99%)
create mode 100644 _pages/cookbook/use-case-guides/finance/access-real-time-asset-data-pyth-price-feeds.mdx
create mode 100644 _pages/cookbook/use-case-guides/finance/access-real-world-data-chainlink.mdx
create mode 100644 _pages/cookbook/use-case-guides/finance/build-a-smart-wallet-funding-app.mdx
rename {docs/pages => _pages}/cookbook/use-case-guides/gating-and-redirects.mdx (99%)
rename {docs/pages => _pages}/cookbook/use-case-guides/hyperframes.mdx (99%)
rename {docs/pages => _pages}/cookbook/use-case-guides/nft-minting.mdx (99%)
rename {docs/pages => _pages}/cookbook/use-case-guides/no-code-minting.mdx (100%)
rename {docs/pages => _pages}/cookbook/use-case-guides/transactions.mdx (99%)
rename {docs/pages => _pages}/cookie-policy.mdx (100%)
rename {docs/pages => _pages}/docs.mdx (100%)
create mode 100644 _pages/feedback.mdx
rename {docs/pages => _pages}/identity/basenames/basenames-faq.mdx (99%)
rename {docs/pages => _pages}/identity/basenames/basenames-onchainkit-tutorial.mdx (98%)
rename {docs/pages => _pages}/identity/basenames/basenames-wagmi-tutorial.mdx (99%)
rename {docs/pages => _pages}/identity/index.mdx (100%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/batch.mdx (98%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/encryption.mdx (99%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/handshake.mdx (98%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/messages-example.mdx (100%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/messages-request.mdx (96%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/messages-response.mdx (97%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/messages.mdx (98%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/multi-chain.mdx (92%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/network.mdx (69%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/spec-overview.mdx (100%)
rename {docs/pages => _pages}/identity/mobile-wallet-protocol/verification.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/base-gasless-campaign.mdx (99%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/built-in/MagicSpend.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/built-in/networks.mdx (89%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/built-in/passkeys.mdx (91%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/built-in/recovery-keys.mdx (95%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/built-in/single-sign-on.mdx (94%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/optional/batch-operations.mdx (91%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/optional/custom-gas-tokens.mdx (93%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/optional/gas-free-transactions.mdx (92%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/optional/spend-permissions.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/features/optional/sub-accounts.mdx (95%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/usage-details/gas-usage.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/usage-details/popups.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/usage-details/self-calls.mdx (87%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/usage-details/signature-verification.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/usage-details/simulations.mdx (91%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/usage-details/wallet-library-support.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/concepts/what-is-smart-wallet.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/contribute/contribute-to-smart-wallet-docs.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/contribute/security-and-bug-bounty.mdx (93%)
rename {docs/pages => _pages}/identity/smart-wallet/examples/coin-a-joke-app.mdx (97%)
create mode 100644 _pages/identity/smart-wallet/guides/batch-transactions.mdx
rename {docs/pages => _pages}/identity/smart-wallet/guides/components/create-wallet-button.mdx (99%)
rename {docs/pages => _pages}/identity/smart-wallet/guides/erc20-paymasters.mdx (99%)
rename {docs/pages => _pages}/identity/smart-wallet/guides/magic-spend.mdx (97%)
create mode 100644 _pages/identity/smart-wallet/guides/paymasters.mdx
rename {docs/pages => _pages}/identity/smart-wallet/guides/signature-verification.mdx (99%)
rename {docs/pages => _pages}/identity/smart-wallet/guides/signing-and-verifying-messages.mdx (98%)
create mode 100644 _pages/identity/smart-wallet/guides/siwe.mdx
create mode 100644 _pages/identity/smart-wallet/guides/spend-permissions.mdx
rename {docs/pages => _pages}/identity/smart-wallet/guides/sub-accounts/index.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/guides/sub-accounts/setup.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/guides/sub-accounts/using-sub-accounts.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/guides/tips/inspect-txn-simulation.mdx (90%)
rename {docs/pages => _pages}/identity/smart-wallet/guides/tips/popup-tips.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/quickstart/ai-tools-available-for-devs.mdx (95%)
rename {docs/pages => _pages}/identity/smart-wallet/quickstart/index.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/quickstart/nextjs-project.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/quickstart/quick-demo.mdx (95%)
rename {docs/pages => _pages}/identity/smart-wallet/quickstart/react-native-project.mdx (94%)
create mode 100644 _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/Overview.mdx
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_accounts.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_blockNumber.mdx (88%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_chainId.mdx (94%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_coinbase.mdx (89%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_estimateGas.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_feeHistory.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_gasPrice.mdx (89%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBalance.mdx (94%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByHash.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByNumber.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByHash.mdx (92%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByNumber.mdx (92%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getCode.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getLogs.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getProof.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getStorageAt.mdx (95%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockHashAndIndex.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockNumberAndIndex.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByHash.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionCount.mdx (93%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionReceipt.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockHash.mdx (92%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockNumber.mdx (93%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_requestAccounts.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendRawTransaction.mdx (94%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendTransaction.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_signTypedData_v4.mdx (99%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/personal_sign.mdx (95%)
create mode 100644 _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/request-overview.mdx
create mode 100644 _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/sdk-overview.mdx
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addEthereumChain.mdx (97%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addSubAccount.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_connect.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_switchEthereumChain.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_watchAsset.mdx (98%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/web3_clientVersion.mdx (90%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/index.mdx (96%)
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/sdk/sub-account-reference.mdx (98%)
create mode 100644 _pages/identity/smart-wallet/technical-reference/spend-permissions/coinbase-fetchpermissions.mdx
rename {docs/pages => _pages}/identity/smart-wallet/technical-reference/spend-permissions/spendpermissionmanager.mdx (97%)
rename {docs/pages => _pages}/identity/wallet-sdk/adding-tokens-to-coinbase-wallet.mdx (98%)
rename {docs/pages => _pages}/identity/wallet-sdk/android-api-reference.mdx (99%)
rename {docs/pages => _pages}/identity/wallet-sdk/android-establishing-a-connection.mdx (98%)
rename {docs/pages => _pages}/identity/wallet-sdk/android-install.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/android-making-requests.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/android-setup.mdx (97%)
rename {docs/pages => _pages}/identity/wallet-sdk/developer-settings.mdx (97%)
rename {docs/pages => _pages}/identity/wallet-sdk/disconnecting-links.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/environments.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/errors.mdx (100%)
create mode 100644 _pages/identity/wallet-sdk/existing-welcome-page-features.mdx
rename {docs/pages => _pages}/identity/wallet-sdk/faq.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/getting-eth-accounts.mdx (99%)
rename {docs/pages => _pages}/identity/wallet-sdk/injected-provider-guidance.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/injected-provider.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/installing.mdx (99%)
rename {docs/pages => _pages}/identity/wallet-sdk/ios-api-reference.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/ios-establishing-a-connection.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/ios-install.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/ios-making-requests.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/ios-setup.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/message-payment-xmtp-content-type.mdx (99%)
create mode 100644 _pages/identity/wallet-sdk/mobile-dapp-integration-via-deep-linking.mdx
rename {docs/pages => _pages}/identity/wallet-sdk/mobile-sdk-overview.mdx (98%)
rename {docs/pages => _pages}/identity/wallet-sdk/sample-applications.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/setup.mdx (98%)
create mode 100644 _pages/identity/wallet-sdk/smart-wallet.mdx
rename {docs/pages => _pages}/identity/wallet-sdk/solana-adapter-guide.mdx (99%)
rename {docs/pages => _pages}/identity/wallet-sdk/solana-connecting-accounts.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/solana-overview.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/solana-provider-api.mdx (98%)
rename {docs/pages => _pages}/identity/wallet-sdk/solana-provider.mdx (97%)
rename {docs/pages => _pages}/identity/wallet-sdk/solana-sending-transactions.mdx (99%)
rename {docs/pages => _pages}/identity/wallet-sdk/solana-signing-messages.mdx (98%)
rename {docs/pages => _pages}/identity/wallet-sdk/solana-wallet-adapter.mdx (100%)
create mode 100644 _pages/identity/wallet-sdk/supported-environments.mdx
rename {docs/pages => _pages}/identity/wallet-sdk/sw-rainbowkit.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/sw-setup.mdx (94%)
rename {docs/pages => _pages}/identity/wallet-sdk/switching-chains.mdx (100%)
rename {docs/pages => _pages}/identity/wallet-sdk/tracking-assets.mdx (100%)
create mode 100644 _pages/identity/wallet-sdk/ux-guidelines.mdx
rename {docs/pages => _pages}/identity/wallet-sdk/ux-tips.mdx (99%)
rename {docs/pages => _pages}/identity/wallet-sdk/wallet-features.mdx (100%)
create mode 100644 _pages/identity/wallet-sdk/wallet-mobile-sdk.mdx
create mode 100644 _pages/identity/wallet-sdk/wallet-sdk-existing-section.mdx
create mode 100644 _pages/identity/wallet-sdk/wallet-sdk-mobile-sdk.mdx
rename {docs/pages => _pages}/identity/wallet-sdk/welcome.mdx (97%)
rename {docs/pages => _pages}/identity/wallet-sdk/whitelisted-networks.mdx (100%)
create mode 100644 _pages/identity/wallet-sdk/xmtp.mdx
rename {docs/pages => _pages}/index.mdx (97%)
rename {docs/pages => _pages}/learn/address-and-payable/address-and-payable.mdx (100%)
rename {docs/pages => _pages}/learn/advanced-functions/function-modifiers-vid.mdx (79%)
rename {docs/pages => _pages}/learn/advanced-functions/function-modifiers.mdx (99%)
rename {docs/pages => _pages}/learn/advanced-functions/function-visibility-vid.mdx (80%)
rename {docs/pages => _pages}/learn/advanced-functions/function-visibility.mdx (99%)
rename {docs/pages => _pages}/learn/arrays/array-storage-layout-vid.mdx (79%)
rename {docs/pages => _pages}/learn/arrays/arrays-exercise.mdx (97%)
rename {docs/pages => _pages}/learn/arrays/arrays-in-solidity-vid.mdx (78%)
rename {docs/pages => _pages}/learn/arrays/arrays-in-solidity.mdx (100%)
rename {docs/pages => _pages}/learn/arrays/filtering-an-array-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/arrays/fixed-size-arrays-vid.mdx (78%)
rename {docs/pages => _pages}/learn/arrays/writing-arrays-in-solidity-vid.mdx (80%)
rename {docs/pages => _pages}/learn/contracts-and-basic-functions/basic-functions-exercise.mdx (99%)
rename {docs/pages => _pages}/learn/contracts-and-basic-functions/basic-types.mdx (99%)
rename {docs/pages => _pages}/learn/contracts-and-basic-functions/hello-world-step-by-step.mdx (100%)
rename {docs/pages => _pages}/learn/contracts-and-basic-functions/intro-to-contracts-vid.mdx (81%)
rename {docs/pages => _pages}/learn/control-structures/control-structures-exercise.mdx (99%)
rename {docs/pages => _pages}/learn/control-structures/control-structures.mdx (99%)
rename {docs/pages => _pages}/learn/control-structures/loops-vid.mdx (74%)
rename {docs/pages => _pages}/learn/control-structures/require-revert-error-vid.mdx (80%)
rename {docs/pages => _pages}/learn/control-structures/standard-control-structures-vid.mdx (80%)
rename {docs/pages => _pages}/learn/deployment-to-testnet/contract-verification-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/deployment-to-testnet/deployment-to-base-sepolia-sbs.mdx (98%)
rename {docs/pages => _pages}/learn/deployment-to-testnet/deployment-to-testnet-exercise.mdx (97%)
rename {docs/pages => _pages}/learn/deployment-to-testnet/overview-of-test-networks-vid.mdx (80%)
rename {docs/pages => _pages}/learn/deployment-to-testnet/test-networks.mdx (100%)
rename {docs/pages => _pages}/learn/development-tools/overview.mdx (100%)
rename {docs/pages => _pages}/learn/erc-20-token/analyzing-erc-20-vid.mdx (80%)
rename {docs/pages => _pages}/learn/erc-20-token/erc-20-exercise.mdx (97%)
rename {docs/pages => _pages}/learn/erc-20-token/erc-20-standard.mdx (100%)
rename {docs/pages => _pages}/learn/erc-20-token/erc-20-testing-vid.mdx (78%)
rename {docs/pages => _pages}/learn/erc-20-token/erc-20-token-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/erc-20-token/openzeppelin-erc-20-vid.mdx (82%)
rename {docs/pages => _pages}/learn/erc-721-token/erc-721-exercise.mdx (97%)
rename {docs/pages => _pages}/learn/erc-721-token/erc-721-on-opensea-vid.mdx (81%)
rename {docs/pages => _pages}/learn/erc-721-token/erc-721-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/erc-721-token/erc-721-standard-video.mdx (81%)
rename {docs/pages => _pages}/learn/erc-721-token/erc-721-standard.mdx (100%)
rename {docs/pages => _pages}/learn/erc-721-token/implementing-an-erc-721-vid.mdx (79%)
rename {docs/pages => _pages}/learn/erc-721-token/openzeppelin-erc-721-vid.mdx (83%)
rename {docs/pages => _pages}/learn/error-triage/error-triage-exercise-source.sol (100%)
rename {docs/pages => _pages}/learn/error-triage/error-triage-exercise.mdx (99%)
rename {docs/pages => _pages}/learn/error-triage/error-triage-vid.mdx (76%)
rename {docs/pages => _pages}/learn/error-triage/error-triage.mdx (99%)
rename {docs/pages => _pages}/learn/ethereum-virtual-machine/evm-diagram.mdx (100%)
rename {docs/pages => _pages}/learn/etherscan/etherscan-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/etherscan/etherscan-vid.mdx (79%)
rename {docs/pages => _pages}/learn/events/hardhat-events-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/exercise-contracts.mdx (100%)
rename {docs/pages => _pages}/learn/frontend-setup/building-an-onchain-app.mdx (98%)
rename {docs/pages => _pages}/learn/frontend-setup/overview.mdx (100%)
rename {docs/pages => _pages}/learn/frontend-setup/wallet-connectors.mdx (99%)
create mode 100644 _pages/learn/hardhat-deploy/deployment-vid.mdx
create mode 100644 _pages/learn/hardhat-deploy/hardhat-deploy-sbs.mdx
create mode 100644 _pages/learn/hardhat-deploy/installing-hardhat-deploy-vid.mdx
create mode 100644 _pages/learn/hardhat-deploy/setup-deploy-script-vid.mdx
create mode 100644 _pages/learn/hardhat-deploy/test-network-configuration-vid.mdx
create mode 100644 _pages/learn/hardhat-deploy/testing-our-deployment-vid.mdx
rename {docs/pages => _pages}/learn/hardhat-forking/hardhat-forking.mdx (100%)
create mode 100644 _pages/learn/hardhat-forking/mainnet-forking-vid.mdx
rename {docs/pages => _pages}/learn/hardhat-setup-overview/creating-a-project-vid.mdx (79%)
rename {docs/pages => _pages}/learn/hardhat-setup-overview/hardhat-overview-vid.mdx (76%)
rename {docs/pages => _pages}/learn/hardhat-setup-overview/hardhat-setup-overview-sbs.mdx (100%)
create mode 100644 _pages/learn/hardhat-testing/contract-abi-and-testing-vid.mdx
rename {docs/pages => _pages}/learn/hardhat-testing/hardhat-testing-sbs.mdx (100%)
create mode 100644 _pages/learn/hardhat-testing/testing-overview-vid.mdx
create mode 100644 _pages/learn/hardhat-testing/writing-tests-vid.mdx
rename {docs/pages => _pages}/learn/hardhat-tools-and-testing/overview.mdx (100%)
rename {docs/pages => _pages}/learn/hardhat-verify/hardhat-verify-sbs.mdx (100%)
create mode 100644 _pages/learn/hardhat-verify/hardhat-verify-vid.mdx
rename {docs/pages => _pages}/learn/help-on-discord.mdx (100%)
rename {docs/pages => _pages}/learn/imports/imports-exercise.mdx (98%)
rename {docs/pages => _pages}/learn/imports/imports-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/imports/imports-vid.mdx (78%)
rename {docs/pages => _pages}/learn/inheritance/abstract-contracts-sbs.mdx (100%)
rename {docs/pages => _pages}/learn/inheritance/abstract-contracts-vid.mdx (80%)
rename {docs/pages => _pages}/learn/inheritance/inheritance-exercise.mdx (98%)
rename {docs/pages => _pages}/learn/inheritance/inheritance-sbs.mdx (100%)
rename {docs/pages => _pages}/learn/inheritance/inheritance-vid.mdx (78%)
rename {docs/pages => _pages}/learn/inheritance/multiple-inheritance-vid.mdx (81%)
rename {docs/pages => _pages}/learn/inheritance/multiple-inheritance.mdx (100%)
rename {docs/pages => _pages}/learn/interfaces/calling-another-contract-vid.mdx (85%)
rename {docs/pages => _pages}/learn/interfaces/contract-to-contract-interaction.mdx (99%)
rename {docs/pages => _pages}/learn/interfaces/intro-to-interfaces-vid.mdx (85%)
rename {docs/pages => _pages}/learn/interfaces/testing-the-interface-vid.mdx (84%)
rename {docs/pages => _pages}/learn/intro-to-tokens/intro-to-tokens-vid.mdx (79%)
rename {docs/pages => _pages}/learn/intro-to-tokens/misconceptions-about-tokens-vid.mdx (81%)
rename {docs/pages => _pages}/learn/intro-to-tokens/tokens-overview.mdx (100%)
rename {docs/pages => _pages}/learn/introduction-to-ethereum/ethereum-applications.mdx (100%)
rename {docs/pages => _pages}/learn/introduction-to-ethereum/ethereum-dev-overview-vid.mdx (81%)
rename {docs/pages => _pages}/learn/introduction-to-ethereum/evm-diagram.mdx (99%)
rename {docs/pages => _pages}/learn/introduction-to-ethereum/gas-use-in-eth-transactions.mdx (100%)
rename {docs/pages => _pages}/learn/introduction-to-ethereum/intro-to-ethereum-vid.mdx (79%)
rename {docs/pages => _pages}/learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid.mdx (81%)
rename {docs/pages => _pages}/learn/introduction-to-solidity/deployment-in-remix-vid.mdx (80%)
rename {docs/pages => _pages}/learn/introduction-to-solidity/deployment-in-remix.mdx (100%)
rename {docs/pages => _pages}/learn/introduction-to-solidity/introduction-to-remix-vid.mdx (79%)
rename {docs/pages => _pages}/learn/introduction-to-solidity/introduction-to-remix.mdx (99%)
rename {docs/pages => _pages}/learn/introduction-to-solidity/introduction-to-solidity-overview.mdx (100%)
rename {docs/pages => _pages}/learn/introduction-to-solidity/introduction-to-solidity-vid.mdx (79%)
rename {docs/pages => _pages}/learn/introduction-to-solidity/solidity-overview.mdx (99%)
create mode 100644 _pages/learn/learning-objectives.mdx
rename {docs/pages => _pages}/learn/mappings/how-mappings-are-stored-vid.mdx (79%)
rename {docs/pages => _pages}/learn/mappings/mappings-exercise.mdx (99%)
rename {docs/pages => _pages}/learn/mappings/mappings-sbs.mdx (100%)
rename {docs/pages => _pages}/learn/mappings/mappings-vid.mdx (74%)
rename {docs/pages => _pages}/learn/mappings/using-msg-sender-vid.mdx (78%)
rename {docs/pages => _pages}/learn/minimal-tokens/creating-a-minimal-token-vid.mdx (80%)
rename {docs/pages => _pages}/learn/minimal-tokens/minimal-token-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/minimal-tokens/minimal-tokens-exercise.mdx (98%)
rename {docs/pages => _pages}/learn/minimal-tokens/transferring-a-minimal-token-vid.mdx (82%)
rename {docs/pages => _pages}/learn/new-keyword/creating-a-new-contract-vid.mdx (83%)
rename {docs/pages => _pages}/learn/new-keyword/new-keyword-exercise.mdx (98%)
rename {docs/pages => _pages}/learn/new-keyword/new-keyword-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/reading-and-displaying-data/configuring-useReadContract.mdx (99%)
rename {docs/pages => _pages}/learn/reading-and-displaying-data/useAccount.mdx (100%)
rename {docs/pages => _pages}/learn/reading-and-displaying-data/useReadContract.mdx (99%)
rename {docs/pages => _pages}/learn/storage/how-storage-works-video.mdx (78%)
rename {docs/pages => _pages}/learn/storage/how-storage-works.mdx (100%)
rename {docs/pages => _pages}/learn/storage/simple-storage-sbs.mdx (99%)
rename {docs/pages => _pages}/learn/storage/simple-storage-video.mdx (77%)
rename {docs/pages => _pages}/learn/storage/storage-exercise.mdx (97%)
rename {docs/pages => _pages}/learn/structs/structs-exercise.mdx (99%)
rename {docs/pages => _pages}/learn/structs/structs-sbs.mdx (100%)
rename {docs/pages => _pages}/learn/structs/structs-vid.mdx (74%)
rename {docs/pages => _pages}/learn/welcome.mdx (95%)
rename {docs/pages => _pages}/learn/writing-to-contracts/useSimulateContract.mdx (100%)
rename {docs/pages => _pages}/learn/writing-to-contracts/useWriteContract.mdx (99%)
rename docs/pages/privacy-policy.md => _pages/privacy-policy.mdx (100%)
create mode 100644 _pages/quickstart.mdx
rename docs/pages/terms-of-service.md => _pages/terms-of-service.mdx (100%)
create mode 100644 _pages/use-cases/accept-crypto-payments.mdx
create mode 100644 _pages/use-cases/ai-instructions/eliza.mdx
create mode 100644 _pages/use-cases/ai-instructions/langchain-local.mdx
create mode 100644 _pages/use-cases/ai-instructions/langchain-replit.mdx
rename {docs/pages => _pages}/use-cases/decentralize-social-app.mdx (83%)
rename {docs/pages => _pages}/use-cases/defi-your-app.mdx (96%)
rename {docs/pages => _pages}/use-cases/go-gasless.mdx (98%)
rename {docs/pages => _pages}/use-cases/launch-ai-agents.mdx (100%)
rename {docs/pages => _pages}/use-cases/onboard-any-user.mdx (58%)
rename {docs/pages => _pages}/wallet-app/mini-apps.mdx (99%)
delete mode 100644 api/submitFeedback.ts
delete mode 100644 contexts/Theme.tsx
create mode 100644 docs.json
create mode 100644 docs/_docs.json
create mode 100644 docs/base-chain/flashblocks/apps.mdx
create mode 100644 docs/base-chain/flashblocks/node-providers.mdx
create mode 100644 docs/base-chain/network-information/base-contracts.mdx
create mode 100644 docs/base-chain/network-information/diffs-ethereum-base.mdx
create mode 100644 docs/base-chain/network-information/ecosystem-contracts.mdx
create mode 100644 docs/base-chain/network-information/network-fees.mdx
create mode 100644 docs/base-chain/node-operators/performance-tuning.mdx
create mode 100644 docs/base-chain/node-operators/run-a-base-node.mdx
create mode 100644 docs/base-chain/node-operators/snapshots.mdx
create mode 100644 docs/base-chain/node-operators/troubleshooting.mdx
create mode 100644 docs/base-chain/quickstart/bridge-token.mdx
create mode 100644 docs/base-chain/quickstart/connecting-to-base.mdx
create mode 100644 docs/base-chain/quickstart/deploy-on-base.mdx
create mode 100644 docs/base-chain/quickstart/why-base.mdx
create mode 100644 docs/base-chain/security/avoid-malicious-flags.mdx
create mode 100644 docs/base-chain/security/bug-bounty.mdx
create mode 100644 docs/base-chain/security/report-vulnerability.mdx
create mode 100644 docs/base-chain/security/security-council.mdx
create mode 100644 docs/base-chain/tools/account-abstraction.mdx
create mode 100644 docs/base-chain/tools/base-products.mdx
create mode 100644 docs/base-chain/tools/block-explorers.mdx
create mode 100644 docs/base-chain/tools/cross-chain.mdx
create mode 100644 docs/base-chain/tools/data-indexers.mdx
create mode 100644 docs/base-chain/tools/network-faucets.mdx
create mode 100644 docs/base-chain/tools/node-providers.mdx
create mode 100644 docs/base-chain/tools/onchain-registry-api.mdx
create mode 100644 docs/base-chain/tools/onramps.mdx
create mode 100644 docs/base-chain/tools/oracles.mdx
create mode 100644 docs/base-chain/tools/tokens-in-wallet.mdx
delete mode 100644 docs/components/App.tsx
delete mode 100644 docs/config/guides.ts
delete mode 100644 docs/constants.ts
delete mode 100644 docs/contexts/AppProviders.tsx
delete mode 100644 docs/contexts/CookieBannerWrapper.tsx
create mode 100644 docs/cookbook/accept-crypto-payments.mdx
create mode 100644 docs/cookbook/ai-prompting.mdx
create mode 100644 docs/cookbook/base-builder-mcp.mdx
create mode 100644 docs/cookbook/defi-your-app.mdx
create mode 100644 docs/cookbook/defi/access-real-time-asset-data.mdx
create mode 100644 docs/cookbook/defi/access-real-world-data.mdx
create mode 100644 docs/cookbook/defi/add-in-app-funding.mdx
create mode 100644 docs/cookbook/deploy-a-chain.mdx
create mode 100644 docs/cookbook/go-gasless.mdx
create mode 100644 docs/cookbook/growth/cast-actions.mdx
create mode 100644 docs/cookbook/growth/deploy-to-vercel.mdx
create mode 100644 docs/cookbook/growth/email-campaigns.mdx
create mode 100644 docs/cookbook/growth/gating-and-redirects.mdx
create mode 100644 docs/cookbook/growth/hyperframes.mdx
create mode 100644 docs/cookbook/growth/retaining-users.mdx
create mode 100644 docs/cookbook/launch-ai-agents.mdx
create mode 100644 docs/cookbook/launch-tokens.mdx
create mode 100644 docs/cookbook/nfts/complex-onchain-nfts.mdx
create mode 100644 docs/cookbook/nfts/dynamic-nfts.mdx
create mode 100644 docs/cookbook/nfts/nft-minting-zora.mdx
create mode 100644 docs/cookbook/nfts/signature-mint.mdx
create mode 100644 docs/cookbook/nfts/simple-onchain-nfts.mdx
create mode 100644 docs/cookbook/nfts/thirdweb-unreal-nft-items.mdx
create mode 100644 docs/cookbook/onboard-any-user.mdx
create mode 100644 docs/cookbook/onchain-social.mdx
create mode 100644 docs/cookbook/payments/build-ecommerce-app.mdx
create mode 100644 docs/cookbook/payments/deploy-shopify-storefront.mdx
create mode 100644 docs/cookbook/payments/transaction-guide.mdx
create mode 100644 docs/cookbook/social/convert-farcaster-frame.mdx
create mode 100644 docs/cookbook/social/farcaster-nft-minting-guide.mdx
create mode 100644 docs/cookbook/social/farcaster-no-code-nft-minting.mdx
create mode 100644 docs/custom.css
create mode 100644 docs/docs.json
delete mode 100644 docs/footer.tsx
create mode 100644 docs/get-started/ai-prompting.mdx
create mode 100644 docs/get-started/base.mdx
create mode 100644 docs/get-started/build-app.mdx
create mode 100644 docs/get-started/concepts.mdx
create mode 100644 docs/get-started/deploy-chain.mdx
create mode 100644 docs/get-started/deploy-smart-contracts.mdx
create mode 100644 docs/get-started/get-funded.mdx
create mode 100644 docs/get-started/launch-token.mdx
create mode 100644 docs/get-started/products.mdx
create mode 100644 docs/get-started/prompt-library.mdx
create mode 100644 docs/get-started/use-cases.mdx
create mode 100644 docs/get-started/use-cases/agents.mdx
create mode 100644 docs/get-started/use-cases/defi.mdx
create mode 100644 docs/get-started/use-cases/gasless.mdx
create mode 100644 docs/get-started/use-cases/onboarding.mdx
create mode 100644 docs/get-started/use-cases/payments.mdx
create mode 100644 docs/get-started/use-cases/social.mdx
create mode 100644 docs/iframe-theme.js
rename docs/{public => }/images/account-abstraction/privy-console.png (100%)
rename docs/{public => }/images/account-abstraction/privy-dashboard-page.png (100%)
rename docs/{public => }/images/account-abstraction/privy-login-methods.png (100%)
rename docs/{public => }/images/account-abstraction/privy-login-modal.png (100%)
rename docs/{public => }/images/account-abstraction/privy-login-page.png (100%)
rename docs/{public => }/images/base-docs-og.png (100%)
rename docs/{public => }/images/basenames-tutorial/basename-profile-home.png (100%)
rename docs/{public => }/images/basenames-tutorial/basenames-frame-final.png (100%)
rename docs/{public => }/images/basenames-tutorial/basenames-homepage.png (100%)
rename docs/{public => }/images/basenames-tutorial/confirm-textrecord-update.png (100%)
rename docs/{public => }/images/basenames-tutorial/confirm-txn.png (100%)
rename docs/{public => }/images/basenames-tutorial/edit-basename-profile.png (100%)
rename docs/{public => }/images/basenames-tutorial/final-basename.png (100%)
rename docs/{public => }/images/basenames-tutorial/frame-preview.png (100%)
rename docs/{public => }/images/basenames-tutorial/frames-selector.png (100%)
rename docs/{public => }/images/basenames-tutorial/preview-frame.png (100%)
rename docs/{public => }/images/basenames-tutorial/profile-component-dropdown.png (100%)
rename docs/{public => }/images/basenames-tutorial/show-preview.png (100%)
rename docs/{public => }/images/basenames-tutorial/try-now.png (100%)
rename docs/{public => }/images/build-with-nouns/auction.png (100%)
rename docs/{public => }/images/build-with-nouns/create-dao.png (100%)
rename docs/{public => }/images/build-with-thirdweb/car-color-nft.gif (100%)
rename docs/{public => }/images/build-with-thirdweb/deploy-contract.png (100%)
rename docs/{public => }/images/build-with-thirdweb/get-nft-colors.png (100%)
rename docs/{public => }/images/build-with-thirdweb/hex-to-linear-color.png (100%)
rename docs/{public => }/images/build-with-thirdweb/import-image-instance.png (100%)
rename docs/{public => }/images/build-with-thirdweb/mint-nft.png (100%)
rename docs/{public => }/images/build-with-thirdweb/open-thirdweb-manager.png (100%)
rename docs/{public => }/images/build-with-thirdweb/open-unreal-project.png (100%)
rename docs/{public => }/images/build-with-thirdweb/perform-nft-claim.png (100%)
rename docs/{public => }/images/build-with-thirdweb/play-button.png (100%)
rename docs/{public => }/images/build-with-thirdweb/scene-game.png (100%)
rename docs/{public => }/images/build-with-thirdweb/token-airdrop-dashboard.png (100%)
rename docs/{public => }/images/build-with-zora/cdp-pick-node.png (100%)
rename docs/{public => }/images/build-with-zora/dashboard.png (100%)
rename docs/{public => }/images/builder-anniversary-nft/builder-anniversary-nft-preview.webp (100%)
rename docs/{public => }/images/connecting-to-the-blockchain/add-project-information.png (100%)
rename docs/{public => }/images/connecting-to-the-blockchain/alchemy-new-app.png (100%)
rename docs/{public => }/images/connecting-to-the-blockchain/blockdaemon-create-key.png (100%)
rename docs/{public => }/images/connecting-to-the-blockchain/connected.png (100%)
rename docs/{public => }/images/connecting-to-the-blockchain/quicknode-select-chain.png (100%)
rename docs/{public => }/images/connecting-to-the-blockchain/rainbowkit-modal.png (100%)
rename docs/{public => }/images/connecting-to-the-blockchain/wallet-connect-create-button.png (100%)
rename docs/{public => }/images/deployment-with-remix/base-confirm-transaction.png (100%)
rename docs/{public => }/images/deployment-with-remix/compiler-debug-log.png (100%)
rename docs/{public => }/images/deployment-with-remix/editor-pane.png (100%)
rename docs/{public => }/images/deployment-with-remix/remix-base-goerli-connected.png (100%)
rename docs/{public => }/images/deployment-with-remix/remix-home.png (100%)
rename docs/{public => }/images/deployment-with-remix/remix-terminal.png (100%)
rename docs/{public => }/images/deployment-with-remix/select-provider.png (100%)
rename docs/{public => }/images/deployment-with-remix/verify-and-publish.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/configuration.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/create-template.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/debugger-button.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/devnet-project-slug.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/github-actions.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/modifying-source.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/output.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/overrides.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/result-of-expression.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/result-of-simulation.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/setgreeting.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/simulation.png (100%)
rename docs/{public => }/images/deployment-with-tenderly/simulator-button.png (100%)
rename docs/{public => }/images/dynamic-nfts/NFT_level_1.png (100%)
rename docs/{public => }/images/dynamic-nfts/NFT_level_2.png (100%)
rename docs/{public => }/images/dynamic-nfts/NFT_level_3.png (100%)
rename docs/{public => }/images/dynamic-nfts/all-characters.png (100%)
rename docs/{public => }/images/dynamic-nfts/base-dynamic-nft.zip (100%)
rename docs/{public => }/images/dynamic-nfts/image-level-1.png (100%)
rename docs/{public => }/images/dynamic-nfts/image-level-2.png (100%)
rename docs/{public => }/images/dynamic-nfts/image-level-3.png (100%)
rename docs/{public => }/images/dynamic-nfts/mutable-references.png (100%)
rename docs/{public => }/images/dynamic-nfts/open-sea-mockup.jpg (100%)
rename docs/{public => }/images/dynamic-nfts/refresh-metadata.png (100%)
rename docs/{public => }/images/frames/100-lines-frame.png (100%)
rename docs/{public => }/images/frames/2024-a-base-odyssey.png (100%)
rename docs/{public => }/images/frames/first-frame.png (100%)
rename docs/{public => }/images/frames/gave-me-away.png (100%)
rename docs/{public => }/images/frames/install-action.png (100%)
rename docs/{public => }/images/frames/link-button-test.png (100%)
rename docs/{public => }/images/frames/real-nft.png (100%)
rename docs/{public => }/images/frames/story-time.png (100%)
rename docs/{public => }/images/frames/updated-100-lines.png (100%)
rename docs/{public => }/images/frames/vercel-build.png (100%)
rename docs/{public => }/images/frames/vercel-import.png (100%)
rename docs/{public => }/images/frames/vercel-install.png (100%)
rename docs/{public => }/images/frames/vercel-projects.png (100%)
rename "docs/public/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 3.10.17\342\200\257PM.png" => "docs/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 3.10.17\342\200\257PM.png" (100%)
rename "docs/public/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 8.05.25\342\200\257AM.png" => "docs/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 8.05.25\342\200\257AM.png" (100%)
rename docs/{public => }/images/gasless-transaction-on-base/cdp-allowlist-contract.png (100%)
rename docs/{public => }/images/gasless-transaction-on-base/cdp-config.png (100%)
rename docs/{public => }/images/gasless-transaction-on-base/cdp-global-user-limits.png (100%)
rename docs/{public => }/images/gasless-transaction-on-base/cdp-home.png (100%)
rename docs/{public => }/images/gasless-transaction-on-base/cdp-paymaster.png (100%)
rename docs/{public => }/images/gasless-transaction-on-base/cdp-select-network.png (100%)
rename docs/{public => }/images/gasless-transaction-on-base/cdp-select-project.png (100%)
rename docs/{public => }/images/gasless-transaction-on-base/cdp-userops-10.png (100%)
rename docs/{public => }/images/hardhat-test-coverage/coverage-report.png (100%)
create mode 100644 docs/images/hero.png
rename docs/{public => }/images/homepage/hero-background.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/add-injected-provider.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/balance.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/base-confirm-transaction.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/compiler-debug-log.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/confirm-transaction.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/connected.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/deployment-transaction.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/importance-of-testnets.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/remix-base-goerli-connected.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/select-provider.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/testnet-comparison.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/verify-and-publish.png (100%)
rename docs/{public => }/images/learn/deployment-to-testnet/view-transaction.png (100%)
rename docs/{public => }/images/learn/erc-20/deployed-token.png (100%)
rename docs/{public => }/images/learn/erc-20/erc20-dev-perspective.png (100%)
rename docs/{public => }/images/learn/erc-20/erc20-user-perspective.png (100%)
rename docs/{public => }/images/learn/erc-20/evolution-eth-erc20.png (100%)
rename docs/{public => }/images/learn/erc-721/erc-721-standard.png (100%)
rename docs/{public => }/images/learn/erc-721/evolution-eth-erc721.png (100%)
rename docs/{public => }/images/learn/error-triage/array-out-of-bounds.png (100%)
rename docs/{public => }/images/learn/error-triage/debugger.png (100%)
rename docs/{public => }/images/learn/error-triage/divide-by-zero.png (100%)
rename docs/{public => }/images/learn/error-triage/gas-limit.png (100%)
rename docs/{public => }/images/learn/error-triage/highlight-code.png (100%)
rename docs/{public => }/images/learn/error-triage/underflow.png (100%)
rename docs/{public => }/images/learn/ethereum-virtual-machine/evm-architecture-execution.png (100%)
rename docs/{public => }/images/learn/ethereum-virtual-machine/evm-execution-basic.png (100%)
rename docs/{public => }/images/learn/ethereum-virtual-machine/evm-stack-memory.png (100%)
rename docs/{public => }/images/learn/ethereum-virtual-machine/opcode-execution.png (100%)
rename docs/{public => }/images/learn/etherscan/bayc-query.png (100%)
rename docs/{public => }/images/learn/etherscan/bayc-read.png (100%)
rename docs/{public => }/images/learn/etherscan/bayc-verified.png (100%)
rename docs/{public => }/images/learn/etherscan/bayc-write-connected.png (100%)
rename docs/{public => }/images/learn/etherscan/bayc-write.png (100%)
rename docs/{public => }/images/learn/etherscan/bayc.png (100%)
rename docs/{public => }/images/learn/etherscan/blocks.png (100%)
rename docs/{public => }/images/learn/etherscan/etherscan-user-interface.png (100%)
rename docs/{public => }/images/learn/hardhat-deploying/new-deploy.png (100%)
rename docs/{public => }/images/learn/hardhat-forking/hardhat-forking.png (100%)
rename docs/{public => }/images/learn/hardhat-testing/autocomplete-unlockTime.png (100%)
rename docs/{public => }/images/learn/hardhat-verify/hardhat-verify-success.png (100%)
rename docs/{public => }/images/learn/hardhat-verify/hardhat-verify.png (100%)
rename docs/{public => }/images/learn/hardhat-verify/harhat-verify-create-key.png (100%)
rename docs/{public => }/images/learn/icons/coding-white.svg (100%)
rename docs/{public => }/images/learn/icons/coding.svg (100%)
rename docs/{public => }/images/learn/icons/quizzes-white.svg (100%)
rename docs/{public => }/images/learn/icons/quizzes.svg (100%)
rename docs/{public => }/images/learn/icons/reading-white.svg (100%)
rename docs/{public => }/images/learn/icons/reading.svg (100%)
rename docs/{public => }/images/learn/icons/stepbystep-white.svg (100%)
rename docs/{public => }/images/learn/icons/stepbystep.svg (100%)
rename docs/{public => }/images/learn/icons/video-white.svg (100%)
rename docs/{public => }/images/learn/icons/video.svg (100%)
rename docs/{public => }/images/learn/introduction-to-ethereum/btc-eth-comparison.png (100%)
rename docs/{public => }/images/learn/introduction-to-ethereum/gas-costs.png (100%)
rename docs/{public => }/images/learn/introduction-to-ethereum/web2-web3-development.png (100%)
rename docs/{public => }/images/learn/introduction-to-ethereum/web2-web3-limitations.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/delete.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/deploy-button.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/editor-pane.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/key-value-store.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/remix-contract-buttons.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/remix-deploy-chevron.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/remix-deploy-log.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/remix-editor.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/remix-home.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/remix-retrieve.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/remix-settings.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/remix-terminal.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/remix-transaction-console.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/variable-order-inefficient.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/variable-order-optimized.png (100%)
rename docs/{public => }/images/learn/introduction-to-solidity/variable-packing.png (100%)
rename docs/{public => }/images/learn/introduction-to-tokens/erc-1155.png (100%)
rename docs/{public => }/images/learn/introduction-to-tokens/erc-20.png (100%)
rename docs/{public => }/images/learn/introduction-to-tokens/erc-721.png (100%)
rename docs/{public => }/images/learn/minimal-tokens/balance.png (100%)
rename docs/{public => }/images/learn/minimal-tokens/split-balances.png (100%)
rename docs/{public => }/images/learn/minimal-tokens/transferred.png (100%)
rename docs/{public => }/images/learn/new-keyword/at-address.png (100%)
rename docs/{public => }/images/learn/new-keyword/deployed.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_01.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_02.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_03.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_04.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_05.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_06.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_07.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_08.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_09.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_10.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_11.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_12.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_13.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_14.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_15.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_16.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_17.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_18.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/Base_Camp_NFT_19.png (100%)
rename docs/{components/CafeUnitTest/assets/images => images/learn/nft-pins}/TestPin.png (100%)
rename docs/{public => }/images/learn/reading-and-displaying-data/issues-console-log.png (100%)
rename docs/{public => }/images/learn/reading-and-displaying-data/missing-data.png (100%)
rename docs/{public => }/images/learn/storage/deployment-with-params.png (100%)
rename docs/{public => }/images/learn/welcome/Base_Learn_Hero.png (100%)
rename docs/{public => }/images/minikit/example_embed.png (100%)
rename docs/{public => }/images/minikit/manifest-setup.png (100%)
rename docs/{public => }/images/minikit/minikit-cli.gif (100%)
rename docs/{public => }/images/mobile-wallet-protocol/diffie-hellman.png (100%)
rename docs/{public => }/images/mobile-wallet-protocol/handshake.png (100%)
rename docs/{public => }/images/mobile-wallet-protocol/overview.png (100%)
rename docs/{public => }/images/onchain-generative-nfts/architecture.png (100%)
rename docs/{public => }/images/onchain-generative-nfts/first_pass.png (100%)
rename docs/{public => }/images/onchain-generative-nfts/mockup.png (100%)
rename docs/{public => }/images/onchain-generative-nfts/progress.png (100%)
rename docs/{public => }/images/onchainkit-tutorials/fund-funding-options.png (100%)
rename docs/{public => }/images/onchainkit-tutorials/fund-onramp-config.png (100%)
rename docs/{public => }/images/onchainkit-tutorials/fund-wallet-balance.png (100%)
rename docs/{public => }/images/onchainkit-tutorials/pay-commerce-products.png (100%)
rename docs/{public => }/images/onchainkit-tutorials/pay-copy-product-link.png (100%)
rename docs/{public => }/images/onchainkit-tutorials/pay-create-product-details.png (100%)
rename docs/{public => }/images/onchainkit-tutorials/pay-final-product.png (100%)
rename docs/{public => }/images/onchainkit/NFTCard.gif (100%)
rename docs/{public => }/images/onchainkit/NFTMintCard.gif (100%)
rename docs/{public => }/images/onchainkit/buy.gif (100%)
rename docs/{public => }/images/onchainkit/checkout.gif (100%)
rename docs/{public => }/images/onchainkit/commerce-1.png (100%)
rename docs/{public => }/images/onchainkit/commerce-2.png (100%)
rename docs/{public => }/images/onchainkit/commerce-3.png (100%)
rename docs/{public => }/images/onchainkit/commerce-4.png (100%)
rename docs/{public => }/images/onchainkit/copy-api-key-guide.png (100%)
rename docs/{public => }/images/onchainkit/copy-project-id.png (100%)
rename docs/{public => }/images/onchainkit/cursor-dir.gif (100%)
rename docs/{public => }/images/onchainkit/fetch-frame-part-II.png (100%)
rename docs/{public => }/images/onchainkit/fetch-frame.png (100%)
rename docs/{public => }/images/onchainkit/frame.png (100%)
rename docs/{public => }/images/onchainkit/fund-card.gif (100%)
rename docs/{public => }/images/onchainkit/getting-started-create-env-file.png (100%)
rename docs/{public => }/images/onchainkit/onchain-app-template-1.png (100%)
rename docs/{public => }/images/onchainkit/onchain-figma.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-components-paymaster-endpoint.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-components-transaction-anatomy.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-figma-design-components.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-figma-design-how-to-use.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-figma-design.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-identity.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-lifecycle-status-vibes.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-template.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-themes.gif (100%)
rename docs/{public => }/images/onchainkit/onchainkit-token.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-wallet-1.png (100%)
rename docs/{public => }/images/onchainkit/onchainkit-wallet-2.png (100%)
rename docs/{public => }/images/onchainkit/onramp-secure-init.png (100%)
rename docs/{public => }/images/onchainkit/pay-button.png (100%)
rename docs/{public => }/images/onchainkit/quickstart.png (100%)
rename docs/{public => }/images/onchainkit/use-onchain-app-template.png (100%)
rename docs/{public => }/images/onchainkit/wallet-island.gif (100%)
rename docs/{public => }/images/onchainkit/wallet-modal.gif (100%)
rename docs/{public => }/images/onchainkit/wallet-modal.png (100%)
rename docs/{public => }/images/onchainkit/warpcast-logo.png (100%)
rename docs/{public => }/images/openframes-fc/debugger-of-not-valid-zoom.png (100%)
rename docs/{public => }/images/openframes-fc/debugger-of-not-valid.png (100%)
rename docs/{public => }/images/openframes-fc/debugger-of-valid.png (100%)
rename docs/{public => }/images/openframes-fc/debugger-protocol-selector.png (100%)
rename docs/{public => }/images/openframes-fc/frame-custom-no-url.png (100%)
rename docs/{public => }/images/openframes-fc/frame-custom-url.png (100%)
rename docs/{public => }/images/paymaster/pb-paymaster-chainid.png (100%)
rename docs/{public => }/images/paymaster/pb-paymaster-config-highlight.png (100%)
rename docs/{public => }/images/paymaster/pb-paymaster-config.png (100%)
rename docs/{public => }/images/paymaster/pb-paymaster-policy-erc20-flow.png (100%)
rename docs/{public => }/images/paymaster/pb-paymaster-policy-erc20.png (100%)
rename docs/{public => }/images/paymaster/pb-paymaster-tenderly-dev-debug.png (100%)
rename docs/{public => }/images/paymaster/pb-paymaster-tenderly-entrypoint.png (100%)
rename docs/{public => }/images/paymaster/pb-sponsorship-scw.png (100%)
rename docs/{public => }/images/resend-email-campaigns/ock-dashboard.png (100%)
rename docs/{public => }/images/resend-email-campaigns/ock-use-template.png (100%)
rename docs/{public => }/images/resend-email-campaigns/resend-1.gif (100%)
rename docs/{public => }/images/resend-email-campaigns/resend-api-keys.png (100%)
rename docs/{public => }/images/resend-email-campaigns/resend-contact-added.png (100%)
rename docs/{public => }/images/resend-email-campaigns/resend-mailing-list-prompt.png (100%)
rename docs/{public => }/images/resend-email-campaigns/resend-user-subscribed.png (100%)
rename docs/{public => }/images/resend-email-campaigns/site-load.png (100%)
rename docs/{public => }/images/resend-email-campaigns/vercel-import-project.png (100%)
rename docs/{public => }/images/resend-email-campaigns/verel-login.png (100%)
rename docs/{public => }/images/resend-email-campaigns/wc-project-page.png (100%)
rename docs/{public => }/images/shopify-storefront-commerce/shopify-install-commerce.gif (100%)
create mode 100644 docs/images/showcase/aerodrome.svg
create mode 100644 docs/images/showcase/blocklords.svg
create mode 100644 docs/images/showcase/cat-town.svg
create mode 100644 docs/images/showcase/heyelsa.svg
create mode 100644 docs/images/showcase/morpho.svg
create mode 100644 docs/images/showcase/opensea.svg
rename docs/{public => }/images/smart-wallet/CDPSteps.png (100%)
rename docs/{public => }/images/smart-wallet/PaymasterAllowlist.png (100%)
rename docs/{public => }/images/smart-wallet/PaymasterCDP.png (100%)
rename docs/{public => }/images/smart-wallet/ReownSteps.png (100%)
rename docs/{public => }/images/smart-wallet/accountRecovery.png (100%)
rename docs/{public => }/images/smart-wallet/buttonPlacementExamples.png (100%)
rename docs/{public => }/images/smart-wallet/copyTxnSimClickZone.png (100%)
rename docs/{public => }/images/smart-wallet/create-a-passkey.png (100%)
rename docs/{public => }/images/smart-wallet/createWalletButtonBlack.png (100%)
rename docs/{public => }/images/smart-wallet/createWalletButtonBlue.png (100%)
rename docs/{public => }/images/smart-wallet/customized-rainbow.png (100%)
rename docs/{public => }/images/smart-wallet/customized-wallet-list.png (100%)
rename docs/{public => }/images/smart-wallet/examplePlacement.png (100%)
rename docs/{public => }/images/smart-wallet/logo.svg (100%)
rename docs/{public => }/images/smart-wallet/meme-vs-content.png (100%)
rename docs/{public => }/images/smart-wallet/onchainkit-default-eoa.png (100%)
rename docs/{public => }/images/smart-wallet/onchainkit-default-smart.png (100%)
rename docs/{public => }/images/smart-wallet/one-click-pay.png (100%)
rename docs/{public => }/images/smart-wallet/pendingOwnershipChange.png (100%)
rename docs/{public => }/images/smart-wallet/rainbow-smart-wallet.png (100%)
rename docs/{public => }/images/smart-wallet/rainbowkit-default.png (100%)
rename docs/{public => }/images/smart-wallet/random-color-nft.png (100%)
rename docs/{public => }/images/smart-wallet/recoveryKeyAddPasskey.png (100%)
rename docs/{public => }/images/smart-wallet/recoveryKeyCreated.png (100%)
rename docs/{public => }/images/smart-wallet/recoveryKeyScamWarning.png (100%)
rename docs/{public => }/images/smart-wallet/recoveryKeySignIn.png (100%)
rename docs/{public => }/images/smart-wallet/sponsored-by-base.png (100%)
rename docs/{public => }/images/smart-wallet/sub-account-demo.gif (100%)
rename docs/{public => }/images/smart-wallet/sub-account-popup.png (100%)
rename docs/{public => }/images/smart-wallet/submitRecoveryKey.png (100%)
rename docs/{public => }/images/smart-wallet/wagmi-template-normal.png (100%)
rename docs/{public => }/images/verifications/attestation-creation-flow.png (100%)
rename docs/{public => }/images/verifications/coinbase-verification-flow.png (100%)
rename docs/{public => }/images/verifications/developer-data-flow.png (100%)
rename docs/{public => }/images/verifications/onchain-attestation.png (100%)
rename docs/{public => }/images/verifications/rpc-endpoint.png (100%)
rename docs/{public => }/images/verify-with-basescan-api/basescan-apikey-page-add.png (100%)
rename docs/{public => }/images/verify-with-basescan-api/basescan-apikey-page.png (100%)
rename docs/{public => }/images/verify-with-basescan-api/basescan-menu.png (100%)
rename docs/{public => }/images/verify-with-basescan-api/cbw-show-private-key.png (100%)
rename docs/{public => }/images/verify-with-basescan-api/cdp-node-full.png (100%)
rename docs/{public => }/images/verify-with-basescan-api/cdp-rpc-url.png (100%)
rename docs/{public => }/images/wallet-sdk/developer-settings-overview.gif (100%)
rename docs/{public => }/images/wallet-sdk/dynamic-coinbase.jpg (100%)
rename docs/{public => }/images/wallet-sdk/dynamic.jpg (100%)
rename docs/{public => }/images/wallet-sdk/plaid-link-demo.png (100%)
rename docs/{public => }/images/wallet-sdk/show-private-key (1).gif (100%)
rename docs/{public => }/images/wallet-sdk/show-private-key.gif (100%)
rename docs/{public => }/images/wallet-sdk/smart-wallet-create-passkey-2.png (100%)
rename docs/{public => }/images/wallet-sdk/smart-wallet-create-passkey.png (100%)
rename docs/{public => }/images/wallet-sdk/smart-wallet-entry.png (100%)
rename docs/{public => }/images/wallet-sdk/testnet-assets.png (100%)
rename docs/{public => }/images/wallet-sdk/testnets.png (100%)
rename docs/{public => }/images/wallet-sdk/wagmi_custom_modal.png (100%)
rename docs/{public => }/images/wallet-sdk/wallet-onboard.png (100%)
rename docs/{public => }/images/wallet-sdk/web3-onboard_modal.png (100%)
rename docs/{public => }/images/wallet-sdk/web3-react_custom_modal.png (100%)
rename docs/{public => }/images/wallet-sdk/web3modal_modal.png (100%)
create mode 100644 docs/index.mdx
delete mode 100644 docs/layout.tsx
create mode 100644 docs/learn/address-and-payable/address-and-payable.mdx
create mode 100644 docs/learn/advanced-functions/function-modifiers-vid.mdx
create mode 100644 docs/learn/advanced-functions/function-modifiers.mdx
create mode 100644 docs/learn/advanced-functions/function-visibility-vid.mdx
create mode 100644 docs/learn/advanced-functions/function-visibility.mdx
create mode 100644 docs/learn/arrays/array-storage-layout-vid.mdx
create mode 100644 docs/learn/arrays/arrays-exercise.mdx
create mode 100644 docs/learn/arrays/arrays-in-solidity-vid.mdx
create mode 100644 docs/learn/arrays/arrays-in-solidity.mdx
create mode 100644 docs/learn/arrays/filtering-an-array-sbs.mdx
create mode 100644 docs/learn/arrays/fixed-size-arrays-vid.mdx
create mode 100644 docs/learn/arrays/writing-arrays-in-solidity-vid.mdx
create mode 100644 docs/learn/client-side-development.mdx
create mode 100644 docs/learn/contracts-and-basic-functions/basic-functions-exercise.mdx
create mode 100644 docs/learn/contracts-and-basic-functions/basic-types.mdx
create mode 100644 docs/learn/contracts-and-basic-functions/hello-world-step-by-step.mdx
create mode 100644 docs/learn/contracts-and-basic-functions/intro-to-contracts-vid.mdx
create mode 100644 docs/learn/control-structures/control-structures-exercise.mdx
create mode 100644 docs/learn/control-structures/control-structures.mdx
create mode 100644 docs/learn/control-structures/loops-vid.mdx
create mode 100644 docs/learn/control-structures/require-revert-error-vid.mdx
create mode 100644 docs/learn/control-structures/standard-control-structures-vid.mdx
create mode 100644 docs/learn/cross-chain-development.mdx
create mode 100644 docs/learn/deployment-to-testnet/contract-verification-sbs.mdx
create mode 100644 docs/learn/deployment-to-testnet/deployment-to-base-sepolia-sbs.mdx
create mode 100644 docs/learn/deployment-to-testnet/deployment-to-testnet-exercise.mdx
create mode 100644 docs/learn/deployment-to-testnet/overview-of-test-networks-vid.mdx
create mode 100644 docs/learn/deployment-to-testnet/test-networks.mdx
create mode 100644 docs/learn/erc-20-token/analyzing-erc-20-vid.mdx
create mode 100644 docs/learn/erc-20-token/erc-20-exercise.mdx
create mode 100644 docs/learn/erc-20-token/erc-20-standard.mdx
create mode 100644 docs/learn/erc-20-token/erc-20-testing-vid.mdx
create mode 100644 docs/learn/erc-20-token/erc-20-token-sbs.mdx
create mode 100644 docs/learn/erc-20-token/openzeppelin-erc-20-vid.mdx
create mode 100644 docs/learn/erc-721-token/erc-721-exercise.mdx
create mode 100644 docs/learn/erc-721-token/erc-721-on-opensea-vid.mdx
create mode 100644 docs/learn/erc-721-token/erc-721-sbs.mdx
create mode 100644 docs/learn/erc-721-token/erc-721-standard-video.mdx
create mode 100644 docs/learn/erc-721-token/erc-721-standard.mdx
create mode 100644 docs/learn/erc-721-token/implementing-an-erc-721-vid.mdx
create mode 100644 docs/learn/erc-721-token/openzeppelin-erc-721-vid.mdx
create mode 100644 docs/learn/error-triage/error-triage-exercise-source.sol
create mode 100644 docs/learn/error-triage/error-triage-exercise.mdx
create mode 100644 docs/learn/error-triage/error-triage-vid.mdx
create mode 100644 docs/learn/error-triage/error-triage.mdx
create mode 100644 docs/learn/ethereum-applications.mdx
create mode 100644 docs/learn/ethereum-dev-overview.mdx
create mode 100644 docs/learn/events/hardhat-events-sbs.mdx
create mode 100644 docs/learn/evm-diagram.mdx
create mode 100644 docs/learn/exercise-contracts.mdx
rename docs/{pages/cookbook/smart-contract-development => learn}/foundry/deploy-with-foundry.mdx (100%)
rename docs/{pages/cookbook/smart-contract-development => learn}/foundry/generate-random-numbers-contracts.md (100%)
create mode 100644 docs/learn/foundry/introduction-to-foundry.mdx
create mode 100644 docs/learn/foundry/setup-with-base.mdx
create mode 100644 docs/learn/foundry/testing-smart-contracts.mdx
create mode 100644 docs/learn/foundry/testing.mdx
rename docs/{pages/cookbook/smart-contract-development => learn}/foundry/verify-contract-with-basescan.md (100%)
create mode 100644 docs/learn/gas-use-in-eth-transactions.mdx
create mode 100644 docs/learn/guide-to-base.mdx
create mode 100644 docs/learn/hardhat/analyzing-test-coverage.mdx
rename docs/{pages/learn/hardhat-testing => learn/hardhat}/contract-abi-and-testing-vid.mdx (82%)
create mode 100644 docs/learn/hardhat/contract-abi-testing.mdx
create mode 100644 docs/learn/hardhat/creating-project.mdx
create mode 100644 docs/learn/hardhat/debugging-smart-contracts.mdx
create mode 100644 docs/learn/hardhat/deploy-with-hardhat.mdx
create mode 100644 docs/learn/hardhat/deployment-guide.mdx
rename docs/{pages/learn/hardhat-deploy => learn/hardhat}/deployment-vid.mdx (76%)
create mode 100644 docs/learn/hardhat/deployment.mdx
create mode 100644 docs/learn/hardhat/etherscan-guide.mdx
create mode 100644 docs/learn/hardhat/etherscan-video.mdx
create mode 100644 docs/learn/hardhat/fork-guide.mdx
create mode 100644 docs/learn/hardhat/fork-video.mdx
rename docs/{pages/learn/hardhat-deploy => learn/hardhat}/hardhat-deploy-sbs.mdx (100%)
create mode 100644 docs/learn/hardhat/hardhat-forking.mdx
create mode 100644 docs/learn/hardhat/hardhat-testing-sbs.mdx
create mode 100644 docs/learn/hardhat/hardhat-verify-sbs.mdx
rename docs/{pages/learn/hardhat-verify => learn/hardhat}/hardhat-verify-vid.mdx (81%)
create mode 100644 docs/learn/hardhat/installing-deploy.mdx
rename docs/{pages/learn/hardhat-deploy => learn/hardhat}/installing-hardhat-deploy-vid.mdx (82%)
rename docs/{pages/learn/hardhat-forking => learn/hardhat}/mainnet-forking-vid.mdx (80%)
create mode 100644 docs/learn/hardhat/network-configuration.mdx
create mode 100644 docs/learn/hardhat/optimizing-gas-usage.md
create mode 100644 docs/learn/hardhat/overview.mdx
create mode 100644 docs/learn/hardhat/reducing-contract-size.md
rename docs/{pages/learn/hardhat-deploy => learn/hardhat}/setup-deploy-script-vid.mdx (82%)
create mode 100644 docs/learn/hardhat/setup-deploy-script.mdx
create mode 100644 docs/learn/hardhat/setup.mdx
rename docs/{pages/learn/hardhat-deploy => learn/hardhat}/test-network-configuration-vid.mdx (80%)
create mode 100644 docs/learn/hardhat/testing-deployment.mdx
create mode 100644 docs/learn/hardhat/testing-guide.mdx
rename docs/{pages/learn/hardhat-deploy => learn/hardhat}/testing-our-deployment-vid.mdx (80%)
rename docs/{pages/learn/hardhat-testing => learn/hardhat}/testing-overview-vid.mdx (79%)
create mode 100644 docs/learn/hardhat/testing.mdx
create mode 100644 docs/learn/hardhat/verify-guide.mdx
create mode 100644 docs/learn/hardhat/verify-video.mdx
rename docs/{pages/learn/hardhat-testing => learn/hardhat}/writing-tests-vid.mdx (78%)
create mode 100644 docs/learn/hardhat/writing-tests.mdx
create mode 100644 docs/learn/imports/imports-exercise.mdx
create mode 100644 docs/learn/imports/imports-sbs.mdx
create mode 100644 docs/learn/imports/imports-vid.mdx
create mode 100644 docs/learn/inheritance/abstract-contracts-sbs.mdx
create mode 100644 docs/learn/inheritance/abstract-contracts-vid.mdx
create mode 100644 docs/learn/inheritance/inheritance-exercise.mdx
create mode 100644 docs/learn/inheritance/inheritance-sbs.mdx
create mode 100644 docs/learn/inheritance/inheritance-vid.mdx
create mode 100644 docs/learn/inheritance/multiple-inheritance-vid.mdx
create mode 100644 docs/learn/inheritance/multiple-inheritance.mdx
create mode 100644 docs/learn/interfaces/calling-another-contract-vid.mdx
create mode 100644 docs/learn/interfaces/contract-to-contract-interaction.mdx
create mode 100644 docs/learn/interfaces/intro-to-interfaces-vid.mdx
create mode 100644 docs/learn/interfaces/testing-the-interface-vid.mdx
create mode 100644 docs/learn/intro-to-tokens/intro-to-tokens-vid.mdx
create mode 100644 docs/learn/intro-to-tokens/misconceptions-about-tokens-vid.mdx
create mode 100644 docs/learn/intro-to-tokens/tokens-overview.mdx
create mode 100644 docs/learn/introduction-to-ethereum.mdx
create mode 100644 docs/learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid.mdx
create mode 100644 docs/learn/introduction-to-solidity/deployment-in-remix-vid.mdx
create mode 100644 docs/learn/introduction-to-solidity/deployment-in-remix.mdx
create mode 100644 docs/learn/introduction-to-solidity/introduction-to-remix-vid.mdx
create mode 100644 docs/learn/introduction-to-solidity/introduction-to-remix.mdx
create mode 100644 docs/learn/introduction-to-solidity/introduction-to-solidity-overview.mdx
create mode 100644 docs/learn/introduction-to-solidity/introduction-to-solidity-vid.mdx
create mode 100644 docs/learn/introduction-to-solidity/solidity-overview.mdx
create mode 100644 docs/learn/mappings/how-mappings-are-stored-vid.mdx
create mode 100644 docs/learn/mappings/mappings-exercise.mdx
create mode 100644 docs/learn/mappings/mappings-sbs.mdx
create mode 100644 docs/learn/mappings/mappings-vid.mdx
create mode 100644 docs/learn/mappings/using-msg-sender-vid.mdx
create mode 100644 docs/learn/minimal-tokens/creating-a-minimal-token-vid.mdx
create mode 100644 docs/learn/minimal-tokens/minimal-token-sbs.mdx
create mode 100644 docs/learn/minimal-tokens/minimal-tokens-exercise.mdx
create mode 100644 docs/learn/minimal-tokens/transferring-a-minimal-token-vid.mdx
create mode 100644 docs/learn/new-keyword/creating-a-new-contract-vid.mdx
create mode 100644 docs/learn/new-keyword/new-keyword-exercise.mdx
create mode 100644 docs/learn/new-keyword/new-keyword-sbs.mdx
create mode 100644 docs/learn/onchain-app-development/account-abstraction.mdx
rename docs/{pages/cookbook => learn/onchain-app-development}/account-abstraction/account-abstraction-on-base-using-biconomy.mdx (100%)
rename docs/{pages/cookbook => learn/onchain-app-development}/account-abstraction/account-abstraction-on-base-using-particle-network.mdx (100%)
rename docs/{pages/cookbook => learn/onchain-app-development}/account-abstraction/account-abstraction-on-base-using-privy-and-the-base-paymaster.mdx (100%)
rename docs/{pages/cookbook => learn/onchain-app-development}/account-abstraction/gasless-transactions-with-paymaster.mdx (100%)
rename docs/{pages/cookbook => learn/onchain-app-development}/client-side-development/introduction-to-providers.mdx (100%)
create mode 100644 docs/learn/onchain-app-development/client-side-development/viem.mdx
rename docs/{pages/cookbook => learn/onchain-app-development}/client-side-development/web3.mdx (99%)
create mode 100644 docs/learn/onchain-app-development/cross-chain/bridge-tokens-with-layerzero.mdx
rename docs/{pages/cookbook => learn/onchain-app-development}/cross-chain/send-messages-and-tokens-from-base-chainlink.mdx (99%)
rename docs/{pages/cookbook/IPFS => learn/onchain-app-development}/deploy-with-fleek.mdx (100%)
rename docs/{pages/cookbook/use-case-guides => learn/onchain-app-development}/finance/access-real-time-asset-data-pyth-price-feeds.mdx (100%)
rename docs/{pages/cookbook/use-case-guides => learn/onchain-app-development}/finance/access-real-world-data-chainlink.mdx (100%)
rename docs/{pages/cookbook/use-case-guides => learn/onchain-app-development}/finance/build-a-smart-wallet-funding-app.mdx (100%)
create mode 100644 docs/learn/onchain-concepts/building-onchain-ai.mdx
create mode 100644 docs/learn/onchain-concepts/building-onchain-frontend-development.mdx
create mode 100644 docs/learn/onchain-concepts/building-onchain-gas.mdx
create mode 100644 docs/learn/onchain-concepts/building-onchain-identity.mdx
create mode 100644 docs/learn/onchain-concepts/building-onchain-nodes.mdx
create mode 100644 docs/learn/onchain-concepts/building-onchain-onramps.mdx
create mode 100644 docs/learn/onchain-concepts/building-onchain-social-networks.mdx
create mode 100644 docs/learn/onchain-concepts/building-onchain-wallets.mdx
create mode 100644 docs/learn/onchain-concepts/continue-building-onchain.mdx
create mode 100644 docs/learn/onchain-concepts/core-concepts.mdx
create mode 100644 docs/learn/onchain-concepts/development-flow.mdx
create mode 100644 docs/learn/onchain-concepts/understanding-the-onchain-tech-stack.mdx
create mode 100644 docs/learn/solidity/anatomy.mdx
create mode 100644 docs/learn/solidity/basic-types.mdx
create mode 100644 docs/learn/solidity/deployment-in-remix.mdx
create mode 100644 docs/learn/solidity/exercise-basics.mdx
create mode 100644 docs/learn/solidity/hello-world.mdx
create mode 100644 docs/learn/solidity/introduction-to-contracts.mdx
create mode 100644 docs/learn/solidity/introduction-to-remix.mdx
create mode 100644 docs/learn/solidity/introduction.mdx
create mode 100644 docs/learn/solidity/overview.mdx
create mode 100644 docs/learn/solidity/remix-guide.mdx
create mode 100644 docs/learn/solidity/step-by-step.mdx
create mode 100644 docs/learn/solidity/video-tutorial.mdx
create mode 100644 docs/learn/storage/how-storage-works-video.mdx
create mode 100644 docs/learn/storage/how-storage-works.mdx
create mode 100644 docs/learn/storage/simple-storage-sbs.mdx
create mode 100644 docs/learn/storage/simple-storage-video.mdx
create mode 100644 docs/learn/storage/storage-exercise.mdx
create mode 100644 docs/learn/structs/structs-exercise.mdx
create mode 100644 docs/learn/structs/structs-sbs.mdx
create mode 100644 docs/learn/structs/structs-vid.mdx
create mode 100644 docs/learn/welcome.mdx
rename docs/{public => }/llms-full.txt (99%)
create mode 100644 docs/logo/favicon.svg
create mode 100644 docs/logo/logo_dark.svg
create mode 100644 docs/logo/logo_light.svg
create mode 100644 docs/onchainkit/api/build-deposit-to-morpho-tx.mdx
create mode 100644 docs/onchainkit/api/build-mint-transaction.mdx
create mode 100644 docs/onchainkit/api/build-swap-transaction.mdx
create mode 100644 docs/onchainkit/api/build-withdraw-from-morpho-tx.mdx
create mode 100644 docs/onchainkit/api/get-mint-details.mdx
create mode 100644 docs/onchainkit/api/get-portfolios.mdx
create mode 100644 docs/onchainkit/api/get-swap-quote.mdx
create mode 100644 docs/onchainkit/api/get-token-details.mdx
create mode 100644 docs/onchainkit/api/get-tokens.mdx
create mode 100644 docs/onchainkit/api/types.mdx
create mode 100644 docs/onchainkit/appchain/bridge.mdx
create mode 100644 docs/onchainkit/appchain/types.mdx
create mode 100644 docs/onchainkit/buy/buy.mdx
create mode 100644 docs/onchainkit/buy/types.mdx
create mode 100644 docs/onchainkit/checkout/checkout.mdx
create mode 100644 docs/onchainkit/checkout/types.mdx
rename docs/{pages/builderkits => }/onchainkit/config/is-base.mdx (94%)
rename docs/{pages/builderkits => }/onchainkit/config/is-ethereum.mdx (93%)
create mode 100644 docs/onchainkit/config/onchainkit-provider.mdx
create mode 100644 docs/onchainkit/config/supplemental-providers.mdx
create mode 100644 docs/onchainkit/config/types.mdx
create mode 100644 docs/onchainkit/create-a-basename-profile-component.mdx
create mode 100644 docs/onchainkit/earn/earn.mdx
create mode 100644 docs/onchainkit/earn/types.mdx
create mode 100644 docs/onchainkit/fund/fetch-onramp-config.mdx
create mode 100644 docs/onchainkit/fund/fetch-onramp-options.mdx
create mode 100644 docs/onchainkit/fund/fetch-onramp-quote.mdx
create mode 100644 docs/onchainkit/fund/fetch-onramp-transaction-status.mdx
create mode 100644 docs/onchainkit/fund/fund-button.mdx
create mode 100644 docs/onchainkit/fund/fund-card.mdx
create mode 100644 docs/onchainkit/fund/get-onramp-buy-url.mdx
create mode 100644 docs/onchainkit/fund/setup-onramp-event-listeners.mdx
create mode 100644 docs/onchainkit/fund/types.mdx
create mode 100644 docs/onchainkit/getting-started.mdx
create mode 100644 docs/onchainkit/guides/ai-prompting-guide.mdx
create mode 100644 docs/onchainkit/guides/build-onchain-apps.mdx
create mode 100644 docs/onchainkit/guides/contribution.mdx
create mode 100644 docs/onchainkit/guides/lifecycle-status.mdx
create mode 100644 docs/onchainkit/guides/reporting-bug.mdx
create mode 100644 docs/onchainkit/guides/tailwind.mdx
create mode 100644 docs/onchainkit/guides/telemetry.mdx
create mode 100644 docs/onchainkit/guides/themes.mdx
create mode 100644 docs/onchainkit/guides/troubleshooting.mdx
create mode 100644 docs/onchainkit/guides/use-basename-in-onchain-app.mdx
create mode 100644 docs/onchainkit/guides/using-ai-powered-ides.mdx
create mode 100644 docs/onchainkit/hooks/use-build-deposit-to-morpho-tx.mdx
create mode 100644 docs/onchainkit/hooks/use-build-withdraw-from-morpho-tx.mdx
create mode 100644 docs/onchainkit/hooks/use-earn-context.mdx
create mode 100644 docs/onchainkit/hooks/use-mint-details.mdx
create mode 100644 docs/onchainkit/hooks/use-morpho-vault.mdx
create mode 100644 docs/onchainkit/hooks/use-token-details.mdx
create mode 100644 docs/onchainkit/identity/address.mdx
create mode 100644 docs/onchainkit/identity/avatar.mdx
create mode 100644 docs/onchainkit/identity/badge.mdx
create mode 100644 docs/onchainkit/identity/get-address.mdx
create mode 100644 docs/onchainkit/identity/get-attestations.mdx
create mode 100644 docs/onchainkit/identity/get-avatar.mdx
create mode 100644 docs/onchainkit/identity/get-avatars.mdx
create mode 100644 docs/onchainkit/identity/get-name.mdx
create mode 100644 docs/onchainkit/identity/get-names.mdx
create mode 100644 docs/onchainkit/identity/identity-card.mdx
create mode 100644 docs/onchainkit/identity/identity.mdx
create mode 100644 docs/onchainkit/identity/name.mdx
create mode 100644 docs/onchainkit/identity/socials.mdx
create mode 100644 docs/onchainkit/identity/types.mdx
create mode 100644 docs/onchainkit/identity/use-address.mdx
create mode 100644 docs/onchainkit/identity/use-avatar.mdx
create mode 100644 docs/onchainkit/identity/use-avatars.mdx
create mode 100644 docs/onchainkit/identity/use-name.mdx
create mode 100644 docs/onchainkit/identity/use-names.mdx
create mode 100644 docs/onchainkit/installation.mdx
create mode 100644 docs/onchainkit/installation/astro.mdx
create mode 100644 docs/onchainkit/installation/nextjs.mdx
create mode 100644 docs/onchainkit/installation/remix.mdx
create mode 100644 docs/onchainkit/installation/vite.mdx
create mode 100644 docs/onchainkit/mint/nft-card.mdx
create mode 100644 docs/onchainkit/mint/nft-mint-card.mdx
create mode 100644 docs/onchainkit/mint/types.mdx
create mode 100644 docs/onchainkit/paymaster/erc20-paymaster.mdx
create mode 100644 docs/onchainkit/paymaster/errors.mdx
create mode 100644 docs/onchainkit/paymaster/gasless-transactions-with-paymaster.mdx
create mode 100644 docs/onchainkit/paymaster/how-to-contribute.mdx
create mode 100644 docs/onchainkit/paymaster/quickstart-guide.mdx
create mode 100644 docs/onchainkit/paymaster/quickstart-headless.mdx
create mode 100644 docs/onchainkit/paymaster/security.mdx
create mode 100644 docs/onchainkit/paymaster/troubleshooting.mdx
create mode 100644 docs/onchainkit/paymaster/welcome.mdx
create mode 100644 docs/onchainkit/restricted.mdx
create mode 100644 docs/onchainkit/signature/signature.mdx
create mode 100644 docs/onchainkit/signature/types.mdx
create mode 100644 docs/onchainkit/swap/swap-settings.mdx
create mode 100644 docs/onchainkit/swap/swap.mdx
create mode 100644 docs/onchainkit/swap/types.mdx
create mode 100644 docs/onchainkit/templates/onchain-commerce-app.mdx
create mode 100644 docs/onchainkit/templates/onchain-nft-app.mdx
create mode 100644 docs/onchainkit/templates/onchain-social-profile.mdx
create mode 100644 docs/onchainkit/token/format-amount.mdx
create mode 100644 docs/onchainkit/token/token-chip.mdx
create mode 100644 docs/onchainkit/token/token-image.mdx
create mode 100644 docs/onchainkit/token/token-row.mdx
create mode 100644 docs/onchainkit/token/token-search.mdx
create mode 100644 docs/onchainkit/token/token-select-dropdown.mdx
create mode 100644 docs/onchainkit/token/types.mdx
create mode 100644 docs/onchainkit/transaction/transaction.mdx
create mode 100644 docs/onchainkit/transaction/types.mdx
create mode 100644 docs/onchainkit/use-coinbase-smart-wallet-and-eoas.mdx
create mode 100644 docs/onchainkit/wallet/is-valid-aa-entrypoint.mdx
create mode 100644 docs/onchainkit/wallet/is-wallet-a-coinbase-smart-wallet.mdx
create mode 100644 docs/onchainkit/wallet/types.mdx
create mode 100644 docs/onchainkit/wallet/wallet-dropdown-basename.mdx
create mode 100644 docs/onchainkit/wallet/wallet-dropdown-disconnect.mdx
create mode 100644 docs/onchainkit/wallet/wallet-dropdown-fund-link.mdx
create mode 100644 docs/onchainkit/wallet/wallet-dropdown-link.mdx
create mode 100644 docs/onchainkit/wallet/wallet-island.mdx
create mode 100644 docs/onchainkit/wallet/wallet-modal.mdx
create mode 100644 docs/onchainkit/wallet/wallet.mdx
create mode 100644 docs/openapi/onchainkit.yaml
delete mode 100644 docs/pages/builderkits/onchainkit/guides/build-onchain-apps.mdx
delete mode 100644 docs/pages/builderkits/onchainkit/guides/tailwind.mdx
delete mode 100644 docs/pages/builderkits/onchainkit/installation/astro.mdx
delete mode 100644 docs/pages/builderkits/onchainkit/installation/nextjs.mdx
delete mode 100644 docs/pages/builderkits/onchainkit/installation/remix.mdx
delete mode 100644 docs/pages/builderkits/onchainkit/installation/vite.mdx
delete mode 100644 docs/pages/builderkits/onchainkit/transaction/transaction.mdx
delete mode 100644 docs/pages/chain/decentralizing-base-with-optimism.mdx
delete mode 100644 docs/pages/chain/security.mdx
delete mode 100644 docs/pages/feedback.mdx
delete mode 100644 docs/pages/identity/smart-wallet/guides/batch-transactions.mdx
delete mode 100644 docs/pages/identity/smart-wallet/guides/paymasters.mdx
delete mode 100644 docs/pages/identity/smart-wallet/guides/siwe.mdx
delete mode 100644 docs/pages/identity/smart-wallet/guides/spend-permissions.mdx
delete mode 100644 docs/pages/identity/wallet-sdk/existing-welcome-page-features.mdx
delete mode 100644 docs/pages/identity/wallet-sdk/mobile-dapp-integration-via-deep-linking.mdx
delete mode 100644 docs/pages/identity/wallet-sdk/smart-wallet.mdx
delete mode 100644 docs/pages/identity/wallet-sdk/supported-environments.mdx
delete mode 100644 docs/pages/identity/wallet-sdk/ux-guidelines.mdx
delete mode 100644 docs/pages/identity/wallet-sdk/wallet-mobile-sdk.mdx
delete mode 100644 docs/pages/identity/wallet-sdk/wallet-sdk-existing-section.mdx
delete mode 100644 docs/pages/identity/wallet-sdk/wallet-sdk-mobile-sdk.mdx
delete mode 100644 docs/pages/identity/wallet-sdk/xmtp.mdx
delete mode 100644 docs/pages/quickstart.mdx
delete mode 100644 docs/pages/use-cases/accept-crypto-payments.mdx
delete mode 100644 docs/pages/use-cases/ai-instructions/langchain-local.mdx
delete mode 100644 docs/pages/use-cases/ai-instructions/langchain-replit.mdx
delete mode 100644 docs/public/builderkits/minikit/llms.txt
delete mode 100644 docs/public/builderkits/onchainkit/llms.txt
delete mode 100644 docs/public/favicon.ico
delete mode 100644 docs/public/fonts/CoinbaseSans-Medium.woff2
delete mode 100644 docs/public/fonts/CoinbaseSans-Regular.woff
delete mode 100644 docs/public/fonts/Coinbase_Mono-Bold-web.woff2
delete mode 100644 docs/public/fonts/Coinbase_Mono-Extra_Light-web.woff2
delete mode 100644 docs/public/fonts/Coinbase_Mono-Light-web.woff2
delete mode 100644 docs/public/fonts/Coinbase_Mono-Medium-web.woff2
delete mode 100644 docs/public/fonts/Coinbase_Mono-Regular-web.woff2
delete mode 100644 docs/public/fonts/Coinbase_Sans-Bold-web-1.32.woff2
delete mode 100644 docs/public/fonts/Coinbase_Sans-Bold_Italic-web-1.32.woff2
delete mode 100644 docs/public/fonts/Coinbase_Sans-Extra_Light-web-1.32.woff2
delete mode 100644 docs/public/fonts/Coinbase_Sans-Extra_Light_Italic-web-1.32.woff2
delete mode 100644 docs/public/fonts/Coinbase_Sans-Light-web-1.32.woff2
delete mode 100644 docs/public/fonts/Coinbase_Sans-Light_Italic-web-1.32.woff2
delete mode 100644 docs/public/fonts/Coinbase_Sans-Medium_Italic-web-1.32.woff2
delete mode 100644 docs/public/fonts/Coinbase_Sans-Regular_Italic-web-1.32.woff2
delete mode 100644 docs/public/logo.svg
delete mode 100644 docs/public/placeholder.svg
delete mode 100644 docs/public/serve.json
create mode 100644 docs/showcase.mdx
create mode 100644 docs/smart-wallet/concepts/base-gasless-campaign.mdx
create mode 100644 docs/smart-wallet/concepts/features/built-in/MagicSpend.mdx
create mode 100644 docs/smart-wallet/concepts/features/built-in/networks.mdx
create mode 100644 docs/smart-wallet/concepts/features/built-in/passkeys.mdx
create mode 100644 docs/smart-wallet/concepts/features/built-in/recovery-keys.mdx
create mode 100644 docs/smart-wallet/concepts/features/built-in/single-sign-on.mdx
create mode 100644 docs/smart-wallet/concepts/features/optional/batch-operations.mdx
create mode 100644 docs/smart-wallet/concepts/features/optional/custom-gas-tokens.mdx
create mode 100644 docs/smart-wallet/concepts/features/optional/gas-free-transactions.mdx
create mode 100644 docs/smart-wallet/concepts/features/optional/spend-limits.mdx
create mode 100644 docs/smart-wallet/concepts/features/optional/sub-accounts.mdx
create mode 100644 docs/smart-wallet/concepts/usage-details/gas-usage.mdx
create mode 100644 docs/smart-wallet/concepts/usage-details/popups.mdx
create mode 100644 docs/smart-wallet/concepts/usage-details/signature-verification.mdx
create mode 100644 docs/smart-wallet/concepts/usage-details/simulations.mdx
create mode 100644 docs/smart-wallet/concepts/usage-details/unsupported-calls.mdx
create mode 100644 docs/smart-wallet/concepts/usage-details/wallet-library-support.mdx
create mode 100644 docs/smart-wallet/concepts/what-is-smart-wallet.mdx
create mode 100644 docs/smart-wallet/contribute/contribute-to-smart-wallet-docs.mdx
create mode 100644 docs/smart-wallet/contribute/security-and-bug-bounty.mdx
create mode 100644 docs/smart-wallet/examples/coin-a-joke-app.mdx
create mode 100644 docs/smart-wallet/guides/batch-transactions.mdx
create mode 100644 docs/smart-wallet/guides/components/create-wallet-button.mdx
create mode 100644 docs/smart-wallet/guides/erc20-paymasters.mdx
create mode 100644 docs/smart-wallet/guides/magic-spend.mdx
create mode 100644 docs/smart-wallet/guides/paymasters.mdx
create mode 100644 docs/smart-wallet/guides/signature-verification.mdx
create mode 100644 docs/smart-wallet/guides/signing-and-verifying-messages.mdx
create mode 100644 docs/smart-wallet/guides/siwe.mdx
create mode 100644 docs/smart-wallet/guides/spend-limits.mdx
create mode 100644 docs/smart-wallet/guides/sub-accounts.mdx
create mode 100644 docs/smart-wallet/guides/sub-accounts/add-sub-accounts-to-onchainkit-minikit.mdx
create mode 100644 docs/smart-wallet/guides/sub-accounts/index.mdx
create mode 100644 docs/smart-wallet/guides/sub-accounts/setup.mdx
create mode 100644 docs/smart-wallet/guides/sub-accounts/sub-accounts-with-privy.mdx
create mode 100644 docs/smart-wallet/guides/sub-accounts/using-sub-accounts.mdx
create mode 100644 docs/smart-wallet/guides/tips/inspect-txn-simulation.mdx
create mode 100644 docs/smart-wallet/guides/tips/popup-tips.mdx
rename docs/{public/identity => }/smart-wallet/llms.txt (99%)
create mode 100644 docs/smart-wallet/quickstart.mdx
create mode 100644 docs/smart-wallet/quickstart/ai-tools-available-for-devs.mdx
create mode 100644 docs/smart-wallet/quickstart/nextjs-project.mdx
create mode 100644 docs/smart-wallet/quickstart/quick-demo.mdx
create mode 100644 docs/smart-wallet/quickstart/react-native-project.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk.mdx
rename docs/{pages/identity => }/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/Overview.mdx (100%)
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_accounts.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_blockNumber.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_chainId.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_coinbase.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_estimateGas.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_feeHistory.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_gasPrice.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBalance.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByHash.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByNumber.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByHash.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByNumber.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getCode.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getLogs.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getProof.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getStorageAt.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockHashAndIndex.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockNumberAndIndex.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByHash.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionCount.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionReceipt.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockHash.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockNumber.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_requestAccounts.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendRawTransaction.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendTransaction.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_signTypedData_v4.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/personal_sign.mdx
rename docs/{pages/identity => }/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/request-overview.mdx (100%)
rename docs/{pages/identity => }/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/sdk-overview.mdx (100%)
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addEthereumChain.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addSubAccount.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_connect.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_sendCalls.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_switchEthereumChain.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_watchAsset.mdx
create mode 100644 docs/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/web3_clientVersion.mdx
rename docs/{pages/identity => }/smart-wallet/technical-reference/spend-permissions/coinbase-fetchpermissions.mdx (98%)
create mode 100644 docs/smart-wallet/technical-reference/spend-permissions/spendpermissionmanager.mdx
create mode 100644 docs/smart-wallet/technical-reference/sub-account-reference.mdx
create mode 100644 docs/snippets/BrowseCard.mdx
create mode 100644 docs/snippets/BrowseUseCaseCard.mdx
create mode 100644 docs/snippets/Button/index.mdx
create mode 100644 docs/snippets/GithubRepoCard.mdx
create mode 100644 docs/snippets/HomeHeader.mdx
create mode 100644 docs/snippets/HomeWrapper.mdx
create mode 100644 docs/snippets/VideoPlayer.mdx
rename docs/{pages/use-cases => snippets}/ai-instructions/eliza.mdx (90%)
create mode 100644 docs/snippets/ai-instructions/langchain-local.mdx
create mode 100644 docs/snippets/ai-instructions/langchain-replit.mdx
create mode 100644 docs/snippets/ai-powered.mdx
create mode 100644 docs/snippets/base-org/Icon/Icon.mdx
create mode 100644 docs/snippets/danger.mdx
create mode 100644 docs/snippets/headerNoToc.mdx
create mode 100644 docs/snippets/installation-options.mdx
rename docs/{pages/learn => snippets}/learning-objectives.mdx (99%)
create mode 100644 docs/snippets/prompt-library.mdx
create mode 100644 docs/snippets/start-building.mdx
create mode 100644 docs/snippets/svg/agentKitSvg.mdx
create mode 100644 docs/snippets/svg/agentSvg.mdx
create mode 100644 docs/snippets/svg/depositSvg.mdx
create mode 100644 docs/snippets/svg/gaslessSvg.mdx
create mode 100644 docs/snippets/svg/miniKitSvg.mdx
create mode 100644 docs/snippets/svg/onboardingSvg.mdx
create mode 100644 docs/snippets/svg/onchainKitSvg.mdx
create mode 100644 docs/snippets/svg/paymasterSvg.mdx
create mode 100644 docs/snippets/svg/paymentsSvg.mdx
create mode 100644 docs/snippets/svg/smartWalletSvg.mdx
create mode 100644 docs/snippets/svg/socialSvg.mdx
create mode 100644 docs/snippets/svg/verificationsSvg.mdx
delete mode 100644 docs/styles.css
delete mode 100644 docs/utils/logEvent.ts
create mode 100644 docs/wallet-app/build-with-minikit/debugging.mdx
create mode 100644 docs/wallet-app/build-with-minikit/existing-app-integration.mdx
create mode 100644 docs/wallet-app/build-with-minikit/overview.mdx
create mode 100644 docs/wallet-app/build-with-minikit/quickstart.mdx
create mode 100644 docs/wallet-app/guides/thinking-social.mdx
create mode 100644 docs/wallet-app/introduction/beta-faq.mdx
create mode 100644 docs/wallet-app/introduction/getting-started.mdx
create mode 100644 docs/wallet-app/introduction/mini-apps.mdx
delete mode 100644 package.json
delete mode 100644 postcss.config.js
delete mode 100644 scripts/clean-frontmatter.ts
delete mode 100644 scripts/remove-feedback.ts
delete mode 100644 sidebar.ts
create mode 100644 storybook/.gitignore
create mode 100644 storybook/.storybook/main.ts
create mode 100644 storybook/.storybook/preview-head.html
create mode 100644 storybook/.storybook/preview.ts
create mode 100644 storybook/README.md
create mode 100644 storybook/eslint.config.mjs
create mode 100644 storybook/next.config.ts
create mode 100644 storybook/package-lock.json
create mode 100644 storybook/package.json
create mode 100644 storybook/postcss.config.mjs
create mode 100644 storybook/public/file.svg
create mode 100644 storybook/public/globe.svg
create mode 100644 storybook/public/next.svg
create mode 100644 storybook/public/vercel.svg
create mode 100644 storybook/public/window.svg
create mode 100644 storybook/src/app/favicon.ico
create mode 100644 storybook/src/app/globals.css
create mode 100644 storybook/src/app/layout.tsx
create mode 100644 storybook/src/app/page.tsx
create mode 100644 storybook/stories/App.tsx
create mode 100644 storybook/stories/BuyWrapper.stories.tsx
create mode 100644 storybook/stories/CafeUnitTest.stories.tsx
create mode 100644 storybook/stories/Checkout.stories.tsx
create mode 100644 storybook/stories/Earn.stories.tsx
create mode 100644 storybook/stories/Fund/FundButton.stories.tsx
create mode 100644 storybook/stories/Fund/FundCard.stories.tsx
create mode 100644 storybook/stories/Fund/FundWrapper.stories.tsx
create mode 100644 storybook/stories/GithubRepoCard.stories.tsx
create mode 100644 storybook/stories/Identity/Identity.stories.tsx
create mode 100644 storybook/stories/Identity/IdentityAddress.stories.tsx
create mode 100644 storybook/stories/Identity/IdentityAvatar.stories.tsx
create mode 100644 storybook/stories/Identity/IdentityBadge.stories.tsx
create mode 100644 storybook/stories/Identity/IdentityCard.stories.tsx
create mode 100644 storybook/stories/Identity/IdentityName.stories.tsx
create mode 100644 storybook/stories/Identity/IdentitySocials.stories.tsx
create mode 100644 storybook/stories/NFT/NFTCard.stories.tsx
create mode 100644 storybook/stories/NFT/NFTMintCard.stories.tsx
create mode 100644 storybook/stories/SignatureComponents.stories.tsx
create mode 100644 storybook/stories/SubAccount.stories.tsx
create mode 100644 storybook/stories/Swap/Swap.stories.tsx
create mode 100644 storybook/stories/Swap/SwapSettings.stories.tsx
create mode 100644 storybook/stories/Swap/SwapWallet.stories.tsx
rename docs/contexts/Theme.tsx => storybook/stories/ThemeProvider.tsx (61%)
create mode 100644 storybook/stories/Token/TokenChip.stories.tsx
create mode 100644 storybook/stories/Token/TokenImage.stories.tsx
create mode 100644 storybook/stories/Token/TokenRow.stories.tsx
create mode 100644 storybook/stories/Token/TokenSearch.stories.tsx
create mode 100644 storybook/stories/Token/TokenSelectDropdown.stories.tsx
create mode 100644 storybook/stories/Transaction.stories.tsx
create mode 100644 storybook/stories/Wallet/Wallet.stories.tsx
create mode 100644 storybook/stories/Wallet/WalletBasename.stories.tsx
create mode 100644 storybook/stories/Wallet/WalletDisconnect.stories.tsx
create mode 100644 storybook/stories/Wallet/WalletFundLink.stories.tsx
create mode 100644 storybook/stories/Wallet/WalletIsland.stories.tsx
create mode 100644 storybook/stories/Wallet/WalletLink.stories.tsx
create mode 100644 storybook/stories/Wallet/WalletModal.stories.tsx
create mode 100644 storybook/stories/components/App.tsx
rename {docs => storybook/stories}/components/AppDemo.tsx (92%)
rename {docs => storybook/stories}/components/AppWithWalletModal.tsx (88%)
rename {docs => storybook/stories}/components/BrowseCard.tsx (100%)
rename {docs => storybook/stories}/components/BrowseUseCaseCard.tsx (100%)
rename {docs => storybook/stories}/components/Button/index.tsx (81%)
rename {docs => storybook/stories}/components/Button/types.ts (100%)
rename {docs => storybook/stories}/components/BuyWrapper.tsx (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/ArraysUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/BasicMathUnitTest.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/ControlStructuresUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/ERC20UT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/ERC721UT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/ErrorTriageUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/ImportsUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/InheritanceUnitTest.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/MappingsUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/MinimalTokenUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/NewUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/StorageUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-goerli/StructsUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/ArraysUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/BasicMathUnitTest.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/ControlStructuresUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/ERC20UT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/ERC721UT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/ErrorTriageUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/ImportsUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/InheritanceUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/MappingsUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/MinimalTokenUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/NewUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/StorageUT.json (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/assets/deployments/base-sepolia/StructsUT.json (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_01.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_02.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_03.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_04.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_05.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_06.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_07.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_08.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_09.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_10.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_11.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_12.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_13.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_14.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_15.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_16.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_17.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_18.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/Base_Camp_NFT_19.png (100%)
rename {docs/public/images/learn/nft-pins => storybook/stories/components/CafeUnitTest/assets/images}/TestPin.png (100%)
rename {docs => storybook/stories}/components/CafeUnitTest/index.jsx (70%)
rename {docs => storybook/stories}/components/CafeUnitTest/nft-exercise-data.js (100%)
rename {docs => storybook/stories}/components/ClientAnalyticsScript/ClientAnalyticsScript.tsx (100%)
rename {docs => storybook/stories}/components/ClientAnalyticsScript/initCCA.ts (100%)
create mode 100644 storybook/stories/components/ConnectUI.tsx
rename {docs => storybook/stories}/components/CookieManager/CookieManagerProvider.tsx (100%)
rename {docs => storybook/stories}/components/CookieManager/cookieManagerConfig.ts (100%)
rename {docs => storybook/stories}/components/EarnComponents.tsx (100%)
rename {docs => storybook/stories}/components/FundWrapper.tsx (100%)
rename {docs => storybook/stories}/components/GithubRepoCard.tsx (100%)
rename {docs => storybook/stories}/components/HomePage/Hero.tsx (100%)
rename {docs => storybook/stories}/components/HomePage/ProductCard.tsx (100%)
rename {docs => storybook/stories}/components/HomePage/ProductsSection.tsx (100%)
rename {docs => storybook/stories}/components/HomePage/QuickLink.tsx (100%)
rename {docs => storybook/stories}/components/HomePage/QuickStartSection.tsx (100%)
rename {docs => storybook/stories}/components/HomePage/ResourcesSection.tsx (100%)
rename {docs => storybook/stories}/components/InstallationOptions.tsx (100%)
rename {docs => storybook/stories}/components/NFTComponents.tsx (100%)
rename {docs => storybook/stories}/components/SignatureComponents.tsx (98%)
rename {docs => storybook/stories}/components/SmartWalletAITools.tsx (100%)
rename {docs => storybook/stories}/components/SmartWalletQuickstartOptions.tsx (100%)
rename {docs => storybook/stories}/components/StartBuilding.tsx (100%)
rename {docs => storybook/stories}/components/SwapWrapper.tsx (100%)
rename {docs => storybook/stories}/components/TokenSelectorContainer.tsx (100%)
rename {docs => storybook/stories}/components/TransactionWrapper.tsx (100%)
rename {docs => storybook/stories}/components/VideoPlayer.jsx (100%)
rename {docs => storybook/stories}/components/WalletComponents.tsx (100%)
rename {docs => storybook/stories}/components/base-org/Icon/Icon.tsx (100%)
rename {docs => storybook/stories}/components/index.d.ts (100%)
rename {docs => storybook/stories}/components/landing/BuyDemo.tsx (100%)
rename {docs => storybook/stories}/components/landing/CheckoutDemo.tsx (100%)
rename {docs => storybook/stories}/components/landing/ComponentPreview.tsx (100%)
rename {docs => storybook/stories}/components/landing/FundDemo.tsx (100%)
rename {docs => storybook/stories}/components/landing/IdentityCardDemo.tsx (100%)
rename {docs => storybook/stories}/components/landing/LandingFooter.tsx (100%)
rename {docs => storybook/stories}/components/landing/NavigationList.tsx (100%)
rename {docs => storybook/stories}/components/landing/NftMintCardDemo.tsx (100%)
rename {docs => storybook/stories}/components/landing/SwapDemo.tsx (100%)
rename {docs => storybook/stories}/components/landing/TransactionDemo.tsx (100%)
rename {docs => storybook/stories}/components/landing/Tweets.tsx (100%)
rename {docs => storybook/stories}/components/landing/WalletDemo.tsx (100%)
rename {docs => storybook/stories}/components/landing/getHighlightedCode.tsx (100%)
rename {docs => storybook/stories}/components/smart-wallet/Illustration.tsx (100%)
rename {docs => storybook/stories}/components/smart-wallet/SubAccount.tsx (72%)
rename {docs => storybook/stories}/components/svg/AgentKitSvgSW.tsx (100%)
rename {docs => storybook/stories}/components/svg/CopySvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/LLMsTxtSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/McpSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/NextjsSvgSW.tsx (100%)
rename {docs => storybook/stories}/components/svg/OnchainKit.svg (100%)
rename {docs => storybook/stories}/components/svg/OnchainKitSvgSW.tsx (100%)
rename {docs => storybook/stories}/components/svg/ReactNativeSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/agentKitSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/agentSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/appchainsSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/astroSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/checkSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/closeSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/coinbasePaySvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/depositSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/fundSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/gaslessSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/identitySvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/miniKitSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/nextjsSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/onboardingSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/onchainKitSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/paymasterSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/paymentsSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/remixSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/smartWalletSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/socialSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/swapSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/tokensSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/transactionSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/verificationsSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/viteSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/walletDropdownLinkCustomBaseIconSvg.tsx (100%)
rename {docs => storybook/stories}/components/svg/walletSvg.tsx (100%)
create mode 100644 storybook/tsconfig.json
delete mode 100644 styles/globals.css
delete mode 100644 tailwind.config.js
delete mode 100644 tsconfig.json
delete mode 100644 utils/check-image-refs.js
delete mode 100644 utils/check-image-refs.ts
delete mode 100644 utils/use-check-image-refs.js
delete mode 100644 vite-env.d.ts
delete mode 100644 vocs.config.tsx
delete mode 100644 yarn.lock
diff --git a/.cursor/rules/mintlify.mdc b/.cursor/rules/mintlify.mdc
new file mode 100644
index 00000000..63042356
--- /dev/null
+++ b/.cursor/rules/mintlify.mdc
@@ -0,0 +1,368 @@
+---
+description: Update anything with mintlify or style of a written article
+globs:
+alwaysApply: false
+---
+---
+description: Mintlify writing assistant guidelines
+type: always
+---
+# Mintlify technical writing assistant
+
+You are an AI writing assistant specialized in creating exceptional technical documentation using Mintlify components and following industry-leading technical writing practices.
+
+## Core writing principles
+
+### Language and style requirements
+- Use clear, direct language appropriate for technical audiences
+- Write in second person ("you") for instructions and procedures
+- Use active voice over passive voice
+- Employ present tense for current states, future tense for outcomes
+- Maintain consistent terminology throughout all documentation
+- Keep sentences concise while providing necessary context
+- Use parallel structure in lists, headings, and procedures
+
+### Content organization standards
+- Lead with the most important information (inverted pyramid structure)
+- Use progressive disclosure: basic concepts before advanced ones
+- Break complex procedures into numbered steps
+- Include prerequisites and context before instructions
+- Provide expected outcomes for each major step
+- End sections with next steps or related information
+- Use descriptive, keyword-rich headings for navigation and SEO
+
+### User-centered approach
+- Focus on user goals and outcomes rather than system features
+- Anticipate common questions and address them proactively
+- Include troubleshooting for likely failure points
+- Provide multiple pathways when appropriate (beginner vs advanced), but offer an opinionated path for people to follow to avoid overwhelming with options
+
+## Mintlify component reference
+
+### Callout components
+
+#### Note - Additional helpful information
+
+
+Supplementary information that supports the main content without interrupting flow
+
+
+#### Tip - Best practices and pro tips
+
+
+Expert advice, shortcuts, or best practices that enhance user success
+
+
+#### Warning - Important cautions
+
+
+Critical information about potential issues, breaking changes, or destructive actions
+
+
+#### Info - Neutral contextual information
+
+
+Background information, context, or neutral announcements
+
+
+#### Check - Success confirmations
+
+
+Positive confirmations, successful completions, or achievement indicators
+
+
+### Code components
+
+#### Single code block
+
+```javascript config.js
+const apiConfig = {
+baseURL: 'https://api.example.com',
+timeout: 5000,
+headers: {
+ 'Authorization': `Bearer ${process.env.API_TOKEN}`
+}
+};
+```
+
+#### Code group with multiple languages
+
+
+```javascript Node.js
+const response = await fetch('/api/endpoint', {
+ headers: { Authorization: `Bearer ${apiKey}` }
+});
+```
+
+```python Python
+import requests
+response = requests.get('/api/endpoint',
+ headers={'Authorization': f'Bearer {api_key}'})
+```
+
+```curl cURL
+curl -X GET '/api/endpoint' \
+ -H 'Authorization: Bearer YOUR_API_KEY'
+```
+
+
+#### Request/Response examples
+
+
+```bash cURL
+curl -X POST 'https://api.example.com/users' \
+ -H 'Content-Type: application/json' \
+ -d '{"name": "John Doe", "email": "john@example.com"}'
+```
+
+
+
+```json Success
+{
+ "id": "user_123",
+ "name": "John Doe",
+ "email": "john@example.com",
+ "created_at": "2024-01-15T10:30:00Z"
+}
+```
+
+
+### Structural components
+
+#### Steps for procedures
+
+
+
+ Run `npm install` to install required packages.
+
+
+ Verify installation by running `npm list`.
+
+
+
+
+ Create a `.env` file with your API credentials.
+
+ ```bash
+ API_KEY=your_api_key_here
+ ```
+
+
+ Never commit API keys to version control.
+
+
+
+
+#### Tabs for alternative content
+
+
+
+ ```bash
+ brew install node
+ npm install -g package-name
+ ```
+
+
+
+ ```powershell
+ choco install nodejs
+ npm install -g package-name
+ ```
+
+
+
+ ```bash
+ sudo apt install nodejs npm
+ npm install -g package-name
+ ```
+
+
+
+#### Accordions for collapsible content
+
+
+
+ - **Firewall blocking**: Ensure ports 80 and 443 are open
+ - **Proxy configuration**: Set HTTP_PROXY environment variable
+ - **DNS resolution**: Try using 8.8.8.8 as DNS server
+
+
+
+ ```javascript
+ const config = {
+ performance: { cache: true, timeout: 30000 },
+ security: { encryption: 'AES-256' }
+ };
+ ```
+
+
+
+### API documentation components
+
+#### Parameter fields
+
+
+Unique identifier for the user. Must be a valid UUID v4 format.
+
+
+
+User's email address. Must be valid and unique within the system.
+
+
+
+Maximum number of results to return. Range: 1-100.
+
+
+
+Bearer token for API authentication. Format: `Bearer YOUR_API_KEY`
+
+
+#### Response fields
+
+
+Unique identifier assigned to the newly created user.
+
+
+
+ISO 8601 formatted timestamp of when the user was created.
+
+
+
+List of permission strings assigned to this user.
+
+
+#### Expandable nested fields
+
+
+Complete user object with all associated data.
+
+
+
+ User profile information including personal details.
+
+
+
+ User's first name as entered during registration.
+
+
+
+ URL to user's profile picture. Returns null if no avatar is set.
+
+
+
+
+
+
+### Interactive components
+
+#### Cards for navigation
+
+
+Complete walkthrough from installation to your first API call in under 10 minutes.
+
+
+
+
+ Learn how to authenticate requests using API keys or JWT tokens.
+
+
+
+ Understand rate limits and best practices for high-volume usage.
+
+
+
+### Media and advanced components
+
+#### Frames for images
+
+Wrap all images in frames.
+
+
+
+
+
+
+
+
+
+#### Tooltips and updates
+
+
+API
+
+
+
+## New features
+- Added bulk user import functionality
+- Improved error messages with actionable suggestions
+
+## Bug fixes
+- Fixed pagination issue with large datasets
+- Resolved authentication timeout problems
+
+
+## Required page structure
+
+Every documentation page must begin with YAML frontmatter:
+
+```yaml
+---
+title: "Clear, specific, keyword-rich title"
+description: "Concise description explaining page purpose and value"
+---
+```
+
+## Content quality standards
+
+### Code examples requirements
+- Always include complete, runnable examples that users can copy and execute
+- Show proper error handling and edge case management
+- Use realistic data instead of placeholder values
+- Include expected outputs and results for verification
+- Test all code examples thoroughly before publishing
+- Specify language and include filename when relevant
+- Add explanatory comments for complex logic
+
+### API documentation requirements
+- Document all parameters including optional ones with clear descriptions
+- Show both success and error response examples with realistic data
+- Include rate limiting information with specific limits
+- Provide authentication examples showing proper format
+- Explain all HTTP status codes and error handling
+- Cover complete request/response cycles
+
+### Accessibility requirements
+- Include descriptive alt text for all images and diagrams
+- Use specific, actionable link text instead of "click here"
+- Ensure proper heading hierarchy starting with H2
+- Provide keyboard navigation considerations
+- Use sufficient color contrast in examples and visuals
+- Structure content for easy scanning with headers and lists
+
+## AI assistant instructions
+
+### Component selection logic
+- Use **Steps** for procedures, tutorials, setup guides, and sequential instructions
+- Use **Tabs** for platform-specific content or alternative approaches
+- Use **CodeGroup** when showing the same concept in multiple languages
+- Use **Accordions** for supplementary information that might interrupt flow
+- Use **Cards and CardGroup** for navigation, feature overviews, and related resources
+- Use **RequestExample/ResponseExample** specifically for API endpoint documentation
+- Use **ParamField** for API parameters, **ResponseField** for API responses
+- Use **Expandable** for nested object properties or hierarchical information
+
+### Quality assurance checklist
+- Verify all code examples are syntactically correct and executable
+- Test all links to ensure they are functional and lead to relevant content
+- Validate Mintlify component syntax with all required properties
+- Confirm proper heading hierarchy with H2 for main sections, H3 for subsections
+- Ensure content flows logically from basic concepts to advanced topics
+- Check for consistency in terminology, formatting, and component usage
+
+### Error prevention strategies
+- Always include realistic error handling in code examples
+- Provide dedicated troubleshooting sections for complex procedures
+- Explain prerequisites clearly before beginning instructions
+- Include verification and testing steps with expected outcomes
+- Add appropriate warnings for destructive or security-sensitive actions
+- Validate all technical information through testing before publication
\ No newline at end of file
diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml
new file mode 100644
index 00000000..d09b48c8
--- /dev/null
+++ b/.github/workflows/chromatic.yml
@@ -0,0 +1,19 @@
+name: "Chromatic Publish"
+
+on: push
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Install dependencies
+ run: cd storybook && yarn install
+ - uses: chromaui/action@latest
+ with:
+ workingDir: storybook
+ buildScriptName: build-storybook
+ projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
+ onlyChanged: true
diff --git a/.gitignore b/.gitignore
index 96c8d6e6..c69f085f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,80 +1,47 @@
-.env
-# Node stuff
-node_modules
-yarn-debug.log*
-yarn-error.log*
-docs/dist/
-docs/build/
-vocs.config.tsx.timestamp*
-
-# OS ignores
-.DS_Store
-
-# Xcode
-**/ios/build/
-**/ios/derived_data/
-*.pbxuser
-!default.pbxuser
-*.mode1v3
-!default.mode1v3
-*.mode2v3
-!default.mode2v3
-*.perspectivev3
-!default.perspectivev3
-xcuserdata
-*.xccheckout
-*.moved-aside
-DerivedData
-*.hmap
-*.ipa
-*.xcuserstate
-*.xcworkspace
-Pods/
-
-# Android/IntelliJ
-**/android/build/
-**/android/app/build/
-.idea
-.gradle
-local.properties
-*.iml
-*.hprof
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-# Nx/Builds
-.docusaurus
-.next
-.nx
-cjs/
-dts/
-esm/
-lib/
-mjs/
-out/
-*.tsbuildinfo
-
-# Yarn
+# dependencies
+/node_modules
+/.pnp
+.pnp.*
.yarn/*
!.yarn/patches
-!.yarn/releases
!.yarn/plugins
-!.yarn/sdks
+!.yarn/releases
!.yarn/versions
-.pnp.*
-# prevent people from accidentally committing a package-lock
-package-lock.json
-# Env files
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
+# testing
+/coverage
-# GraphQL
-schema.graphql
-persisted_queries.json
-**/*.graphql.ts
+# next.js
+/.next/
+/out/
-# eslint
-.eslintcache
+# production
+/build
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# env files (can opt-in for committing if needed)
+.env*
+
+# vercel
.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+*storybook.log
+
+*.py
+
+.mintlify-latest
diff --git a/.nvmrc b/.nvmrc
deleted file mode 100644
index 25bf17fc..00000000
--- a/.nvmrc
+++ /dev/null
@@ -1 +0,0 @@
-18
\ No newline at end of file
diff --git a/.yarnrc.yml b/.yarnrc.yml
deleted file mode 100644
index 8b757b29..00000000
--- a/.yarnrc.yml
+++ /dev/null
@@ -1 +0,0 @@
-nodeLinker: node-modules
\ No newline at end of file
diff --git a/README.md b/README.md
index ec463b2e..6730885a 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,30 @@
-This is a [Vocs](https://vocs.dev) project bootstrapped with the Vocs CLI.
+### Development
-# Creating New Docs
+Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation changes locally. To install, use the following command
-You can create a new doc by adding a `.md` or `.mdx` file in
-`apps/base-docs/docs/pages`.
+```
+npm i -g mintlify
+```
-The URL path for your doc will map to the file location. For instance, `bounty.mdx`
-is found within `chain/security`. So the URL for this link will be:
-`docs.base.org/chain/security/bounty`.
+Run the following command at the root of your documentation (where docs.json is)
+```
+mintlify dev
+```
-# Running Docs Locally
+### Publishing Changes
-Follow these steps to run Base-Docs locally:
+Install our Github App to auto propagate changes from your repo to your deployment. Changes will be deployed to production automatically after pushing to the default branch. Find the link to install on your dashboard.
-1. Clone repo
+#### Troubleshooting
-2. Enable yarn by running `corepack enable`
+- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies.
+- Page loads as a 404 - Make sure you are running in a folder with `docs.json`
-3. Make sure you have installed all dependencies by running `yarn install` at
-the top-level
+### Storybook for hosting UI components
-4. `yarn build`
+Checkout the [storybook README](storybook/README.md) for more information.
-4. Start development server by running `yarn dev`
+### TODO
+- [ ] Add github action to deploy storybook to chromatic whenever there is a push to the `main` branch and only changes in `storybook` folder
diff --git a/docs/pages/arbitration.mdx b/_pages/arbitration.mdx
similarity index 100%
rename from docs/pages/arbitration.mdx
rename to _pages/arbitration.mdx
diff --git a/docs/pages/base-services-hub.mdx b/_pages/base-services-hub.mdx
similarity index 100%
rename from docs/pages/base-services-hub.mdx
rename to _pages/base-services-hub.mdx
diff --git a/docs/pages/buildathons/2025-02-flash.mdx b/_pages/buildathons/2025-02-flash.mdx
similarity index 65%
rename from docs/pages/buildathons/2025-02-flash.mdx
rename to _pages/buildathons/2025-02-flash.mdx
index 942e3f55..f5f48990 100644
--- a/docs/pages/buildathons/2025-02-flash.mdx
+++ b/_pages/buildathons/2025-02-flash.mdx
@@ -1,4 +1,7 @@
-# Buildathon: 2025-02-flash
+---
+title: "Buildathon: 2025-02-flash"
+---
+
## Flashblocks Builder Side Quest
@@ -37,43 +40,43 @@ A total of **2 ETH** in prizes with the 1st place receiving 1 ETH.
## Start Building
-:::info
+
Visit our [Flashblocks page](https://www.base.org/flashblocks) for comprehensive documentation on how to build with Flashblocks, including detailed examples and response formats.
-:::
-
-Flashblocks is enabled for developers on Base Sepolia, providing ultra-fast 200-millisecond block times. You can integrate with Flashblocks in two ways:
-
-:::steps
-
-### Flashblock WebSocket endpoint
-
-Stream real-time block updates over a WebSocket connection at:
-
-```
-wss://sepolia.flashblocks.base.org/ws
-```
-
-This endpoint returns a stream of Flashblocks with differential data between blocks to minimize bandwidth usage. The initial block contains complete data while subsequent blocks only include changes.
+
-### Flashblock RPC endpoint
-Query the Flashblocks-aware RPC endpoint at:
-
-```
-https://sepolia-preconf.base.org
-```
-
-This endpoint supports all standard Ethereum JSON-RPC methods plus Flashblocks-specific functionality. You can use the `pending` tag to retrieve the latest Flashblock:
-
-```bash
-curl https://sepolia-preconf.base.org \
- -X POST \
- -H "Content-Type: application/json" \
- -d '{
- "jsonrpc": "2.0",
- "method": "eth_getBlockByNumber",
- "params": ["pending", true],
- "id": 1
- }'
-```
+Flashblocks is enabled for developers on Base Sepolia, providing ultra-fast 200-millisecond block times. You can integrate with Flashblocks in two ways:
+
+
+ Stream real-time block updates over a WebSocket connection at:
+
+ ```
+ wss://sepolia.flashblocks.base.org/ws
+ ```
+
+ This endpoint returns a stream of Flashblocks with differential data between blocks to minimize bandwidth usage. The initial block contains complete data while subsequent blocks only include changes.
+
+
+
+ Query the Flashblocks-aware RPC endpoint at:
+
+ ```
+ https://sepolia-preconf.base.org
+ ```
+
+ This endpoint supports all standard Ethereum JSON-RPC methods plus Flashblocks-specific functionality. You can use the `pending` tag to retrieve the latest Flashblock:
+
+ ```bash
+ curl https://sepolia-preconf.base.org \
+ -X POST \
+ -H "Content-Type: application/json" \
+ -d '{
+ "jsonrpc": "2.0",
+ "method": "eth_getBlockByNumber",
+ "params": ["pending", true],
+ "id": 1
+ }'
+ ```
+
+
diff --git a/docs/pages/builderkits/agentkit/index.mdx b/_pages/builderkits/agentkit/index.mdx
similarity index 100%
rename from docs/pages/builderkits/agentkit/index.mdx
rename to _pages/builderkits/agentkit/index.mdx
diff --git a/docs/pages/builderkits/minikit/debugging.mdx b/_pages/builderkits/minikit/debugging.mdx
similarity index 97%
rename from docs/pages/builderkits/minikit/debugging.mdx
rename to _pages/builderkits/minikit/debugging.mdx
index 2845d387..e6d9eae5 100644
--- a/docs/pages/builderkits/minikit/debugging.mdx
+++ b/_pages/builderkits/minikit/debugging.mdx
@@ -1,4 +1,7 @@
-# Common Issues & Debugging
+---
+title: "Common Issues & Debugging"
+---
+
This section outlines frequent issues encountered during the development of Mini Apps and how to resolve them.
@@ -79,8 +82,7 @@ This is often caused by a farcaster.json file that was signed using the wrong wa
To sign with the correct identity, import your Farcaster custody key into an external wallet:
-:::info
-
+
To sign with the correct identity, import your Farcaster custody key into an external wallet:
1. Open the Warpcast mobile app
@@ -92,8 +94,8 @@ To sign with the correct identity, import your Farcaster custody key into an ext
4. Import the phrase into a compatible wallet (e.g., Coinbase Wallet Mobile App, MetaMask or Rabby)
5. Use this wallet for signing the `accountAssociation` payload
+
-:::
### Manifest Signing Utility
@@ -105,9 +107,10 @@ Run the following to initiate the manifest signing workflow:
This CLI will open the signing UI in your browser and update local .env values automatically.
-:::info
+
This is required for generating valid signed manifests that link your domain to your Farcaster identity.
-:::
+
+
## Developer Tools
diff --git a/docs/pages/builderkits/minikit/overview.mdx b/_pages/builderkits/minikit/overview.mdx
similarity index 95%
rename from docs/pages/builderkits/minikit/overview.mdx
rename to _pages/builderkits/minikit/overview.mdx
index 4977ee8b..efd73d48 100644
--- a/docs/pages/builderkits/minikit/overview.mdx
+++ b/_pages/builderkits/minikit/overview.mdx
@@ -47,9 +47,10 @@ This command will:
After running the command, follow the prompts to configure your project.
-:::info
+
We recommend using [Vercel](https://vercel.com) to deploy your MiniKit app, as it integrates seamlessly with the upstash/redis backend required for frames, webhooks, and notifications. The CLI will guide you through setting up the necessary environment variables for your Redis database.
-:::
+
+
## Provider
@@ -160,9 +161,10 @@ const handleSendNotification = () => {
};
```
-:::info
+
Notifications require a backend proxy to avoid CORS restrictions. The CLI automatically sets up this proxy at `/api/notification`, but you can override this in the `MiniKitProvider`.
-:::
+
+
### useOpenUrl
@@ -234,9 +236,10 @@ const handleSignIn = async () => {
};
```
-:::info
+
Authentication requires additional setup utilizing an auth framework like next/auth or manually integrating session storage and route/component authentication.
-:::
+
+
## CLI
@@ -256,9 +259,10 @@ The CLI creates an application with:
- Uses upstash/redis for data storage (compatible with Vercel)
- Requires users to sign up for an upstash/redis account and add their key and URL to the .env file
- :::info
- The CLI creates both frontend and backend components to support adding frames, webhooks, and notifications. While a frontend-only option was considered, the ability to add frames and handle notifications requires backend support. If you don't need these features, you can easily remove the database and related routes after project creation.
- :::
+
+ The CLI creates both frontend and backend components to support adding frames, webhooks, and notifications. While a frontend-only option was considered, the ability to add frames and handle notifications requires backend support. If you don't need these features, you can easily remove the database and related routes after project creation.
+
+
2. **Account Association Generation**
diff --git a/docs/pages/builderkits/minikit/quickstart.mdx b/_pages/builderkits/minikit/quickstart.mdx
similarity index 87%
rename from docs/pages/builderkits/minikit/quickstart.mdx
rename to _pages/builderkits/minikit/quickstart.mdx
index 84dac4e8..f032da67 100644
--- a/docs/pages/builderkits/minikit/quickstart.mdx
+++ b/_pages/builderkits/minikit/quickstart.mdx
@@ -1,6 +1,6 @@
-import { Callout } from 'vocs/components'
-
-# MiniKit Quickstart
+---
+title: "MiniKit Quickstart"
+---
This guide shows you how to get started with MiniKit, the easist way to build mini apps on Base! It can also be used to update an exisitng standalone app to a mini app. We'll start by setting up the template project with the CLI tool and then explore both built-in and additional features of MiniKit.
@@ -18,34 +18,31 @@ A mini app is a lightweight web app that runs directly inside [Farcaster Frames]
## Initial Setup
-:::steps
-
-## Create a new MiniKit project using the CLI:
-
-```bash
-npx create-onchain --mini
-```
-
-## When prompted, enter your CDP Client API key.
-
-You can get a CDP API key by going to the (CDP Portal)[portal.cdp.coinbase.com] and navigating API Keys -> Client API Key.
+
+
+ ```bash
+ npx create-onchain --mini
+ ```
+
+
+ You can get a CDP API key by going to the (CDP Portal)[portal.cdp.coinbase.com] and navigating API Keys -> Client API Key.
+
+
+ You will be asked if you'd like to set up your manifest. You can skip the manifest setup step as we'll handle that separately once we know our project's URL.
+
+
+ ```bash [Terminal]
+ cd your-project-name
+ npm install
+ npm run dev
+ ```
+
+
+ These docs are LLM-friendly—reference [llms.txt](https://docs.base.org/builderkits/minikit/llms.txt) in your code editor to streamline builds and prompt smarter.
+
+
+
-## Skip Frames Account Manifest Setup
-
-You will be asked if you'd like to set up your manifest. You can skip the manifest setup step as we'll handle that separately once we know our project's URL.
-
-## Navigate to your project directory and install dependencies:
-
-```bash [Terminal]
-cd your-project-name
-npm install
-npm run dev
-```
-
-
- These docs are LLM-friendly—reference [llms.txt](https://docs.base.org/builderkits/minikit/llms.txt) in your code editor to streamline builds and prompt smarter.
-
-:::
## Testing Your Mini App
@@ -54,11 +51,15 @@ To test your Mini App in Warpcast, you'll need a live URL.
We recommend using [Vercel](https://vercel.com) to deploy your MiniKit app, as it integrates seamlessly with the upstash/redis backend required for stateful frames, webhooks, and notifications.
Alternatively, you can use ngrok to tunnel your localhost to a live url.
-::::details[Using ngrok]
-:::warning[Pitfalls]
+
+
+
+**Pitfalls**
+
To successfully test your app, you'll need the paid version of ngrok. The free veresion has an approval screen which can break the frame manifest. Also the url for the free version will change every time requiring you to update the manifest each time you start a new ngrok tunnel.
-:::
+
+
1. Start your development server:
@@ -82,25 +83,31 @@ ngrok http 3000
5. In the "Preview Frames" section, paste your ngrok URL to test your mini app.
-::::
+
### Deploying to Vercel
-:::steps
-
-#### Install Vercel CLI: `npm install -g vercel`
-
-#### Deploy with the command: `vercel`
-
-#### Set environment variables in your Vercel project settings (you can use `vercel env add` to set these up via CLI):
-
-- NEXT_PUBLIC_CDP_CLIENT_API_KEY (from [CDP Portal](https://portal.cdp.coinbase.com))
-- NEXT_PUBLIC_URL (deployed app URL)
-- NEXT_PUBLIC_IMAGE_URL (optional)
-- NEXT_PUBLIC_SPLASH_IMAGE_URL (optional)
-- NEXT_PUBLIC_SPLASH_BACKGROUND_COLORs
-
-:::
+
+
+ ```sh
+ npm install -g vercel
+ ```
+
+
+ ```sh
+ vercel
+ ```
+
+
+ You can use `vercel env add` to set these up via CLI:
+
+ - NEXT_PUBLIC_CDP_CLIENT_API_KEY (from [CDP Portal](https://portal.cdp.coinbase.com))
+ - NEXT_PUBLIC_URL (deployed app URL)
+ - NEXT_PUBLIC_IMAGE_URL (optional)
+ - NEXT_PUBLIC_SPLASH_IMAGE_URL (optional)
+ - NEXT_PUBLIC_SPLASH_BACKGROUND_COLORs
+
+
You can now test your mini app:
@@ -206,9 +213,12 @@ const handleAddFrame = async () => {
}
```
-:::warning[Not for Production]
+
+**Not for Production**
+
In production, you'll want to save the url and token associated with each user in a persistent database so that you can send them notifications over time.
-:::
+
+
### useOpenUrl
@@ -351,9 +361,10 @@ const handleSendNotification = async () => {
)}
```
-:::info
+
Notice that we first check if the user has added the frame to their list of mini apps before displaying the button. This is using the `context` object provided by `useMiniKit()`. If you don't see the button to send the notification, its likely because mini app hasn't been saved.
-:::
+
+
## Conclusion
diff --git a/docs/pages/builderkits/minikit/thinking-social.mdx b/_pages/builderkits/minikit/thinking-social.mdx
similarity index 99%
rename from docs/pages/builderkits/minikit/thinking-social.mdx
rename to _pages/builderkits/minikit/thinking-social.mdx
index 2e8bcefb..4ca6f4d7 100644
--- a/docs/pages/builderkits/minikit/thinking-social.mdx
+++ b/_pages/builderkits/minikit/thinking-social.mdx
@@ -1,4 +1,7 @@
-# Thinking Social
+---
+title: "Thinking Social"
+---
+
**Designing mini apps that people actually come back to.**
diff --git a/docs/pages/builderkits/onchainkit/api/build-deposit-to-morpho-tx.mdx b/_pages/builderkits/onchainkit/api/build-deposit-to-morpho-tx.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/api/build-deposit-to-morpho-tx.mdx
rename to _pages/builderkits/onchainkit/api/build-deposit-to-morpho-tx.mdx
index 9223d0b4..c76d4db6 100644
--- a/docs/pages/builderkits/onchainkit/api/build-deposit-to-morpho-tx.mdx
+++ b/_pages/builderkits/onchainkit/api/build-deposit-to-morpho-tx.mdx
@@ -1,4 +1,7 @@
-# `buildDepositToMorphoTx`
+---
+title: "`buildDepositToMorphoTx`"
+---
+
The `buildDepositToMorphoTx` function is used to build [Calls](/builderkits/onchainkit/transaction/types#calls) for depositing an asset to Morpho. These calls can be passed the `` component to send a transaction.
diff --git a/docs/pages/builderkits/onchainkit/api/build-mint-transaction.mdx b/_pages/builderkits/onchainkit/api/build-mint-transaction.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/api/build-mint-transaction.mdx
rename to _pages/builderkits/onchainkit/api/build-mint-transaction.mdx
index 945c33e1..c4da29d8 100644
--- a/docs/pages/builderkits/onchainkit/api/build-mint-transaction.mdx
+++ b/_pages/builderkits/onchainkit/api/build-mint-transaction.mdx
@@ -1,4 +1,7 @@
-# `buildMintTransaction`
+---
+title: "`buildMintTransaction`"
+---
+
The `buildMintTransaction` function is used to get an unsigned transaction for minting an NFT.
@@ -6,8 +9,7 @@ Before using them, make sure to obtain a [Client API Key](https://portal.cdp.coi
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { setOnchainKitConfig } from '@coinbase/onchainkit';
import { buildMintTransaction } from '@coinbase/onchainkit/api';
@@ -31,8 +33,7 @@ const response = await buildMintTransaction({
}
}
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/api/build-swap-transaction.mdx b/_pages/builderkits/onchainkit/api/build-swap-transaction.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/api/build-swap-transaction.mdx
rename to _pages/builderkits/onchainkit/api/build-swap-transaction.mdx
index d2ef79cf..9d1a60ba 100644
--- a/docs/pages/builderkits/onchainkit/api/build-swap-transaction.mdx
+++ b/_pages/builderkits/onchainkit/api/build-swap-transaction.mdx
@@ -1,4 +1,7 @@
-# `buildSwapTransaction`
+---
+title: "`buildSwapTransaction`"
+---
+
The `buildSwapTransaction` function is used to get an unsigned transaction for a swap between two Tokens.
@@ -6,8 +9,7 @@ Before using this function, make sure to obtain a [Client API Key](https://porta
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { setOnchainKitConfig } from '@coinbase/onchainkit';
import { buildSwapTransaction } from '@coinbase/onchainkit/api';
@@ -112,8 +114,7 @@ const response = await buildSwapTransaction({
}
}
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/api/build-withdraw-from-morpho-tx.mdx b/_pages/builderkits/onchainkit/api/build-withdraw-from-morpho-tx.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/api/build-withdraw-from-morpho-tx.mdx
rename to _pages/builderkits/onchainkit/api/build-withdraw-from-morpho-tx.mdx
index d32d7fbd..bbd245a4 100644
--- a/docs/pages/builderkits/onchainkit/api/build-withdraw-from-morpho-tx.mdx
+++ b/_pages/builderkits/onchainkit/api/build-withdraw-from-morpho-tx.mdx
@@ -1,4 +1,7 @@
-# `buildWithdrawFromMorphoTx`
+---
+title: "`buildWithdrawFromMorphoTx`"
+---
+
The `buildWithdrawFromMorphoTx` function is used to build [Calls](/builderkits/onchainkit/transaction/types#calls) for withdrawing an asset from Morpho. These calls can be passed the `` component to send a transaction.
diff --git a/docs/pages/builderkits/onchainkit/api/get-mint-details.mdx b/_pages/builderkits/onchainkit/api/get-mint-details.mdx
similarity index 96%
rename from docs/pages/builderkits/onchainkit/api/get-mint-details.mdx
rename to _pages/builderkits/onchainkit/api/get-mint-details.mdx
index 2cb0632f..4c690d0d 100644
--- a/docs/pages/builderkits/onchainkit/api/get-mint-details.mdx
+++ b/_pages/builderkits/onchainkit/api/get-mint-details.mdx
@@ -1,4 +1,7 @@
-# `getMintDetails`
+---
+title: "`getMintDetails`"
+---
+
The `getMintDetails` function returns data required to view an NFT to be minted
@@ -6,8 +9,7 @@ Before using them, make sure to obtain a [Client API Key](https://portal.cdp.coi
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { setOnchainKitConfig } from '@coinbase/onchainkit';
import { getMintDetails } from '@coinbase/onchainkit/api';
@@ -45,8 +47,7 @@ const response = await getMintDetails({
"totalOwners": "200"
}
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/api/get-portfolios.mdx b/_pages/builderkits/onchainkit/api/get-portfolios.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/api/get-portfolios.mdx
rename to _pages/builderkits/onchainkit/api/get-portfolios.mdx
index 6e2d0ab4..fcc6bec4 100644
--- a/docs/pages/builderkits/onchainkit/api/get-portfolios.mdx
+++ b/_pages/builderkits/onchainkit/api/get-portfolios.mdx
@@ -1,24 +1,28 @@
-# `getPortfolios`
+---
+title: "`getPortfolios`"
+---
+
The `getPortfolios` function returns an object containing an array of
portfolios for the provided addresses. Each portfolio is an object with the address
of the wallet, the fiat value of the portfolio, and an array of tokens held by the
provided address.
-:::info
+
Before using this endpoint, make sure to obtain a [Client API Key](https://portal.cdp.coinbase.com/projects/api-keys/client-key)
from Coinbase Developer Platform.
-:::
+
+
-:::info
+
Please note: `getPortfolios` is only available for Base mainnet and Ethereum mainnet.
You can control the network in the `OnchainKitProvider` by setting the `chain` prop.
-:::
+
-## Usage
-:::code-group
+## Usage
+
```tsx twoslash [code]
import { setOnchainKitConfig } from '@coinbase/onchainkit';
import { getPortfolios } from '@coinbase/onchainkit/api';
@@ -46,8 +50,7 @@ const response = await getPortfolios({
}
]
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/api/get-swap-quote.mdx b/_pages/builderkits/onchainkit/api/get-swap-quote.mdx
similarity index 97%
rename from docs/pages/builderkits/onchainkit/api/get-swap-quote.mdx
rename to _pages/builderkits/onchainkit/api/get-swap-quote.mdx
index 27e9009e..5434d955 100644
--- a/docs/pages/builderkits/onchainkit/api/get-swap-quote.mdx
+++ b/_pages/builderkits/onchainkit/api/get-swap-quote.mdx
@@ -1,4 +1,7 @@
-# `getSwapQuote`
+---
+title: "`getSwapQuote`"
+---
+
The `getSwapQuote` function is used to get a quote for a swap between two Tokens.
@@ -6,8 +9,7 @@ Before using them, make sure to obtain a [Client API Key](https://portal.cdp.coi
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { setOnchainKitConfig } from '@coinbase/onchainkit';
import { getSwapQuote } from '@coinbase/onchainkit/api';
@@ -73,8 +75,7 @@ const quote = await getSwapQuote({
"slippage": "3"
}
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/api/get-token-details.mdx b/_pages/builderkits/onchainkit/api/get-token-details.mdx
similarity index 95%
rename from docs/pages/builderkits/onchainkit/api/get-token-details.mdx
rename to _pages/builderkits/onchainkit/api/get-token-details.mdx
index 2be1feb2..7f1f943b 100644
--- a/docs/pages/builderkits/onchainkit/api/get-token-details.mdx
+++ b/_pages/builderkits/onchainkit/api/get-token-details.mdx
@@ -1,4 +1,7 @@
-# `getTokenDetails`
+---
+title: "`getTokenDetails`"
+---
+
The `getTokenDetails` function returns data required to view an NFT
@@ -6,8 +9,7 @@ Before using them, make sure to obtain a [Client API Key](https://portal.cdp.coi
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { setOnchainKitConfig } from '@coinbase/onchainkit';
import { getTokenDetails } from '@coinbase/onchainkit/api';
@@ -34,8 +36,7 @@ const response = await getTokenDetails({
"mimeType": "image/png",
"contractType": "ERC721"
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/api/get-tokens.mdx b/_pages/builderkits/onchainkit/api/get-tokens.mdx
similarity index 96%
rename from docs/pages/builderkits/onchainkit/api/get-tokens.mdx
rename to _pages/builderkits/onchainkit/api/get-tokens.mdx
index 5edad702..836c4447 100644
--- a/docs/pages/builderkits/onchainkit/api/get-tokens.mdx
+++ b/_pages/builderkits/onchainkit/api/get-tokens.mdx
@@ -1,4 +1,7 @@
-# `getTokens`
+---
+title: "`getTokens`"
+---
+
The `getTokens` function retrieves a list of tokens on Base by searching for the name, symbol, or address of a token.
@@ -8,8 +11,7 @@ Before using them, make sure to obtain a [Client API Key](https://portal.cdp.coi
Search by symbol
-:::code-group
-
+
```tsx twoslash [code]
import { setOnchainKitConfig } from '@coinbase/onchainkit';
import { getTokens } from '@coinbase/onchainkit/api'; // [!code focus]
@@ -32,13 +34,11 @@ const tokens = await getTokens({ limit: '1', search: 'degen' }); // [!code focus
},
];
```
-
-:::
+
Search by name
-:::code-group
-
+
```tsx twoslash [code]
import { setOnchainKitConfig } from '@coinbase/onchainkit';
import { getTokens } from '@coinbase/onchainkit/api'; // [!code focus]
@@ -61,13 +61,11 @@ const tokens = await getTokens({ limit: '1', search: 'Wrapped Ether' }); // [!co
},
];
```
-
-:::
+
Search by address
-:::code-group
-
+
```tsx twoslash [code]
import { setOnchainKitConfig } from '@coinbase/onchainkit';
import { getTokens } from '@coinbase/onchainkit/api'; // [!code focus]
@@ -93,8 +91,7 @@ const tokens = await getTokens({
},
];
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/api/types.mdx b/_pages/builderkits/onchainkit/api/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/api/types.mdx
rename to _pages/builderkits/onchainkit/api/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/appchain/bridge.mdx b/_pages/builderkits/onchainkit/appchain/bridge.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/appchain/bridge.mdx
rename to _pages/builderkits/onchainkit/appchain/bridge.mdx
index e525598e..6aca34f3 100644
--- a/docs/pages/builderkits/onchainkit/appchain/bridge.mdx
+++ b/_pages/builderkits/onchainkit/appchain/bridge.mdx
@@ -3,11 +3,16 @@ title: · OnchainKit
description: Bridge to appchains with OnchainKit
---
+import { Danger } from "/snippets/danger.mdx";
+
# ``
-:::danger[⚠️ NOTE]
+
+**⚠️ NOTE**
+
The `AppchainBridge` component is alpha release software and is provided AS-IS. Use at your own risk.
-:::
+
+
The `AppchainBridge` component provides a simple interface for implementing bridging to appchains with OnchainKit.
@@ -27,8 +32,7 @@ npm create onchain@latest
If you're adding `AppchainBridge` to an existing project, simply install OnchainKit.
-:::code-group
-
+
```bash [npm]
npm install @coinbase/onchainkit
```
@@ -44,8 +48,7 @@ pnpm add @coinbase/onchainkit
```bash [bun]
bun add @coinbase/onchainkit
```
-
-:::
+
Wrap the `` around your app, following the steps in [Getting Started](/builderkits/onchainkit/installation/nextjs#add-providers).
@@ -57,8 +60,7 @@ You can retrieve the chain ID and your RPC URL from your appchain's dashboard in
Once successfully created, add the custom chain to your Wagmi configuration, and provide it as a child component to `OnchainKitProvider`.
-:::code-group
-
+
```tsx twoslash [chain.ts]
// @noErrors: 2554
import { defineChain } from 'viem';
@@ -135,8 +137,7 @@ export function Providers(props: { children: ReactNode }) {
);
}
```
-
-:::
+
Use the custom chain to create an `Appchain` object. You can also render an icon in the UI using the `icon` prop.
@@ -252,13 +253,16 @@ const customBridgeableTokens: BridgeableToken[] = [
];
```
-:::warning[⚠️ What is remoteToken?]
+
+**⚠️ What is remoteToken?**
+
The `remoteToken` field represents the token address on the appchain you're bridging to.
ERC-20 tokens on the appchain must comply to the `IOptimismMintableERC20` interface to be bridgeable.
Follow the [Optimism documentation](https://docs.optimism.io/app-developers/tutorials/bridging/standard-bridge-standard-token#create-an-l2-erc-20-token) to retrieve the `remoteToken` address for your ERC-20 token.
-:::
+
+
You can then plug the `customBridgeableTokens` into the `AppchainBridge` component with the `bridgeableTokens` prop.
diff --git a/docs/pages/builderkits/onchainkit/appchain/types.mdx b/_pages/builderkits/onchainkit/appchain/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/appchain/types.mdx
rename to _pages/builderkits/onchainkit/appchain/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/buy/buy.mdx b/_pages/builderkits/onchainkit/buy/buy.mdx
similarity index 97%
rename from docs/pages/builderkits/onchainkit/buy/buy.mdx
rename to _pages/builderkits/onchainkit/buy/buy.mdx
index c688b418..450ec44a 100644
--- a/docs/pages/builderkits/onchainkit/buy/buy.mdx
+++ b/_pages/builderkits/onchainkit/buy/buy.mdx
@@ -3,6 +3,7 @@ title: · OnchainKit
description: Buy components & utilities
---
+import { Danger } from "/snippets/danger.mdx";
import { Avatar, Name } from '@coinbase/onchainkit/identity';
import { Swap, SwapAmountInput, SwapButton, SwapDefault, SwapMessage, SwapToggleButton, SwapToast } from '@coinbase/onchainkit/swap';
import { Buy } from '@coinbase/onchainkit/buy';
@@ -21,15 +22,17 @@ The `Buy` components provide a comprehensive interface for users to purchase [To
The `Buy` component supports token swaps from USDC and ETH by default with the option to provide an additional token of choice using the `fromToken` prop. In addition, users are able to purchase tokens using their Coinbase account, Apple Pay, or debit card.
-:::info
+
The Apple Pay and Debit Card onramp options are only available for Coinbase supported assets.
-:::
+
+
Before using, ensure you've completed all [Getting Started steps](/builderkits/onchainkit/getting-started).
-:::info
+
This component requires a `projectId` to be set in the `OnchainKitProvider`. You can find your `projectId` on [Coinbase Developer Platform](https://portal.cdp.coinbase.com/products/onchainkit).
-:::
+
+
## Usage
@@ -67,11 +70,12 @@ export default function BuyComponents() { // [!code focus]
-:::danger
+
**Note: This interface is for demonstration purposes only.**
Swap and Onramp flows will execute and work out of the box when you implement the component in your own app.
-:::
+
+
### Sponsor gas with Paymaster
diff --git a/docs/pages/builderkits/onchainkit/buy/types.mdx b/_pages/builderkits/onchainkit/buy/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/buy/types.mdx
rename to _pages/builderkits/onchainkit/buy/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/checkout/checkout.mdx b/_pages/builderkits/onchainkit/checkout/checkout.mdx
similarity index 86%
rename from docs/pages/builderkits/onchainkit/checkout/checkout.mdx
rename to _pages/builderkits/onchainkit/checkout/checkout.mdx
index 5fc7fdd5..6a79df5c 100644
--- a/docs/pages/builderkits/onchainkit/checkout/checkout.mdx
+++ b/_pages/builderkits/onchainkit/checkout/checkout.mdx
@@ -3,6 +3,7 @@ title: · OnchainKit
description: One-click checkout for onchain commerce
---
+import { Danger } from "/snippets/danger.mdx";
import { Checkout, CheckoutButton } from '@coinbase/onchainkit/checkout';
import App from '@/components/App';
@@ -27,9 +28,10 @@ Our all-in-one solution simplifies payment processing for onchain developers, re
Before using the `Checkout` component, ensure you've completed the [Getting Started](/builderkits/onchainkit/getting-started) steps.
-::::tip
+
To use the `Checkout` component, you'll need to provide a Client API Key in `OnchainKitProvider`. You can get one following our [Getting Started](/builderkits/onchainkit/getting-started#get-your-client-api-key) steps.
-:::::
+
+
### Starting a new project
@@ -43,8 +45,7 @@ npm create onchain@latest
If you're adding `Checkout` to an existing project, simply install OnchainKit.
-:::code-group
-
+
```bash [npm]
npm install @coinbase/onchainkit
```
@@ -60,8 +61,7 @@ pnpm add @coinbase/onchainkit
```bash [bun]
bun add @coinbase/onchainkit
```
-
-:::
+
Wrap the `` around your app, following the steps in [Getting Started](/builderkits/onchainkit/getting-started#add-providers).
@@ -71,62 +71,54 @@ Wrap the `` around your app, following the steps in [Getti
Ideal for fixed-price items. Get started with minimal setup.
-::::steps
-
-### Sign up for a Coinbase Commerce account
-
-Head to [Coinbase Commerce](https://beta.commerce.coinbase.com/) and sign up. This is where you’ll manage transactions, view reports, and configure payments.
-
-### Create a product and copy the `productId`
-
-In the Coinbase Commerce dashboard, create a new product and copy the `productId`.
-
-### Import the component
-
-```tsx twoslash
-import { Checkout, CheckoutButton, CheckoutStatus } from '@coinbase/onchainkit/checkout';
-
-
- // set coinbaseBranded for branding
-
-
-```
+
+
+ Head to [Coinbase Commerce](https://beta.commerce.coinbase.com/) and sign up. This is where you’ll manage transactions, view reports, and configure payments.
+
+
+ In the Coinbase Commerce dashboard, create a new product and copy the `productId`.
+
+
+ ```tsx twoslash
+ import { Checkout, CheckoutButton, CheckoutStatus } from '@coinbase/onchainkit/checkout';
+
+
+ // set coinbaseBranded for branding
+
+
+ ```
+
+
-::::
### Option 2: Dynamic Charges
For variable pricing, custom metadata, or multi-product checkouts, use backend-generated charges.
-::::steps
-
-### Sign up for a Coinbase Commerce account
-
-Head to [Coinbase Commerce](https://beta.commerce.coinbase.com/) and sign up. This is where you’ll manage transactions, view reports, and configure payments.
-
-### Create a Coinbase Commerce API Key
-
-In the [Coinbase Commerce dashboard](https://beta.commerce.coinbase.com/settings/security), create a new API Key under `Security` in `Settings`.
-
-### Set up a backend to create charges dynamically using the Coinbase Commerce API.
-
-See [Using chargeHandler](/builderkits/onchainkit/checkout/checkout#using-chargehandler) for a code example.
-
-### Pass the chargeID into Checkout via the chargeHandler prop.
-
-```tsx
-const chargeHandler = async () => {
- const response = await fetch('/createCharge', { method: 'POST' });
- const { id } = await response.json();
- return id; // Return charge ID
-};
-
-
-
-
-```
+
+
+ Head to [Coinbase Commerce](https://beta.commerce.coinbase.com/) and sign up. This is where you’ll manage transactions, view reports, and configure payments.
+
+
+ In the [Coinbase Commerce dashboard](https://beta.commerce.coinbase.com/settings/security), create a new API Key under `Security` in `Settings`.
+
+
+ See [Using chargeHandler](/builderkits/onchainkit/checkout/checkout#using-chargehandler) for a code example.
+
+
+ ```tsx
+ const chargeHandler = async () => {
+ const response = await fetch('/createCharge', { method: 'POST' });
+ const { id } = await response.json();
+ return id; // Return charge ID
+ };
-::::
+
+
+
+ ```
+
+
That's it! Start selling onchain with just a few lines of code.
@@ -164,16 +156,19 @@ Alternatively, you can create charges dynamically using the Coinbase Commerce AP
This function must have the signature `() => Promise` and must return a valid chargeId created by the create charge endpoint.
-:::tip
+
To create charges, you'll need a Coinbase Commerce [API Key](https://docs.cdp.coinbase.com/commerce-onchain/docs/getting-started).
-:::
+
+
+
+
+**⚠️ Warning**
-:::danger[⚠️ Warning]
You should protect your Coinbase Commerce API Key by only creating charges server-side.
-:::
+
-:::code-group
+
```ts [backend.ts]
// This backend endpoint should create a charge and return the response.
app.post('/createCharge', async (req: Request, res: Response) => {
@@ -212,8 +207,7 @@ const chargeHandler = async () => {
```
-
-:::
+
Note that `productId` and `chargeHandler` are mutually exclusive and only one can be provided as a prop to Checkout.
@@ -260,13 +254,17 @@ const statusHandler = async (status: LifecycleStatus) => { // [!code focus]
// ---cut-after---
```
-:::tip
+
To verify charges, you'll need a Coinbase Commerce [API Key](https://docs.cdp.coinbase.com/commerce-onchain/docs/getting-started).
-:::
+
+
+
+
+**⚠️ Warning**
-:::danger[⚠️ Warning]
You should protect your Coinbase Commerce API Key by verifying charges server-side. This client-side code is only provided as an example.
-:::
+
+
### Viewing successful checkouts
diff --git a/docs/pages/builderkits/onchainkit/checkout/types.mdx b/_pages/builderkits/onchainkit/checkout/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/checkout/types.mdx
rename to _pages/builderkits/onchainkit/checkout/types.mdx
diff --git a/_pages/builderkits/onchainkit/config/is-base.mdx b/_pages/builderkits/onchainkit/config/is-base.mdx
new file mode 100644
index 00000000..62236ea3
--- /dev/null
+++ b/_pages/builderkits/onchainkit/config/is-base.mdx
@@ -0,0 +1,37 @@
+---
+title: "`isBase`"
+---
+
+
+The `isBase` utility is designed to verify if the chain id is a valid Base or Base Sepolia chain id.
+
+## Usage
+
+
+```tsx twoslash [code]
+import { isBase } from '@coinbase/onchainkit';
+
+// Base Mainnet (chain ID: 8453)
+isBase({ chainId: 8453 }); // returns true
+
+// Base Sepolia (chain ID: 84532)
+isBase({ chainId: 84532 }); // returns true
+
+// Ethereum (chain ID: 1)
+isBase({ chainId: 1 }); // returns false
+```
+
+```ts [return value]
+true; // When chainId is 8453 (Base Mainnet) or 84532 (Base Sepolia)
+false; // For all other chain IDs
+```
+
+
+## Returns
+
+`boolean` - Returns `true` if the chain id is Base or Base Sepolia, otherwise `false`.
+
+## Parameters
+
+[`IsBaseOptions`](./types#isbaseoptions) - See [`IsBaseOptions`](./types#isbaseoptions) for more details.
+
diff --git a/_pages/builderkits/onchainkit/config/is-ethereum.mdx b/_pages/builderkits/onchainkit/config/is-ethereum.mdx
new file mode 100644
index 00000000..ea4c45b8
--- /dev/null
+++ b/_pages/builderkits/onchainkit/config/is-ethereum.mdx
@@ -0,0 +1,37 @@
+---
+title: "`isEthereum`"
+---
+
+
+The `isEthereum` utility is designed to verify if the chain id is a valid Ethereum Mainnet or Ethereum Sepolia chain id.
+
+## Usage
+
+
+```tsx twoslash [code]
+import { isEthereum } from '@coinbase/onchainkit';
+
+// Ethereum Mainnet (chain ID: 1)
+isEthereum({ chainId: 1 }); // returns true
+
+// Ethereum Sepolia (chain ID: 11155111)
+isEthereum({ chainId: 11155111 }); // returns true
+
+// Base (chain ID: 8453)
+isEthereum({ chainId: 8453 }); // returns false
+```
+
+```ts [return value]
+true; // When chainId is 1 (Ethereum Mainnet) or 11155111 (Ethereum Sepolia)
+false; // For all other chain IDs
+```
+
+
+## Returns
+
+`boolean` - Returns `true` if the chain id is Ethereum Mainnet or Ethereum Sepolia, otherwise `false`.
+
+## Parameters
+
+[`IsEthereumOptions`]: ./types#isethereumoptions
+
diff --git a/docs/pages/builderkits/onchainkit/config/onchainkit-provider.mdx b/_pages/builderkits/onchainkit/config/onchainkit-provider.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/config/onchainkit-provider.mdx
rename to _pages/builderkits/onchainkit/config/onchainkit-provider.mdx
index 5512a297..046f45ea 100644
--- a/docs/pages/builderkits/onchainkit/config/onchainkit-provider.mdx
+++ b/_pages/builderkits/onchainkit/config/onchainkit-provider.mdx
@@ -1,4 +1,7 @@
-# ``
+---
+title: "``"
+---
+
Provides the OnchainKit React Context to the app.
diff --git a/docs/pages/builderkits/onchainkit/config/supplemental-providers.mdx b/_pages/builderkits/onchainkit/config/supplemental-providers.mdx
similarity index 96%
rename from docs/pages/builderkits/onchainkit/config/supplemental-providers.mdx
rename to _pages/builderkits/onchainkit/config/supplemental-providers.mdx
index 3e80f9fd..db63dbc6 100644
--- a/docs/pages/builderkits/onchainkit/config/supplemental-providers.mdx
+++ b/_pages/builderkits/onchainkit/config/supplemental-providers.mdx
@@ -3,7 +3,7 @@ title: Supplemental Providers · OnchainKit
description: Customize the Wagmi and QueryClient providers
---
-import StartBuilding from '@/components/StartBuilding';
+import StartBuilding from "/snippets/start-building.mdx";
# Custom Supplemental Providers
@@ -13,8 +13,7 @@ these providers with your own configuration.
For example, the following code creates custom Wagmi and QueryClient providers:
-:::code-group
-
+
```tsx twoslash [wagmi.ts]
// @noErrors: 2554
import { http, cookieStorage, createConfig, createStorage } from 'wagmi';
@@ -83,7 +82,6 @@ export function Providers(props: {
);
}
```
-
-:::
+
diff --git a/docs/pages/builderkits/onchainkit/config/types.mdx b/_pages/builderkits/onchainkit/config/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/config/types.mdx
rename to _pages/builderkits/onchainkit/config/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/create-a-basename-profile-component.mdx b/_pages/builderkits/onchainkit/create-a-basename-profile-component.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/create-a-basename-profile-component.mdx
rename to _pages/builderkits/onchainkit/create-a-basename-profile-component.mdx
index b1fc6ceb..7e08d16f 100644
--- a/docs/pages/builderkits/onchainkit/create-a-basename-profile-component.mdx
+++ b/_pages/builderkits/onchainkit/create-a-basename-profile-component.mdx
@@ -166,7 +166,8 @@ const IdentityWrapper: React.FC<{ address: string }> = ({ address }) => {
export default IdentityWrapper;
```
-:::info[Possible Basename Text Records:]
+
+**Possible Basename Text Records:**
The full list of existing text records for a basename:
@@ -184,8 +185,8 @@ The full list of existing text records for a basename:
Discord,
Avatar
```
+
-:::
## Implementing the Render Logic
diff --git a/docs/pages/builderkits/onchainkit/earn/earn.mdx b/_pages/builderkits/onchainkit/earn/earn.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/earn/earn.mdx
rename to _pages/builderkits/onchainkit/earn/earn.mdx
index b6caa876..eba3ae12 100644
--- a/docs/pages/builderkits/onchainkit/earn/earn.mdx
+++ b/_pages/builderkits/onchainkit/earn/earn.mdx
@@ -25,8 +25,7 @@ npm create onchain@latest
If you're adding `Earn` to an existing project, simply install OnchainKit.
-:::code-group
-
+
```bash [npm]
npm install @coinbase/onchainkit
```
@@ -42,8 +41,7 @@ pnpm add @coinbase/onchainkit
```bash [bun]
bun add @coinbase/onchainkit
```
-
-:::
+
Wrap the `` around your app, following the steps in [Getting Started](/builderkits/onchainkit/getting-started#add-providers).
@@ -115,8 +113,7 @@ You can find the full interface for `EarnContextType` on the [Types page](/build
Below, we use `useEarnContext` to implement a custom deposit interface by using `useEarnContext` to access the `depositAmount` and `setDepositAmount` context values.
-:::code-group
-
+
```tsx twoslash [index.tsx]
// @noErrors: 2307
import { Earn, useEarnContext } from '@coinbase/onchainkit/earn';
@@ -164,8 +161,7 @@ function CustomDepositButtons() {
);
}
```
-
-:::
+
@@ -193,13 +189,14 @@ Ensure that your `OnchainKitProvider` has a `paymaster` configured:
>
```
-:::tip
+
If you have a contract allowlist set on Coinbase Developer Platform, you'll need to ensure that the following contract functions are allowed:
- `deposit` on the Morpho vault
- `redeem` on the Morpho vault
- `approve` on the token being deposited
- :::
+
+
## Components
diff --git a/docs/pages/builderkits/onchainkit/earn/types.mdx b/_pages/builderkits/onchainkit/earn/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/earn/types.mdx
rename to _pages/builderkits/onchainkit/earn/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/fund/fetch-onramp-config.mdx b/_pages/builderkits/onchainkit/fund/fetch-onramp-config.mdx
similarity index 96%
rename from docs/pages/builderkits/onchainkit/fund/fetch-onramp-config.mdx
rename to _pages/builderkits/onchainkit/fund/fetch-onramp-config.mdx
index 9ebecf18..f9786533 100644
--- a/docs/pages/builderkits/onchainkit/fund/fetch-onramp-config.mdx
+++ b/_pages/builderkits/onchainkit/fund/fetch-onramp-config.mdx
@@ -1,11 +1,13 @@
-# `fetchOnrampConfig`
+---
+title: "`fetchOnrampConfig`"
+---
+
The `fetchOnrampConfig` utility fetches the list of countries supported by Coinbase Onramp and their available payment methods. This is useful when you need to validate user eligibility or display available payment options.
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { fetchOnrampConfig } from '@coinbase/onchainkit/fund';
@@ -36,8 +38,7 @@ const config2 = await fetchOnrampConfig('your-api-key');
]
}
```
-
-:::
+
## Parameters
diff --git a/docs/pages/builderkits/onchainkit/fund/fetch-onramp-options.mdx b/_pages/builderkits/onchainkit/fund/fetch-onramp-options.mdx
similarity index 96%
rename from docs/pages/builderkits/onchainkit/fund/fetch-onramp-options.mdx
rename to _pages/builderkits/onchainkit/fund/fetch-onramp-options.mdx
index 037ac702..d692e6ee 100644
--- a/docs/pages/builderkits/onchainkit/fund/fetch-onramp-options.mdx
+++ b/_pages/builderkits/onchainkit/fund/fetch-onramp-options.mdx
@@ -1,11 +1,13 @@
-# `fetchOnrampOptions`
+---
+title: "`fetchOnrampOptions`"
+---
+
The `fetchOnrampOptions` utility retrieves supported fiat currencies and available crypto assets for a specific country. This information is essential for determining which assets can be purchased in the user's jurisdiction.
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { fetchOnrampOptions } from '@coinbase/onchainkit/fund';
@@ -42,8 +44,7 @@ const options = await fetchOnrampOptions({
]
}
```
-
-:::
+
## Parameters
diff --git a/docs/pages/builderkits/onchainkit/fund/fetch-onramp-quote.mdx b/_pages/builderkits/onchainkit/fund/fetch-onramp-quote.mdx
similarity index 97%
rename from docs/pages/builderkits/onchainkit/fund/fetch-onramp-quote.mdx
rename to _pages/builderkits/onchainkit/fund/fetch-onramp-quote.mdx
index d6a2781c..9b812d17 100644
--- a/docs/pages/builderkits/onchainkit/fund/fetch-onramp-quote.mdx
+++ b/_pages/builderkits/onchainkit/fund/fetch-onramp-quote.mdx
@@ -1,11 +1,13 @@
-# `fetchOnrampQuote`
+---
+title: "`fetchOnrampQuote`"
+---
+
The `fetchOnrampQuote` utility provides a quote based on the asset the user would like to purchase, plus the network, fiat payment, payment currency, payment method, and country. This is useful for getting pricing information and fees before initiating a transaction.
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { fetchOnrampQuote } from '@coinbase/onchainkit/fund';
@@ -46,8 +48,7 @@ const quote = await fetchOnrampQuote({
"quoteId": "quote_123"
}
```
-
-:::
+
## Parameters
diff --git a/docs/pages/builderkits/onchainkit/fund/fetch-onramp-transaction-status.mdx b/_pages/builderkits/onchainkit/fund/fetch-onramp-transaction-status.mdx
similarity index 96%
rename from docs/pages/builderkits/onchainkit/fund/fetch-onramp-transaction-status.mdx
rename to _pages/builderkits/onchainkit/fund/fetch-onramp-transaction-status.mdx
index 80c7b71b..0b1bf298 100644
--- a/docs/pages/builderkits/onchainkit/fund/fetch-onramp-transaction-status.mdx
+++ b/_pages/builderkits/onchainkit/fund/fetch-onramp-transaction-status.mdx
@@ -1,11 +1,13 @@
-# `fetchOnrampTransactionStatus`
+---
+title: "`fetchOnrampTransactionStatus`"
+---
+
The `fetchOnrampTransactionStatus` utility retrieves the status of onramp transactions for a specific user. This is useful for tracking the progress of crypto purchases and displaying transaction history.
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { fetchOnrampTransactionStatus } from '@coinbase/onchainkit/fund';
@@ -33,8 +35,7 @@ const transactions = await fetchOnrampTransactionStatus({
"totalCount": "1"
}
```
-
-:::
+
## Parameters
diff --git a/docs/pages/builderkits/onchainkit/fund/fund-button.mdx b/_pages/builderkits/onchainkit/fund/fund-button.mdx
similarity index 78%
rename from docs/pages/builderkits/onchainkit/fund/fund-button.mdx
rename to _pages/builderkits/onchainkit/fund/fund-button.mdx
index 663bf3f2..0f22e0cd 100644
--- a/docs/pages/builderkits/onchainkit/fund/fund-button.mdx
+++ b/_pages/builderkits/onchainkit/fund/fund-button.mdx
@@ -27,71 +27,71 @@ Before using it, ensure you've completed all [Getting Started steps](/builderkit
## Walkthrough
-::::steps
+
+
+ 1. Get your Project ID from the [Coinbase Developer Platform Dashboard](https://portal.cdp.coinbase.com/).
+
+
+
+ 2. Add your Project ID to your `.env` file.
+
+ ```tsx twoslash [.env]
+ // @noErrors
+ NEXT_PUBLIC_ONCHAINKIT_API_KEY=YOUR_PUBLIC_API_KEY
+ NEXT_PUBLIC_CDP_PROJECT_ID=YOUR_CDP_PROJECT_ID // [!code ++]
+ ```
+
+
+ ```tsx twoslash
+ // @noErrors
+
+ {props.children}
+
+ ```
+
+
+ ```tsx
+ import { FundButton } from '@coinbase/onchainkit/fund';
+
+
+ ```
+
+
+
+ {({ address }) => {
+ if (address) {
+ return (
+
+ )
+ }
+ return <>
+
+
+
+
+
+
+ >;
+ }}
+
+
+
+
+
+
+
+**Troubleshooting**
-### Get your Project ID
-
-1. Get your Project ID from the [Coinbase Developer Platform Dashboard](https://portal.cdp.coinbase.com/).
-
-
-
-2. Add your Project ID to your `.env` file.
-
-```tsx twoslash [.env]
-// @noErrors
-NEXT_PUBLIC_ONCHAINKIT_API_KEY=YOUR_PUBLIC_API_KEY
-NEXT_PUBLIC_CDP_PROJECT_ID=YOUR_CDP_PROJECT_ID // [!code ++]
-```
-
-### Add Project ID to OnchainKitProvider
-
-```tsx twoslash
-// @noErrors
-
- {props.children}
-
-```
-
-### Drop in the `````` component
-
-```tsx
-import { FundButton } from '@coinbase/onchainkit/fund';
-
-
-```
-
-
-
- {({ address }) => {
- if (address) {
- return (
-
- )
- }
- return <>
-
-
-
-
-
-
- >;
- }}
-
-
-
-::::
-
-:::tip[Troubleshooting]
If you see a "something went wrong" error message when navigating to pay.coinbase.com, make sure you have "enforce
secure initialization" disabled on the [Onramp config page in Coinbase Developer Platform Dashboard](https://portal.cdp.coinbase.com/products/onramp).
-:::
+
+
## Customizing the funding experience
diff --git a/docs/pages/builderkits/onchainkit/fund/fund-card.mdx b/_pages/builderkits/onchainkit/fund/fund-card.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/fund/fund-card.mdx
rename to _pages/builderkits/onchainkit/fund/fund-card.mdx
index 4fd727f7..97bdfee7 100644
--- a/docs/pages/builderkits/onchainkit/fund/fund-card.mdx
+++ b/_pages/builderkits/onchainkit/fund/fund-card.mdx
@@ -22,21 +22,24 @@ The `` component provides a complete fiat onramp experience within y
- Automatic exchange rate updates
- Smart handling of payment method restrictions (based on country and subdivision)
-:::info
+
The Apple Pay and Debit Card onramp options are only available for Coinbase supported assets.
-:::
+
+
## Prerequisites
Before using the `FundCard` component, ensure you've completed the [Getting Started](/builderkits/onchainkit/installation/nextjs#get-your-client-api-key) steps.
-::::tip
+
To use the `FundCard` component, you'll need to provide a Client API Key in `OnchainKitProvider`. You can get one following our [Getting Started](/builderkits/onchainkit/installation/nextjs#get-your-client-api-key) steps.
-:::::
+
+
-:::info
+
This component requires a `projectId` to be set in the `OnchainKitProvider`. You can find your `projectId` on [Coinbase Developer Platform](https://portal.cdp.coinbase.com/products/onchainkit).
-:::
+
+
## Usage
@@ -143,9 +146,10 @@ const presetAmountInputs = ['10', '20', '50'] as const;
/>;
```
-:::info
+
**Note: 3 preset amount inputs are required in order to show the preset amount buttons.**
-:::
+
+
### Custom Content
@@ -197,9 +201,10 @@ import {
```
-:::info
+
**Note:** If you are using the custom components then you are going to need to access the state of the `FundCard` component. You can do this by using the `useFundContext` hook.
-:::
+
+
```tsx
const {
diff --git a/docs/pages/builderkits/onchainkit/fund/get-onramp-buy-url.mdx b/_pages/builderkits/onchainkit/fund/get-onramp-buy-url.mdx
similarity index 95%
rename from docs/pages/builderkits/onchainkit/fund/get-onramp-buy-url.mdx
rename to _pages/builderkits/onchainkit/fund/get-onramp-buy-url.mdx
index e08b6dec..27ff06b3 100644
--- a/docs/pages/builderkits/onchainkit/fund/get-onramp-buy-url.mdx
+++ b/_pages/builderkits/onchainkit/fund/get-onramp-buy-url.mdx
@@ -1,4 +1,7 @@
-# `getOnrampBuyUrl`
+---
+title: "`getOnrampBuyUrl`"
+---
+
The `getOnrampBuyUrl` utility is a helper method to generate a Coinbase Onramp URL. It helps you customize the funding
experience for your users. For example:
@@ -10,8 +13,7 @@ experience for your users. For example:
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { getOnrampBuyUrl } from '@coinbase/onchainkit/fund';
@@ -29,8 +31,7 @@ const onrampBuyUrl = getOnrampBuyUrl({
```json [return value]
'https://pay.coinbase.com/buy?addresses=%7B%220x1%22%3A%5B%22base%22%5D%7D&appId=project-id&assets=%5B%22USDC%22%5D&fiatCurrency=USD&presetFiatAmount=20&redirectUrl=https%3A%2F%2Fyourapp.com%2Fonramp-return%3Fparam%3Dfoo'
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/fund/setup-onramp-event-listeners.mdx b/_pages/builderkits/onchainkit/fund/setup-onramp-event-listeners.mdx
similarity index 95%
rename from docs/pages/builderkits/onchainkit/fund/setup-onramp-event-listeners.mdx
rename to _pages/builderkits/onchainkit/fund/setup-onramp-event-listeners.mdx
index d9c69a8e..2272aad5 100644
--- a/docs/pages/builderkits/onchainkit/fund/setup-onramp-event-listeners.mdx
+++ b/_pages/builderkits/onchainkit/fund/setup-onramp-event-listeners.mdx
@@ -1,11 +1,13 @@
-# `setupOnrampEventListeners`
+---
+title: "`setupOnrampEventListeners`"
+---
+
The `setupOnrampEventListeners` utility sets up event listeners for the Coinbase Onramp widget. It helps you handle various events like successful purchases, exits, and other user interactions.
## Usage
-:::code-group
-
+
```tsx twoslash [code]
// @errors: 2305
import { setupOnrampEventListeners } from '@coinbase/onchainkit/fund';
@@ -32,8 +34,7 @@ unsubscribe();
// Returns an unsubscribe function
() => void
```
-
-:::
+
## Parameters
diff --git a/docs/pages/builderkits/onchainkit/fund/types.mdx b/_pages/builderkits/onchainkit/fund/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/fund/types.mdx
rename to _pages/builderkits/onchainkit/fund/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/getting-started.mdx b/_pages/builderkits/onchainkit/getting-started.mdx
similarity index 89%
rename from docs/pages/builderkits/onchainkit/getting-started.mdx
rename to _pages/builderkits/onchainkit/getting-started.mdx
index 88b0dc00..944e0610 100644
--- a/docs/pages/builderkits/onchainkit/getting-started.mdx
+++ b/_pages/builderkits/onchainkit/getting-started.mdx
@@ -1,8 +1,10 @@
-import StartBuilding from '@/components/StartBuilding';
-import InstallationOptions from '@/components/InstallationOptions';
-import { Callout } from 'vocs/components'
+---
+title: "Getting Started"
+---
+
+import StartBuilding from "/snippets/start-building.mdx";
+import InstallationOptions from '/snippets/installation-options.mdx';
-# Getting Started
OnchainKit is your go-to SDK for building beautiful onchain applications. Ship in minutes, not weeks.
@@ -41,9 +43,9 @@ You can also checkout our pre-built templates:
- [Funding flow](https://github.com/fakepixels/fund-component)
- [Social profile](https://github.com/fakepixels/ock-identity)
-
+
These docs are LLM-friendly—reference [llms.txt](https://docs.base.org/builderkits/onchainkit/llms.txt) in your code editor to streamline builds and prompt smarter.
-
+
## Manual Installation
diff --git a/docs/pages/builderkits/onchainkit/guides/ai-prompting-guide.mdx b/_pages/builderkits/onchainkit/guides/ai-prompting-guide.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/guides/ai-prompting-guide.mdx
rename to _pages/builderkits/onchainkit/guides/ai-prompting-guide.mdx
index 0d10f404..b0f6505c 100644
--- a/docs/pages/builderkits/onchainkit/guides/ai-prompting-guide.mdx
+++ b/_pages/builderkits/onchainkit/guides/ai-prompting-guide.mdx
@@ -4,7 +4,7 @@ description: Learn practical AI prompting techniques to enhance your coding work
author: sohey
---
-# Developer's Guide to Effective AI Prompting
+# Developer's Guide to Effective AI Prompting
This guide helps developers leverage AI tools effectively in their coding workflow. Whether you're using Cursor, GitHub Copilot, or other AI assistants,
these strategies will help you get better results and integrate AI smoothly into your development process.
@@ -80,9 +80,10 @@ Create a detailed instructions.md file for my project with the following section
6. APIs and Integrations: External services and how they connect.
```
-:::info
+
Note: When planning architecture or making complex design decisions, use AI models with strong reasoning—like o4 mini or Claude 3.7 Sonnet. They excel at thinking through tradeoffs, edge cases, and long-term planning.
-:::
+
+
## **Effective Prompting Strategies**
diff --git a/_pages/builderkits/onchainkit/guides/build-onchain-apps.mdx b/_pages/builderkits/onchainkit/guides/build-onchain-apps.mdx
new file mode 100644
index 00000000..4bf59cfe
--- /dev/null
+++ b/_pages/builderkits/onchainkit/guides/build-onchain-apps.mdx
@@ -0,0 +1,98 @@
+---
+title: Build Onchain Apps · OnchainKit
+description: Our onchain app template streamlines your initial app setup and seamlessly integrates onchain components with web2 infrastructure, saving you weeks of effort.
+---
+
+# Build Onchain Apps with OnchainKit ⛵️ 🌊
+
+Build your first onchain app effortlessly with OnchainKit's **app template**. Save weeks of initial setup
+and easily integrate onchain components with web2 infrastructure.
+
+Our opinionated approach streamlines early decisions, making your development process smoother.
+
+Whether you're a hackathon participant or an ambitious entrepreneur aiming to build the next big thing, this template is tailored for you.
+
+
+
+Play with it live [here](https://onchain-app-template.vercel.app).
+
+## Out of the box
+
+- Next.js v14 with App routing 🏗️
+- Ethereum L2 support through Base 🔵
+- Easy account creation with Smart Wallet
+- Live examples for Minting and Paymaster experiences with wagmi and Viem 🚀
+- Latest styling best practices with Tailwind CSS 💅
+- Easy maintenance with linting, formatting, and tests ✅
+
+## Getting Started
+
+
+
+ Go to https://github.com/coinbase/onchain-app-template and click on the "Use this template" button to create a new repository based on the template.
+
+
+
+
+ Get your [Client API Key](https://portal.cdp.coinbase.com/projects/api-keys/client-key) from Coinbase Developer Platform.
+
+
+
+ In order to use RainbowKit, you'd also need to obtain a Wallet Connector project ID at [WalletConnect](https://cloud.reown.com/app).
+
+
+
+ Create a new file in your project's root directory and name it `.env`.
+
+
+
+ ```tsx [.env]
+ NEXT_PUBLIC_CDP_API_KEY=YOUR_PUBLIC_API_KEY
+ NEXT_PUBLIC_WC_PROJECT_ID=YOUR_WALLETCONNECT_PROJECT_ID
+ ```
+
+
+ In your new onchain app repository, run the following commands to install the dependencies:
+
+ ```bash
+ # Install bun in case you don't have it
+ curl -fsSL https://bun.sh/install | bash
+
+ # Install packages
+ bun i
+ ```
+
+
+ Now you are ready to run the app and start building onchain experiences!
+
+ ```bash
+ # Run Next app
+ bun run dev
+ ```
+
+
+
+## Need more help?
+
+If you have any questions or need help, feel free to reach out to us on [Discord](https://discord.gg/invite/cdp)
+or open a [Github issue](https://github.com/coinbase/onchainkit/issues) or DM us
+on X at [@onchainkit](https://x.com/onchainkit), [@zizzamia](https://x.com/zizzamia), [@fkpxls](https://x.com/fkpxls).
diff --git a/docs/pages/builderkits/onchainkit/guides/contribution.mdx b/_pages/builderkits/onchainkit/guides/contribution.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/guides/contribution.mdx
rename to _pages/builderkits/onchainkit/guides/contribution.mdx
diff --git a/docs/pages/builderkits/onchainkit/guides/lifecycle-status.mdx b/_pages/builderkits/onchainkit/guides/lifecycle-status.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/guides/lifecycle-status.mdx
rename to _pages/builderkits/onchainkit/guides/lifecycle-status.mdx
diff --git a/docs/pages/builderkits/onchainkit/guides/reporting-bug.mdx b/_pages/builderkits/onchainkit/guides/reporting-bug.mdx
similarity index 61%
rename from docs/pages/builderkits/onchainkit/guides/reporting-bug.mdx
rename to _pages/builderkits/onchainkit/guides/reporting-bug.mdx
index ccf9d06e..25c7ddc0 100644
--- a/docs/pages/builderkits/onchainkit/guides/reporting-bug.mdx
+++ b/_pages/builderkits/onchainkit/guides/reporting-bug.mdx
@@ -7,17 +7,17 @@ description: Help us make OnchainKit better
We look at all of your bug reports and will do our best to fix them as quickly as possible.
-::::steps
-
-### Create a new issue
-Navigate to [Issues tab](https://github.com/coinbase/onchainkit/issues) on Github and click the "New issue" button.
-
-### Select "Bug Report"
-Pick the "Bug Report" option and fill out the form to the best of your ability.
-
-### We'll be in touch
-We'll do our best to respond to your issue on Github as soon as possible.
-::::
+
+
+ Navigate to [Issues tab](https://github.com/coinbase/onchainkit/issues) on Github and click the "New issue" button.
+
+
+ Pick the "Bug Report" option and fill out the form to the best of your ability.
+
+
+ We'll do our best to respond to your issue on Github as soon as possible.
+
+
### Have a special request?
You can tag us on [Discord](https://discord.com/channels/1220414409550336183/1253768005863739565) or DM us on [X](https://x.com/Onchainkit).
diff --git a/_pages/builderkits/onchainkit/guides/tailwind.mdx b/_pages/builderkits/onchainkit/guides/tailwind.mdx
new file mode 100644
index 00000000..37c5cc7e
--- /dev/null
+++ b/_pages/builderkits/onchainkit/guides/tailwind.mdx
@@ -0,0 +1,100 @@
+---
+title: Tailwind CSS Integration Guide · OnchainKit
+description: Learn how to integrate Tailwind CSS with OnchainKit
+---
+
+# Tailwind CSS Integration Guide
+
+OnchainKit comes with first class support for `tailwindcss`.
+
+
+
+ You can use the default styles without any customization.
+ Just place this at the top of your application's entry point to have the components work out of the box.
+
+ ```javascript
+ import '@coinbase/onchainkit/styles.css';
+ ```
+
+
+ Depending on your dark mode setup, you may have to add `safelist: ['dark']` to your Tailwind config.
+
+ ```javascript filename="tailwind.config.js"
+ /** @type {import('tailwindcss').Config} */
+ export default {
+ content: ['./src/**/*.{ts,tsx}'],
+ darkMode: ['class'], // [!code focus]
+ safelist: ['dark'], // [!code focus]
+ theme: {
+ fontFamily: {
+ sans: ['Inter', 'sans-serif'],
+ },
+ },
+ plugins: [],
+ };
+ ```
+
+
+ There are many ways to handle color mode.
+
+ In OnchainKit, toggling color mode works by adding / removing class name `dark` to the root html tag.
+
+
+ To override default colorscheme, you need to modify the following css variables:
+
+ ```css
+ @tailwind base;
+
+ @layer base {
+ :root {
+ --ock-font-family: 'your-custom-value';
+ --ock-border-radius: 'your-custom-value';
+ --ock-border-radius-inner: 'your-custom-value';
+ --ock-text-inverse: 'your-custom-value';
+ --ock-text-foreground: 'your-custom-value';
+ --ock-text-foreground-muted: 'your-custom-value';
+ --ock-text-error: 'your-custom-value';
+ --ock-text-primary: 'your-custom-value';
+ --ock-text-success: 'your-custom-value';
+ --ock-text-warning: 'your-custom-value';
+ --ock-text-disabled: 'your-custom-value';
+
+ --ock-bg-default: 'your-custom-value';
+ --ock-bg-default-hover: 'your-custom-value';
+ --ock-bg-default-active: 'your-custom-value';
+ --ock-bg-alternate: 'your-custom-value';
+ --ock-bg-alternate-hover: 'your-custom-value';
+ --ock-bg-alternate-active: 'your-custom-value';
+ --ock-bg-inverse: 'your-custom-value';
+ --ock-bg-inverse-hover: 'your-custom-value';
+ --ock-bg-inverse-active: 'your-custom-value';
+ --ock-bg-primary: 'your-custom-value';
+ --ock-bg-primary-hover: 'your-custom-value';
+ --ock-bg-primary-active: 'your-custom-value';
+ --ock-bg-primary-washed: 'your-custom-value';
+ --ock-bg-primary-disabled: 'your-custom-value';
+ --ock-bg-secondary: 'your-custom-value';
+ --ock-bg-secondary-hover: 'your-custom-value';
+ --ock-bg-secondary-active: 'your-custom-value';
+ --ock-bg-error: 'your-custom-value';
+ --ock-bg-warning: 'your-custom-value';
+ --ock-bg-success: 'your-custom-value';
+ --ock-bg-default-reverse: 'your-custom-value';
+
+ --ock-icon-color-primary: 'your-custom-value';
+ --ock-icon-color-foreground: 'your-custom-value';
+ --ock-icon-color-foreground-muted: 'your-custom-value';
+ --ock-icon-color-inverse: 'your-custom-value';
+ --ock-icon-color-error: 'your-custom-value';
+ --ock-icon-color-success: 'your-custom-value';
+ --ock-icon-color-warning: 'your-custom-value';
+
+ --ock-line-primary: 'your-custom-value';
+ --ock-line-default: 'your-custom-value';
+ --ock-line-heavy: 'your-custom-value';
+ --ock-line-inverse: 'your-custom-value';
+ }
+ }
+ ```
+
+
diff --git a/docs/pages/builderkits/onchainkit/guides/telemetry.mdx b/_pages/builderkits/onchainkit/guides/telemetry.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/guides/telemetry.mdx
rename to _pages/builderkits/onchainkit/guides/telemetry.mdx
diff --git a/docs/pages/builderkits/onchainkit/guides/themes.mdx b/_pages/builderkits/onchainkit/guides/themes.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/guides/themes.mdx
rename to _pages/builderkits/onchainkit/guides/themes.mdx
diff --git a/docs/pages/builderkits/onchainkit/guides/troubleshooting.mdx b/_pages/builderkits/onchainkit/guides/troubleshooting.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/guides/troubleshooting.mdx
rename to _pages/builderkits/onchainkit/guides/troubleshooting.mdx
index 29a48c57..3b45fe27 100644
--- a/docs/pages/builderkits/onchainkit/guides/troubleshooting.mdx
+++ b/_pages/builderkits/onchainkit/guides/troubleshooting.mdx
@@ -1,4 +1,7 @@
-# Troubleshooting
+---
+title: "Troubleshooting"
+---
+
This guide covers common issues you may encounter while using OnchainKit. If you don't find your issue here, try searching our [GitHub Issues](https://github.com/coinbase/onchainkit/issues) or joining our [Discord Community](https://discord.gg/invite/cdp).
diff --git a/docs/pages/builderkits/onchainkit/guides/use-basename-in-onchain-app.mdx b/_pages/builderkits/onchainkit/guides/use-basename-in-onchain-app.mdx
similarity index 95%
rename from docs/pages/builderkits/onchainkit/guides/use-basename-in-onchain-app.mdx
rename to _pages/builderkits/onchainkit/guides/use-basename-in-onchain-app.mdx
index 22b6d174..833afc8b 100644
--- a/docs/pages/builderkits/onchainkit/guides/use-basename-in-onchain-app.mdx
+++ b/_pages/builderkits/onchainkit/guides/use-basename-in-onchain-app.mdx
@@ -14,17 +14,15 @@ They operate entirely onchain, utilizing the same technology as ENS names, and a
You can integrate [Basenames](https://www.base.org/names) into your app with these few steps.
-::::steps
+
+
+ Follow the [Getting Started](/builderkits/onchainkit/getting-started) guide to install the package.
+
+
+ Update to the latest version and choose from the following steps: a React component approach, a React hook, or a pure TypeScript utility function.
+
+
-### New to OnchainKit?
-
-Follow the [Getting Started](/builderkits/onchainkit/getting-started) guide to install the package.
-
-### Already using OnchainKit?
-
-Update to the latest version and choose from the following steps: a React component approach, a React hook, or a pure TypeScript utility function.
-
-::::
## React components with `` and ``
@@ -55,8 +53,7 @@ Use the [`useAvatar`](/builderkits/onchainkit/identity/use-avatar) and [`useName
The hooks are incredibly useful for building custom components while leveraging OnchainKit for efficient data fetching.
-:::code-group
-
+
```tsx twoslash [code]
import { useAvatar, useName } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -71,8 +68,7 @@ const { data: name, isLoading: nameIsLoading } = await useName({ address, chain:
{ data: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwMCIgaGVpZ2h0PSIzMDAwIiB2aWV3Qm94PSIwIDAgMzAwMCAzMDAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF81NTY5XzcyODM1KSI+PHJlY3Qgd2lkdGg9IjMwMDAiIGhlaWdodD0iMzAwMCIgZmlsbD0iIzE1NURGRCIvPjxjaXJjbGUgY3g9IjE1MDAiIGN5PSIxNTAwIiByPSIxNTAwIiBmaWxsPSIjMTU1REZEIi8+PHBhdGggZD0iTTI3MTMuMTMgMTUwMEMyNzMxLjIgMTY4MC45MiAyNjE1LjEzIDE4MTguMTUgMjUwNy43OCAxOTI0LjQyQzIzOTQuNyAyMDMyLjEzIDIyOTAuNDQgMjEwOC44OCAyMjAwLjg4IDIyMDAuNjFDMjEwOS4xNSAyMjkwLjE2IDIwMzIuMjIgMjM5NC42MSAxOTI0LjUxIDI1MDcuNjhDMTgxOC4xNSAyNjE1LjA0IDE2ODAuOTIgMjczMS4xMSAxNTAwIDI3MTMuMTNDMTMxOS4wOCAyNzMxLjIgMTE4MS44NSAyNjE1LjEzIDEwNzUuNTggMjUwNy43OEM5NjcuODY2IDIzOTQuNyA4OTEuMTIgMjI5MC40NCA3OTkuMzg5IDIyMDAuODhDNzA5LjgzNyAyMTA5LjE1IDYwNS4zOSAyMDMyLjIyIDQ5Mi4zMTUgMTkyNC41MUMzODQuOTYyIDE4MTguMTUgMjY4Ljg5IDE2ODAuOTIgMjg2Ljg3MyAxNTAwQzI2OC43OTkgMTMxOS4wOCAzODQuODcxIDExODEuODUgNDkyLjIyNCAxMDc1LjU4QzYwNS4yOTkgOTY3Ljg2NiA3MDkuNTY0IDg5MS4xMiA3OTkuMTE2IDc5OS4zODlDODkwLjg0OCA3MDkuODM3IDk2Ny43NzUgNjA1LjM5IDEwNzUuNDkgNDkyLjMxNUMxMTgxLjg1IDM4NC44NzEgMTMxOS4wOCAyNjguNzk5IDE1MDAgMjg2Ljg3M0MxNjgwLjkyIDI2OC43OTkgMTgxOC4xNSAzODQuODcxIDE5MjQuNDIgNDkyLjIyNEMyMDMyLjEzIDYwNS4yOTkgMjEwOC44OCA3MDkuNTY0IDIyMDAuNjEgNzk5LjExNkMyMjkwLjE2IDg5MC44NDggMjM5NC42MSA5NjcuNzc1IDI1MDcuNjggMTA3NS40OUMyNjE1LjA0IDExODEuODUgMjczMS4xMSAxMzE5LjA4IDI3MTMuMTMgMTUwMFoiIGZpbGw9IndoaXRlIi8+PHBhdGggZD0iTTEzOTEuMDYgMTUwMEMxMzkxLjA2IDE2NDcuODkgMTM1OC40IDE3ODEuNjIgMTMwNS43NCAxODc4LjI4QzEyNTMuMDMgMTk3NS4wNSAxMTgwLjY5IDIwMzQgMTEwMS41MyAyMDM0QzEwMjIuMzYgMjAzNCA5NTAuMDMxIDE5NzUuMDUgODk3LjMxNCAxODc4LjI4Qzg0NC42NiAxNzgxLjYyIDgxMiAxNjQ3Ljg5IDgxMiAxNTAwQzgxMiAxMzUyLjExIDg0NC42NiAxMjE4LjM4IDg5Ny4zMTQgMTEyMS43MkM5NTAuMDMxIDEwMjQuOTUgMTAyMi4zNiA5NjYgMTEwMS41MyA5NjZDMTE4MC42OSA5NjYgMTI1My4wMyAxMDI0Ljk1IDEzMDUuNzQgMTEyMS43MkMxMzU4LjQgMTIxOC4zOCAxMzkxLjA2IDEzNTIuMTEgMTM5MS4wNiAxNTAwWiIgZmlsbD0iIzE1NURGRCIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSI2Ii8+PGVsbGlwc2UgY3g9IjExMDIuNTciIGN5PSIxMTk0LjkzIiByeD0iMTI2LjQxNCIgcnk9IjIzMS45MzQiIGZpbGw9IndoaXRlIi8+PHBhdGggZD0iTTIxODcuMTYgMTUwMEMyMTg3LjE2IDE2NDcuODkgMjE1NC41IDE3ODEuNjIgMjEwMS44NCAxODc4LjI4QzIwNDkuMTIgMTk3NS4wNSAxOTc2Ljc5IDIwMzQgMTg5Ny42MyAyMDM0QzE4MTguNDYgMjAzNCAxNzQ2LjEzIDE5NzUuMDUgMTY5My40MSAxODc4LjI4QzE2NDAuNzYgMTc4MS42MiAxNjA4LjEgMTY0Ny44OSAxNjA4LjEgMTUwMEMxNjA4LjEgMTM1Mi4xMSAxNjQwLjc2IDEyMTguMzggMTY5My40MSAxMTIxLjcyQzE3NDYuMTMgMTAyNC45NSAxODE4LjQ2IDk2NiAxODk3LjYzIDk2NkMxOTc2Ljc5IDk2NiAyMDQ5LjEyIDEwMjQuOTUgMjEwMS44NCAxMTIxLjcyQzIxNTQuNSAxMjE4LjM4IDIxODcuMTYgMTM1Mi4xMSAyMTg3LjE2IDE1MDBaIiBmaWxsPSIjMTU1REZEIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjYiLz48ZWxsaXBzZSBjeD0iMTg5Ni41OCIgY3k9IjExOTQuOTMiIHJ4PSIxMjYuNDE0IiByeT0iMjMxLjkzNCIgZmlsbD0id2hpdGUiLz48L2c+PGRlZnM+PGNsaXBQYXRoIGlkPSJjbGlwMF81NTY5XzcyODM1Ij48cmVjdCB3aWR0aD0iMzAwMCIgaGVpZ2h0PSIzMDAwIiBmaWxsPSJ3aGl0ZSIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==', isLoading: false }
{ data: 'zizzamia.base.eth', isLoading: false }
```
-
-:::
+
## Typescript utility with `getAvatar` and `getName`
@@ -80,8 +76,7 @@ Use the [`getAvatar`](/builderkits/onchainkit/identity/get-avatar) and [`getName
Being pure functions, it seamlessly integrates into any TypeScript project, including Vue, Angular, Svelte, or Node.js.
-:::code-group
-
+
```tsx twoslash [code]
import { getAvatar, getName } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -96,5 +91,5 @@ const name = await getName({ address, chain: base });
data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwMCIgaGVpZ2h0PSIzMDAwIiB2aWV3Qm94PSIwIDAgMzAwMCAzMDAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF81NTY5XzcyODM1KSI+PHJlY3Qgd2lkdGg9IjMwMDAiIGhlaWdodD0iMzAwMCIgZmlsbD0iIzE1NURGRCIvPjxjaXJjbGUgY3g9IjE1MDAiIGN5PSIxNTAwIiByPSIxNTAwIiBmaWxsPSIjMTU1REZEIi8+PHBhdGggZD0iTTI3MTMuMTMgMTUwMEMyNzMxLjIgMTY4MC45MiAyNjE1LjEzIDE4MTguMTUgMjUwNy43OCAxOTI0LjQyQzIzOTQuNyAyMDMyLjEzIDIyOTAuNDQgMjEwOC44OCAyMjAwLjg4IDIyMDAuNjFDMjEwOS4xNSAyMjkwLjE2IDIwMzIuMjIgMjM5NC42MSAxOTI0LjUxIDI1MDcuNjhDMTgxOC4xNSAyNjE1LjA0IDE2ODAuOTIgMjczMS4xMSAxNTAwIDI3MTMuMTNDMTMxOS4wOCAyNzMxLjIgMTE4MS44NSAyNjE1LjEzIDEwNzUuNTggMjUwNy43OEM5NjcuODY2IDIzOTQuNyA4OTEuMTIgMjI5MC40NCA3OTkuMzg5IDIyMDAuODhDNzA5LjgzNyAyMTA5LjE1IDYwNS4zOSAyMDMyLjIyIDQ5Mi4zMTUgMTkyNC41MUMzODQuOTYyIDE4MTguMTUgMjY4Ljg5IDE2ODAuOTIgMjg2Ljg3MyAxNTAwQzI2OC43OTkgMTMxOS4wOCAzODQuODcxIDExODEuODUgNDkyLjIyNCAxMDc1LjU4QzYwNS4yOTkgOTY3Ljg2NiA3MDkuNTY0IDg5MS4xMiA3OTkuMTE2IDc5OS4zODlDODkwLjg0OCA3MDkuODM3IDk2Ny43NzUgNjA1LjM5IDEwNzUuNDkgNDkyLjMxNUMxMTgxLjg1IDM4NC44NzEgMTMxOS4wOCAyNjguNzk5IDE1MDAgMjg2Ljg3M0MxNjgwLjkyIDI2OC43OTkgMTgxOC4xNSAzODQuODcxIDE5MjQuNDIgNDkyLjIyNEMyMDMyLjEzIDYwNS4yOTkgMjEwOC44OCA3MDkuNTY0IDIyMDAuNjEgNzk5LjExNkMyMjkwLjE2IDg5MC44NDggMjM5NC42MSA5NjcuNzc1IDI1MDcuNjggMTA3NS40OUMyNjE1LjA0IDExODEuODUgMjczMS4xMSAxMzE5LjA4IDI3MTMuMTMgMTUwMFoiIGZpbGw9IndoaXRlIi8+PHBhdGggZD0iTTEzOTEuMDYgMTUwMEMxMzkxLjA2IDE2NDcuODkgMTM1OC40IDE3ODEuNjIgMTMwNS43NCAxODc4LjI4QzEyNTMuMDMgMTk3NS4wNSAxMTgwLjY5IDIwMzQgMTEwMS41MyAyMDM0QzEwMjIuMzYgMjAzNCA5NTAuMDMxIDE5NzUuMDUgODk3LjMxNCAxODc4LjI4Qzg0NC42NiAxNzgxLjYyIDgxMiAxNjQ3Ljg5IDgxMiAxNTAwQzgxMiAxMzUyLjExIDg0NC42NiAxMjE4LjM4IDg5Ny4zMTQgMTEyMS43MkM5NTAuMDMxIDEwMjQuOTUgMTAyMi4zNiA5NjYgMTEwMS41MyA5NjZDMTE4MC42OSA5NjYgMTI1My4wMyAxMDI0Ljk1IDEzMDUuNzQgMTEyMS43MkMxMzU4LjQgMTIxOC4zOCAxMzkxLjA2IDEzNTIuMTEgMTM5MS4wNiAxNTAwWiIgZmlsbD0iIzE1NURGRCIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSI2Ii8+PGVsbGlwc2UgY3g9IjExMDIuNTciIGN5PSIxMTk0LjkzIiByeD0iMTI2LjQxNCIgcnk9IjIzMS45MzQiIGZpbGw9IndoaXRlIi8+PHBhdGggZD0iTTIxODcuMTYgMTUwMEMyMTg3LjE2IDE2NDcuODkgMjE1NC41IDE3ODEuNjIgMjEwMS44NCAxODc4LjI4QzIwNDkuMTIgMTk3NS4wNSAxOTc2Ljc5IDIwMzQgMTg5Ny42MyAyMDM0QzE4MTguNDYgMjAzNCAxNzQ2LjEzIDE5NzUuMDUgMTY5My40MSAxODc4LjI4QzE2NDAuNzYgMTc4MS42MiAxNjA4LjEgMTY0Ny44OSAxNjA4LjEgMTUwMEMxNjA4LjEgMTM1Mi4xMSAxNjQwLjc2IDEyMTguMzggMTY5My40MSAxMTIxLjcyQzE3NDYuMTMgMTAyNC45NSAxODE4LjQ2IDk2NiAxODk3LjYzIDk2NkMxOTc2Ljc5IDk2NiAyMDQ5LjEyIDEwMjQuOTUgMjEwMS44NCAxMTIxLjcyQzIxNTQuNSAxMjE4LjM4IDIxODcuMTYgMTM1Mi4xMSAyMTg3LjE2IDE1MDBaIiBmaWxsPSIjMTU1REZEIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjYiLz48ZWxsaXBzZSBjeD0iMTg5Ni41OCIgY3k9IjExOTQuOTMiIHJ4PSIxMjYuNDE0IiByeT0iMjMxLjkzNCIgZmlsbD0id2hpdGUiLz48L2c+PGRlZnM+PGNsaXBQYXRoIGlkPSJjbGlwMF81NTY5XzcyODM1Ij48cmVjdCB3aWR0aD0iMzAwMCIgaGVpZ2h0PSIzMDAwIiBmaWxsPSJ3aGl0ZSIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==
zizzamia.base.eth;
```
+
-:::
diff --git a/docs/pages/builderkits/onchainkit/guides/using-ai-powered-ides.mdx b/_pages/builderkits/onchainkit/guides/using-ai-powered-ides.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/guides/using-ai-powered-ides.mdx
rename to _pages/builderkits/onchainkit/guides/using-ai-powered-ides.mdx
diff --git a/docs/pages/builderkits/onchainkit/hooks/use-build-deposit-to-morpho-tx.mdx b/_pages/builderkits/onchainkit/hooks/use-build-deposit-to-morpho-tx.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/hooks/use-build-deposit-to-morpho-tx.mdx
rename to _pages/builderkits/onchainkit/hooks/use-build-deposit-to-morpho-tx.mdx
index 3cb832b0..f3726718 100644
--- a/docs/pages/builderkits/onchainkit/hooks/use-build-deposit-to-morpho-tx.mdx
+++ b/_pages/builderkits/onchainkit/hooks/use-build-deposit-to-morpho-tx.mdx
@@ -1,4 +1,7 @@
-# `useBuildDepositToMorphoTx`
+---
+title: "`useBuildDepositToMorphoTx`"
+---
+
The `useBuildDepositToMorphoTx` hook is used to build a deposit transaction to Morpho from within a React component.
diff --git a/docs/pages/builderkits/onchainkit/hooks/use-build-withdraw-from-morpho-tx.mdx b/_pages/builderkits/onchainkit/hooks/use-build-withdraw-from-morpho-tx.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/hooks/use-build-withdraw-from-morpho-tx.mdx
rename to _pages/builderkits/onchainkit/hooks/use-build-withdraw-from-morpho-tx.mdx
index c72dec4c..42a9b9f5 100644
--- a/docs/pages/builderkits/onchainkit/hooks/use-build-withdraw-from-morpho-tx.mdx
+++ b/_pages/builderkits/onchainkit/hooks/use-build-withdraw-from-morpho-tx.mdx
@@ -1,4 +1,7 @@
-# `useBuildWithdrawFromMorphoTx`
+---
+title: "`useBuildWithdrawFromMorphoTx`"
+---
+
The `useBuildWithdrawFromMorphoTx` hook is used to build a withdraw transaction from Morpho from within a React component.
diff --git a/docs/pages/builderkits/onchainkit/hooks/use-earn-context.mdx b/_pages/builderkits/onchainkit/hooks/use-earn-context.mdx
similarity index 95%
rename from docs/pages/builderkits/onchainkit/hooks/use-earn-context.mdx
rename to _pages/builderkits/onchainkit/hooks/use-earn-context.mdx
index a9a313e3..af1aa8f1 100644
--- a/docs/pages/builderkits/onchainkit/hooks/use-earn-context.mdx
+++ b/_pages/builderkits/onchainkit/hooks/use-earn-context.mdx
@@ -1,4 +1,7 @@
-# `useEarnContext`
+---
+title: "`useEarnContext`"
+---
+
The `useEarnContext` hook is used to access the context values of the `Earn` component.
diff --git a/docs/pages/builderkits/onchainkit/hooks/use-mint-details.mdx b/_pages/builderkits/onchainkit/hooks/use-mint-details.mdx
similarity index 97%
rename from docs/pages/builderkits/onchainkit/hooks/use-mint-details.mdx
rename to _pages/builderkits/onchainkit/hooks/use-mint-details.mdx
index e6cb906e..579a97bc 100644
--- a/docs/pages/builderkits/onchainkit/hooks/use-mint-details.mdx
+++ b/_pages/builderkits/onchainkit/hooks/use-mint-details.mdx
@@ -1,4 +1,7 @@
-# `useMintDetails`
+---
+title: "`useMintDetails`"
+---
+
The `useMintDetails` hook implements the `getMintDetails` API, returning the data required to view an NFT to be minted.
@@ -8,8 +11,7 @@ Before using them, make sure to obtain a [Client API Key](https://portal.cdp.coi
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { useMintDetails } from '@coinbase/onchainkit/nft';
@@ -72,8 +74,7 @@ const queryClient = new QueryClient();
}
}
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/hooks/use-morpho-vault.mdx b/_pages/builderkits/onchainkit/hooks/use-morpho-vault.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/hooks/use-morpho-vault.mdx
rename to _pages/builderkits/onchainkit/hooks/use-morpho-vault.mdx
index c215cab3..8ef23b06 100644
--- a/docs/pages/builderkits/onchainkit/hooks/use-morpho-vault.mdx
+++ b/_pages/builderkits/onchainkit/hooks/use-morpho-vault.mdx
@@ -1,4 +1,7 @@
-# `useMorphoVault`
+---
+title: "`useMorphoVault`"
+---
+
The `useMorphoVault` hook fetches and returns comprehensive data about a Morpho vault, including APYs, balances, and rewards.
diff --git a/docs/pages/builderkits/onchainkit/hooks/use-token-details.mdx b/_pages/builderkits/onchainkit/hooks/use-token-details.mdx
similarity index 97%
rename from docs/pages/builderkits/onchainkit/hooks/use-token-details.mdx
rename to _pages/builderkits/onchainkit/hooks/use-token-details.mdx
index 0ecbdd3f..67a0a27b 100644
--- a/docs/pages/builderkits/onchainkit/hooks/use-token-details.mdx
+++ b/_pages/builderkits/onchainkit/hooks/use-token-details.mdx
@@ -1,4 +1,7 @@
-# `useTokenDetails`
+---
+title: "`useTokenDetails`"
+---
+
The `useTokenDetails` hook implements the `getTokenDetails` API, returning the data required to view an NFT.
@@ -8,8 +11,7 @@ Before using them, make sure to obtain a [Client API Key](https://portal.cdp.coi
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { useTokenDetails } from '@coinbase/onchainkit/nft';
@@ -62,8 +64,7 @@ const queryClient = new QueryClient();
}
}
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/identity/address.mdx b/_pages/builderkits/onchainkit/identity/address.mdx
similarity index 97%
rename from docs/pages/builderkits/onchainkit/identity/address.mdx
rename to _pages/builderkits/onchainkit/identity/address.mdx
index 6492708b..2c8b2464 100644
--- a/docs/pages/builderkits/onchainkit/identity/address.mdx
+++ b/_pages/builderkits/onchainkit/identity/address.mdx
@@ -1,8 +1,11 @@
+---
+title: "``"
+---
+
import { Address } from '@coinbase/onchainkit/identity';
import { color } from '@coinbase/onchainkit/theme';
import App from '@/components/App';
-# ``
The `Address` component is used to render a shortened user account address.
diff --git a/docs/pages/builderkits/onchainkit/identity/avatar.mdx b/_pages/builderkits/onchainkit/identity/avatar.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/identity/avatar.mdx
rename to _pages/builderkits/onchainkit/identity/avatar.mdx
index d819d079..11321850 100644
--- a/docs/pages/builderkits/onchainkit/identity/avatar.mdx
+++ b/_pages/builderkits/onchainkit/identity/avatar.mdx
@@ -1,8 +1,11 @@
+---
+title: "``"
+---
+
import { Avatar, Badge, Identity } from '@coinbase/onchainkit/identity';
import App from '@/components/App';
import { base } from 'viem/chains';
-# ``
The `Avatar` component is used to display ENS or [Basenames](https://www.base.org/names) avatar associated with Ethereum addresses.
When an avatar is not available, it defaults to blue color avatar.
diff --git a/docs/pages/builderkits/onchainkit/identity/badge.mdx b/_pages/builderkits/onchainkit/identity/badge.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/identity/badge.mdx
rename to _pages/builderkits/onchainkit/identity/badge.mdx
index 5692ae65..ac08e90e 100644
--- a/docs/pages/builderkits/onchainkit/identity/badge.mdx
+++ b/_pages/builderkits/onchainkit/identity/badge.mdx
@@ -1,8 +1,11 @@
+---
+title: "``"
+---
+
import { base } from 'viem/chains';
import { Avatar, Badge, Name, Identity } from '@coinbase/onchainkit/identity';
import App from '@/components/App';
-# ``
Use `Badge` component along with [`Avatar`](/builderkits/onchainkit/identity/avatar) or [`Name`](/builderkits/onchainkit/identity/name) components to display user attestations attached to their account
@@ -10,8 +13,7 @@ Use `Badge` component along with [`Avatar`](/builderkits/onchainkit/identity/ava
Badge with default colors:
-:::code-group
-
+
```tsx twoslash [tsx]
import { Badge } from '@coinbase/onchainkit/identity';
// [!code focus]
@@ -25,8 +27,7 @@ import { Badge } from '@coinbase/onchainkit/identity';
}
}
```
-
-:::
+
diff --git a/docs/pages/builderkits/onchainkit/identity/get-address.mdx b/_pages/builderkits/onchainkit/identity/get-address.mdx
similarity index 92%
rename from docs/pages/builderkits/onchainkit/identity/get-address.mdx
rename to _pages/builderkits/onchainkit/identity/get-address.mdx
index 92cb247c..bafc771b 100644
--- a/docs/pages/builderkits/onchainkit/identity/get-address.mdx
+++ b/_pages/builderkits/onchainkit/identity/get-address.mdx
@@ -1,4 +1,7 @@
-# `getAddress`
+---
+title: "`getAddress`"
+---
+
The `getAddress` utility is designed to retrieve an address from an onchain identity provider for a given name.
@@ -6,7 +9,7 @@ The `getAddress` utility is designed to retrieve an address from an onchain iden
Get ENS Name from mainnet chain
-:::code-group
+
```tsx twoslash [code]
import { getAddress } from '@coinbase/onchainkit/identity';
@@ -16,13 +19,11 @@ const address = await getAddress({ name: 'zizzamia.eth' });
```ts [return value]
0x02feeb0AdE57b6adEEdE5A4EEea6Cf8c21BeB6B1
```
-
-:::
+
Get Basename from base chain
-:::code-group
-
+
```tsx twoslash [code]
import { getAddress } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -33,8 +34,7 @@ const address = await getAddress({ name: 'zizzamia.base.eth', chain: base });
```ts [return value]
0x02feeb0AdE57b6adEEdE5A4EEea6Cf8c21BeB6B1
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/identity/get-attestations.mdx b/_pages/builderkits/onchainkit/identity/get-attestations.mdx
similarity index 97%
rename from docs/pages/builderkits/onchainkit/identity/get-attestations.mdx
rename to _pages/builderkits/onchainkit/identity/get-attestations.mdx
index 26a72150..33b43b11 100644
--- a/docs/pages/builderkits/onchainkit/identity/get-attestations.mdx
+++ b/_pages/builderkits/onchainkit/identity/get-attestations.mdx
@@ -1,4 +1,7 @@
-# `getAttestations`
+---
+title: "`getAttestations`"
+---
+
The `getAttestations` function fetches attestations for a specified address
and blockchain in Ethereum Attestation Service (EAS). It allows optional filtering
@@ -8,8 +11,7 @@ In the example, we use the Coinbase [Verified Account](https://base.easscan.org/
## Usage
-:::code-group
-
+
```tsx twoslash [code]
// @noErrors: 2345 - Argument of type string is not assignable to 0x{string}
import { getAttestations } from '@coinbase/onchainkit/identity';
@@ -44,8 +46,7 @@ const attestations = [
},
];
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/identity/get-avatar.mdx b/_pages/builderkits/onchainkit/identity/get-avatar.mdx
similarity index 93%
rename from docs/pages/builderkits/onchainkit/identity/get-avatar.mdx
rename to _pages/builderkits/onchainkit/identity/get-avatar.mdx
index 1087f287..e6c7dc34 100644
--- a/docs/pages/builderkits/onchainkit/identity/get-avatar.mdx
+++ b/_pages/builderkits/onchainkit/identity/get-avatar.mdx
@@ -1,4 +1,7 @@
-# `getAvatar`
+---
+title: "`getAvatar`"
+---
+
The `getAvatar` utility is designed to retrieve an avatar image
URL from an onchain identity provider for a given name.
@@ -15,7 +18,7 @@ Supported providers:
Get Basename avatar:
-:::code-group
+
```tsx twoslash [code]
import { getAvatar } from '@coinbase/onchainkit/identity';
import { base, mainnet } from 'viem/chains';
@@ -26,13 +29,11 @@ const baseAvatar = await getAvatar({ ensName: 'paulcramer.eth', chain: base });
```ts [return value]
https://zku9gdedgba48lmr.public.blob.vercel-storage.com/basenames/avatar/paul.base.eth/1722120524815/FWUzoZmJ_400x400-kWjr2gMvjNe9hHMs9Z9LxGVGIME3By.jpg
```
-
-:::
+
Get ENS avatar:
-:::code-group
-
+
```tsx twoslash [code]
import { getAvatar } from '@coinbase/onchainkit/identity';
import { mainnet } from 'viem/chains';
@@ -43,8 +44,7 @@ const ensAvatar = await getAvatar({ ensName: 'paulcramer.eth', chain: mainnet })
```ts [return value]
https://euc.li/paulcramer.eth;
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/identity/get-avatars.mdx b/_pages/builderkits/onchainkit/identity/get-avatars.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/identity/get-avatars.mdx
rename to _pages/builderkits/onchainkit/identity/get-avatars.mdx
index 592fa87d..ced4b9a8 100644
--- a/docs/pages/builderkits/onchainkit/identity/get-avatars.mdx
+++ b/_pages/builderkits/onchainkit/identity/get-avatars.mdx
@@ -1,4 +1,7 @@
-# `getAvatars`
+---
+title: "`getAvatars`"
+---
+
The `getAvatars` utility is designed to retrieve multiple avatars from an onchain identity
provider for an array of ENS names or Basenames in a single batch request.
@@ -10,8 +13,7 @@ use it with Next.js or any Node.js backend.
Get avatars for multiple ENS names:
-:::code-group
-
+
```tsx twoslash [code]
import { getAvatars } from '@coinbase/onchainkit/identity';
@@ -25,13 +27,11 @@ const avatars = await getAvatars({ ensNames });
'https://ipfs.io/ipfs/QmQ9RT2SrZ6TWUjrQxG4bNnhb3nDqBE5Ld1j9GYvk3kTjf'
]
```
-
-:::
+
Get avatars for multiple Basenames:
-:::code-group
-
+
```tsx twoslash [code]
import { getAvatars } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -46,13 +46,11 @@ const avatars = await getAvatars({ ensNames, chain: base });
'https://ipfs.io/ipfs/QmXHFnSXcN7CSuVcyF3vyPgPcPvLQyLpKYBaNpx3x3bPAZ'
]
```
-
-:::
+
Get avatars for a mix of ENS names and Basenames:
-:::code-group
-
+
```tsx twoslash [code]
import { getAvatars } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -67,8 +65,7 @@ const avatars = await getAvatars({ ensNames, chain: base });
'https://ipfs.io/ipfs/QmQ9RT2SrZ6TWUjrQxG4bNnhb3nDqBE5Ld1j9GYvk3kTjf'
]
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/identity/get-name.mdx b/_pages/builderkits/onchainkit/identity/get-name.mdx
similarity index 93%
rename from docs/pages/builderkits/onchainkit/identity/get-name.mdx
rename to _pages/builderkits/onchainkit/identity/get-name.mdx
index 28dd1ad6..0181f75b 100644
--- a/docs/pages/builderkits/onchainkit/identity/get-name.mdx
+++ b/_pages/builderkits/onchainkit/identity/get-name.mdx
@@ -1,4 +1,7 @@
-# `getName`
+---
+title: "`getName`"
+---
+
The `getName` utility is designed to retrieve a name from an onchain identity
provider for a specific address.
@@ -10,8 +13,7 @@ use it with Next.js or any Node.js backend.
Get ENS name from an address:
-:::code-group
-
+
```tsx twoslash [code]
import { getName } from '@coinbase/onchainkit/identity';
@@ -22,13 +24,11 @@ const name = await getName({ address });
```ts [return value]
zizzamia.eth;
```
-
-:::
+
Get Basename from an address:
-:::code-group
-
+
```tsx twoslash [code]
import { getName } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -40,13 +40,11 @@ const name = await getName({ address, chain: base });
```ts [return value]
zizzamia.base.eth;
```
-
-:::
+
Get a sliced address when address does not have an ENS name:
-:::code-group
-
+
```tsx twoslash [code]
import { getName } from '@coinbase/onchainkit/identity';
@@ -57,8 +55,7 @@ const name = await getName({ address });
```ts [return value]
0x123...5678
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/identity/get-names.mdx b/_pages/builderkits/onchainkit/identity/get-names.mdx
similarity index 93%
rename from docs/pages/builderkits/onchainkit/identity/get-names.mdx
rename to _pages/builderkits/onchainkit/identity/get-names.mdx
index 45abe5bb..9a93d626 100644
--- a/docs/pages/builderkits/onchainkit/identity/get-names.mdx
+++ b/_pages/builderkits/onchainkit/identity/get-names.mdx
@@ -1,4 +1,7 @@
-# `getNames`
+---
+title: "`getNames`"
+---
+
The `getNames` utility is designed to retrieve multiple names from an onchain identity
provider for an array of addresses in a single batch request.
@@ -10,8 +13,7 @@ use it with Next.js or any Node.js backend.
Get ENS names from multiple addresses:
-:::code-group
-
+
```tsx twoslash [code]
import { getNames } from '@coinbase/onchainkit/identity';
@@ -25,13 +27,11 @@ const names = await getNames({ addresses });
```ts [return value]
['paulcramer.eth', 'vitalik.eth']
```
-
-:::
+
Get Basenames from multiple addresses:
-:::code-group
-
+
```tsx twoslash [code]
import { getNames } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -46,13 +46,11 @@ const names = await getNames({ addresses, chain: base });
```ts [return value]
['paul.base.eth', 'coinbase.base.eth']
```
-
-:::
+
Get a mix of ENS names and sliced addresses when some addresses don't have names:
-:::code-group
-
+
```tsx twoslash [code]
import { getNames } from '@coinbase/onchainkit/identity';
@@ -66,8 +64,7 @@ const names = await getNames({ addresses });
```ts [return value]
['paulcramer.eth', null]
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/identity/identity-card.mdx b/_pages/builderkits/onchainkit/identity/identity-card.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/identity/identity-card.mdx
rename to _pages/builderkits/onchainkit/identity/identity-card.mdx
diff --git a/docs/pages/builderkits/onchainkit/identity/identity.mdx b/_pages/builderkits/onchainkit/identity/identity.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/identity/identity.mdx
rename to _pages/builderkits/onchainkit/identity/identity.mdx
diff --git a/docs/pages/builderkits/onchainkit/identity/name.mdx b/_pages/builderkits/onchainkit/identity/name.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/identity/name.mdx
rename to _pages/builderkits/onchainkit/identity/name.mdx
index 242c1d42..3880b12e 100644
--- a/docs/pages/builderkits/onchainkit/identity/name.mdx
+++ b/_pages/builderkits/onchainkit/identity/name.mdx
@@ -1,8 +1,11 @@
+---
+title: "``"
+---
+
import { Badge, Name, Identity } from '@coinbase/onchainkit/identity';
import App from '@/components/App';
import { base } from 'viem/chains';
-# ``
The `Name` component is used to display ENS or [Basenames](https://www.base.org/names) associated with Ethereum addresses.
diff --git a/docs/pages/builderkits/onchainkit/identity/socials.mdx b/_pages/builderkits/onchainkit/identity/socials.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/identity/socials.mdx
rename to _pages/builderkits/onchainkit/identity/socials.mdx
diff --git a/docs/pages/builderkits/onchainkit/identity/types.mdx b/_pages/builderkits/onchainkit/identity/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/identity/types.mdx
rename to _pages/builderkits/onchainkit/identity/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/identity/use-address.mdx b/_pages/builderkits/onchainkit/identity/use-address.mdx
similarity index 96%
rename from docs/pages/builderkits/onchainkit/identity/use-address.mdx
rename to _pages/builderkits/onchainkit/identity/use-address.mdx
index cd5bdb52..b89f2b72 100644
--- a/docs/pages/builderkits/onchainkit/identity/use-address.mdx
+++ b/_pages/builderkits/onchainkit/identity/use-address.mdx
@@ -1,4 +1,7 @@
-# `useAddress`
+---
+title: "`useAddress`"
+---
+
The `useAddress` hook is used to get an address from an onchain identity provider for a given name.
diff --git a/docs/pages/builderkits/onchainkit/identity/use-avatar.mdx b/_pages/builderkits/onchainkit/identity/use-avatar.mdx
similarity index 96%
rename from docs/pages/builderkits/onchainkit/identity/use-avatar.mdx
rename to _pages/builderkits/onchainkit/identity/use-avatar.mdx
index 6e00b195..466d5f66 100644
--- a/docs/pages/builderkits/onchainkit/identity/use-avatar.mdx
+++ b/_pages/builderkits/onchainkit/identity/use-avatar.mdx
@@ -1,4 +1,7 @@
-# `useAvatar`
+---
+title: "`useAvatar`"
+---
+
The `useAvatar` hook is used to get avatar image URL from an onchain identity
provider for a given name.
diff --git a/docs/pages/builderkits/onchainkit/identity/use-avatars.mdx b/_pages/builderkits/onchainkit/identity/use-avatars.mdx
similarity index 95%
rename from docs/pages/builderkits/onchainkit/identity/use-avatars.mdx
rename to _pages/builderkits/onchainkit/identity/use-avatars.mdx
index 6ea8f778..fd032419 100644
--- a/docs/pages/builderkits/onchainkit/identity/use-avatars.mdx
+++ b/_pages/builderkits/onchainkit/identity/use-avatars.mdx
@@ -1,4 +1,7 @@
-# `useAvatars`
+---
+title: "`useAvatars`"
+---
+
The `useAvatars` hook is used to get multiple avatar image URLs from an onchain identity
provider for an array of ENS names or Basenames in a single batch request.
@@ -9,8 +12,7 @@ It is implemented with [useQuery](https://tanstack.com/query/latest/docs/framewo
Get avatars for multiple ENS names:
-:::code-group
-
+
```tsx twoslash [code]
import { useAvatars } from '@coinbase/onchainkit/identity';
@@ -27,13 +29,11 @@ const { data: avatars, isLoading } = useAvatars({ ensNames });
isLoading: false
}
```
-
-:::
+
Get avatars for multiple Basenames:
-:::code-group
-
+
```tsx twoslash [code]
import { useAvatars } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -51,8 +51,7 @@ const { data: avatars, isLoading } = useAvatars({ ensNames, chain: base });
isLoading: false
}
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/identity/use-name.mdx b/_pages/builderkits/onchainkit/identity/use-name.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/identity/use-name.mdx
rename to _pages/builderkits/onchainkit/identity/use-name.mdx
index aaa53f60..5171cf4c 100644
--- a/docs/pages/builderkits/onchainkit/identity/use-name.mdx
+++ b/_pages/builderkits/onchainkit/identity/use-name.mdx
@@ -1,4 +1,7 @@
-# `useName`
+---
+title: "`useName`"
+---
+
The `useName` hook is used to get name from an onchain identity provider
for a given address.
@@ -9,8 +12,7 @@ It is implemented with [useQuery](https://tanstack.com/query/latest/docs/framewo
Get ENS name from an address:
-:::code-group
-
+
```tsx twoslash [code]
import { useName } from '@coinbase/onchainkit/identity';
@@ -21,13 +23,11 @@ const { data: name, isLoading } = await useName({ address });
```ts [return value]
{ data: 'zizzamia.eth', isLoading: false }
```
-
-:::
+
Get Basename from an address:
-:::code-group
-
+
```tsx twoslash [code]
import { useName } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -39,8 +39,7 @@ const { data: name, isLoading } = await useName({ address, chain: base });
```ts [return value]
{ data: 'zizzamia.base.eth', isLoading: false }
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/identity/use-names.mdx b/_pages/builderkits/onchainkit/identity/use-names.mdx
similarity index 95%
rename from docs/pages/builderkits/onchainkit/identity/use-names.mdx
rename to _pages/builderkits/onchainkit/identity/use-names.mdx
index 769c9095..5865ed79 100644
--- a/docs/pages/builderkits/onchainkit/identity/use-names.mdx
+++ b/_pages/builderkits/onchainkit/identity/use-names.mdx
@@ -1,4 +1,7 @@
-# `useNames`
+---
+title: "`useNames`"
+---
+
The `useNames` hook is used to get multiple names from an onchain identity provider
for an array of addresses in a single batch request.
@@ -9,8 +12,7 @@ It is implemented with [useQuery](https://tanstack.com/query/latest/docs/framewo
Get ENS names from multiple addresses:
-:::code-group
-
+
```tsx twoslash [code]
import { useNames } from '@coinbase/onchainkit/identity';
@@ -27,13 +29,11 @@ const { data: names, isLoading } = useNames({ addresses });
isLoading: false
}
```
-
-:::
+
Get Basenames from multiple addresses:
-:::code-group
-
+
```tsx twoslash [code]
import { useNames } from '@coinbase/onchainkit/identity';
import { base } from 'viem/chains';
@@ -51,8 +51,7 @@ const { data: names, isLoading } = useNames({ addresses, chain: base });
isLoading: false
}
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/installation.mdx b/_pages/builderkits/onchainkit/installation.mdx
similarity index 74%
rename from docs/pages/builderkits/onchainkit/installation.mdx
rename to _pages/builderkits/onchainkit/installation.mdx
index 78def6d4..96b450e4 100644
--- a/docs/pages/builderkits/onchainkit/installation.mdx
+++ b/_pages/builderkits/onchainkit/installation.mdx
@@ -3,7 +3,7 @@ title: Installation · OnchainKit
description: Install OnchainKit using the top React frameworks
---
-import InstallationOptions from '@/components/InstallationOptions';
+import InstallationOptions from '/snippets/installation-options.mdx';
# Installation
diff --git a/_pages/builderkits/onchainkit/installation/astro.mdx b/_pages/builderkits/onchainkit/installation/astro.mdx
new file mode 100644
index 00000000..c0b98b9c
--- /dev/null
+++ b/_pages/builderkits/onchainkit/installation/astro.mdx
@@ -0,0 +1,198 @@
+---
+title: Astro Installation · OnchainKit
+description: Install OnchainKit using Astro
+---
+
+import StartBuilding from "/snippets/start-building.mdx";
+
+# Astro Installation
+
+Install and configure OnchainKit with Astro.
+If you are integrating OnchainKit into an existing project,
+skip to the [OnchainKit installation](#install-onchainkit).
+
+
+
+ Create a new Astro project by using the Astro CLI.
+ More information about Astro can be found [here](https://docs.astro.build/en/install-and-setup/#start-a-new-project).
+
+
+ ```bash [npm]
+ npm create astro@latest
+ ```
+
+ ```bash [yarn]
+ yarn create astro
+ ```
+
+ ```bash [pnpm]
+ pnpm create astro@latest
+ ```
+
+
+
+ Astro does not come with React by default, so if you are not already using React
+ in your application, you will need to install it.
+
+ ```bash [Terminal]
+ npx astro add react
+ ```
+
+
+ Add OnchainKit to your project by installing the `@coinbase/onchainkit` package.
+
+
+ ```bash [npm]
+ npm install @coinbase/onchainkit
+ ```
+
+ ```bash [yarn]
+ yarn add @coinbase/onchainkit
+ ```
+
+ ```bash [pnpm]
+ pnpm add @coinbase/onchainkit
+ ```
+
+ ```bash [bun]
+ bun add @coinbase/onchainkit
+ ```
+
+
+
+ Get your [Client API Key](https://portal.cdp.coinbase.com/projects/api-keys/client-key) from Coinbase Developer Platform.
+
+
+
+ Create a `.env` file in your project's root directory.
+
+
+
+ Add your Client API Key to the `.env` file:
+
+ ```dotenv [.env]
+ PUBLIC_ONCHAINKIT_API_KEY=YOUR_CLIENT_API_KEY
+ ```
+
+
+ Create a `providers.tsx` file. Add `OnchainKitProvider` with your desired config.
+
+ Under the hood, OnchainKit will create our recommended Wagmi and QueryClient
+ providers. If you wish to customize these providers, check out [Custom
+ Supplemental Providers](/builderkits/onchainkit/config/supplemental-providers).
+
+ ```tsx twoslash [providers.tsx]
+ // @noErrors: 2307 2580 2339 - cannot find 'process', cannot find './wagmi', cannot find 'import.meta'
+ 'use client';
+
+ import type { ReactNode } from 'react';
+ import { OnchainKitProvider } from '@coinbase/onchainkit';
+ import { base } from 'wagmi/chains'; // add baseSepolia for testing // [!code ++]
+
+ export function Providers(props: { children: ReactNode }) {
+ return (
+
+ {props.children}
+
+ );
+ }
+ ```
+
+
+ After configuring the providers in step 4, you will need to wrap your OnchainKit components
+ with the `` component.
+
+ There are two options for this:
+
+ 1. Create a component, eg. `` that contains all OnchainKit components.
+ 2. Wrap every OnchainKit component individually.
+
+
+ ```tsx [ReactIsland]
+ import { AppProviders } from '../AppProviders';
+
+ export default function ReactIsland() {
+ return (
+
+
+
+ );
+ }
+ ```
+
+ ```tsx [OnchainKit Wrappers]
+ import { AppProviders } from '../AppProviders';
+ import { OnchainKitComponent } from '@coinbase/onchainkit';
+
+ export default function OnchainKitComponentWrapper() {
+ return (
+
+
+
+ );
+ }
+ ```
+
+
+ The advantage of ReactIsland is that you will only have a single provider at any time.
+ The drawback is that your OnchainKit components will all need to live in the same Island.
+
+ The advantage of individual wrappers is that you can use OnchainKit components anywhere in your app.
+ The drawback is that you will have multiple providers if you use more than one OnchainKit component.
+
+
+ You can add OnchainKit components to your app by using the component(s) you
+ created above into your `.astro` files.
+
+ For example, if you created a ReactIsland, you can add it to your
+ `src/pages/index.astro` file:
+
+ ```astro [src/pages/index.astro]
+ ---
+ import Layout from '../layouts/Layout.astro';
+ import ReactIsland from '../components/ReactIsland';
+ ---
+
+
+
+ ...
+
+ ...
+
+
+ ```
+
+ Don't forget to add the `client:only="react"` directive to your OnchainKit component,
+ as this is required for Astro to render React components.
+
+
+ OnchainKit components come with pre-configured styles.
+ To include these styles in your project, add the following import
+ statement at the top of the `Layout.astro` file:
+
+ ```tsx
+ import '@coinbase/onchainkit/styles.css';
+ ```
+
+ This ensures that the OnchainKit styles are loaded and applied to your entire application.
+
+ - For Tailwind CSS users, check out our [Tailwind Integration Guide](/builderkits/onchainkit/guides/tailwind).
+
+ - Update the appearance of components by using our built-in themes or crafting your own custom theme.
+ Explore the possibilities in our [Theming Guide](/builderkits/onchainkit/guides/themes).
+
+
+
+
diff --git a/_pages/builderkits/onchainkit/installation/nextjs.mdx b/_pages/builderkits/onchainkit/installation/nextjs.mdx
new file mode 100644
index 00000000..6ec71f31
--- /dev/null
+++ b/_pages/builderkits/onchainkit/installation/nextjs.mdx
@@ -0,0 +1,175 @@
+---
+title: Next.js Installation · OnchainKit
+description: Install OnchainKit using Next.js
+---
+
+import StartBuilding from "/snippets/start-building.mdx";
+
+# Next.js Installation
+
+Install and configure OnchainKit with Next.js.
+If you are integrating OnchainKit into an existing project,
+skip to the [OnchainKit installation](#install-onchainkit).
+
+
+
+ Create a new Next.js project by using the Next.js CLI.
+ More information about Next.js can be found [here](https://nextjs.org/docs/getting-started/installation).
+
+ ```bash [npm]
+ npx create-next-app@14
+ ```
+
+ During the setup process you will encounter multiple prompts.
+ Make sure you enable TypeScript, ESLint, and Tailwind CSS.
+
+
+ Install OnchainKit in your project.
+
+
+ ```bash [npm]
+ npm install @coinbase/onchainkit
+ ```
+
+ ```bash [yarn]
+ yarn add @coinbase/onchainkit
+ ```
+
+ ```bash [pnpm]
+ pnpm add @coinbase/onchainkit
+ ```
+
+ ```bash [bun]
+ bun add @coinbase/onchainkit
+ ```
+
+
+
+ Get your [Client API Key](https://portal.cdp.coinbase.com/projects/api-keys/client-key) from Coinbase Developer Platform.
+
+
+
+ Create a `.env` file in your project's root directory.
+
+
+
+ Add your Client API Key to the `.env` file:
+
+ ```tsx [.env]
+ NEXT_PUBLIC_ONCHAINKIT_API_KEY=YOUR_CLIENT_API_KEY;
+ ```
+
+
+ Create a `providers.tsx` file. Add `OnchainKitProvider` with your desired config.
+
+ Under the hood, OnchainKit will create our recommended Wagmi and QueryClient
+ providers. If you wish to customize these providers, check out [Custom
+ Supplemental Providers](/builderkits/onchainkit/config/supplemental-providers).
+
+ ```tsx twoslash [providers.tsx]
+ // @noErrors: 2307 2580 2339 - cannot find 'process', cannot find './wagmi', cannot find 'import.meta'
+ 'use client';
+
+ import type { ReactNode } from 'react';
+ import { OnchainKitProvider } from '@coinbase/onchainkit';
+ import { base } from 'wagmi/chains'; // add baseSepolia for testing // [!code ++]
+
+ export function Providers(props: { children: ReactNode }) {
+ return (
+
+ {props.children}
+
+ );
+ }
+ ```
+
+
+ After the setup, wrap your app with the above `` component.
+
+ ```javascript [app.tsx]
+ import './globals.css';
+ import { Providers } from './providers'; // [!code ++]
+
+ export default function RootLayout({
+ children,
+ }: Readonly<{
+ children: React.ReactNode,
+ }>) {
+ return (
+
+
+
+ {children}
+
+
+
+ );
+ }
+ ```
+
+
+ OnchainKit components come with pre-configured styles. To include these styles in your project, add the following import statement at the top of this file:
+
+ ```javascript
+ import '@coinbase/onchainkit/styles.css';
+ ```
+
+ For example, if you're using Next.js with the app router, your `app/layout.tsx` might look like this:
+
+ ```tsx [layout.tsx]
+ import '@coinbase/onchainkit/styles.css'; // [!code ++]
+ import './globals.css';
+ import type { Metadata } from 'next';
+ import { Inter } from 'next/font/google';
+ import { headers } from 'next/headers';
+ import { type ReactNode } from 'react';
+ import { cookieToInitialState } from 'wagmi';
+
+ import { getConfig } from '../wagmi';
+ import { Providers } from './providers';
+
+ const inter = Inter({ subsets: ['latin'] });
+
+ export const metadata: Metadata = {
+ title: 'Create Wagmi',
+ description: 'Generated by create-wagmi',
+ };
+
+ export default function RootLayout(props: { children: ReactNode }) {
+ const initialState = cookieToInitialState(
+ getConfig(),
+ headers().get('cookie')
+ );
+ return (
+
+
+ {props.children}
+
+
+ );
+ }
+ ```
+
+ This ensures that the OnchainKit styles are loaded and applied to your entire application.
+
+ - For Tailwind CSS users, check out our [Tailwind Integration Guide](/builderkits/onchainkit/guides/tailwind).
+
+ - Update the appearance of components by using our built-in themes or crafting your own custom theme.
+ Explore the possibilities in our [Theming Guide](/builderkits/onchainkit/guides/themes).
+
+
+
+
+
diff --git a/_pages/builderkits/onchainkit/installation/remix.mdx b/_pages/builderkits/onchainkit/installation/remix.mdx
new file mode 100644
index 00000000..969c363a
--- /dev/null
+++ b/_pages/builderkits/onchainkit/installation/remix.mdx
@@ -0,0 +1,196 @@
+---
+title: Remix Installation · OnchainKit
+description: Install OnchainKit using Remix
+---
+
+import StartBuilding from "/snippets/start-building.mdx";
+
+# Remix Installation
+
+Install and configure OnchainKit with Remix.
+If you are integrating OnchainKit into an existing project,
+skip to the [OnchainKit installation](#install-onchainkit).
+
+
+
+ Create a new Remix project by using the Remix CLI.
+ More information about Remix can be found [here](https://remix.run/docs/en/main/start/quickstart).
+
+ ```bash [Terminal]
+ npx create-remix@latest
+ ```
+
+
+ Add OnchainKit to your project by installing the `@coinbase/onchainkit` package.
+
+
+ ```bash [npm]
+ npm install @coinbase/onchainkit
+ ```
+
+ ```bash [yarn]
+ yarn add @coinbase/onchainkit
+ ```
+
+ ```bash [pnpm]
+ pnpm add @coinbase/onchainkit
+ ```
+
+ ```bash [bun]
+ bun add @coinbase/onchainkit
+ ```
+
+
+
+
+ Get your [Client API Key](https://portal.cdp.coinbase.com/projects/api-keys/client-key) from Coinbase Developer Platform.
+
+
+
+ Create a `.env` file in your project's root directory.
+
+
+
+ Add your Client API Key to the `.env` file:
+
+ ```dotenv [.env]
+ PUBLIC_ONCHAINKIT_API_KEY=YOUR_CLIENT_API_KEY
+ ```
+
+ Update the `app/root.tsx` file to provide access to your Client API Key
+ through `window.ENV`:
+
+ ```tsx [app/root.tsx]
+ declare global {
+ interface Window {
+ ENV: {
+ PUBLIC_ONCHAINKIT_API_KEY: string; // [!code ++]
+ };
+ }
+ }
+
+ export async function loader() {
+ return json({
+ ENV: {
+ PUBLIC_ONCHAINKIT_API_KEY: process.env.PUBLIC_ONCHAINKIT_API_KEY, // [!code ++]
+ },
+ });
+ }
+ ```
+
+ If this is the first env variable you've added to your project, you will need to
+ update the `Layout` component of `app/root.tsx` to make it available to your app:
+
+ ```tsx [app/root.tsx]
+ export function Layout({ children }: { children: React.ReactNode }) {
+ const data = useLoaderData(); // [!code ++]
+ return (
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+ );
+ }
+ ```
+
+
+ Create a `providers.tsx` file. Add `OnchainKitProvider` with your desired config.
+
+ Under the hood, OnchainKit will create our recommended Wagmi and QueryClient
+ providers. If you wish to customize these providers, check out [Custom
+ Supplemental Providers](/builderkits/onchainkit/config/supplemental-providers).
+
+ ```tsx twoslash [providers.tsx]
+ // @noErrors: 2307 2580 2339 - cannot find 'process', cannot find './wagmi', cannot find 'import.meta'
+ 'use client';
+
+ import type { ReactNode } from 'react';
+ import { OnchainKitProvider } from '@coinbase/onchainkit';
+ import { base } from 'wagmi/chains'; // add baseSepolia for testing // [!code ++]
+
+ export function Providers(props: { children: ReactNode }) {
+ const apiKey =
+ typeof window !== 'undefined'
+ ? window.ENV?.PUBLIC_ONCHAINKIT_API_KEY
+ : undefined;
+ return (
+
+ {props.children}
+
+ );
+ }
+ ```
+
+
+ After configuring the providers in step 4, wrap your app with
+ the `` component.
+
+ ```tsx [app.tsx]
+ import { AppProviders } from 'src/AppProviders';
+
+ export default function App() {
+ return (
+
+
+
+ );
+ }
+ ```
+
+
+ OnchainKit components come with pre-configured styles.
+ To include these styles in your project, add the following import
+ statement at the top of the file where imported ``:
+
+ ```tsx [app.tsx]
+ import { AppProviders } from 'src/AppProviders';
+ import '@coinbase/onchainkit/styles.css'; // [!code ++]
+
+ export default function App() {
+ return (
+
+
+
+ );
+ }
+ ```
+
+ This ensures that the OnchainKit styles are loaded and applied to your entire application.
+
+ - For Tailwind CSS users, check out our [Tailwind Integration Guide](/builderkits/onchainkit/guides/tailwind).
+
+ - Update the appearance of components by using our built-in themes or crafting your own custom theme.
+ Explore the possibilities in our [Theming Guide](/builderkits/onchainkit/guides/themes).
+
+
+
+
+
diff --git a/_pages/builderkits/onchainkit/installation/vite.mdx b/_pages/builderkits/onchainkit/installation/vite.mdx
new file mode 100644
index 00000000..3d9bc9e6
--- /dev/null
+++ b/_pages/builderkits/onchainkit/installation/vite.mdx
@@ -0,0 +1,158 @@
+---
+title: Vite Installation · OnchainKit
+description: Install OnchainKit using Vite
+---
+
+import StartBuilding from "/snippets/start-building.mdx";
+
+# Vite Installation
+
+Install and configure OnchainKit with Vite.
+If you are integrating OnchainKit into an existing project,
+skip to the [OnchainKit installation](#install-onchainkit).
+
+
+
+ Create a new Vite project by using the Vite CLI.
+ More information about Vite can be found [here](https://vite.dev/guide/#scaffolding-your-first-vite-project).
+
+
+ ```bash [npm]
+ npm create vite@latest
+ ```
+
+ ```bash [yarn]
+ yarn create vite
+ ```
+
+ ```bash [pnpm]
+ pnpm create vite
+ ```
+
+ ```bash [bun]
+ bun create vite
+ ```
+
+
+ During the setup process you will encounter multiple prompts.
+ Make sure you select React and TypeScript.
+
+
+
+ Add OnchainKit to your project by installing the `@coinbase/onchainkit` package.
+
+
+ ```bash [npm]
+ npm install @coinbase/onchainkit
+ ```
+
+ ```bash [yarn]
+ yarn add @coinbase/onchainkit
+ ```
+
+ ```bash [pnpm]
+ pnpm add @coinbase/onchainkit
+ ```
+
+ ```bash [bun]
+ bun add @coinbase/onchainkit
+ ```
+
+
+
+ Get your [Client API Key](https://portal.cdp.coinbase.com/projects/api-keys/client-key) from Coinbase Developer Platform.
+
+
+
+ Create a `.env` file in your project's root directory.
+
+
+
+ Add your Client API Key to the `.env` file:
+
+ ```dotenv [.env]
+ VITE_PUBLIC_ONCHAINKIT_API_KEY=YOUR_CLIENT_API_KEY
+ ```
+
+
+
+ Create a `providers.tsx` file. Add `OnchainKitProvider` with your desired config.
+
+ Under the hood, OnchainKit will create our recommended Wagmi and QueryClient
+ providers. If you wish to customize these providers, check out [Custom
+ Supplemental Providers](/builderkits/onchainkit/config/supplemental-providers).
+
+ ```tsx twoslash [providers.tsx]
+ // @noErrors: 2307 2580 2339 - cannot find 'process', cannot find './wagmi', cannot find 'import.meta'
+ 'use client';
+
+ import type { ReactNode } from 'react';
+ import { OnchainKitProvider } from '@coinbase/onchainkit';
+ import { base } from 'wagmi/chains'; // add baseSepolia for testing // [!code ++]
+
+ export function Providers(props: { children: ReactNode }) {
+ return (
+
+ {props.children}
+
+ );
+ }
+ ```
+
+
+ After configuring the providers in step 4, wrap your app with
+ the `` component.
+
+ ```tsx [app.tsx]
+ import { AppProviders } from 'src/AppProviders';
+
+ export default function App() {
+ return (
+
+
+
+ );
+ }
+ ```
+
+
+OnchainKit components come with pre-configured styles.
+ To include these styles in your project, add the following import
+ statement at the top of the file where imported ``:
+
+ ```tsx [app.tsx]
+ import { AppProviders } from 'src/AppProviders';
+ import '@coinbase/onchainkit/styles.css'; // [!code ++]
+
+ export default function App() {
+ return (
+
+
+
+ );
+ }
+ ```
+
+ This ensures that the OnchainKit styles are loaded and applied to your entire application.
+
+ - For Tailwind CSS users, check out our [Tailwind Integration Guide](/builderkits/onchainkit/guides/tailwind).
+
+ - Update the appearance of components by using our built-in themes or crafting your own custom theme.
+ Explore the possibilities in our [Theming Guide](/builderkits/onchainkit/guides/themes).
+
+
+
+
+
diff --git a/docs/pages/builderkits/onchainkit/mint/nft-card.mdx b/_pages/builderkits/onchainkit/mint/nft-card.mdx
similarity index 88%
rename from docs/pages/builderkits/onchainkit/mint/nft-card.mdx
rename to _pages/builderkits/onchainkit/mint/nft-card.mdx
index e5a417d4..6a976a72 100644
--- a/docs/pages/builderkits/onchainkit/mint/nft-card.mdx
+++ b/_pages/builderkits/onchainkit/mint/nft-card.mdx
@@ -37,8 +37,7 @@ npm create onchain@latest
If you're adding `NFTCard` to an existing project, simply install OnchainKit.
-:::code-group
-
+
```bash [npm]
npm install @coinbase/onchainkit
```
@@ -54,8 +53,7 @@ pnpm add @coinbase/onchainkit
```bash [bun]
bun add @coinbase/onchainkit
```
-
-:::
+
Wrap the `` around your app, following the steps in [Getting Started](/builderkits/onchainkit/getting-started#add-providers).
@@ -74,48 +72,47 @@ import { NFTCardDefault } from '@coinbase/onchainkit/nft'; // [!code focus]
If you'd like more customization you can follow the steps below to customize which subcomponents are rendered.
-::::steps
-
-### Add the NFTCard
-
-```tsx twoslash
-// @noErrors: 2741 - Property children missing in type
-import { NFTCard } from '@coinbase/onchainkit/nft'; // [!code focus]
-
-
-
-```
-
-### Add the NFTCard components
-
-```tsx twoslash
-import { NFTCard } from '@coinbase/onchainkit/nft';
-import {
- NFTLastSoldPrice, // [!code ++]
- NFTMedia, // [!code ++]
- NFTNetwork, // [!code ++]
- NFTOwner, // [!code ++]
- NFTTitle, // [!code ++]
-} from '@coinbase/onchainkit/nft/view'; // [!code ++]
-
-
-
-
-
-
-
-
-```
-
-
-
-::::
+
+
+
+ ```tsx twoslash
+ // @noErrors: 2741 - Property children missing in type
+ import { NFTCard } from '@coinbase/onchainkit/nft'; // [!code focus]
+
+
+
+ ```
+
+
+ ```tsx twoslash
+ import { NFTCard } from '@coinbase/onchainkit/nft';
+ import {
+ NFTLastSoldPrice, // [!code ++]
+ NFTMedia, // [!code ++]
+ NFTNetwork, // [!code ++]
+ NFTOwner, // [!code ++]
+ NFTTitle, // [!code ++]
+ } from '@coinbase/onchainkit/nft/view'; // [!code ++]
+
+
+
+
+
+
+
+
+ ```
+
+
+
+
+
That's it! You've now created an NFT card.
diff --git a/docs/pages/builderkits/onchainkit/mint/nft-mint-card.mdx b/_pages/builderkits/onchainkit/mint/nft-mint-card.mdx
similarity index 88%
rename from docs/pages/builderkits/onchainkit/mint/nft-mint-card.mdx
rename to _pages/builderkits/onchainkit/mint/nft-mint-card.mdx
index ef2d1c6c..e1f50994 100644
--- a/docs/pages/builderkits/onchainkit/mint/nft-mint-card.mdx
+++ b/_pages/builderkits/onchainkit/mint/nft-mint-card.mdx
@@ -37,8 +37,7 @@ npm create onchain@latest
If you're adding `NFTMintCard` to an existing project, simply install OnchainKit.
-:::code-group
-
+
```bash [npm]
npm install @coinbase/onchainkit
```
@@ -54,8 +53,7 @@ pnpm add @coinbase/onchainkit
```bash [bun]
bun add @coinbase/onchainkit
```
-
-:::
+
Wrap the `` around your app, following the steps in [Getting Started](/builderkits/onchainkit/getting-started#add-providers).
@@ -73,50 +71,48 @@ import { NFTMintCardDefault } from '@coinbase/onchainkit/nft'; // [!code focus]
If you'd like more customization you can follow the steps below to customize which subcomponents are rendered.
-::::steps
-
-### Add the NFTMintCard
-
-```tsx twoslash
-// @noErrors: 2741 - Property children missing in type
-import { NFTMintCard } from '@coinbase/onchainkit/nft'; // [!code focus]
-
-
-
-```
-
-### Add the NFTMintCard components
-
-```tsx twoslash
-// @noErrors: 2739
-import { NFTMintCard } from '@coinbase/onchainkit/nft';
-import { NFTMedia } from '@coinbase/onchainkit/nft/view'; // [!code ++]
-import {
- NFTCreator, // [!code ++]
- NFTCollectionTitle, // [!code ++]
- NFTQuantitySelector, // [!code ++]
- NFTAssetCost, // [!code ++]
- NFTMintButton, // [!code ++]
-} from '@coinbase/onchainkit/nft/mint'; // [!code ++]
-
-
-
-
-
-
-
-
-
-```
-
-
-
-::::
+
+
+ ```tsx twoslash
+ // @noErrors: 2741 - Property children missing in type
+ import { NFTMintCard } from '@coinbase/onchainkit/nft'; // [!code focus]
+
+
+
+ ```
+
+
+
+ ```tsx twoslash
+ // @noErrors: 2739
+ import { NFTMintCard } from '@coinbase/onchainkit/nft';
+ import { NFTMedia } from '@coinbase/onchainkit/nft/view'; // [!code ++]
+ import {
+ NFTCreator, // [!code ++]
+ NFTCollectionTitle, // [!code ++]
+ NFTQuantitySelector, // [!code ++]
+ NFTAssetCost, // [!code ++]
+ NFTMintButton, // [!code ++]
+ } from '@coinbase/onchainkit/nft/mint'; // [!code ++]
+
+
+
+
+
+
+
+
+
+ ```
+
+
+
+
That's it! You've now created an NFT mint card.
diff --git a/docs/pages/builderkits/onchainkit/mint/types.mdx b/_pages/builderkits/onchainkit/mint/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/mint/types.mdx
rename to _pages/builderkits/onchainkit/mint/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/paymaster/erc20-paymaster.mdx b/_pages/builderkits/onchainkit/paymaster/erc20-paymaster.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/paymaster/erc20-paymaster.mdx
rename to _pages/builderkits/onchainkit/paymaster/erc20-paymaster.mdx
diff --git a/docs/pages/builderkits/onchainkit/paymaster/errors.mdx b/_pages/builderkits/onchainkit/paymaster/errors.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/paymaster/errors.mdx
rename to _pages/builderkits/onchainkit/paymaster/errors.mdx
diff --git a/docs/pages/builderkits/onchainkit/paymaster/gasless-transactions-with-paymaster.mdx b/_pages/builderkits/onchainkit/paymaster/gasless-transactions-with-paymaster.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/paymaster/gasless-transactions-with-paymaster.mdx
rename to _pages/builderkits/onchainkit/paymaster/gasless-transactions-with-paymaster.mdx
index 66ad723d..ec9ae8ee 100644
--- a/docs/pages/builderkits/onchainkit/paymaster/gasless-transactions-with-paymaster.mdx
+++ b/_pages/builderkits/onchainkit/paymaster/gasless-transactions-with-paymaster.mdx
@@ -5,6 +5,8 @@ description: Learn how to leverage the Base Paymaster for seamless, gasless tran
author: hughescoin
---
+import { Danger } from "/snippets/danger.mdx";
+
# Gasless Transactions on Base using Base Paymaster
Still trying to onboard users to your app? Want to break free from the worries of gas transactions and sponsor them for your users on Base? Look no further!
@@ -74,9 +76,12 @@ Put `mintTo(address)` as the function to allowlist then click `Save` at the bott

-:::note[Use your own contract]
+
+**Use your own contract**
+
You will be using this [simple NFT contract]deployed on Base mainnet for our example. Feel free to use a contract of your choice.
-:::
+
+
### Global & Per User Limits:
@@ -86,11 +91,12 @@ You can set a Paymaster policy that specifies either a specific dollar amount or
Set the max USD to $0.05 and the max UserOperation to 1 to create a policy with a maximum sponsorship limit of $0.05 and a maximum of 1 UserOperation per user.
-:::note[Limit Cycles]
+
+**Limit Cycles**
Limit Cycles enables applications to sponsor smart wallets on a weekly, daily, or monthly basis, either by amount or by number of UserOperations. These limits reset based on the cadence selected in the dropdown menu.
+
-:::
Set the Global limit:
@@ -104,7 +110,8 @@ Set your global policy to be `$.07` by entering the amount in the text field and
You will now test the policy that was created.
-:::info[The Use of Foundry]
+
+**The Use of Foundry**
In this tutorial, You use foundry to create two key pairs that will allow us to create Smart Accounts that you will sponsor transactions on behalf of. You will **not** need to send any funds (ETH) to these wallets. You may use private keys of wallets you own as an alternative.
@@ -115,8 +122,8 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
For more information, see the [Foundry Book installation guide](https://book.getfoundry.sh/getting-started/installation).
+
-:::
Open a terminal and install Foundry by running:
@@ -159,21 +166,23 @@ import { createPimlicoPaymasterClient } from 'permissionless/clients/pimlico';
### Set Constants for Your Paymaster & Bundler endpoint
-:::note[Find your Paymaster & Bundler endpoint]
+
+**Find your Paymaster & Bundler endpoint**
The Paymaster & Bundler endpoint is the URL for your Coinbase Developer Platform (CDP) Paymaster.
This was saved in the previous section and follows this format: `https://api.developer.coinbase.com/rpc/v1/base/`
Navigate to the [Paymaster Tool] and select the `Configuration` tab at the top of the screen to obtain your RPC URL.
+
-:::
-:::danger[Secure your endpoints]
+
+**Secure your endpoints**
You will create a constant for our Paymaster & Bundler endpoint obtained from cdp.portal.coinbase.com. The most secure way to do this is by using a proxy. For the purposes of this demo, hardcode it into our `index.js` file. For product, we highly recommend using a [proxy service].
+
-:::
You will also need the address of the entrypoint contract for Base. A full list of entrypoint contracts and their addresses can be found [here](https://docs.alchemy.com/reference/factory-addresses).
@@ -228,13 +237,14 @@ Private key: 0xbcd6fbc1dfa3c9...634793138897
Use the newly generated private keys as the parameter to the `privateKeyToSimpleSmartAccount` function and set the factory address to
-:::danger[Secure your private keys]
+
+**Secure your private keys**
Be sure to store your private keys somewhere safe. Committing these to a public code repository will give anyone access to your smart accounts.
Saving them to a `.env` file is safest.
+
-:::
```javascript
const simpleAccount = await privateKeyToSimpleSmartAccount(publicClient, {
@@ -257,7 +267,8 @@ Factory address is the address to the smart account factory deployed on base. Ac
Entrypoint is the entrypoint contract for Base.
-:::tip[Find the correct entrypoint address]
+
+**Find the correct entrypoint address**
Make an JSON RPC request to a node using the `` method to get the correct entrpoint contract. Here's an example for Base using a Coinbase Base Node:
@@ -268,8 +279,8 @@ curl --request POST \
--header 'Content-Type: application/json' \
--data '{"id": 1, "jsonrpc": "2.0", "method": "eth_supportedEntryPoints", "params": []}'
```
+
-:::
### Initialize Paymaster and Create Accounts
@@ -303,9 +314,12 @@ const smartAccountClient2 = createSmartAccountClient({
To sponsor transactions you will need the ABI and the address of the contracts you want to support.
-:::note[Sponsor any contract]
+
+**Sponsor any contract**
+
Feel free to use your own contract to interact with the Paymaster. For learning purposes, you will interact with an ERC-721 contract deployed on the Base mainnet. You will call the mintTo function, which takes an address as its only parameter.
-:::
+
+
You will be interacting with the NFT + ABI from a simple NFT contract deployed at: `0x83bd615eb93eE1336acA53e185b03B54fF4A17e8`
@@ -584,13 +598,14 @@ Now, let's send another transaction, this time using the second account.
Before you do that, let's update the per-wallet UserOperation limit to 10. Since gas is cheap on Base, you may need to do a few transactions before you hit our global limit of $0.07.
-:::note[Increase the global limit]
+
+**Increase the global limit**
You may get a warning to increase the global limit and that is okay for now...
[Image-of-policy]
+
-:::
Navigate back to the [UI] and update the policy to 10 and hit the `Save` button.
diff --git a/docs/pages/builderkits/onchainkit/paymaster/how-to-contribute.mdx b/_pages/builderkits/onchainkit/paymaster/how-to-contribute.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/paymaster/how-to-contribute.mdx
rename to _pages/builderkits/onchainkit/paymaster/how-to-contribute.mdx
diff --git a/docs/pages/builderkits/onchainkit/paymaster/quickstart-guide.mdx b/_pages/builderkits/onchainkit/paymaster/quickstart-guide.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/paymaster/quickstart-guide.mdx
rename to _pages/builderkits/onchainkit/paymaster/quickstart-guide.mdx
diff --git a/docs/pages/builderkits/onchainkit/paymaster/quickstart-headless.mdx b/_pages/builderkits/onchainkit/paymaster/quickstart-headless.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/paymaster/quickstart-headless.mdx
rename to _pages/builderkits/onchainkit/paymaster/quickstart-headless.mdx
diff --git a/docs/pages/builderkits/onchainkit/paymaster/security.mdx b/_pages/builderkits/onchainkit/paymaster/security.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/paymaster/security.mdx
rename to _pages/builderkits/onchainkit/paymaster/security.mdx
diff --git a/docs/pages/builderkits/onchainkit/paymaster/troubleshooting.mdx b/_pages/builderkits/onchainkit/paymaster/troubleshooting.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/paymaster/troubleshooting.mdx
rename to _pages/builderkits/onchainkit/paymaster/troubleshooting.mdx
diff --git a/docs/pages/builderkits/onchainkit/paymaster/welcome.mdx b/_pages/builderkits/onchainkit/paymaster/welcome.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/paymaster/welcome.mdx
rename to _pages/builderkits/onchainkit/paymaster/welcome.mdx
diff --git a/docs/pages/builderkits/onchainkit/restricted.mdx b/_pages/builderkits/onchainkit/restricted.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/restricted.mdx
rename to _pages/builderkits/onchainkit/restricted.mdx
diff --git a/docs/pages/builderkits/onchainkit/signature/signature.mdx b/_pages/builderkits/onchainkit/signature/signature.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/signature/signature.mdx
rename to _pages/builderkits/onchainkit/signature/signature.mdx
index 9f7c4cac..3a10fbb8 100644
--- a/docs/pages/builderkits/onchainkit/signature/signature.mdx
+++ b/_pages/builderkits/onchainkit/signature/signature.mdx
@@ -18,8 +18,7 @@ You can use the `Signature` component with the default implementation without pa
### Default implementation for EIP712 signatures
-:::code-group
-
+
```tsx twoslash [Signature.tsx]
// @noErrors: 2307 2395 2554 2834 - Cannot find module 'data'
import { Signature } from '@coinbase/onchainkit/signature';
@@ -101,8 +100,7 @@ export const message = {
value: BigInt(0),
};
```
-
-:::
+
diff --git a/docs/pages/builderkits/onchainkit/signature/types.mdx b/_pages/builderkits/onchainkit/signature/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/signature/types.mdx
rename to _pages/builderkits/onchainkit/signature/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/swap/swap-settings.mdx b/_pages/builderkits/onchainkit/swap/swap-settings.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/swap/swap-settings.mdx
rename to _pages/builderkits/onchainkit/swap/swap-settings.mdx
diff --git a/docs/pages/builderkits/onchainkit/swap/swap.mdx b/_pages/builderkits/onchainkit/swap/swap.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/swap/swap.mdx
rename to _pages/builderkits/onchainkit/swap/swap.mdx
index 459573d8..5b4a9f6f 100644
--- a/docs/pages/builderkits/onchainkit/swap/swap.mdx
+++ b/_pages/builderkits/onchainkit/swap/swap.mdx
@@ -3,6 +3,7 @@ title: · OnchainKit
description: Swap components & utilities
---
+import { Danger } from "/snippets/danger.mdx";
import { Avatar, Name } from '@coinbase/onchainkit/identity';
import { Swap, SwapAmountInput, SwapButton, SwapDefault, SwapMessage, SwapToggleButton, SwapToast } from '@coinbase/onchainkit/swap';
import { Wallet, ConnectWallet } from '@coinbase/onchainkit/wallet';
@@ -185,11 +186,12 @@ export default function SwapComponents() {
-:::danger
+
**Note: This interface is for demonstration purposes only.**
The swap will execute and work out of the box when you implement the component in your own app.
-:::
+
+
### Supported Swap Routers
diff --git a/docs/pages/builderkits/onchainkit/swap/types.mdx b/_pages/builderkits/onchainkit/swap/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/swap/types.mdx
rename to _pages/builderkits/onchainkit/swap/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/token/format-amount.mdx b/_pages/builderkits/onchainkit/token/format-amount.mdx
similarity index 89%
rename from docs/pages/builderkits/onchainkit/token/format-amount.mdx
rename to _pages/builderkits/onchainkit/token/format-amount.mdx
index f56f92bc..3228387a 100644
--- a/docs/pages/builderkits/onchainkit/token/format-amount.mdx
+++ b/_pages/builderkits/onchainkit/token/format-amount.mdx
@@ -1,11 +1,13 @@
-# `formatAmount`
+---
+title: "`formatAmount`"
+---
+
The `formatAmount` utility is designed for consistent number formatting.
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { formatAmount } from '@coinbase/onchainkit/token';
@@ -17,8 +19,7 @@ const amount = formatAmount('10000', { minimumFractionDigits: 2 });
'10.000,00'; // if in EU country locale
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/token/token-chip.mdx b/_pages/builderkits/onchainkit/token/token-chip.mdx
similarity index 97%
rename from docs/pages/builderkits/onchainkit/token/token-chip.mdx
rename to _pages/builderkits/onchainkit/token/token-chip.mdx
index e68c21d5..1638adcf 100644
--- a/docs/pages/builderkits/onchainkit/token/token-chip.mdx
+++ b/_pages/builderkits/onchainkit/token/token-chip.mdx
@@ -1,7 +1,10 @@
+---
+title: "``"
+---
+
import { TokenChip } from '@coinbase/onchainkit/token';
import App from '@/components/App';
-# ``
The `TokenChip` component is a button that displays the token symbol.
diff --git a/docs/pages/builderkits/onchainkit/token/token-image.mdx b/_pages/builderkits/onchainkit/token/token-image.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/token/token-image.mdx
rename to _pages/builderkits/onchainkit/token/token-image.mdx
index bca8fa9d..c1041e26 100644
--- a/docs/pages/builderkits/onchainkit/token/token-image.mdx
+++ b/_pages/builderkits/onchainkit/token/token-image.mdx
@@ -1,7 +1,10 @@
+---
+title: "``"
+---
+
import { TokenImage } from '@coinbase/onchainkit/token';
import App from '@/components/App';
-# ``
The `TokenImage` component is an image that crops token image to a circle with an adjustable size.
diff --git a/docs/pages/builderkits/onchainkit/token/token-row.mdx b/_pages/builderkits/onchainkit/token/token-row.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/token/token-row.mdx
rename to _pages/builderkits/onchainkit/token/token-row.mdx
index 7b069090..d56bf281 100644
--- a/docs/pages/builderkits/onchainkit/token/token-row.mdx
+++ b/_pages/builderkits/onchainkit/token/token-row.mdx
@@ -1,7 +1,10 @@
+---
+title: "``"
+---
+
import { TokenRow } from '@coinbase/onchainkit/token';
import App from '@/components/App';
-# ``
The `TokenRow` component displays token information in a row format to be used in list components.
diff --git a/docs/pages/builderkits/onchainkit/token/token-search.mdx b/_pages/builderkits/onchainkit/token/token-search.mdx
similarity index 97%
rename from docs/pages/builderkits/onchainkit/token/token-search.mdx
rename to _pages/builderkits/onchainkit/token/token-search.mdx
index 63dcbdb2..f8062f97 100644
--- a/docs/pages/builderkits/onchainkit/token/token-search.mdx
+++ b/_pages/builderkits/onchainkit/token/token-search.mdx
@@ -1,7 +1,10 @@
+---
+title: "``"
+---
+
import { TokenSearch } from '@coinbase/onchainkit/token';
import App from '@/components/App';
-# ``
The `` is a search component with an optional debounce delay.
diff --git a/docs/pages/builderkits/onchainkit/token/token-select-dropdown.mdx b/_pages/builderkits/onchainkit/token/token-select-dropdown.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/token/token-select-dropdown.mdx
rename to _pages/builderkits/onchainkit/token/token-select-dropdown.mdx
index 9944ae16..b71788d2 100644
--- a/docs/pages/builderkits/onchainkit/token/token-select-dropdown.mdx
+++ b/_pages/builderkits/onchainkit/token/token-select-dropdown.mdx
@@ -1,8 +1,11 @@
+---
+title: "``"
+---
+
import { TokenSelectDropdown } from '@coinbase/onchainkit/token';
import TokenSelectorContainer from '@/components/TokenSelectorContainer';
import App from '@/components/App';
-# ``
The `TokenSelectDropdown` component is a dropdown component that selects a token in a given list of tokens.
diff --git a/docs/pages/builderkits/onchainkit/token/types.mdx b/_pages/builderkits/onchainkit/token/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/token/types.mdx
rename to _pages/builderkits/onchainkit/token/types.mdx
diff --git a/_pages/builderkits/onchainkit/transaction/transaction.mdx b/_pages/builderkits/onchainkit/transaction/transaction.mdx
new file mode 100644
index 00000000..493b394a
--- /dev/null
+++ b/_pages/builderkits/onchainkit/transaction/transaction.mdx
@@ -0,0 +1,397 @@
+---
+title: · OnchainKit
+description: The `` components provide a high-level wrap around the entire transaction flow. It handles the transaction lifecycle, including gas estimation, fee sponsorship, and status updates.
+---
+
+import { Avatar, Name } from '@coinbase/onchainkit/identity';
+import {
+ Transaction,
+ TransactionButton,
+ TransactionSponsor,
+ TransactionStatus,
+ TransactionStatusAction,
+ TransactionStatusLabel,
+} from '@coinbase/onchainkit/transaction';
+import { Wallet, ConnectWallet } from '@coinbase/onchainkit/wallet';
+import App from '@/components/App';
+import TransactionWrapper from '@/components/TransactionWrapper';
+
+export const BASE_SEPOLIA_CHAIN_ID = 84532;
+export const PAYMASTER_AND_BUNDLER_ENDPOINT = import.meta.env.VITE_CDP_PAYMASTER_AND_BUNDLER_ENDPOINT;
+
+# ``
+
+The `` components provide a high-level wrap around the entire transaction flow.
+It handles the transaction lifecycle, including gas estimation, fee sponsorship, and status updates.
+
+Before using them, ensure you've completed all [Getting Started steps](/builderkits/onchainkit/getting-started).
+
+## Quick start
+
+The `Transaction` component now supports a simplified shorthand version to streamline the integration process for developers. Instead of manually defining each subcomponent and prop, you can render `Transaction` without children, and it will automatically include our suggested implementation — complete with the `TransactionButton` and `TransactionToast` components.
+
+If you'd like more customization, follow the implementation guide for our `Transaction` components below.
+
+```tsx twoslash
+// @noErrors: 1109 - Cannot find name 'contracts'
+import { Transaction } from "@coinbase/onchainkit/transaction"
+
+const calls = [...];
+
+
+```
+
+
+
+ {({ address, contracts, onStatus }) => {
+ if (address) {
+ return (
+
+ )
+ } else {
+ return (
+
+
+
+
+
+
+ )
+ }
+ }}
+
+
+
+### Props
+
+[`TransactionReact`](/builderkits/onchainkit/transaction/types#transactionreact)
+
+## Walkthrough
+
+
+
+ Execute one or multiple transactions using the Transaction component. You can pass transactions in either `Call` or `ContractFunctionParameters` format. The component will automatically apply batching logic if the user's wallet supports it.
+
+ #### Types
+
+ - [`ContractFunctionParameters`](https://github.com/wevm/viem/blob/ce1b8aff4d4523d3a324e500261c8c0867fd35e9/src/types/contract.ts#L188)
+ - [`Call`](/builderkits/onchainkit/transaction/types#call)
+
+
+ ```tsx twoslash [TransactionComponents.tsx]
+ // @noErrors: 2307
+ import { useCallback } from 'react';
+ import { Avatar, Name } from '@coinbase/onchainkit/identity';
+ import { // [!code focus]
+ Transaction, // [!code focus]
+ TransactionButton,
+ TransactionSponsor,
+ TransactionStatus,
+ TransactionStatusAction,
+ TransactionStatusLabel,
+ } from '@coinbase/onchainkit/transaction'; // [!code focus]
+ import type { LifecycleStatus } from '@coinbase/onchainkit/transaction';
+ import { Wallet, ConnectWallet } from '@coinbase/onchainkit/wallet';
+ import { useAccount } from 'wagmi';
+ import { calls } from '@/calls'; // [!code focus]
+
+ // ---cut-start---
+
+ const BASE_SEPOLIA_CHAIN_ID = 84532;
+ // ---cut-end---
+
+ export default function TransactionComponents() {
+ const { address } = useAccount();
+
+ const handleOnStatus = useCallback((status: LifecycleStatus) => {
+ console.log('LifecycleStatus', status);
+ }, []);
+
+ return address ? (
+
+
+
+
+
+
+
+ // [!code focus]
+ ) : (
+
+
+
+
+
+
+ );
+ };
+ ```
+
+ ```ts twoslash [calls.ts]
+ const clickContractAddress = '0x67c97D1FB8184F038592b2109F854dfb09C77C75';
+ const clickContractAbi = [
+ {
+ type: 'function',
+ name: 'click',
+ inputs: [],
+ outputs: [],
+ stateMutability: 'nonpayable',
+ },
+ ] as const;
+
+ export const calls = [
+ {
+ address: clickContractAddress,
+ abi: clickContractAbi,
+ functionName: 'click',
+ args: [],
+ }
+ ];
+ ```
+
+
+
+
+ {({ address, contracts, onStatus }) => {
+ if (address) {
+ return (
+
+
+
+
+
+
+
+
+ )
+ } else {
+ return (
+
+
+
+
+
+
+ )
+ }
+ }}
+
+
+
+
+
+
+ Take full control of your transactions data with the `LifecycleStatus` object via the `onStatus` prop.
+ This TypeScript object provides `statusName` and `statusData` to keep you informed.
+
+ ```tsx twoslash
+ // @noErrors: 2307
+ import { useCallback } from 'react';
+ import {
+ Transaction,
+ TransactionButton,
+ TransactionSponsor,
+ TransactionStatus,
+ TransactionToast,
+ TransactionToastIcon,
+ TransactionToastLabel,
+ TransactionToastAction,
+ } from '@coinbase/onchainkit/transaction';
+ import {contracts} from '@/contracts';
+ // ---cut-before---
+
+ import type { LifecycleStatus } from '@coinbase/onchainkit/transaction'; // [!code focus]
+
+ // omitted for brevity
+
+ const handleOnStatus = useCallback((status: LifecycleStatus) => { // [!code focus]
+ console.log('Transaction status:', status); // [!code focus]
+ }, []); // [!code focus]
+
+ // omitted for brevity
+
+ // Usage in component
+
+
+
+
+
+
+
+
+
+ ```
+
+ The Lifecycle Status features seven states for the transaction experience.
+
+ ```ts twoslash
+ import type { TransactionError } from "@coinbase/onchainkit/transaction";
+ import type { Address, TransactionReceipt } from "viem";
+ // ---cut-before---
+ type LifecycleStatus =
+ | {
+ statusName: 'init';
+ statusData: null;
+ }
+ | {
+ statusName: 'error';
+ statusData: TransactionError;
+ }
+ | {
+ statusName: 'transactionIdle'; // initial status prior to the mutation function executing
+ statusData: null;
+ }
+ | {
+ statusName: 'buildingTransaction'; // resolving calls or contracts promise
+ statusData: null;
+ }
+ | {
+ statusName: 'transactionPending'; // if the mutation is currently executing
+ statusData: null;
+ }
+ | {
+ statusName: 'transactionLegacyExecuted';
+ statusData: {
+ transactionHashList: string[];
+ };
+ }
+ | {
+ statusName: 'success'; // if the last mutation attempt was successful
+ statusData: {
+ transactionReceipts: TransactionReceipt[];
+ };
+ };
+ ```
+
+
+ To sponsor your transactions with Paymaster capabilities, configure your [`OnchainKitProvider`](/builderkits/onchainkit/config/onchainkit-provider) with the appropriate `config.paymaster` URL, then pass `isSponsored={true}` to the `Transaction` component.
+
+ Obtain a Paymaster and Bundler endpoint from the [Coinbase Developer Platform](https://portal.cdp.coinbase.com/products/bundler-and-paymaster).
+
+
+
+ ```tsx twoslash
+ // @noErrors: 2304 17008 1005
+
+ ```
+
+ Next, pass `isSponsored={true}` to the `Transaction` component.
+
+ ```tsx twoslash
+ // @noErrors: 2580 2304 2322 - Cannot find name 'process', Cannot find name 'contracts'
+ import { Transaction, TransactionButton, TransactionSponsor } from "@coinbase/onchainkit/transaction"
+ // ---cut-before---
+ // omitted for brevity
+
+
+
+
+ ```
+
+
+
+
+### Using `calls` with Promises
+
+`Calls` also accepts asynchronous functions that are resolved on each button click. This can be useful if you're calling an API to retrieve transaction data.
+
+These functions must resolve to `Call[]` or `ContractFunctionParameters[]`.
+
+In the example the calls data will be fetched from api.transaction.com when the user clicks the Transaction Button.
+
+```tsx twoslash
+// @noErrors: 2322
+import { Transaction, TransactionButton, LifecycleStatus} from '@coinbase/onchainkit/transaction';
+import { baseSepolia } from 'wagmi/chains';
+
+// ---cut-before---
+
+const callsCallback = async () => { // [!code focus]
+ const res = await fetch('api.transaction.com/createTransaction'); // [!code focus]
+ const callData = await res.json(); // [!code focus]
+ return callData; // [!code focus]
+} // [!code focus]
+
+export default function TransactionWithCalls() {
+
+ return (
+ console.log('Transaction status:', status)}
+ >
+
+
+ );
+}
+```
+
+## Components
+
+
+
+
+
+The components are designed to work together hierarchically. For each component, ensure the following:
+
+- `` - Serves as the main container for all transaction-related components.
+- `` - Handles the transaction initiation process.
+- `` - Displays information about the sponsorship of transaction gas fees.
+- `` - Contains transaction status information and actions.
+- `` - Displays the current status of the transaction.
+- `` - Provides additional actions based on the transaction status.
+- `` - Displays a toast notification for the transaction status.
+- `` - Displays an icon in the transaction toast notification.
+- `` - Displays the label text in the transaction toast notification.
+- `` - Provides additional actions within the transaction toast notification.
+
+## Component types
+
+- [`TransactionButtonReact`](/builderkits/onchainkit/transaction/types#transactionbuttonreact)
+- [`TransactionError`](/builderkits/onchainkit/transaction/types#transactionerror)
+- [`TransactionDefaultReact`](/builderkits/onchainkit/transaction/types#transactiondefaultreact)
+- [`TransactionReact`](/builderkits/onchainkit/transaction/types#transactionreact)
+- [`TransactionSponsorReact`](/builderkits/onchainkit/transaction/types#transactionsponsorreact)
+- [`TransactionStatusReact`](/builderkits/onchainkit/transaction/types#transactionstatusreact)
+- [`TransactionStatusActionReact`](/builderkits/onchainkit/transaction/types#transactionstatusactionreact)
+- [`TransactionStatusLabelReact`](/builderkits/onchainkit/transaction/types#transactionstatuslabelreact)
+- [`TransactionToastReact`](/builderkits/onchainkit/transaction/types#transactiontoastreact)
+- [`TransactionToastActionReact`](/builderkits/onchainkit/transaction/types#transactiontoastactionreact)
+- [`TransactionToastIconReact`](/builderkits/onchainkit/transaction/types#transactiontoasticonreact)
+- [`TransactionToastLabelReact`](/builderkits/onchainkit/transaction/types#transactiontoastlabelreact)
diff --git a/docs/pages/builderkits/onchainkit/transaction/types.mdx b/_pages/builderkits/onchainkit/transaction/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/transaction/types.mdx
rename to _pages/builderkits/onchainkit/transaction/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/use-coinbase-smart-wallet-and-eoas.mdx b/_pages/builderkits/onchainkit/use-coinbase-smart-wallet-and-eoas.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/use-coinbase-smart-wallet-and-eoas.mdx
rename to _pages/builderkits/onchainkit/use-coinbase-smart-wallet-and-eoas.mdx
index 57d2c63a..bd9de2a7 100644
--- a/docs/pages/builderkits/onchainkit/use-coinbase-smart-wallet-and-eoas.mdx
+++ b/_pages/builderkits/onchainkit/use-coinbase-smart-wallet-and-eoas.mdx
@@ -5,6 +5,8 @@ description: Learn how to use OnchainKit to easily handle the Coinbase Smart Wal
author: briandoyle81
---
+import { Danger } from "/snippets/danger.mdx";
+
The [Coinbase Smart Wallet] is a great way to onboard new users to onchain apps, and offers a number of experiential improvements to existing crypto users as well. As we're in a period of adoption and transition, a pain point has developed where a user with both the Smart Wallet and a browser-extension EOA can't always select the wallet they want while connecting to an app.
In this tutorial, you'll learn how to more easily improve that experience by using the [Wallet] component from [OnchainKit] to connect your users to your app.
@@ -48,11 +50,10 @@ bun install
bun run dev
```
-::info
-
+
To bring the world onchain, we'll need to speak in terms people are already comfortable with. Consider using `Log In` rather than `Connect Wallet`!
+
-:::
The demo app contains sections showing a number of [OnchainKit] components, including the [Wallet]. Click `Log In` in your browser with the Coinbase wallet extension present, select `Coinbase Wallet`, and you'll get the expected experience for an EOA wallet user with the browser extension.
@@ -130,14 +131,13 @@ Try connecting again. You'll see your updated list with the wallets organized to
## Tuning the Coinbase Wallet Connection
-:::danger
-
+
If you've already connected with the site, the below won't work unless you clear site data! It will appear that the flag does nothing.
In Chrome: Developer Tools -> Application Tab -> Storage Tab -> Clear Site Data button
In Firefox: Developer Tools -> Storage -> Right-click each item -> Delete All
+
-:::
With RainbowKit, you can force the connector to use the smart wallet or EOA with:
@@ -177,11 +177,10 @@ The `all` setting exhibits the behavior you've observed before. If the EOA is pr
You can use these settings to direct users of your app to your preferred use case, or tie it to a UI element to give them a choice.
-:::info
-
+
The Coinbase Smart Wallet will support user-selected choice of which wallet to use soon!
+
-:::
## Conclusion
diff --git a/docs/pages/builderkits/onchainkit/wallet/is-valid-aa-entrypoint.mdx b/_pages/builderkits/onchainkit/wallet/is-valid-aa-entrypoint.mdx
similarity index 91%
rename from docs/pages/builderkits/onchainkit/wallet/is-valid-aa-entrypoint.mdx
rename to _pages/builderkits/onchainkit/wallet/is-valid-aa-entrypoint.mdx
index ea43c589..82c2ee9d 100644
--- a/docs/pages/builderkits/onchainkit/wallet/is-valid-aa-entrypoint.mdx
+++ b/_pages/builderkits/onchainkit/wallet/is-valid-aa-entrypoint.mdx
@@ -1,11 +1,13 @@
-# `isValidAAEntrypoint`
+---
+title: "`isValidAAEntrypoint`"
+---
+
The `isValidAAEntrypoint` utility is designed to verify the Account-Abstraction entrypoint before sponsoring a transaction.
## Usage
-:::code-group
-
+
```tsx twoslash [code]
import { isValidAAEntrypoint } from '@coinbase/onchainkit/wallet';
@@ -22,8 +24,7 @@ if (isValid) {
```ts [return value]
true;
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/wallet/is-wallet-a-coinbase-smart-wallet.mdx b/_pages/builderkits/onchainkit/wallet/is-wallet-a-coinbase-smart-wallet.mdx
similarity index 94%
rename from docs/pages/builderkits/onchainkit/wallet/is-wallet-a-coinbase-smart-wallet.mdx
rename to _pages/builderkits/onchainkit/wallet/is-wallet-a-coinbase-smart-wallet.mdx
index 11e70cf2..f0f002d0 100644
--- a/docs/pages/builderkits/onchainkit/wallet/is-wallet-a-coinbase-smart-wallet.mdx
+++ b/_pages/builderkits/onchainkit/wallet/is-wallet-a-coinbase-smart-wallet.mdx
@@ -1,11 +1,13 @@
-# `isWalletACoinbaseSmartWallet`
+---
+title: "`isWalletACoinbaseSmartWallet`"
+---
+
The `isWalletACoinbaseSmartWallet` utility is designed to verify if a given sender address is a Smart Wallet proxy with the expected implementation before sponsoring a transaction.
## Usage
-:::code-group
-
+
```tsx twoslash [code]
// @noErrors: 2352 2801 2719 2305
import { isWalletACoinbaseSmartWallet } from '@coinbase/onchainkit/wallet';
@@ -31,8 +33,7 @@ if (isWalletACoinbaseSmartWallet({ client: publicClient, userOp: userOperation }
```ts [return value]
true;
```
-
-:::
+
## Returns
diff --git a/docs/pages/builderkits/onchainkit/wallet/types.mdx b/_pages/builderkits/onchainkit/wallet/types.mdx
similarity index 100%
rename from docs/pages/builderkits/onchainkit/wallet/types.mdx
rename to _pages/builderkits/onchainkit/wallet/types.mdx
diff --git a/docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-basename.mdx b/_pages/builderkits/onchainkit/wallet/wallet-dropdown-basename.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-basename.mdx
rename to _pages/builderkits/onchainkit/wallet/wallet-dropdown-basename.mdx
index 07bcd98f..a4f9deaf 100644
--- a/docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-basename.mdx
+++ b/_pages/builderkits/onchainkit/wallet/wallet-dropdown-basename.mdx
@@ -1,3 +1,7 @@
+---
+title: "``"
+---
+
import {
Address,
Avatar,
@@ -15,7 +19,6 @@ import {
} from '@coinbase/onchainkit/wallet';
import WalletComponents from '@/components/WalletComponents';
-# ``
The `WalletDropdownBasename` component adds a [Basename](https://www.base.org/names) tab to the Wallet Component. This tab serves two purposes:
diff --git a/docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-disconnect.mdx b/_pages/builderkits/onchainkit/wallet/wallet-dropdown-disconnect.mdx
similarity index 98%
rename from docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-disconnect.mdx
rename to _pages/builderkits/onchainkit/wallet/wallet-dropdown-disconnect.mdx
index 8a9b6a75..3dfb90bb 100644
--- a/docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-disconnect.mdx
+++ b/_pages/builderkits/onchainkit/wallet/wallet-dropdown-disconnect.mdx
@@ -1,3 +1,7 @@
+---
+title: "``"
+---
+
import {
Address,
Avatar,
@@ -16,7 +20,6 @@ import {
} from '@coinbase/onchainkit/wallet';
import WalletComponents from '@/components/WalletComponents';
-# ``
The `WalletDropdownDisconnect` component is used to disconnect the wallet from the application.
diff --git a/docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-fund-link.mdx b/_pages/builderkits/onchainkit/wallet/wallet-dropdown-fund-link.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-fund-link.mdx
rename to _pages/builderkits/onchainkit/wallet/wallet-dropdown-fund-link.mdx
index 0d682236..c19413a0 100644
--- a/docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-fund-link.mdx
+++ b/_pages/builderkits/onchainkit/wallet/wallet-dropdown-fund-link.mdx
@@ -36,11 +36,14 @@ If your user connects any other EOA wallet, it provides an easy way to access [C
where your users will also be able to buy crypto using a fiat payment method, or transfer existing crypto from their
Coinbase account.
-:::tip[Coinbase Onramp Support]
+
+**Coinbase Onramp Support**
+
If you would like to provide non Coinbase Smart Wallet users with an easy way to access Coinbase Onramp, please make
sure you go through the `FundButton` [walkthrough](/builderkits/onchainkit/fund/fund-button#walkthrough) to configure your Project ID. Otherwise
only Coinbase Smart Wallet users will be able to use the `WalletDropdownFundLink`.
-:::
+
+
## Usage
diff --git a/docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-link.mdx b/_pages/builderkits/onchainkit/wallet/wallet-dropdown-link.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-link.mdx
rename to _pages/builderkits/onchainkit/wallet/wallet-dropdown-link.mdx
index 068b1317..e964054f 100644
--- a/docs/pages/builderkits/onchainkit/wallet/wallet-dropdown-link.mdx
+++ b/_pages/builderkits/onchainkit/wallet/wallet-dropdown-link.mdx
@@ -1,3 +1,7 @@
+---
+title: "``"
+---
+
import {
Address,
Avatar,
@@ -17,7 +21,6 @@ import {
import WalletComponents from '@/components/WalletComponents';
import { walletDropdownLinkCustomBaseIconSvg } from '@/components/svg/walletDropdownLinkCustomBaseIconSvg';
-# ``
The `WalletDropdownLink` component creates customizable, interactive links within the wallet dropdown menu.
diff --git a/docs/pages/builderkits/onchainkit/wallet/wallet-island.mdx b/_pages/builderkits/onchainkit/wallet/wallet-island.mdx
similarity index 99%
rename from docs/pages/builderkits/onchainkit/wallet/wallet-island.mdx
rename to _pages/builderkits/onchainkit/wallet/wallet-island.mdx
index 5bbc2f54..ec0edf41 100644
--- a/docs/pages/builderkits/onchainkit/wallet/wallet-island.mdx
+++ b/_pages/builderkits/onchainkit/wallet/wallet-island.mdx
@@ -46,15 +46,17 @@ users a seamless way to interact with their wallet and manage their assets.
Before using these components, ensure you've completed all [Getting Started steps](/builderkits/onchainkit/getting-started).
-:::info
+
This component requires a `projectId` and an `apiKey`to be set in the `OnchainKitProvider`. You
can find your both of these values on [Coinbase Developer Platform](https://portal.cdp.coinbase.com/products/onchainkit).
-:::
+
-:::info
+
+
Please note: token balances are only available for Base mainnet and Ethereum mainnet.
You can control the network in the `OnchainKitProvider` by setting the `chain` prop.
-:::
+
+
## Quick start
@@ -99,13 +101,14 @@ different positions depending on the component's location in the window:
- If there is enough space below, it will open below.
- If there is not enough space below, it will open above.
-:::info
+
If you are attempting to use this component and the Buy button is not working,
make sure you have a `projectId` configured correctly in your providers.
If transaction history is not loading, make sure you have an `apiKey` configured
correctly in your providers.
-:::
+
+
## Configuring `WalletIsland` and advanced `Wallet`
diff --git a/docs/pages/builderkits/onchainkit/wallet/wallet-modal.mdx b/_pages/builderkits/onchainkit/wallet/wallet-modal.mdx
similarity index 61%
rename from docs/pages/builderkits/onchainkit/wallet/wallet-modal.mdx
rename to _pages/builderkits/onchainkit/wallet/wallet-modal.mdx
index 3ea3d8db..4479bf7c 100644
--- a/docs/pages/builderkits/onchainkit/wallet/wallet-modal.mdx
+++ b/_pages/builderkits/onchainkit/wallet/wallet-modal.mdx
@@ -39,73 +39,72 @@ import AppWithWalletModal from '@/components/AppWithWalletModal';
## Walkthrough
-::::steps
-
-### Configure the `OnchainKitProvider` with modal settings:
-
-```tsx [providers.tsx]
-
+
+ ```tsx [providers.tsx]
+
- {children}
-
-```
-
-### Use the `ConnectWallet` component in your UI:
-
-```tsx [App.tsx]
-
-
-
-
-
-
-
-
+ wallet: { // [!code focus]
+ display: 'modal', // [!code focus]
+ termsUrl: 'https://...', // [!code focus]
+ privacyUrl: 'https://...', // [!code focus]
+ },
+ }}
+ >
+ {children}
+
+ ```
+
+
+
+ ```tsx [App.tsx]
+
+
+
-
-
-
-
-
-
-```
-
-
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+ ```
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-::::
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
## Components
@@ -161,4 +160,3 @@ By default, the wallet modal includes Coinbase Wallet, MetaMask, and Phantom as
```
Each wallet can be individually enabled or disabled as needed. If no `supportedWallets` configuration is provided, the additional wallets will be disabled by default.
-::::
diff --git a/docs/pages/builderkits/onchainkit/wallet/wallet.mdx b/_pages/builderkits/onchainkit/wallet/wallet.mdx
similarity index 61%
rename from docs/pages/builderkits/onchainkit/wallet/wallet.mdx
rename to _pages/builderkits/onchainkit/wallet/wallet.mdx
index 01b62fb9..4d9f804b 100644
--- a/docs/pages/builderkits/onchainkit/wallet/wallet.mdx
+++ b/_pages/builderkits/onchainkit/wallet/wallet.mdx
@@ -52,173 +52,145 @@ import { Wallet } from '@coinbase/onchainkit/wallet';
## Walkthrough
-::::steps
-
-### Set up your wallet connections
-
-Kick off your wallet connection setup by configuring the `wagmi` provider.
-
-And make sure to update the `appName` as that will be displayed to
-the user when they connect their wallet.
-
-```tsx twoslash
-// @noErrors: 2554
-import { ReactNode } from 'react';
-import { WagmiProvider, createConfig, http } from 'wagmi';
-import { baseSepolia } from 'wagmi/chains';
-import { coinbaseWallet } from 'wagmi/connectors';
-
-const wagmiConfig = createConfig({
- chains: [baseSepolia],
- connectors: [
- coinbaseWallet({
- appName: 'onchainkit',
- }),
- ],
- ssr: true,
- transports: {
- [baseSepolia.id]: http(),
- },
-});
-
-function App({ children }: { children: ReactNode }) {
- return {children};
-}
-```
-
-### Drop in the `` components
-
-Experience the magic by simply dropping in the `` component
-and watch it seamlessly come to life.
-
-Additionally, you can see the [``](/builderkits/onchainkit/identity/identity) components
-like [``](/builderkits/onchainkit/identity/avatar), [``](/builderkits/onchainkit/identity/name),
-and [``](/builderkits/onchainkit/identity/address) are used in a composable way.
-Explore their documentation pages to discover various customization options.
-
-```tsx twoslash
-import {
- ConnectWallet,
- Wallet,
- WalletDropdown,
- WalletDropdownDisconnect,
-} from '@coinbase/onchainkit/wallet';
-import {
- Address,
- Avatar,
- Name,
- Identity,
-} from '@coinbase/onchainkit/identity';
-import { color } from '@coinbase/onchainkit/theme';
-
-export function WalletComponents() {
- return (
-
-
-
-
-
-
-
-
-
+
+
+ Kick off your wallet connection setup by configuring the `wagmi` provider.
+
+ And make sure to update the `appName` as that will be displayed to
+ the user when they connect their wallet.
+
+ ```tsx twoslash
+ // @noErrors: 2554
+ import { ReactNode } from 'react';
+ import { WagmiProvider, createConfig, http } from 'wagmi';
+ import { baseSepolia } from 'wagmi/chains';
+ import { coinbaseWallet } from 'wagmi/connectors';
+
+ const wagmiConfig = createConfig({
+ chains: [baseSepolia],
+ connectors: [
+ coinbaseWallet({
+ appName: 'onchainkit',
+ }),
+ ],
+ ssr: true,
+ transports: {
+ [baseSepolia.id]: http(),
+ },
+ });
+
+ function App({ children }: { children: ReactNode }) {
+ return {children};
+ }
+ ```
+
+
+
+ Experience the magic by simply dropping in the `` component
+ and watch it seamlessly come to life.
+
+ Additionally, you can see the [``](/builderkits/onchainkit/identity/identity) components
+ like [``](/builderkits/onchainkit/identity/avatar), [``](/builderkits/onchainkit/identity/name),
+ and [``](/builderkits/onchainkit/identity/address) are used in a composable way.
+ Explore their documentation pages to discover various customization options.
+
+ ```tsx twoslash
+ import {
+ ConnectWallet,
+ Wallet,
+ WalletDropdown,
+ WalletDropdownDisconnect,
+ } from '@coinbase/onchainkit/wallet';
+ import {
+ Address,
+ Avatar,
+ Name,
+ Identity,
+ } from '@coinbase/onchainkit/identity';
+ import { color } from '@coinbase/onchainkit/theme';
+
+ export function WalletComponents() {
+ return (
+
+ );
+ }
+ ```
+
+
+
+
+
-
-
-
-
-
-
-
-### Drop in pre-made wallet components
-
-Expand the user experience with pre-made components like [``](/builderkits/onchainkit/wallet/wallet-dropdown-link),
-[``](/builderkits/onchainkit/wallet/wallet-dropdown-basename),
-[``](/builderkits/onchainkit/wallet/wallet-dropdown-fund-link),
-or ``, to help you build a seamless wallet experience for your users.
-
-The `` is highly versatile and will likely be your go-to choice
-for adding more links to the dropdown, connecting your users to various pages of your onchain app.
-
-```tsx twoslash
-import {
- ConnectWallet,
- Wallet,
- WalletDropdown,
- WalletDropdownBasename, // [!code focus]
- WalletDropdownFundLink, // [!code focus]
- WalletDropdownLink, // [!code focus]
- WalletDropdownDisconnect,
-} from '@coinbase/onchainkit/wallet';
-import {
- Address,
- Avatar,
- Name,
- Identity,
- EthBalance, // [!code focus]
-} from '@coinbase/onchainkit/identity';
-
-// omitted for brevity
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Wallet
-
-
-
-
-
-```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Expand the user experience with pre-made components like [``](/builderkits/onchainkit/wallet/wallet-dropdown-link),
+ [``](/builderkits/onchainkit/wallet/wallet-dropdown-basename),
+ [``](/builderkits/onchainkit/wallet/wallet-dropdown-fund-link),
+ or ``, to help you build a seamless wallet experience for your users.
+
+ The `` is highly versatile and will likely be your go-to choice
+ for adding more links to the dropdown, connecting your users to various pages of your onchain app.
+
+ ```tsx twoslash
+ import {
+ ConnectWallet,
+ Wallet,
+ WalletDropdown,
+ WalletDropdownBasename, // [!code focus]
+ WalletDropdownFundLink, // [!code focus]
+ WalletDropdownLink, // [!code focus]
+ WalletDropdownDisconnect,
+ } from '@coinbase/onchainkit/wallet';
+ import {
+ Address,
+ Avatar,
+ Name,
+ Identity,
+ EthBalance, // [!code focus]
+ } from '@coinbase/onchainkit/identity';
+
+ // omitted for brevity
-
-
+
-
+
@@ -232,9 +204,36 @@ import {
-
+ ```
-::::
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Wallet
+
+
+
+
+
+
+
+
+
## Customize Connect button text and style
diff --git a/docs/pages/chain/account-abstraction.md b/_pages/chain/account-abstraction.md
similarity index 100%
rename from docs/pages/chain/account-abstraction.md
rename to _pages/chain/account-abstraction.md
diff --git a/docs/pages/chain/account-abstraction.mdx b/_pages/chain/account-abstraction.mdx
similarity index 100%
rename from docs/pages/chain/account-abstraction.mdx
rename to _pages/chain/account-abstraction.mdx
diff --git a/docs/pages/chain/app-blocklist.md b/_pages/chain/app-blocklist.mdx
similarity index 100%
rename from docs/pages/chain/app-blocklist.md
rename to _pages/chain/app-blocklist.mdx
diff --git a/docs/pages/chain/base-contracts.mdx b/_pages/chain/base-contracts.mdx
similarity index 100%
rename from docs/pages/chain/base-contracts.mdx
rename to _pages/chain/base-contracts.mdx
diff --git a/docs/pages/chain/block-explorers.mdx b/_pages/chain/block-explorers.mdx
similarity index 100%
rename from docs/pages/chain/block-explorers.mdx
rename to _pages/chain/block-explorers.mdx
diff --git a/docs/pages/chain/bridge-an-l1-token-to-base.mdx b/_pages/chain/bridge-an-l1-token-to-base.mdx
similarity index 100%
rename from docs/pages/chain/bridge-an-l1-token-to-base.mdx
rename to _pages/chain/bridge-an-l1-token-to-base.mdx
diff --git a/docs/pages/chain/bridges-mainnet.mdx b/_pages/chain/bridges-mainnet.mdx
similarity index 98%
rename from docs/pages/chain/bridges-mainnet.mdx
rename to _pages/chain/bridges-mainnet.mdx
index 66af8363..1483459f 100644
--- a/docs/pages/chain/bridges-mainnet.mdx
+++ b/_pages/chain/bridges-mainnet.mdx
@@ -39,21 +39,20 @@ providers are solely between you and the provider.
See the [sample code repository](https://github.com/base-org/guides/tree/main/bridge/native) to see how to bridge ETH and ERC-20s from Ethereum to Base.
-:::caution
-
+
**Double check the token address for ERC-20s** You can use any ERC-20 that is
supported on the network. You can check what assets are on Base and the
corresponding contract address via [this hub](https://github.com/ethereum-optimism/ethereum-optimism.github.io/tree/master/data).
Ensure there is an address for `base`, [example](https://github.com/ethereum-optimism/ethereum-optimism.github.io/blob/master/data/WETH/data.json#L16-L18).
Always test with small amounts to ensure the system is working as expected.
+
-:::
-:::caution
+
This implementation can only bridge assets to Base. Do not attempt to alter the
code to withdraw the assets.
+
-:::
## FAQ
diff --git a/docs/pages/chain/builder-anniversary-nft.mdx b/_pages/chain/builder-anniversary-nft.mdx
similarity index 100%
rename from docs/pages/chain/builder-anniversary-nft.mdx
rename to _pages/chain/builder-anniversary-nft.mdx
diff --git a/docs/pages/chain/contracts.mdx b/_pages/chain/contracts.mdx
similarity index 99%
rename from docs/pages/chain/contracts.mdx
rename to _pages/chain/contracts.mdx
index d9713331..159514a9 100644
--- a/docs/pages/chain/contracts.mdx
+++ b/_pages/chain/contracts.mdx
@@ -70,11 +70,10 @@ This page lists contract addresses for onchain apps that we have deployed.
#### Testnet interfaces
-:::info
-
+
Two community projects, [BaseX](https://basex-test.vercel.app/swap?currencyA=ETH¤cyB=0x036CbD53842c5426634e7929541eC2318f3dCF7e&focus=source) and [DapDap](https://testnet.base.dapdap.net/uniswap/swap), provide testnet interfaces for Uniswap contracts if you prefer to interact in the browser instead of with the contracts directly.
+
-:::
### Uniswap v2
diff --git a/docs/pages/chain/cross-chain.md b/_pages/chain/cross-chain.md
similarity index 100%
rename from docs/pages/chain/cross-chain.md
rename to _pages/chain/cross-chain.md
diff --git a/docs/pages/chain/cross-chain.mdx b/_pages/chain/cross-chain.mdx
similarity index 100%
rename from docs/pages/chain/cross-chain.mdx
rename to _pages/chain/cross-chain.mdx
diff --git a/docs/pages/chain/data-indexers.md b/_pages/chain/data-indexers.md
similarity index 100%
rename from docs/pages/chain/data-indexers.md
rename to _pages/chain/data-indexers.md
diff --git a/docs/pages/chain/data-indexers.mdx b/_pages/chain/data-indexers.mdx
similarity index 100%
rename from docs/pages/chain/data-indexers.mdx
rename to _pages/chain/data-indexers.mdx
diff --git a/_pages/chain/decentralizing-base-with-optimism.mdx b/_pages/chain/decentralizing-base-with-optimism.mdx
new file mode 100644
index 00000000..8c783144
--- /dev/null
+++ b/_pages/chain/decentralizing-base-with-optimism.mdx
@@ -0,0 +1,5 @@
+---
+title: "Decentralizing Base with Optimism"
+---
+
+
diff --git a/docs/pages/chain/deploy-on-base-quickstart.mdx b/_pages/chain/deploy-on-base-quickstart.mdx
similarity index 98%
rename from docs/pages/chain/deploy-on-base-quickstart.mdx
rename to _pages/chain/deploy-on-base-quickstart.mdx
index 9f4f8185..18a55f87 100644
--- a/docs/pages/chain/deploy-on-base-quickstart.mdx
+++ b/_pages/chain/deploy-on-base-quickstart.mdx
@@ -16,11 +16,12 @@ By the end of this quickstart, you'll be able to:
- Deploy your smart contracts to Base
- Connect your frontend to your smart contracts
-:::tip[Why Base?]
+
+**Why Base?**
Base is a fast, low-cost, builder-friendly Ethereum L2 built to bring the next billion users onchain. By following this guide, you'll join a vibrant ecosystem of developers, creators, and innovators who are building a global onchain economy.
+
-:::
## Set Up Your Development Environment
@@ -47,9 +48,10 @@ forge init
Your Foundry project is now ready. You'll find an example contract in the `src` directory, which you can replace with your own contracts. For the purposes of this guide, we'll use the Counter contract provided in `/src/Counter.sol`
-:::tip
+
Foundry provides a suite of tools for Ethereum application development, including Forge (for testing), Cast (for interacting with the chain), and Anvil (for setting up a local node). You can learn more about Foundry [here](https://book.getfoundry.sh/).
-:::
+
+
## Configure Foundry with Base
@@ -76,9 +78,10 @@ BASE_SEPOLIA_RPC_URL="https://sepolia.base.org"
source .env
```
-:::tip
+
Base Sepolia is the test network for Base, which we will use for the rest of this guide. You can obtain free Base Sepolia ETH from one of the [faucets listed here](/chain/network-faucets).
-:::
+
+
### 2. Secure your private key
@@ -92,9 +95,10 @@ cast wallet import deployer --interactive
Your private key is stored in `~/.foundry/keystores` which is not tracked by git.
-:::warning
+
Never share or commit your private key. Always keep it secure and handle with care.
-:::
+
+
## Deploy Your Contracts
diff --git a/docs/pages/chain/differences-between-ethereum-and-base.mdx b/_pages/chain/differences-between-ethereum-and-base.mdx
similarity index 100%
rename from docs/pages/chain/differences-between-ethereum-and-base.mdx
rename to _pages/chain/differences-between-ethereum-and-base.mdx
diff --git a/docs/pages/chain/fees.mdx b/_pages/chain/fees.mdx
similarity index 100%
rename from docs/pages/chain/fees.mdx
rename to _pages/chain/fees.mdx
diff --git a/docs/pages/chain/flashblocks.mdx b/_pages/chain/flashblocks.mdx
similarity index 100%
rename from docs/pages/chain/flashblocks.mdx
rename to _pages/chain/flashblocks.mdx
diff --git a/docs/pages/chain/index.mdx b/_pages/chain/index.mdx
similarity index 100%
rename from docs/pages/chain/index.mdx
rename to _pages/chain/index.mdx
diff --git a/docs/pages/chain/network-faucets.mdx b/_pages/chain/network-faucets.mdx
similarity index 95%
rename from docs/pages/chain/network-faucets.mdx
rename to _pages/chain/network-faucets.mdx
index 2b385299..cd4f2e19 100644
--- a/docs/pages/chain/network-faucets.mdx
+++ b/_pages/chain/network-faucets.mdx
@@ -10,79 +10,71 @@ description: Documentation for Testnet Faucets for the Base network. Details how
The [Coinbase Developer Platform Faucet](https://portal.cdp.coinbase.com/products/faucet) provides free testnet ETH on Base Sepolia - one claim per 24 hours.
-:::info
-
+
Requests to Coinbase Developer Platform's Faucet are limited to one claim per 24 hours.
+
-:::
## thirdweb Faucet
The [thirdweb Faucet](https://thirdweb.com/base-sepolia-testnet) provides free testnet ETH on Base Sepolia - one claim per 24 hours.
-:::info
-
+
The thirdweb faucet allows developers to connect their wallet through EOA or social logins and claim Base Sepolia testnet funds.
+
-:::
## Superchain Faucet
The [Superchain Faucet](https://app.optimism.io/faucet) provides testnet ETH for all OP Chains, including Base.
-:::info
-
+
The Superchain faucet allows developers to authenticate via their onchain identity. Developers that choose to authenticate via their onchain identity can claim more testnet ETH versus traditional faucets. For more information, see the [FAQ](https://app.optimism.io/faucet).
+
-:::
## Alchemy Faucet
The [Alchemy Faucet](https://basefaucet.com/) is a fast and reliable network faucet that allows users with a free Alchemy account to request testnet ETH on Base Sepolia.
-:::info
-
+
Requests to Alchemy's Base Sepolia Faucet are limited to one claim per 24 hours.
+
-:::
## Bware Labs Faucet
[Bware Labs Faucet](https://bwarelabs.com/faucets) is an easy to use faucet with no registration required. You can use Bware Labs Faucet to claim Base Sepolia testnet ETH for free - one claim per 24 hours.
-:::info
-
+
Requests to Bware Labs Faucet are limited to one claim per 24 hours.
+
-:::
## QuickNode Faucet
[QuickNode Faucet](https://faucet.quicknode.com/drip) is an easy to use Multi-Chain Faucet. You can use QuickNode Faucet to claim Base Sepolia testnet ETH for free - one drip per network every 12 hours.
-:::info
-
+
Requests to QuickNode Faucet are limited to one drip every 12 hours.
+
-:::
## LearnWeb3 Faucet
[LearnWeb3 Faucet](https://learnweb3.io/faucets/base_sepolia) is a multi-chain faucet by LearnWeb3. You can use the LearnWeb3 faucet to claim Base Sepolia testnet ETH for free - one claim every 24 hours.
-:::info
-
+
Requests to LearnWeb3 faucet are limited to one claim per 24 hours.
+
-:::
## Ethereum Ecosystem Faucet
The [Base Sepolia Faucet](https://www.ethereum-ecosystem.com/faucets/base-sepolia) is a free & easy to use testnet faucet for Base Sepolia with very generous drips that doesn't require users to log in. It's run by [Ethereum Ecosystem](https://www.ethereum-ecosystem.com).
-:::info
-
+
Each wallet is restricted to receiving 0.5 ETH from this faucet every 24 hours.
+
-:::
diff --git a/docs/pages/chain/network-information.mdx b/_pages/chain/network-information.mdx
similarity index 98%
rename from docs/pages/chain/network-information.mdx
rename to _pages/chain/network-information.mdx
index b8b0cc55..f3f2c06a 100644
--- a/docs/pages/chain/network-information.mdx
+++ b/_pages/chain/network-information.mdx
@@ -28,13 +28,15 @@ description: Documentation about Base Mainnet and Base Testnet. This page covers
| Currency Symbol | ETH |
| Block Explorer | [https://sepolia-explorer.base.org](https://sepolia-explorer.base.org) |
-:::info
+
L1 & L2 protocol and network-related smart contract deployments can be found on the [Base Contracts](./base-contracts) page.
-:::
+
-:::info
+
+
For production systems, we recommend using a node from one of our [node partners], or [running your own Base node].
-:::
+
+
[running your own Base node]: /tutorials/run-a-base-node
[node partners]: /docs/tools/node-providers
diff --git a/docs/pages/chain/node-providers.mdx b/_pages/chain/node-providers.mdx
similarity index 100%
rename from docs/pages/chain/node-providers.mdx
rename to _pages/chain/node-providers.mdx
diff --git a/docs/pages/chain/onboarding.mdx b/_pages/chain/onboarding.mdx
similarity index 100%
rename from docs/pages/chain/onboarding.mdx
rename to _pages/chain/onboarding.mdx
diff --git a/docs/pages/chain/onramps.mdx b/_pages/chain/onramps.mdx
similarity index 100%
rename from docs/pages/chain/onramps.mdx
rename to _pages/chain/onramps.mdx
diff --git a/docs/pages/chain/oracles.mdx b/_pages/chain/oracles.mdx
similarity index 99%
rename from docs/pages/chain/oracles.mdx
rename to _pages/chain/oracles.mdx
index 2757641e..94840853 100644
--- a/docs/pages/chain/oracles.mdx
+++ b/_pages/chain/oracles.mdx
@@ -33,11 +33,10 @@ Check out these guides to learn more:
See [this guide](https://docs.chain.link/docs/get-the-latest-price/) to learn how to use the Chainlink feeds.
-:::info
-
+
To use Chainlink datafeeds, you may need [LINK](https://docs.chain.link/resources/link-token-contracts?parent=dataFeeds) token.
+
-:::
#### Supported Networks
diff --git a/docs/pages/chain/registry-api.mdx b/_pages/chain/registry-api.mdx
similarity index 99%
rename from docs/pages/chain/registry-api.mdx
rename to _pages/chain/registry-api.mdx
index 7fdc8a36..b7e810b6 100644
--- a/docs/pages/chain/registry-api.mdx
+++ b/_pages/chain/registry-api.mdx
@@ -6,11 +6,10 @@ description: Documentation for the Onchain Registry API.
# Onchain Registry API
-:::info
-
+
The base url for our API endpoints is [https://base.org/api/registry/](https://base.org/api/registry/). The use of Onchain Registry API is governed by the license terms outlined in our [Terms & Conditions](#terms--conditions).
+
-:::
## Instructions
diff --git a/docs/pages/chain/registry-faq.mdx b/_pages/chain/registry-faq.mdx
similarity index 100%
rename from docs/pages/chain/registry-faq.mdx
rename to _pages/chain/registry-faq.mdx
diff --git a/docs/pages/chain/report.md b/_pages/chain/report.mdx
similarity index 100%
rename from docs/pages/chain/report.md
rename to _pages/chain/report.mdx
diff --git a/docs/pages/chain/run-a-base-node.mdx b/_pages/chain/run-a-base-node.mdx
similarity index 98%
rename from docs/pages/chain/run-a-base-node.mdx
rename to _pages/chain/run-a-base-node.mdx
index af842aac..54d8c1c4 100644
--- a/docs/pages/chain/run-a-base-node.mdx
+++ b/_pages/chain/run-a-base-node.mdx
@@ -17,8 +17,7 @@ By the end of this tutorial you should be able to:
## Prerequisites
-:::caution
-
+
Running a node is time consuming, resource expensive, and potentially costly. If you don't already know why you want to run your own node, you probably don't need to.
If you're just getting started and need an RPC URL, you can use our free endpoints:
@@ -29,8 +28,8 @@ If you're just getting started and need an RPC URL, you can use our free endpoin
**Note:** Our RPCs are rate-limited, they are not suitable for production apps.
If you're looking to harden your app and avoid rate-limiting for your users, please check out one of our [partners].
+
-:::
### Hardware requirements
@@ -41,11 +40,10 @@ We recommend you have this configuration to run a node:
- a locally attached NVMe SSD drive
- adequate storage capacity to accommodate both the snapshot restoration process (if restoring from snapshot) and chain data, ensuring a minimum of (2 \* current_chain_size) + snapshot_size + 20%\_buffer
-:::info
-
+
If utilizing Amazon Elastic Block Store (EBS), ensure timing buffered disk reads are fast enough in order to avoid latency issues alongside the rate of new blocks added to Base during the initial synchronization process; `io2 block express` is recommended.
+
-:::
### Docker
@@ -67,19 +65,17 @@ curl -d '{"id":0,"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["late
-H "Content-Type: application/json" http://localhost:8545
```
-:::caution
-
+
Syncing your node may take **days** and will consume a vast amount of your requests quota. Be sure to monitor usage and up your plan if needed.
+
-:::
### Snapshots
-:::info
-
+
Geth Archive Nodes are no longer supported. For Archive functionality, use Reth, which provides significantly better performance in Base’s high-throughput environment.
+
-:::
If you're a prospective or current Base Node operator and would like to restore from a snapshot to save time on the initial sync, it's possible to always get the latest available snapshot of the Base chain on mainnet and/or testnet by using the following CLI commands. The snapshots are updated every week.
diff --git a/docs/pages/chain/security-council.mdx b/_pages/chain/security-council.mdx
similarity index 100%
rename from docs/pages/chain/security-council.mdx
rename to _pages/chain/security-council.mdx
diff --git a/_pages/chain/security.mdx b/_pages/chain/security.mdx
new file mode 100644
index 00000000..00bd2825
--- /dev/null
+++ b/_pages/chain/security.mdx
@@ -0,0 +1,5 @@
+---
+title: "Security"
+---
+
+
diff --git a/docs/pages/chain/using-base.md b/_pages/chain/using-base.mdx
similarity index 100%
rename from docs/pages/chain/using-base.md
rename to _pages/chain/using-base.mdx
diff --git a/docs/pages/chain/wallet.md b/_pages/chain/wallet.mdx
similarity index 99%
rename from docs/pages/chain/wallet.md
rename to _pages/chain/wallet.mdx
index 61cc7b8e..621ab55c 100644
--- a/docs/pages/chain/wallet.md
+++ b/_pages/chain/wallet.mdx
@@ -26,9 +26,12 @@ Coinbase Wallet makes any ERC-20 token instantly available for swapping seconds
Follow the instructions below to ensure your token logo, asset name, and other metadata also appear on Coinbase Wallet.
-:::info[Disclaimer]
+
+**Disclaimer**
+
Base does not endorse any specific token that is deployed on mainnet and made available for swapping.
-:::
+
+
---
@@ -58,9 +61,12 @@ However, you’ll still need to list your token on Birdeye, CoinGecko, or CoinMa
Tokens that are newly launched and haven’t had significant trading volume appear in the **newer token** section. Once your token reaches a market cap of at least $1M it will no longer be displayed in this section.
-:::info[Disclaimer]
+
+**Disclaimer**
+
New assets with low liquidity may result in failed swaps or may result in a user receiving less of the destination token due to slippage. An important responsibility of the token creator is to communicate to the community these risks.
-:::
+
+
## How can I update my token logo or description?
diff --git a/docs/pages/chain/why-base.md b/_pages/chain/why-base.mdx
similarity index 98%
rename from docs/pages/chain/why-base.md
rename to _pages/chain/why-base.mdx
index 58df908a..103a43c1 100644
--- a/docs/pages/chain/why-base.md
+++ b/_pages/chain/why-base.mdx
@@ -10,7 +10,7 @@ description:
## TL;DR
-- **Cheap, fast, and open platform:** Base is a globally available platform that provides 1-second and <1-cent transactions to anyone in the world.
+- **Cheap, fast, and open platform:** Base is a globally available platform that provides 1-second and `<1-cent` transactions to anyone in the world.
- **Access to high-quality tooling:** Builders have access to tools to build incredible onchain experiences for AI, social, media, and entertainment.
- **A place to earn:** Base has delivered over $26M in grants to more than 1,000 builders, with plans to continue supporting more.
- **Reach more users:** Base is committed to helping developers grow their user base by distributing their apps through official Base channels.
diff --git a/_pages/cookbook/IPFS/deploy-with-fleek.mdx b/_pages/cookbook/IPFS/deploy-with-fleek.mdx
new file mode 100644
index 00000000..33bba702
--- /dev/null
+++ b/_pages/cookbook/IPFS/deploy-with-fleek.mdx
@@ -0,0 +1,183 @@
+---
+title: 'Deploy an Onchain App with Fleek'
+description: Learn how to deploy an onchain app using Fleek.
+authors:
+ - briandoyle81
+tags: ['frontend']
+difficulty: hard
+hide_table_of_contents: false
+
+image: https://docs.base.org/img/base-learn-open-graph.png
+---
+
+# Deploy an Onchain App with Fleek
+
+One of the "secrets" of onchain apps is that they almost always have a very large web2 component that they're dependent on. Most onchain apps rely on traditional infrastructure for their frontends, APIs, and other parts of the architecture.
+
+[Fleek]'s goal is to address this issue with the [Fleek Network], a fast and trustless Content Delivery Network (CDN).
+
+In this tutorial, you'll use [Fleek] to deploy a site built with the [Onchain App Template].
+
+## Objectives
+
+By the end of this tutorial you should be able to:
+
+- Deploy a [Next.js] using the Coinbase [Smart Wallet] on [Fleek]
+- Integrate with [Github] for CI/CD
+
+## Prerequisites
+
+### Next.js
+
+You should be familiar with [Next.js], but do not need to be an expert. If you are comfortable with other React libraries, the pattern should be relatively easy to follow.
+
+### Onchain Apps
+
+The tutorial assumes you're comfortable with the basics of deploying an app and connecting it to a smart contract. If you're still learning this part, check out our tutorials in [Base Learn] for [Building an Onchain App].
+
+## Setting up the Template
+
+You can skip this section if you've already built an app based off the template, such as our tutorial for [How to Mint on Zora with an App].
+
+Open [Onchain App Template], click the green `Use this template` button, and create a new repository from the template. Clone your repo and open it in an editor.
+
+Install _bun_ if you need to, and install dependencies.
+
+```bash
+# Install bun in case you don't have it
+curl -fsSL https://bun.sh/install | bash
+
+# Install packages
+bun i
+
+# Run Next app
+bun run dev
+```
+
+Navigate to `localhost:3000` and make sure that it's working, then shut down the server. For this tutorial, you **do not** need to set any environment variables.
+
+## Installing and Configuring Fleek
+
+[Fleek] requires static pages, so you'll need to ensure that your build process produces them. In your editor, open `next.config.js` and update the `nextConfig`.
+
+```javascript
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ output: 'export',
+ reactStrictMode: true,
+ images: {
+ unoptimized: true,
+ },
+ trailingSlash: true,
+};
+
+module.exports = nextConfig;
+```
+
+Save and close the file.
+
+Run `bun run build` and confirm that a directory called `out` is created.
+
+Navigate to [Fleek]'s website and create an account, or log in if you already have one.
+
+Click into `First Project`. You can rename it if you want in the `Settings` tab.
+
+The best way to start is to link Fleek to your repo from the beginning. Click `Add New` from the upper right corner, then select `Deploy My Site`. Select your code location, log into your Git provider, and accept installing the Fleek app.
+
+You can either give it permissions for all repos, or add them one at a time.
+
+Select your repo, and click the `Deploy` button. The `Configure Site` window should automatically populate with the appropriate information, but just in case:
+
+- Site Name: Your site name
+- Framework: Next.js
+- Branch: main
+- Publish Directory: out
+- Build Command: npm install && npm run build
+
+Click `Deploy Site`. Your deploy will probably fail, but this is expected!
+
+Return to your code editor.
+
+Open a terminal and install the Fleek CLI with:
+
+```bash
+npm install -g @fleek-platform/cli
+```
+
+Then, **in the root of your project** run:
+
+```bash
+fleek login
+```
+
+Click the link in your terminal, then click `Confirm` in the web page that opens up. Once you are connected, click the `Visit Dashboard` button. The site automatically creates a project called `First Project`. If you'd like, you can rename it, or add a new one.
+
+Each project can include more than one site.
+
+Return to your terminal in the app folder, and run:
+
+```bash
+fleek sites init
+```
+
+Select `First Project` from the list
+
+```
+⚠️ Warning! To proceed, please select a project...
+
+✔ Select a project from the list: › First Project
+
+✅ Success! You have switched to project "First Project".
+```
+
+For `We've found existing sites. Would you like to link to one of them?`, pick: `Y`
+
+Find the site you just added and select it.
+
+
+You're using TypeScript, but **do not** select `TypeScript (fleek.config.ts)` in the final prompt. Select `JSON (fleek.config.json)`.
+
+
+
+You'll get a few more prompts:
+
+- ? Please specify the directory containing the site files to be uploaded
+ - Enter `out`
+- ? Would you like to include the optional "build" command?
+ - Pick `Y`
+- ? Specify `build` command:
+ - Enter `npm install && npm run build`
+ - Select `JSON (fleek.config.json)`
+
+### Deployment
+
+You can deploy the site from the CLI as the docs describe, but you **do not need to**. There is a better way!
+
+```bash
+# Don't use, better method below!
+fleek sites deploy
+```
+
+Instead, trigger an automatic deploy by making a change to the text at `src/app/page.tsx`, committing your changes, and pushing to your repo.
+
+## Dashboard Overview and Confirming Deployment
+
+Return to your dashboard and click on the `Sites` tab. Click on the card for your new site to open it. Here, you can see information about your site in a similar presentation to other deployment providers.
+
+Click on the `<-> Deploys` tab and you'll see the automatic deploy you triggered by pushing the commit! Open your site by clicking on the build once it shifts from `Pending` to `Live`. You can then click on the link to view your site.
+
+Click on `Settings`. If you'd like, you can change the slug for your site to a name that's more related to your project.
+
+## Conclusion
+
+In this tutorial, you learned how to use [Fleek] to deploy a [Next.js] site based on [Onchain App Template]. You also learned how to link Fleek to your Git provider to enable CI/CD.
+
+[Base Learn]: https://base.org/learn
+[Smart Wallet]: https://www.smartwallet.dev/why
+[Fleek]: https://fleek.xyz
+[Fleek Network]: https://fleek.xyz/blog/announcements/introducing-fleek-network-and-fleek-xyz/
+[Next.js]: https://nextjs.org/
+[Onchain App Template]: https://github.com/coinbase/onchain-app-template
+[Smart Wallet]: https://www.coinbase.com/wallet/smart-wallet
+[How to Mint on Zora with an App]: /use-case-guides/creator/nft-minting-with-zora.mdx
+
diff --git a/_pages/cookbook/account-abstraction/account-abstraction-on-base-using-biconomy.mdx b/_pages/cookbook/account-abstraction/account-abstraction-on-base-using-biconomy.mdx
new file mode 100644
index 00000000..2e33510f
--- /dev/null
+++ b/_pages/cookbook/account-abstraction/account-abstraction-on-base-using-biconomy.mdx
@@ -0,0 +1,319 @@
+---
+title: Account Abstraction on Base using Biconomy
+slug: /account-abstraction-with-biconomy
+description: A tutorial that teaches how to implement Account Abstraction into a Base project using Biconomy paymasters, bundlers, and smart accounts.
+author: taycaldwell
+---
+
+# Account Abstraction on Base using Biconomy
+
+This page will guide you through the process of implementing Account Abstraction in your Base projects using Biconomy paymasters, bundlers, and smart accounts.
+
+## Objectives
+
+By the end of this tutorial you should be able to do the following:
+
+- Set up a smart contract project for Base using [Foundry](https://book.getfoundry.sh/)
+- Set up a Next.js frontend project using `create next-app`
+- Setup user login and authentication using [Particle Network](https://particle.network/)
+- Setup a [Biconomy](https://biconomy.io/) paymaster and bundler
+- Create a gasless transaction
+
+## Prerequisites
+
+### Foundry
+
+This tutorial requires you to have Foundry installed.
+
+- From the command-line (terminal), run: `curl -L https://foundry.paradigm.xyz | bash`
+- Then run `foundryup`, to install the latest (nightly) build of Foundry
+
+For more information, see the Foundry Book [installation guide](https://book.getfoundry.sh/getting-started/installation).
+
+### Coinbase Wallet
+
+This tutorial requires you to have a wallet. You can create a wallet by downloading the Coinbase Wallet browser extension:
+
+- Download [Coinbase Wallet](https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad?hl=en)
+
+### Wallet funds
+
+To complete this tutorial, you will need to fund a wallet with ETH on Base Goerli.
+
+The ETH is required for covering gas fees associated with deploying smart contracts to the network.
+
+- To fund your wallet with ETH on Base Goerli, visit a faucet listed on the [Base Faucets](https://docs.base.org/chain/network-faucets) page.
+
+## What is Biconomy?
+
+Biconomy is a toolkit that offers a full-stack solution for Account Abstraction, including smart accounts, paymasters for sponsoring gas fees, and bundlers for bundling user operations into a single transaction.
+
+### High-level concepts
+
+#### Account Abstraction
+
+Account Abstraction ([ERC-4337](https://eips.ethereum.org/EIPS/eip-4337)) allows users to use Smart Contract wallets instead of traditional Externally Owned Account (EOA) wallets.
+
+#### Smart Accounts
+
+A smart account (also known as a smart contract wallet) is a wallet that stores and manages digital assets (ERC-20 tokens, NFTs, etc.) using a smart contract.
+
+#### User Operations
+
+A user operation is a pseudo-transaction object sent by a smart account that describes a transaction to be sent. Multiple user operations are eventually bundled together and initiated as a single real transaction by a bundler.
+
+#### Paymaster
+
+A paymaster is a special smart contract that allows applications to “sponsor user operations”, meaning it will pay for the gas fees associated with the resulting transaction.
+
+#### Bundler
+
+A special node that monitors a mempool of user operations and bundles multiple user operations into a single transaction.
+
+
+To learn more about Account Abstraction and the concepts outlined above, see [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337).
+
+
+
+## Creating and deploying a smart contract
+
+Before you begin, you need to set up a smart contract development environment using Foundry.
+
+To create a new project, first create a new directory named `myproject`, and change it to your current working directory:
+
+```bash
+mkdir myproject
+cd myproject
+```
+
+### Creating a Foundry project
+
+Next, within the `myproject` directory create a new directory named `contracts`, and change it to your current working directory:
+
+```bash
+mkdir contracts
+cd contracts
+```
+
+Then create a new Foundry project by running the following command:
+
+```bash
+forge init
+```
+
+This will create a Foundry project with the following basic layout:
+
+```bash
+.
+├── foundry.toml
+├── script
+├── src
+└── test
+```
+
+
+The command creates a boilerplate Solidity smart contract file named `src/Counter.sol`. This is the primary contract you will use for this tutorial.
+
+
+
+### Compiling the smart contract
+
+Compile the smart contract to ensure it builds without any errors.
+
+To compile your smart contract, run:
+
+```bash
+forge build
+```
+
+### Setting up a wallet as the deployer
+
+Before you can deploy your smart contract to various chains you will need to set up a wallet to be used as the deployer.
+
+To do so, you can use the [`cast wallet import`](https://book.getfoundry.sh/reference/cast/cast-wallet-import) command to import the private key of the wallet into Foundry's securely encrypted keystore:
+
+```bash
+cast wallet import deployer --interactive
+```
+
+After running the command above, you will be prompted to enter your private key, as well as a password for signing transactions.
+
+
+For instructions on how to get your private key from Coinbase Wallet, visit the [Coinbase Wallet documentation](https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings#show-private-key). **It is critical that you do NOT commit this to a public repo.**
+
+
+
+To confirm that the wallet was imported as the `deployer` account in your Foundry project, run:
+
+```bash
+cast wallet list
+```
+
+### Deploying the smart contract
+
+To deploy the smart contract, you can use the `forge create` command. The command requires you to specify the smart contract you want to deploy, an RPC URL of the network you want to deploy to, and the account you want to deploy with.
+
+
+Your wallet must be funded with ETH on the Base Goerli testnet to cover the gas fees associated with the smart contract deployment. Otherwise, the deployment will fail.
+
+To get testnet ETH, see the [prerequisites](#prerequisites).
+
+
+
+To deploy the smart contract to the Base Goerli testnet, run the following command:
+
+```bash
+forge create ./src/Counter.sol:Counter --rpc-url https://goerli.base.org --account deployer
+```
+
+When prompted, enter the password that you set earlier, when you imported your wallet’s private key.
+
+After running the command above, the contract will be deployed on the Base Goerli test network. You can view the deployment status and contract by using a [block explorer]: /docs/chain/block-explorers.
+
+## Setting up the Paymaster and Bundler
+
+To setup the paymaster and bundler for your project, you will need to visit the [Biconomy Dashboard](https://dashboard.biconomy.io/) and complete the following steps.
+
+### Registering a paymaster
+
+Add and register a Paymaster by completing the following steps:
+
+1. Visit the sign in to the [Biconomy Dashboard](https://dashboard.biconomy.io/)
+1. From the dashboard, select the **Paymasters** tab and click **Add your first Paymaster**
+1. Provide a **Name** for your paymaster
+1. Select **Base Goerli** from the **Network** dropdown
+1. Click **Register**
+
+You should now have a registered Biconomy paymaster.
+
+
+The **API Key** and **Paymaster URL** for the paymaster are provided under the **Overview** tab in the [Biconomy Dashboard](https://dashboard.biconomy.io/).
+
+
+
+### Setting up the paymaster gas tank
+
+Set up and fund the paymaster's gas tank by completing the following steps:
+
+1. From the [dashboard](https://dashboard.biconomy.io/), navigate to the **Paymasters** tab
+1. Click **Setup gas tank** on the paymaster
+1. Navigate to **Gas-Tank > Deposit**, and click **Set up gas tank**
+1. Sign the message with your connected wallet to set up the gas tank
+1. Click **Go to deposit**
+1. Enter the amount of ETH you wish to deposit
+1. Click **Deposit**
+
+ETH should now be deposited into the gas tank for your paymaster. You can visit the Withdraw tab at a later time if you wish to withdraw the funds.
+
+### Setting up the paymaster policies
+
+Set up and fund the paymaster's gas tank by completing the following steps:
+
+1. From the [dashboard](https://dashboard.biconomy.io/), navigate to the **Paymasters** tab
+1. Select the paymaster to configure
+1. Navigate to **Policies > Contracts**, and click **Add your first contract**
+1. Add the **Name** and the **Smart contract address** for your contract
+1. Select the **increment** and **setNumber** write methods as methods to sponsor
+1. Click **Add Smart Contract**
+
+### Setting up a bundler
+
+1. Visit the sign in to the [Biconomy Dashboard](https://dashboard.biconomy.io/)
+1. From the dashboard, select the **Bundlers** tab
+
+
+At the time of writing this tutorial, the Bundler service is still under development, however a **Bundler URL** is provided for testing out UserOperations on test networks. You can specify the chain ID **84531** to use the Bundler URL on **Base Goerli** testnet.
+
+
+
+## Setting up the frontend
+
+### Creating a Next.js project
+
+After you set up your paymaster and bundler from the Biconomy Dashboard, the next step is to create a Next.js project for your app's frontend.
+
+From the root of the `myproject` directory of your project, create a new Next.js project by running the following command:
+
+```bash
+yarn create next-app
+cd my-app
+```
+
+### Installing the dependencies
+
+To use the paymaster and bundler that were setup from the Biconomy Dashboard, you will need to add a few dependencies to your Next.js project.
+
+To install Biconomy as a dependency to your project, run the following command:
+
+```bash
+yarn add @biconomy/account @biconomy/bundler @biconomy/common @biconomy/core-types @biconomy/paymaster ethers@5.7.2
+```
+
+Creating Biconomy smart accounts requires a signer from an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) provider. Biconomy works with a variety of different social login and embedded wallet onboarding solutions that provide access to a signer that can be used for creating smart accounts. In this tutorial, you will use [Particle Network](https://particle.network/) for user authentication and getting a smart account signer.
+
+To install Particle Network as a dependency to your project, run the following command:
+
+```bash
+yarn add @biconomy/particle-auth
+```
+
+### Updating the boilerplate code
+
+The main page (`page.tsx`) of the Next.js project created when running the `yarn create next-app` command contains a `Home` component. This component comes with a lot of code that is unnecessary for this tutorial.
+
+Replace the content of the `page.tsx` file with the following simplified code:
+
+```javascript
+'use client';
+
+import styles from './page.module.css';
+
+export default function Home() {
+ return (
+
+
+
+ );
+}
+```
+
+## Adding social login using Particle Network
+
+### Setting up Particle Network
+
+To get started adding social login into the app using Particle Network, import and initialize the Biconomy Particle Auth module in the `page.tsx` file as shown below:
+
+```javascript
+'use client';
+
+import styles from './page.module.css';
+// highlight-next-line
+import { ParticleAuthModule, ParticleProvider } from '@biconomy/particle-auth';
+
+// highlight-start
+const PARTICLE_PROJECT_ID = 'YOUR_PARTICLE_PROJECT_ID';
+const PARTICLE_CLIENT_ID = 'YOUR_PARTICLE_CLIENT_ID';
+const PARTICLE_APP_ID = 'YOUR_PARTICLE_APP_ID';
+
+const particle = new ParticleAuthModule.ParticleNetwork({
+ projectId: PARTICLE_PROJECT_ID,
+ clientKey: PARTICLE_CLIENT_ID,
+ appId: PARTICLE_APP_ID,
+ wallet: {
+ displayWalletEntry: true,
+ },
+});
+// highlight-end
+
+export default function Home() {
+ return (
+
+
+
+ );
+}
+```
+
+
+You will need to sign up for a Particle Network account and replace the values of `PARTICLE_PROJECT_ID`, `
+
diff --git a/_pages/cookbook/account-abstraction/account-abstraction-on-base-using-particle-network.mdx b/_pages/cookbook/account-abstraction/account-abstraction-on-base-using-particle-network.mdx
new file mode 100644
index 00000000..e432a6bd
--- /dev/null
+++ b/_pages/cookbook/account-abstraction/account-abstraction-on-base-using-particle-network.mdx
@@ -0,0 +1,588 @@
+---
+title: Account Abstraction on Base using Particle Network
+description: A walkthrough on Particle Network's Modular Smart Wallet-as-a-Service, leveraging account abstraction and social logins across various providers.
+authors:
+ - TABASCOatw
+---
+
+# Account Abstraction on Base using Particle Network
+
+Particle Network is a Smart Wallet-as-a-Service provider on Base, providing a modular Account Abstraction stack, allowing developers to use a variety of Paymasters, Bundlers, or smart accounts along with social logins.
+
+This document will guide you through the process of using Particle Network within your Base application, building a simple React project using `create-react-app`, Particle Auth Core, and Particle's AA SDK.
+
+## Objectives
+
+By the end of this guide, you should be able to:
+
+- Use Particle Auth Core to generate an Externally-Owned-Account (EOA) via a social login
+- Assign a chosen smart account to the EOA generated by Particle Auth Core
+- Set up a Bundler and Paymaster
+- Construct and execute a gasless transaction
+
+## Prerequisites
+
+### Wallet funds
+
+This guide requires you to have ETH on Base Sepolia, which will be used to showcase the execution of a gasless burn transaction.
+
+- To fund your wallet with ETH on Base Sepolia, visit one of the faucets listed on the [Base Faucets] page.
+
+### Familiarity with modern, frontend web development
+
+In this example, you'll be building a React-based application using [create-react-app]. It's recommended that you have some level of familiarity with the basics of working with React.
+
+## Understanding Particle Network
+
+### Wallet-as-a-Service
+
+Particle Network provides a large suite of SDKs centered around the reduction of account-based friction.
+
+In this case, "account-based friction" refers to barriers-to-entry that some Web3 users may face as they onboard into an application and begin managing a wallet.
+
+This friction, in the context of this guide, can be placed within two distinct categories:
+
+1. The login process. Often, decentralized applications that tend to be more consumer-facing prefer login flows that aren't dependent upon a user downloading and managing a traditional wallet, as this can be a pain point for some.
+2. The rigidity of standard accounts. Externally Owned Accounts, or EOAs, are often quite rigid in how they operate. They're secured by one key and limited to a strict range of functions, thus developers (and therefore users) are confined to relatively low-level interaction with applications.
+
+Wallet-as-a-Service (WaaS) aims to solve the first of these two points, the login process. WaaS solutions provide an alternative to standard wallets, typically allowing users to use applications through accounts generated by social logins (such as Google, email, or phone). The interfaces for interacting with these accounts are also often embedded within the applications, resulting in a consistent, application-specific experience.
+
+WaaS providers other than Particle Network include [Web3Auth], [Privy], and [Magic], among others.
+
+### Account Abstraction
+
+Particle Network also aims to tackle the second friction point described above: account flexibility.
+
+Account Abstraction refers to a transition away from standard account structures, EOAs, to smart accounts. Smart accounts are contracts that act as a wallet, providing users with an account that feels equivalent to an EOA but is intrinsically programmable (due to it being a smart contract) and thus more flexible.
+
+The most popular modern implementation of Account Abstraction is [ERC-4337], which enables Account Abstraction without any consensus-layer protocol changes. It does this through numerous components of supporting infrastructure, including a Bundler and Paymaster.
+
+Particle Network describes its Account Abstraction stack as modular, referring to cross-compatibility with any provider of Bundlers, Paymasters, or smart accounts). Particle Network's Account Abstraction SDK runs and uses its own Bundler and Paymaster, with built-in support for [Biconomy]'s Paymaster. However, Particle has made it simple to plug into [external infrastructure and components], such as Paymasters or Bundlers from providers like Stackup or Pimlico.
+
+#### Wallet-as-a-Service + Account Abstraction
+
+Leveraging Account Abstraction directly with Wallet-as-a-Service allows users to onboard through social logins into embedded wallets that use smart accounts, not EOAs, allowing for a greater degree of flexibility.
+
+Particle Network does this by allowing developers to use its Account Abstraction SDK alongside its Wallet-as-a-Service SDK (Particle Auth) to facilitate the intersection between both technologies, as we'll cover in this guide.
+
+
+To learn more about Account Abstraction and the concepts outlined above, see [ERC-4337], or Base's [Introduction to Account Abstraction] guide.
+
+
+
+## Setting up the frontend
+
+This guide will go through the process of creating a React-based application through the `create-react-app` template, as shown below.
+
+### Creating a React project
+
+To begin, we'll need to initialize a standard `create-react-app` project.
+
+Within your IDE of choice, run the following command, replacing `{name}` with the name of your project.
+
+```bash
+npx create-react-app {name}
+```
+
+This will create a React project within a directory under the name you set within `{name}`. This directory should contain the following structure by default:
+
+```bash
+{name}/
+├── node_modules/
+├── public/
+├── src/
+├── .gitignore
+├── package.json
+├── package-lock.json
+└── README.md
+```
+
+Throughout this guide, we'll primarily be working with the `src` folder and the files within it. `src` will contain the following by default:
+
+```bash
+src/
+├── App.css
+├── App.js
+├── App.test.js
+├── index.css
+├── index.js
+├── logo.svg
+└── reportWebVitals.js
+```
+
+This structure won't function properly out of the box as our example will be using JSX, a syntax extension that requires a special file type. Thus, you'll need to change the file extension of your `App.js` and `index.js` files to either `.jsx` (JavaScript) or `.tsx` (TypeScript).
+
+We will use these two files, `App.tsx` and `index.tsx`, within this guide.
+
+## Configuring & Initializing Particle Network
+
+### Installing the dependencies
+
+Before jumping into the application itself, it's important to walk through a few vital configurations required for Particle Network's SDKs to function properly.
+
+Within this example, we'll be using three core libraries from Particle, these include:
+
+- `@particle-network/auth-core-modal`, to directly initiate a social login and drive the usage of an embedded wallet.
+- `@particle-network/aa`, for configuring, assigning, and deploying a smart account.
+- `@particle-network/chain`, to allow Base to be used within this example.
+
+To add these as dependencies within your project, run one of the two following commands at the root of your project.
+
+```bash
+yarn add @particle-network/auth-core-modal @particle-network/aa @particle-network/chains
+
+# OR
+
+npm install @particle-network/auth-core-modal @particle-network/aa @particle-network/chains
+```
+
+In addition to the above libraries from `@particle-network`, we'll be using Ethers for core functions, such as retrieving the user's balance, sending a gasless transaction, and so on.
+
+For the sake of simplicity, we'll be using Ethers v5.7.2, the last release before the Ethers v6 upgrade. Although, if you'd like to use a newer version (v6), comments noting the new syntax of v6 will be left on the code snippets throughout this guide.
+
+Thus, you'll need to install Ethers through either of the following commands:
+
+```bash
+yarn add ethers@5.7.2
+
+# OR
+
+npm install ethers@5.7.2
+```
+
+### Setting up the Particle Network dashboard
+
+As you'll find in a moment, every library from Particle Network requires three key values for authentication. These are:
+
+1. Your `projectId`, assigned to a project created through the Particle dashboard.
+2. Your `clientKey`, similarly assigned to a project created through the dashboard, but serving a different purpose.
+3. Your `appId`, retrieved through the creation of an application (within a project) on the dashboard.
+
+Configuring both `@particle-network/auth-core-modal` and `@particle-network/aa` will require the retrieval and utilization of these three values.
+
+To create a project and an application through the Particle dashboard:
+
+1. Navigate to https://dashboard.particle.network.
+2. Create a new account (with your email).
+3. Click "Add New Project" and enter the name of your project.
+4. Copy and save the "Project ID" and "Client Key."
+5. Create a new application. For this example, we'll select "Web."
+6. Once again, enter the name of your project, alongside the domain where you intend to host this application. If you don't have a domain in mind, feel free to use any filler domain (such as 'base.org'), as it won't affect any underlying functionalities.
+7. Copy the "App ID" shown after creating an application.
+
+With these values retrieved, it's recommended that you assign them to environment variables within your application, such as `REACT_APP_PROJECT_ID`, `REACT_APP_CLIENT_KEY`, and `REACT_APP_APP_ID`.
+
+### Configuring Particle Auth Core
+
+Now that you've installed `@particle-network/auth-core-modal` (among other dependencies) and retrieved your project ID, client key, and app ID, you're ready to configure and therefore initialize the Particle Auth Core SDK.
+
+As mentioned, we'll be working out of two files within this guide:
+
+1. `App.jsx/tsx`, containing our core application logic (such as initiating social login and executing the transaction).
+2. `index.jsx/tsx`, used in this example for configuring `AuthCoreContextProvider` from `@particle-network/auth-core-modal`, the core configuration object for Particle Auth Core.
+
+`AuthCoreContextProvider` is a React component used to define these three aforementioned values, customize the embedded wallet modal and enable account abstraction within it. This will wrap our primary application component (`App` from `App.jsx/tsx`), therefore allowing Particle Auth Core to be used through various hooks within `App`.
+
+To achieve this, `AuthCoreContextProvider` will take the following parameters:
+
+- `projectId`, `clientKey`, and `appId`. These are the required values previously retrieved from the [Particle dashboard].
+- `erc4337`, used to define the type of smart account you intend to use, ensuring it's displayed and reflected within the embedded wallet interface.
+- `wallet`, for customizing the embedded wallet interface through the restriction of supported chains, color options, etc.
+
+With this in mind, an example of what your `index.jsx/tsx` file may look like given the usage of `AuthCoreContextProvider` has been included below.
+
+```tsx
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+
+import { AuthType } from '@particle-network/auth-core';
+import { BaseSepolia } from '@particle-network/chains';
+import { AuthCoreContextProvider } from '@particle-network/auth-core-modal';
+
+import App from './App';
+
+// Optional, needed for some environments
+import('buffer').then(({ Buffer }) => {
+ window.Buffer = Buffer;
+});
+// -----
+
+ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
+
+
+
+
+ ,
+);
+```
+
+## Setting Up Your Application
+
+### Importing and configuring hooks
+
+The second core component of this application is `App.jsx/tsx`, which will contain logic achieving the following:
+
+1. Configuration and assignment of a smart account (SimpleAccount in this example).
+2. Construction of a custom Ethers provider, using a custom AA-enabled EIP-1193 provider object.
+3. Initiation of social login.
+4. Execution of a gasless transaction.
+
+To achieve this, we'll be using a combination of hooks (from `@particle-network/auth-core-modal`) and base functions on Ethers, which will be automatically powered by AA through the custom EIP-1193 provider object.
+
+These hooks include `useEthereum` for the retrieval of the standard EOA-based provider object, `useConnect` for managing social logins, and `useAuthCore` to retrieve the user's information (after social login).
+
+To begin building `App.jsx/tsx`, you'll need to define the relevant functions from these hooks through a process similar to the example below:
+
+```tsx
+import React, { useState, useEffect } from 'react';
+import { useEthereum, useConnect, useAuthCore } from '@particle-network/auth-core-modal';
+import { BaseSepolia } from '@particle-network/chains';
+import { AAWrapProvider, SendTransactionMode, SmartAccount } from '@particle-network/aa';
+import { ethers } from 'ethers';
+
+import './App.css';
+
+const App = () => {
+ // Standard, EOA-based 1193 provider
+ const { provider } = useEthereum();
+ // Used for initiating social login and disconnecting users (post-login)
+ const { connect, disconnect } = useConnect();
+ // Automatically loaded with relevant user information after logging in
+ const { userInfo } = useAuthCore();
+};
+```
+
+## Configuring the Smart Account
+
+### Choosing and defining a smart account
+
+The EOA generated through the social login process will be used as the Signer for the smart account specified within this configuration, this will then be reflected through the embedded wallet modal (through its former selection within `AuthCoreContextProvider`).
+
+As mentioned, Particle Network supports a variety of smart accounts directly through its AA SDK, these include:
+
+- Light Account (by Alchemy).
+- Biconomy V1 and V2.
+- SimpleAccount (eth-infinitism).
+- CyberConnect.
+
+We'll be using SimpleAccount in this case. Although, note that you can change which smart account you use at any time through one line of code. This line of code exists on the `SmartAccount` object (imported from `@particle-network/aa`). `SmartAccount` acts as the central point for initializing a smart account.
+
+To configure `SmartAccount`, you'll be using the following parameters:
+
+- `projectId`, `clientKey`, and `appId`. These were used within `AuthCoreContextProvider` and can be retrieved from the [Particle dashboard] through the same procedure.
+- `aaOptions`, which contains `accountContracts`. Within `accountContracts`, you'll need to define a property corresponding with the smart account you'd like to use, i.e. `BICONOMY`, `LIGHT`, `CYBERCONNECT`, or `SIMPLE`.
+ - This property contains `chainIds` and `version`.
+
+See the snippet below for an example of a constructed `SmartAccount` object:
+
+```tsx
+import React, { useState, useEffect } from 'react';
+import { useEthereum, useConnect, useAuthCore } from '@particle-network/auth-core-modal';
+import { BaseSepolia } from '@particle-network/chains';
+import { AAWrapProvider, SendTransactionMode, SmartAccount } from '@particle-network/aa';
+import { ethers } from 'ethers';
+
+import './App.css';
+
+const App = () => {
+ ...
+
+ const smartAccount = new SmartAccount(provider, {
+ projectId: process.env.REACT_APP_PROJECT_ID,
+ clientKey: process.env.REACT_APP_CLIENT_KEY,
+ appId: process.env.REACT_APP_APP_ID,
+ aaOptions: {
+ accountContracts: {
+ SIMPLE: [{ chainIds: [BaseSepolia.id], version: '1.0.0' }]
+ // BICONOMY: [{ chainIds: [BaseSepolia.id], version: '1.0.0' }]
+ // BICONOMY: [{ chainIds: [BaseSepolia.id], version: '2.0.0' }]
+ // LIGHT: [{ chainIds: [BaseSepolia.id], version: '1.0.0' }]
+ // CYBERCONNECT: [{ chainIds: [BaseSepolia.id], version: '1.0.0' }]
+ }
+ }
+ });
+};
+```
+
+### Constructing a custom Ethers object
+
+There are two primary mechanisms to interact with the smart account defined previously. These are:
+
+1. Directly through the constructed `SmartAccount` object, such as with `{your object}.sendTransaction`.
+2. Through a Web3 library, such as Ethers or Web3.js. These libraries can facilitate interaction through a standardized provider object, allowing for a consistent syntax and setup through any wallet or account structure.
+
+As mentioned, we'll be using Ethers within this guide. You'll be able to use any typical Ethers method, such as `sendTransaction` or `getBalance` through the AA-enabled provider we construct with `AAWrapProvider` (imported from `@particle-network/aa`).
+
+Essentially, we'll construct an instance of `AAWrapProvider`, passing in the previously defined `SmartAccount` object alongside an object representing the method selected to pay gas fees. This will allow Ethers to directly load the smart account and drive transactions/signatures through Particle's embedded wallet.
+
+You can achieve this in one line of code, e.g.:
+
+```tsx
+// For Ethers V6, use ethers.BrowserProvider instead; the syntax below won't work.
+const customProvider = new ethers.providers.Web3Provider(
+ new AAWrapProvider(smartAccount, SendTransactionMode.Gasless),
+ 'any',
+);
+```
+
+`SendTransactionMode` has three options. They are:
+
+1. `SendTransactionMode.Gasless`, which will request gas sponsorship on every transaction sent through Ethers. By default, this will be through Particle's Omnichain Paymaster. If you don't have enough USDT deposited in the Paymaster to cover the gas fees, or if the transaction fails to meet your sponsorship conditions (set on the Particle dashboard), the user will pay the gas fees themselves.
+2. `SendTransactionMode.UserPaidNative`, the default method used if `SendTransactionMode` is missing from `AAWrapProvider`. This forces the user to pay gas fees themselves.
+3. `SendTransactionMode.UserSelect`, which allows a user to select which gas fee payment mechanism they use (ERC-20 token, native token, or request sponsorship).
+
+In this example, we're using `SendTransactionMode.Gasless`. Because this example uses Base Sepolia, all transactions will automatically be sponsored.
+
+## Initiating Social Login
+
+### Calling the connect function
+
+At this point, you've configured Particle Auth Core, initialized a smart account of choice, and constructed a custom Ethers provider to drive on-chain interaction.
+
+As covered earlier, one of the core benefits of Wallet-as-a-Service is the ability to onboard users through their social accounts. In this case, users' social login will directly create or log them into a smart account (if they have already created one through Particle Auth), allowing for the immediate usage of account abstraction.
+
+To initiate the social login process programmatically, you'll need to use the `connect` function, defined from the `useConnect` hook imported earlier (from `@particle-network/auth-core-modal`).
+
+Upon calling `connect`, a user will be brought through the social login process, after which an EOA will be generated (through MPC-TSS) and used as a signer for the smart account.
+
+`connect` takes the following parameters:
+
+- `socialType`, the specific social login mechanism you'd like users to go through. If left as an empty string, a generalized social login modal will be shown. Otherwise, use strings such as 'google', 'twitter', 'email', etc.
+- `chain`, an object (imported from `@particle-network/chains`) corresponding with the chain you'd like to use. In this example, it'll be `BaseSepolia`.
+
+Ideally, some logic should be set in place to ensure `connect` isn't called if a user has already logged in. This can be done by only calling `connect` on the condition that `userInfo` (from `useAuthCore`) is undefined, indicating that the user isn't logged in.
+
+Below is an example of calling `connect` (within the conditional described above).
+
+```tsx
+const handleLogin = async (authType) => {
+ if (!userInfo) {
+ await connect({
+ socialType: authType,
+ chain: BaseSepolia,
+ });
+ }
+};
+```
+
+In most applications, `connect` (or `handleLogin` in this example), will be bound to a "Login" or "Connect" button, as will be done here.
+
+## Executing a Gasless Transaction
+
+### Constructing a transaction
+
+Because we're using Ethers in this guide, constructing and executing a gasless transaction (intrinsically gasless through the previously defined `SendTransactionMode`) is identical to the flow you're likely already familiar with. However, it's important to note that transactions sent through ERC-4337 account abstraction do not follow standard transaction structures, these are called UserOperations.
+
+Typically, UserOperations follow lower-level, alternative structures. Although, through the usage of `AAWrapProvider`, the conversion between a simple transaction object (with `to`, `value`, `data`, etc.) to a complete UserOperation is handled automatically, allowing you to send transactions as you would normally.
+
+Thus, we'll be constructing a simple transaction (`tx`) adhering to the following structure:
+
+- `to`, the recipient address. For this example, we can burn a small amount of ETH on Base Sepolia, which means the recipient will be `0x000000000000000000000000000000000000dEaD`.
+- `value`, the value being sent in wei. Because of the default denomination in wei, this will be set as `ethers.utils.parseEther("0.001")`.
+
+If you intend on interacting with a contract, `data` can also be filled out (or within Ethers, a `Contract` object can be built).
+
+Therefore, your `tx` object should look like this:
+
+```tsx
+const executeUserOp = async () => {
+ ...
+
+ const tx = {
+ to: "0x000000000000000000000000000000000000dEaD",
+ value: ethers.utils.parseEther("0.001"),
+ };
+
+ ...
+};
+```
+
+### Executing a transaction
+
+Now that you've defined a standard transaction object, you'll need to execute it. Once again, due to the usage of Ethers, this is quite straightforward.
+
+We'll be using a `signer` object retrieved from `{your provider}.getSigner()` to call the `sendTransaction` method, which simply takes the `tx` object we constructed a moment ago.
+
+Upon calling `signer.sendTransaction(tx)`, the user will be prompted to confirm the transaction (sign a UserOperation hash) through an application-embedded popup. After doing so, the transaction will immediately be sent on Base Sepolia.
+
+To reflect the transaction hash after its confirmation on-chain, you can call the `wait` method on the variable you saved `signer.sendTransaction(tx)` to. The resulting object will contain a `transactionHash` value.
+
+See the example below for a visualization of this process:
+
+```tsx
+const executeUserOp = async () => {
+ const signer = customProvider.getSigner();
+
+ const tx = {
+ to: '0x000000000000000000000000000000000000dEaD',
+ value: ethers.utils.parseEther('0.001'),
+ };
+
+ const txResponse = await signer.sendTransaction(tx);
+ const txReceipt = await txResponse.wait();
+
+ return txReceipt.transactionHash;
+};
+```
+
+## Mapping to JSX
+
+You've now initiated social login (through `handleLogin`), assigned a smart account (through `SmartAccount`), and executed a gasless transaction (through `executeUserOp`).
+
+To present all of this to the user and allow them to interact with these functions for themselves, you'll need to map `handleLogin` and `executeUserOp` to the JSX of your `App` component. This will format the frontend that a user interacts with to test this application.
+
+Essentially, this displays either "Sign in with Google" or "Sign in with Twitter" through custom buttons that are only shown if the user hasn't logged in (determined through the state of `userInfo`). Upon logging in, the user can either call `executeUserOp` or `disconnect` (which was defined from `useConnect`).
+
+Below is an example of what your `App.jsx/tsx` file may look at this point. At the bottom of this snippet you'll find the JSX:
+
+```tsx
+import React, { useState, useEffect } from 'react';
+
+import { useEthereum, useConnect, useAuthCore } from '@particle-network/auth-core-modal';
+import { BaseSepolia } from '@particle-network/chains';
+import { AAWrapProvider, SmartAccount, SendTransactionMode } from '@particle-network/aa';
+
+import { ethers } from 'ethers';
+
+import './App.css';
+
+const App = () => {
+ const { provider } = useEthereum();
+ const { connect, disconnect } = useConnect();
+ const { userInfo } = useAuthCore();
+
+ // Initializes and assigns a smart account to the EOA resulting from social login
+ const smartAccount = new SmartAccount(provider, {
+ projectId: process.env.REACT_APP_PROJECT_ID,
+ clientKey: process.env.REACT_APP_CLIENT_KEY,
+ appId: process.env.REACT_APP_APP_ID,
+ aaOptions: {
+ accountContracts: {
+ SIMPLE: [{ chainIds: [BaseSepolia.id], version: '1.0.0' }],
+ },
+ },
+ });
+
+ // Enables interaction with the smart account through Ethers
+ const customProvider = new ethers.providers.Web3Provider(
+ new AAWrapProvider(smartAccount, SendTransactionMode.Gasless),
+ 'any',
+ );
+
+ // Initiates social login according to authType
+ const handleLogin = async (authType) => {
+ if (!userInfo) {
+ await connect({
+ socialType: authType,
+ chain: BaseSepolia,
+ });
+ }
+ };
+
+ // Executes a gasless burn of 0.001 ETH
+ const executeUserOp = async () => {
+ const signer = customProvider.getSigner();
+
+ const tx = {
+ to: '0x000000000000000000000000000000000000dEaD',
+ value: ethers.utils.parseEther('0.001'),
+ };
+
+ const txResponse = await signer.sendTransaction(tx);
+ const txReceipt = await txResponse.wait();
+
+ return txReceipt.transactionHash;
+ };
+
+ // The JSX
+ return (
+
+
+
+
+
+ {!userInfo ? (
+
+
+
+
+ ) : (
+
+
{userInfo.name}
+
+
+
+
+
+ )}
+
+ );
+};
+
+export default App;
+```
+
+With everything complete, you're ready to run your application to test it. To do so, go through the following process:
+
+1. Navigate to the root of your project.
+2. Run either `npm run start` or `yarn start`.
+3. Once running, log in with either your Google or Twitter.
+4. Fund the address displayed on the wallet modal in the bottom right.
+5. Click "Execute User Operation".
+
+## Conclusion
+
+Congratulations! You've just built an application from scratch, onboarding users into smart accounts through social logins using Particle Network.
+
+To learn more about using Particle Network on Base, take a look at the following resources:
+
+- [Biconomy Guide (which uses Particle Network)]
+- [Account Abstraction on Base]
+- [Particle Network Documentation]
+- [Particle Network 101: Developer Experience]
+
+[create-react-app]: https://create-react-app.dev
+[Base Faucets]: https://docs.base.org/chain/network-faucets
+[Web3Auth]: https://web3auth.io
+[Privy]: https://docs.base.org/tutorials/account-abstraction-with-privy-and-base-paymaster/
+[Magic]: https://magic.link
+[ERC-4337]: https://eips.ethereum.org/EIPS/eip-4337
+[Biconomy]: https://docs.base.org/guides/account-abstraction-with-biconomy
+[external infrastructure and components]: https://blog.particle.network/announcing-our-smart-wallet-as-a-service-modular-stack-upgrading-waas-with-erc-4337
+[Introduction to Account Abstraction]: https://docs.base.org/cookbook/account-abstraction/account-abstraction-on-base-using-privy-and-the-base-paymaster
+[Particle dashboard]: https://dashboard.particle.network
+[Biconomy Guide (which uses Particle Network)]: https://docs.base.org/cookbook/account-abstraction/account-abstraction-on-base-using-biconomy
+[Account Abstraction on Base]: https://docs.base.org/tools/account-abstraction
+[Particle Network Documentation]: https://developers.particle.network
+[Particle Network 101: Developer Experience]: https://blog.particle.network/particle-network-101-developer-experience-edition
+
diff --git a/_pages/cookbook/account-abstraction/account-abstraction-on-base-using-privy-and-the-base-paymaster.mdx b/_pages/cookbook/account-abstraction/account-abstraction-on-base-using-privy-and-the-base-paymaster.mdx
new file mode 100644
index 00000000..b338dea8
--- /dev/null
+++ b/_pages/cookbook/account-abstraction/account-abstraction-on-base-using-privy-and-the-base-paymaster.mdx
@@ -0,0 +1,734 @@
+---
+title: 'Account Abstraction on Base using Privy and the Base Paymaster'
+slug: /account-abstraction-with-privy-and-base-paymaster
+description: A tutorial that teaches how to implement Account Abstraction into a Base project using Privy and the Base paymaster.
+author: Brian Doyle and Aaron Hayslip
+---
+
+# Account Abstraction on Base using Privy and the Base Paymaster
+
+This tutorial shows you how to use [Privy], [Alchemy's Account Kit], and the [Base Paymaster] to enable your users to use onchain apps without creating a wallet on their own, or even needing to pay for gas fees!
+
+## Objectives
+
+By the end of this tutorial, you should be able to:
+
+### Intro to Account Abstraction
+
+- Explain how Account Abstraction can improve user experience for onchain apps
+- Describe the difference between contract accounts and EOAs, the limitations of contract accounts, and how EIP-4337 uses `UserOperation`s to mitigate these limitations
+- Outline how Account Abstraction works, and how users interact with smart contract wallets
+
+### Intro to Privy
+
+- Implement Privy's quick start to add onchain authentication to a NextJS application
+- Compare Privy's progressive authentication strategy with traditional wallet-based authentication
+- Use Privy's `PrivyProvider` context and `usePrivy` hook to implement basic authentication via an email address, SMS, EOA, and/or social auth
+- Utilize Privy's Embedded Wallets to enable users to utilize wallet-based actions without having to connect to an external wallet or leave your application
+
+### Implementing the Paymaster
+
+- Describe how a third party can use a _paymaster_ to sponsor gas
+- Modify Privy's Base [paymaster example] example to work in another app, using an EOA to allow a user to call a smart contract function without requiring the user to pay any gas
+
+## Prerequisites
+
+### 1. Be familiar with modern, frontend web development
+
+In this tutorial, we'll be working with a React frontend built with [Next.js]. While you don't need to be an expert, we'll assume that you're comfortable with the basics.
+
+### 2. Possess a general understanding of the EVM and smart contract development
+
+This tutorial assumes that you're reasonably comfortable writing basic smart contracts. If you're just getting started, jump over to our [Base Learn] guides and start learning!
+
+## Intro do Account Abstraction
+
+[ERC-4337], also known as _Account Abstraction_, is a standard that allows smart contracts to initiate transactions, thus enabling any logic that users want to implement to be encoded into the smart contract wallet itself for execution on Ethereum.
+
+Account Abstraction has the potential to be a massive game-changer for onchain user experience and many believe it will play a key role in bringing the next billion users onchain.
+
+### The Problem Account Abstraction Solves
+
+Onchain applications are difficult to use for many people, as they require a lengthy onboarding process for the average internet user who already onchain.
+
+For example,the preliminary steps a user needs to go through before they can use an onchain app are:
+
+1. Create a wallet (Coinbase Wallet, Metamask, etc)
+1. Store the wallet mnemonic safely, without losing it or compromising it
+1. Sign a slightly frightening message to connect to an onchain app
+1. Try to do anything with the app and get a popup asking them to approve a transaction
+1. Attempt to do so, learn transactions cost gas, and that they don't have any
+1. Learn that gas is a fee that users must pay in ETH to use onchain apps
+1. Attempt to buy ETH, possibly buying the wrong flavor of ETH in the wrong location
+1. Try the transaction again
+1. Repeat until they finally find the correct path
+
+For widespread adoption of onchain applications, this confusing and alienating process has to change.
+
+That's where Account Abstraction comes in. It allows you to improve the onboarding and usage flow for your users:
+
+1. User goes to the onchain app and authenticates (using email, EOA, or social auth)
+2. User uses the app
+3. Transactions happen under the hood via a smart contract wallet and the app developer sponsors the user's gas fees until after they're onboarded.
+
+To summarize, Account Abstraction enables smart contract accounts to initiate user operations, similar to how an EOA would initiate a transaction. However, unlike EOAs, smart contract accounts are programmable and can enable a number of incredible features, such as:
+
+- **Sponsored Transactions**: Allow application owners to cover the users gas fees with a paymaster or allow a user to use something other than ETH (USDC, for example) to cover gas
+- **Arbitrary Verification Logic**: Verify transactions with custom logic
+- **Account Recovery**: Create account recovery features for when user lose private keys
+- **Batching Transactions**: Change the user experience so that multiple transactions can be submitted at once
+
+### Overview of ERC-4337 - Account Abstraction
+
+"Account Abstraction" comes from [ERC-4337]. The proposal itself is a dense read, but one of stated goals of the proposal is to:
+
+> allow users to use smart contract wallets containing arbitrary verification logic instead of EOAs as their primary account. Completely remove any need at all for users to also have EOAs (as status quo SC wallets and EIP-3074 both require)
+
+In other words, the proposal seeks to allow users to use _smart contract wallets_ **instead** of EOAs to transact onchain.
+
+
+You're working with something so new that the vocabulary hasn't settled yet. You'll often see the terms "smart contract wallet", "smart contract account" or just "smart account" used interchangeably.
+
+
+
+At first glance, you may be asking yourself if using smart contract accounts solve our problem. What's the difference between a smart contract account (or contract account) and an _Externally Owned Account_?
+
+According to [ethereum.org], the differences are:
+
+**Externally Owned Account**
+
+- Creating an account costs nothing
+- Can initiate transactions
+- Transactions between externally-owned accounts can only be ETH/token transfers
+- Made up of a cryptographic pair of keys: public and private keys that control account activities
+
+**Contract Accounts**
+
+- Creating a contract has a cost because you're using network storage
+- Can only send transactions in response to receiving a transaction
+- Transactions from an external account to a contract account can trigger code which can execute many different actions, such as transferring tokens or even creating a new contract
+- Contract accounts don't have private keys. Instead, they are controlled by the logic of the smart contract code
+
+Smart contract wallets _would_ solve our problems, **but**, as stated above, they can't initiate transactions. Since they cannot initiate transactions, users still need EOAs and those EOAs still need to pay for gas with ETH.
+
+There were two options to resolve this problem:
+
+1. Change the protocol - hard fork!
+
+2. Change transactions, upstream (ERC-4337)
+
+In a nutshell, ERC-4337 doesn't change how Ethereum transactions work. Cryptographically signed instructions from accounts still initiate transactions to update the state of the Ethereum network.
+
+What ERC-4337 changes is everything _upstream_ of that signed transaction. It does this by introducing a new _user intent layer_ that acts as a proxy for an EOA. This layer allows users to initiate transactions, with highly customizable smart contract wallets, but without using an EOA. The Ethereum network still receives what it received before - signed transactions.
+
+The result is a better experience for the user without changing the Ethereum protocol.
+
+### How Account Abstraction Works
+
+With typical Ethereum transactions an EOA initiates and signs a transaction. That transaction is sent to Ethereum's Public Mempool, is validated and added to a block, onchain.
+
+Note that the following steps are primarily happening **before** any of that.
+
+#### 1. **Smart Contract Wallet Creation**
+
+First, a new smart contract wallet must be created for a user. This wallet is owned by its creator who is designated as the _signer_. This signer must validate any of its future operations.
+
+This wallet may come with a variety of features, but it must be able to at least validate `UserOperations`s with a function called, `validateUserOp`. `validateUserOp` will check each `UserOperation`'s signature, increment the nonce, and handle the operation's fees.
+
+#### 2. **User Operation Creation**
+
+From the smart contract account, `UserOperations`s are created. These are not yet transactions, but rather represent intents from the user. These intents can represent any onchain user operation.
+
+`UserOperation` includes the details of the transaction such as sender, nonce, gas limit, max fee per gas, paymaster data (if applicable), and a signature.
+
+#### 3. **Signature Generation**:
+
+The `UserOperation` is then signed using the private key associated with the initiating account. This signature serves to authenticate the transaction and validate that it was indeed initiated by the owner of the smart contract account.
+
+#### 4. **Alt Mempool**:
+
+ERC-4337 introduces an _Alt Mempool_ where operations are stored until they're picked up by a _Bundler_. The Alt Mempool is not very different from the transaction pool typically used in Ethereum, but this mempool exists earlier on in the transaction and holds user operations, where Ethereum's mempool holds signed transactions.
+
+#### 5. **Bundler and Operation Submission**:
+
+Nodes on the Ethereum network have the option to serve as a _Bundler_, a role that involves collecting multiple signed `UserOperation`s and consolidating them into a single transaction, called a bundle transaction. These bundle transactions are then directed towards a universal smart contract, called the _EntryPoint_.
+
+The submission of the signed `UserOperation` to the EntryPoint contract can be done directly or through a _paymaster_, which is a contract that agrees to cover the cost of operations for certain users.
+
+#### 6. **Operation Validation**:
+
+The Bundler triggers a function named `handleOps` on the EntryPoint smart contract, which receives the bundle transaction. The EntryPoint then calls `validateUserOp` for each account within this bundle transaction.
+
+Each smart contract wallet is then required to implement an additional function and execute the actual operation sent by the EntryPoint contract.
+
+#### 7. **Operation Execution**:
+
+Once the operation has been validated and the fees have been handled, the operation is executed on the Ethereum network.
+
+## Intro to Privy
+
+[Privy] makes authentication and user-management in onchain apps easier by bridging onchain and offchain user data. In preparation to dive into our Base Paymaster example app, this lesson will cover the basics of Privy.
+
+In this tutorial, you'll quick start and review a sample application where users can authenticate with [Privy].
+
+### Overview of Privy
+
+Privy self-describes as "a simple toolkit for progressive authentication in web3". In this app, you'll primarily use Privy for its authentication and user-handling capabilities, but some of Privy's most popular features include:
+
+**Authentication Options**: Privy allows developers to configure how users authenticate. This can be with a crypto wallet, an email address, phone number or social profiles. Conveniently, Privy handles sessions and provides all necessary authentication methods.
+
+**Progressive Onboarding**: Privy creates a `user` object for each session. Before authentication, this `user` object is `null`, but as the user interacts with your application it will progressively associate more user information with this object. For example, users can start by authenticating with their email address and later add their wallet address or any other user information as the application requires.
+
+**Embedded Wallets**: Embedded wallets are "self-custodial Ethereum wallets that are embedded into your app. This allows your users to take wallet-based actions without ever leaving your site. Embedded wallets are the easiest way to unlock your full product experience for users who don't have, or don't want to connect, their own wallet." Developers can simply configure Privy to automatically created an Embedded Wallet on `login` or they can be pregenerated on the backend.
+
+
+_Embedded wallets_ are still EOAs and should not be confused with _smart contract wallets_. A user may have both. During development, this division can lead to confusing situations where `msg.sender` is **not** the address you were expecting.
+
+
+
+### Privy Quick Start
+
+As with most onchain frontend connector libraries, you can use [Privy's Quick Start] to jump start your development with their platform. In this example, you'll use the NextJS starter.
+
+#### Setup
+
+First, navigate to the repository: [https://github.com/privy-io/create-next-app] and clone the repo.
+
+```bash
+git clone https://github.com/privy-io/create-next-app
+```
+
+Next, `cd create-next-app` and install dependencies with `yarn`.
+
+#### Setting Your App Id
+
+To use Privy, you'll need your own environment variables. In your terminal, run:
+
+```bash
+cp .env.example .env.local
+```
+
+This will create a `.env.local` file in your project's root. This is where you'll add your Privy App ID:
+
+```text
+NEXT_PUBLIC_PRIVY_APP_ID=
+```
+
+
+Note - to get an App ID, you'll need to request one and access it at [https://console.privy.io/]. This process can take a while, but for the Base community, Privy will expedite this process! Developers can send an email to `base@privy.io` with:
+
+- Your app name
+- The email address you want as admin
+- A one liner on what you're building
+
+
+
+#### Starting the App
+
+Finally, run `yarn dev` and navigate to [http://localhost:3000] to see the starter application.
+
+### Privy Login Walkthrough
+
+Before exploring the code, test the app. First, you should see this login page:
+
+
+
+After clicking "Log in" you'll see the following modal:
+
+
+
+By default, you can login with a wallet, or email.
+
+After logging in, you'll be redirected to the `/dashboard` page, where the demo app will allow you to connect a number of other accounts to your `user` object:
+
+
+
+If you navigate to [console.privy.io](https://console.privy.io/), you'll see that Privy stores all your users and their data here.
+
+
+
+### PrivyProvider
+
+Diving into the code, first look at the `PrivyProvider` inside of `_app.jsx`:
+
+```tsx
+ router.push('/dashboard')}
+>
+
+
+```
+
+`PrivyProvider` uses React Context and wraps any components that will use the `usePrivy` hook.
+
+Additionally, it's here that you can pass an optional `config` property to enable more authentication methods.
+
+Add a `config` property to the `` in `_app.jsx` with `'github'` and `'sms'` as the login options:
+
+```tsx
+ router.push('/dashboard')}
+ config={{
+ loginMethods: ['github', 'sms'],
+ }}
+>
+
+
+```
+
+Refresh to see that authentication is only possible now through Github or SMS:
+
+
+
+You can find a full list of `loginMethods` in the docs for [`PrivyClientConfig`].
+
+### The `usePrivy` Hook
+
+The primary method you'll use to utilize Privy's authentication features is `usePrivy`. Open `pages/dashboard.tsx` to see the methods decomposed from `usePrivy` in the starter, and how they are used.
+
+A full list of the fields and methods returned from `usePrivy` are [documented here].
+
+### The `useWallets` Hook
+
+To access wallet data for currently authenticated user, use the `useWallets` hook:
+
+```tsx
+import { ConnectedWallet, useWallets } from '@privy-io/react-auth';
+
+const { wallets } = useWallets();
+
+// wallets = [
+// {
+// "address": "0x",
+// "type": "wallet",
+// "verifiedAt": "2023-11-28T19:01:41.000Z",
+// "chainType": "ethereum",
+// "chainId": "eip155:84531",
+// "walletClient": "unknown",
+// "walletClientType": "coinbase_wallet",
+// "connectorType": "coinbase_wallet"
+// },
+// {
+// "address": "0x",
+// "type": "wallet",
+// "verifiedAt": "2023-11-28T20:09:23.000Z",
+// "chainType": "ethereum",
+// "chainId": "eip155:1",
+// "walletClient": "unknown",
+// "walletClientType": "metamask",
+// "connectorType": "injected"
+// },
+// ],
+```
+
+As you can see, a user may connect multiple wallets to Privy, including Embedded Wallets.
+
+### Embedded Wallets
+
+Lastly, configure your starter app to create an Embedded Wallet for your users on login.
+
+As stated in the Privy docs,
+
+> Embedded wallets are self-custodial Ethereum wallets that are embedded into your app. This allows your users to take wallet-based actions without ever leaving your site. Embedded wallets are the easiest way to unlock your full product experience for users who don't have, or don't want to connect, their own wallet.
+
+When configuring your app to create embedded wallets on login, you have 2 options:
+
+- `users-without-wallets`: This will create embedded wallets for all use who did not login with an external wallet
+- `all-users`: This will create an additional embedded wallet for all users, regardless if they have linked an external wallet
+
+Inside of `_app.tsx`, update your `PrivyProvider`:
+
+```tsx
+ router.push('/dashboard')}
+ config={{
+ embeddedWallets: {
+ createOnLogin: 'all-users'
+ }
+ }}
+>
+```
+
+Log out of your application, then log in again and see that your user has an additional `linkedAccount` which is the Privy Embedded Wallet:
+
+```tsx
+{
+ "address": "0xD5063967BA703D485e3Ca40Ecd61882dfa5F49b2",
+ "type": "wallet",
+ "verifiedAt": "2023-11-28T20:52:22.000Z",
+ "chainType": "ethereum",
+ "chainId": "eip155:1",
+ "walletClient": "privy",
+ "walletClientType": "privy",
+ "connectorType": "embedded",
+ "recoveryMethod": "privy"
+},
+```
+
+More information on Privy's Embedded Wallets, including information about the addresses, signing transactions, funding the wallet and more, can be found here: [https://docs.privy.io/guide/frontend/embedded/overview]
+
+## Implementing the Paymaster
+
+A _paymaster_ is a type of smart contract account, introduced in [ERC-4337], that is able to pay for gas on behalf of another account. In this step-by-step, you'll modify an example created by [Privy], move it to another onchain app, and use it to call a smart contract function. Along the way, you'll encounter and resolve some of the confusing pitfalls associated with working with smart contract accounts.
+
+
+The tutorial below does not account for recent changes to the [Base Paymaster]. Please reference the linked repo and adjust. We'll update the tutorial soon!
+
+
+
+### Reviewing the Example
+
+Start by reviewing the [paymaster example]. The address in the `about` section of the Github page links to a deployed version of the app. It's the same app you get from [Privy's Quick Start], with the addition of a mint button (the versions may be a little older).
+
+The app is limited to social auth, so log in with either your Google account or email. You'll see the dashboard, with the addition of a `Mint NFT` button at the top.
+
+Click the button and you'll see a toast notification informing you of updates to the transaction status. Note that this happens **without** you needing to approve a transaction or fund a wallet!
+
+Click to see the transaction when it's done to open BaseScan. If you missed it, mint another NFT, it's not like you're paying gas!
+
+### Reviewing the Transaction and Contract
+
+The transaction page should appear fairly standard. You can see from it that an NFT was minted by the [NFT Contract] and transferred to the smart wallet address listed on the dashboard. Digging in a little more, you'll see some things that might be different than what you'd expect.
+
+#### Tokens Transferred and the NFT Contract
+
+In the `ERC-721 Tokens Transferred` section, click the link to `NFT Name (NFT)` to open up the overview page for the token. You'll see a list of transfers, with yours likely on the top. Click the address for the contract to open up the [view for the contract itself].
+
+You may be surprised to see that there are very few transactions listed for this contract, despite the list of transfers you can see on the token page, or the `Events` tab. Currently, Etherscan and BaseScan won't display transactions done via the paymaster.
+
+
+Blockchain explorers are service providers that provide information about the state of various blockchains. They are **not** a source of truth.
+
+It is possible for onchain activity to be missing from these services.
+
+
+
+#### The Bundler (Transaction Sender)
+
+Return to the transactions summary and look at the `From:` field. It will contain `0x1e6754b227c6ae4b0ca61d82f79d60660737554a`. What is this address? It's not your smart wallet address or signer address. If you mint another NFT from a different login, you'll get the same sender.
+
+This address is the [bundler], which is a special node that bundles user operations from the alt mempool into a single transaction and sends them to the single [EntryPoint] contract.
+
+#### EntryPoint
+
+The EntryPoint contract for Base Goerli is located at `0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789`. Strangely, in your transaction receipt you'll see that the transaction includes a transfer of ETH **from** the EntryPoint **to** the bundler. This transaction is how the bundler gets compensated for performing the service of bundling user ops and turning them into transactions -- the EntryPoint calculates the gas used by user ops and multiplies that by the fee percentage and send it to the bundler.
+
+### Review the Example Code
+
+Return to the [paymaster example] and review the readme. The section on _Copying into your code_ lists the three files you'll need to copy over to implement the paymaster in your own app. All three are extensively documented via comments. You'll also want to review how the demo app uses these to call a function.
+
+#### `SmartAccountContext.tsx`
+
+The first file, [`hooks/SmartAccountContext.tsx`] uses a React Context provider to create a ` SmartAccountProvider`` and pass it into your app. You can see it in use in `\_app.tsx`, with the regular `PrivyProvider` around it. Review the file in detail.
+
+Starting on line 63, the exported `SmartAccountProvider` does the following:
+
+1. Fetch the user's wallets and find their Privy wallet. This wallet is provided, and if need be created, by the `PrivyProvider`
+1. Set up state variables to manage and share connection status and the smart account itself
+1. Initialize an RPC client for the [Base Paymaster] (on Goerli). The URL is hardcoded in `lib/constants.ts`
+1. Initialize an ERC-4337 RPC client for Alchemy's network. This network is where the bundler address comes from
+1. Create a smart wallet. In this case, the `signer` is your EOA embedded wallet created by Privy and fetched in the first step
+1. The EOA address is displayed in the example app as `YOUR SIGNER ADDRESS`
+1. Initialize an Alchemy provider for the smart account signer, using Alchemy's [Account Kit].
+1. This creates the smart account and its address, which is displayed in the example app as `YOUR SMART WALLET ADDRESS`
+
+Finally, the `sendSponsoredUserOperation` function takes a traditional transaction, turns it into a user operation, adds the data for the paymaster to pay the gas, signs it, and sends it. Whew!
+
+If you want a deeper dive into the inner workings of this process, review the helper functions in [`user-operations.ts`].
+
+#### How to Call a Smart Contract Function with the Paymaster
+
+Open [`pages/dashboard.tsx`] and take a look at the `onMint` function on line 32. This function is used as the `oncClick` handler for the `Mint` button at the top of the dashboard.
+
+If you're used to working with wagmi, you'll find the process of sending and awaiting for confirmation of a transaction a little on the manual side. Most of this will be familiar if you've used viem directly, or have worked with _Ethers_.
+
+When a user clicks, the app first creates a viem `RpcTransactionRequest` for the `mint` function on the smart contract. The `smartContractAddress` is supplied by the `SmartAccountProvider`, and the `ABI` and contract `NFT_ADDRESS` are loaded from `lib/constants.ts`:
+
+```tsx
+{
+ from: smartAccountAddress,
+ to: NFT_ADDRESS,
+ data: encodeFunctionData({
+ abi: ABI,
+ functionName: "mint",
+ args: [smartAccountAddress],
+ }),
+}
+```
+
+The app then updates the toast component to update the users while it `await`s first the `userOpHash`, then the `transactionHash`, indicating that transaction has completed successfully. It then updates the link in the toast to send the user to that transaction on Goerli BaseScan.
+
+### Implementing the Paymaster in your own App
+
+Create a new project using Privy's [`create-next-app`] template, and complete the setup instructions in the readme.
+
+Add an environment variable for `NEXT_PUBLIC_ALCHEMY_API_KEY` and paste in the an API key for a Base Goerli app. If you need a key, go to [add an app] and create a new one.
+
+#### Copying and Updating the Source Files
+
+Copy the `hooks` and `lib` folders into your _new_ project. You'll need to install some more dependencies. Use `npm` or `yarn` to add:
+
+- viem
+- react-dom
+- @alchemy/aa-accounts
+- @alchemy/aa-alchemy
+- @alchemy/aa-core
+
+Open `SmartAccountContext.tsx` in your project. You'll see an error for `getDefaultLightAccountFactory`. The name of this function has been updated to `getDefaultLightAccountFactoryAddress`. Change it in the import, and where it is used in the file in the call to `LightSmartContractAccount`.
+
+#### Updating to Use the User's Wallet
+
+The app is currently configured to find and use the user's embedded Privy wallet as the signer. To change this, modify the instantiation of the `SmartAccountProvider`. Instead of `find`ing the user's Privy wallet:
+
+```tsx
+// Old code to change
+
+// Get a list of all of the wallets (EOAs) the user has connected to your site
+const { wallets } = useWallets();
+// Find the embedded wallet by finding the entry in the list with a `walletClientType` of 'privy'
+const embeddedWallet = wallets.find((wallet) => wallet.walletClientType === 'privy');
+```
+
+Simply grab the first wallet in the list (you'll want to do something more elegant for a production app):
+
+```tsx
+// Updated Code
+
+// Get a list of all of the wallets (EOAs) the user has connected to your site
+const { wallets } = useWallets();
+
+// Grab the first wallet on the list
+// TODO: Implement the option to allow the user to choose another wallet
+const wallet = wallets[0];
+```
+
+Then, update the call at the bottom of `useEffect` to `createSmartWallet` if there is an `embeddedWallet` to instead create it if there is a `wallet`, using that `wallet`. You'll also need to update the dependency in the dependency array.
+
+```tsx
+useEffect(() => {
+ // Other code
+
+ if (wallet) createSmartWallet(wallet);
+}, [wallet?.address]);
+```
+
+#### Configuring the PrivyProvider and Adding SmartAccountProvider
+
+By default, the `PrivyProvider` allows logging in with a wallet or email address. To limit it to only the wallet, update the config. You can also set the default chain here. You'll need to import `baseGoerli` to do so.
+
+You also need to import and wrap the app with `SmartAccountProvider`, imported from `hooks/SmartAccountContext.tsx`.
+
+
+The `@alchemy/aa-core` package also exports `SmartAccountProvider` and this export takes precedence when VSCode attempts to help you by automatically adding the import. You'll know you've got the wrong one if `SmartAccountProvider` generates an error that:
+
+```text
+'SmartAccountProvider' cannot be used as a JSX component.
+Its instance type 'SmartAccountProvider' is not a valid JSX element.
+```
+
+
+
+```tsx
+ router.push('/dashboard')}
+ config={{
+ loginMethods: ['wallet'],
+ defaultChain: baseGoerli,
+ }}
+>
+
+
+
+
+```
+
+#### Checking Progress
+
+Grab the snippet from the original demo that displays the user's addresses, and add it to `dashboard.tsx` in the new project:
+
+```tsx
+
` for the `User Object` window.
+
+You'll need to import `BASE_GOERLI_SCAN_URL` from `constants.ts`. The `useSmartAccount` hook returns `smartAccountProvider` and `eoa`. Import it and add it under the `usePrivy` hook. You don't need them just yet, but go ahead and decompose `smartAccountProvider` and `sendSponsoredUserOperation` as well:
+
+```tsx
+const router = useRouter();
+const {
+ ready,
+ authenticated,
+ user,
+ logout,
+ linkEmail,
+ linkWallet,
+ unlinkEmail,
+ linkPhone,
+ unlinkPhone,
+ unlinkWallet,
+ linkGoogle,
+ unlinkGoogle,
+ linkTwitter,
+ unlinkTwitter,
+ linkDiscord,
+ unlinkDiscord,
+} = usePrivy();
+const { smartAccountAddress, smartAccountProvider, sendSponsoredUserOperation, eoa } =
+ useSmartAccount();
+```
+
+Run the app. You'll now see your familiar wallet address as `YOUR SIGNER ADDRESS`!
+
+```caution
+
+The app sometimes gets confused with login state after you've made changes to `config`. If you see the `Log In` button but clicking it does nothing, try manually navigating to `localhost:3000/dashboard` or clearing the cache.
+
+```
+
+#### Calling a Smart Contract Function
+
+You've adjusted the foundation of the app to allow you to use the Base Goerli Paymaster with your normal wallet as the signer. Now, it's time to call a smart contract function.
+
+Start by using the `mint` function in the original example. In the `DashboardPage` component, add a state variable holding an empty element:
+
+```tsx
+const [transactionLink, setTransactionLink] = useState(<>>);
+```
+
+Then, add a variant of the original `onMint` function that sets this variable and has the code related to the toast removed.
+
+**Note:** make sure you change your wallet address in `args` to make sure the NFT is sent to your EOA wallet address!
+
+```tsx
+const onMint = async () => {
+ // The mint button is disabled if either of these are undefined
+ if (!smartAccountProvider || !smartAccountAddress) return;
+
+ try {
+ // From a viem `RpcTransactionRequest` (e.g. calling an ERC-721's `mint` method),
+ // build and send a user operation. Gas fees will be sponsored by the Base Paymaster.
+ const userOpHash = await sendSponsoredUserOperation({
+ from: smartAccountAddress,
+ to: NFT_ADDRESS,
+ data: encodeFunctionData({
+ abi: ABI,
+ functionName: 'mint',
+ args: [eoa?.address],
+ }),
+ });
+
+ // Once we have a hash for the user operation, watch it until the transaction has
+ // been confirmed.
+ const transactionHash = await smartAccountProvider.waitForUserOperationTransaction(userOpHash);
+
+ setTransactionLink(
+
+ Successfully minted! Click here to see your transaction.
+ ,
+ );
+ } catch (error) {
+ setTransactionLink(
{'Mint failed with error: ' + error}
);
+ }
+};
+```
+
+Finally, above where you added the addresses, add a button to call the function, and display the link to the transaction:
+
+```tsx
+;
+{
+ transactionLink;
+}
+```
+
+Run it and confirm it works. You need the full transaction receipt for the process to finish, so expect to wait as long as 10 or 15 seconds.
+
+
+For simplicity, we've stripped out the code to disable the button while it is minting. You'll want to implement your own solution to avoid confusing your users!
+
+
+
+#### Calling Another Function
+
+The [Base Paymaster] on Goerli is very permissive. To call another function, all you need to do is to change the `RpcTransactionRequest` in `sendSponsoredUserOperation` to match the address, abi, function name, and arguments of your function on your smart contract.
+
+For example, to call the `claim` function in the Weighted Voting contract we've used in other tutorials, you'd simply need to import the Hardhat-style [artifact] for the contract and use it to call the function:
+
+```tsx
+const userOpHash = await sendSponsoredUserOperation({
+ from: smartAccountAddress,
+ to: weightedVoting.address as `0x${string}`,
+ data: encodeFunctionData({
+ abi: weightedVoting.abi,
+ functionName: 'claim',
+ }),
+});
+```
+
+
+The function in this example can only be called once per address. It will then fail, because one wallet cannot claim more than one batch of tokens.
+
+
+
+## Conclusion
+
+In this article, we've explored the transformative potential of Account Abstraction for the Ethereum ecosystem, highlighting how it enables smart contract accounts to initiate transactions without altering the core protocol. This innovation, coupled with the utilization of Privy for streamlined user onboarding and secure data management, marks a significant advancement towards reducing onboarding friction for onchain applications. Through a practical implementation involving Privy and the [Base Paymaster], we demonstrated how users can perform onchain actions without incurring gas fees, showcasing the adaptability and user-centric benefits of these technologies. This tutorial not only sheds light on the technical workings of Account Abstraction but also illustrates its practical application in enhancing the blockchain user experience.
+
+[ERC-4337]: https://eips.ethereum.org/EIPS/eip-4337
+[ethereum.org]: https://ethereum.org/en/developers/docs/accounts/#key-differences
+[Base Learn]: https://base.org/learn
+[Next.js]: https://nextjs.org/
+[Base Paymaster]: https://github.com/base-org/paymaster
+[Privy]: https://www.privy.io/
+[Alchemy's Account Kit]: https://www.alchemy.com/account-kit
+[Privy]: https://www.privy.io/
+[https://docs.privy.io/guide/frontend/embedded/overview]: https://docs.privy.io/guide/frontend/embedded/overview
+[Alchemy's Account Kit]: https://www.alchemy.com/account-kit
+[Privy's Quick Start]: https://docs.privy.io/guide/quickstart
+[https://github.com/privy-io/create-next-app]: https://github.com/privy-io/create-next-app
+[`PrivyClientConfig`]: https://docs.privy.io/reference/react-auth/modules#privyclientconfig
+[documented here]: https://docs.privy.io/reference/react-auth/interfaces/PrivyInterface
+[securely stored]: https://docs.privy.io/guide/security#user-data-management
+[paymaster example]: https://github.com/privy-io/base-paymaster-example/blob/main/README.md
+[ERC-4337]: https://eips.ethereum.org/EIPS/eip-4337
+[NFT Contract]: https://goerli.basescan.org/address/0x6527e5052de5521fe370ae5ec0afcc6cd5a221de
+[view for the contract itself]: https://goerli.basescan.org/address/0x6527e5052de5521fe370ae5ec0afcc6cd5a221de
+[Base Paymaster]: https://github.com/base-org/paymaster
+[EntryPoint]: https://github.com/eth-infinitism/account-abstraction/releases
+[bundler]: https://www.alchemy.com/overviews/what-is-a-bundler
+[`create-next-app`]: https://github.com/privy-io/create-next-app
+[add an app]: https://dashboard.alchemy.com/apps
+[Account Kit]: https://www.alchemy.com/blog/introducing-account-kit
+[`hooks/SmartAccountContext.tsx`]: https://github.com/privy-io/base-paymaster-example/blob/main/hooks/SmartAccountContext.tsx
+[`user-operations.ts`]: https://github.com/privy-io/base-paymaster-example/blob/main/lib/user-operations.ts
+[`pages/dashboard.tsx`]: https://github.com/privy-io/base-paymaster-example/blob/main/pages/dashboard.tsx
+[artifact]: https://gist.github.com/briandoyle81CB/2c2849b5723058792bece666f0a318cb
+
diff --git a/_pages/cookbook/account-abstraction/gasless-transactions-with-paymaster.mdx b/_pages/cookbook/account-abstraction/gasless-transactions-with-paymaster.mdx
new file mode 100644
index 00000000..565f50de
--- /dev/null
+++ b/_pages/cookbook/account-abstraction/gasless-transactions-with-paymaster.mdx
@@ -0,0 +1,360 @@
+---
+title: "Gasless Transactions on Base using Base Paymaster"
+---
+
+
+Still trying to onboard users to your app? Want to break free from the worries of gas transactions and sponsor them for your users on Base? Look no further!
+
+Base transaction fees are typically less than a penny, but the concept of gas can still be confusing for new users. You can abstract this away and improve your UX by using the **Base Paymaster**. The Paymaster allows you to:
+
+- Batch multi-step transactions
+- Create custom gasless experiences
+- Sponsor up to $10k monthly on mainnet (unlimited on testnet)
+
+> **Note:** If you need an increase in your sponsorship limit, please [reach out on Discord][Discord]!
+
+## Objectives
+
+1. Configure security measures to ensure safe and reliable transactions.
+2. Manage and allocate resources for sponsored transactions.
+3. Subsidize transaction fees for users, enhancing the user experience by making transactions free.
+4. Set up and manage sponsored transactions on various schedules, including weekly, monthly, and daily cadences.
+
+## Prerequisites
+
+This tutorial assumes you have:
+
+1. **A Coinbase Cloud Developer Platform Account**
+ If not, sign up on the [CDP site]. Once you have your account, you can manage projects and utilize tools like the Paymaster.
+
+2. **Familiarity with Smart Accounts and ERC 4337**
+ Smart Accounts are the backbone of advanced transaction patterns (e.g., bundling, sponsorship). If you’re new to ERC 4337, check out external resources like the official [EIP-4337 explainer](https://eips.ethereum.org/EIPS/eip-4337) before starting.
+
+3. **Foundry**
+ Foundry is a development environment, testing framework, and smart contract toolkit for Ethereum. You’ll need it installed locally for generating key pairs and interacting with smart contracts.
+
+> **Testnet vs. Mainnet**
+> If you prefer not to spend real funds, you can switch to **Base Goerli** (testnet). The steps below are conceptually the same. Just select _Base Goerli_ in the Coinbase Developer Platform instead of _Base Mainnet_, and use a contract deployed on Base testnet for your allowlisted methods.
+
+## Set Up a Base Paymaster & Bundler
+
+In this section, you will configure a Paymaster to sponsor payments on behalf of a specific smart contract for a specified amount.
+
+1. **Navigate to the [Coinbase Developer Platform].**
+2. Create or select your project from the upper left corner of the screen.
+3. Click on the **Paymaster** tool from the left navigation.
+4. Go to the **Configuration** tab and copy the **RPC URL** to your clipboard — you’ll need this shortly in your code.
+
+### Screenshots
+
+- **Selecting your project**
+ 
+
+- **Navigating to the Paymaster tool**
+ 
+
+- **Configuration screen**
+ 
+
+### Allowlist a Sponsorable Contract
+
+1. From the Configuration page, ensure **Base Mainnet** (or **Base Goerli** if you’re testing) is selected.
+2. Enable your paymaster by clicking the toggle button.
+3. Click **Add** to add an allowlisted contract.
+4. For this example, add [`0x83bd615eb93eE1336acA53e185b03B54fF4A17e8`][simple NFT contract], and add the function `mintTo(address)`.
+
+
+
+> **Use your own contract**
+> We use a [simple NFT contract][simple NFT contract] on Base mainnet as an example. Feel free to substitute your own.
+
+### Global & Per User Limits
+
+Scroll down to the **Per User Limit** section. You can set:
+
+- **Dollar amount limit** or **number of UserOperations** per user
+- **Limit cycles** that reset daily, weekly, or monthly
+
+For example, you might set:
+
+- `max USD` to `$0.05`
+- `max UserOperation` to `1`
+
+This means **each user** can only have \$0.05 in sponsored gas and **1** user operation before the cycle resets.
+
+> **Limit Cycles**
+> These reset based on the selected cadence (daily, weekly, monthly).
+
+Next, **Set the Global Limit**. For example, set this to `$0.07` so that once the entire paymaster has sponsored \$0.07 worth of gas (across all users), no more sponsorship occurs unless you raise the limit.
+
+
+
+## Test Your Paymaster Policy
+
+Now let’s verify that these policies work. We’ll:
+
+1. Create two local key pairs (or use private keys you own).
+2. Generate two Smart Accounts.
+3. Attempt to sponsor multiple transactions to see your policy in action.
+
+### Installing Foundry
+
+1. Ensure you have **Rust** installed. If not:
+ ```bash [Terminal]
+ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+ ```
+2. Install Foundry:
+ ```bash [Terminal]
+ curl -L https://foundry.paradigm.xyz | bash
+ foundryup
+ ```
+3. Verify it works:
+ ```bash [Terminal]
+ cast --help
+ ```
+ If you see Foundry usage info, you’re good to go!
+
+### Create Your Project & Generate Key Pairs
+
+1. Make a new folder and install dependencies:
+ ```bash [Terminal]
+ mkdir sponsored_transactions
+ cd sponsored_transactions
+ npm init es6
+ npm install permissionless
+ npm install viem
+ touch index.js
+ ```
+2. Generate two key pairs with Foundry:
+ ```bash [Terminal]
+ cast wallet new
+ cast wallet new
+ ```
+ You’ll see something like:
+ ```bash [Terminal]
+ Successfully created new keypair.
+ Address: 0xD440D746...
+ Private key: 0x01c9720c1dfa3c9...
+ ```
+ **Store these private keys somewhere safe** — ideally in a `.env` file.
+
+### Project Structure With Environment Variables
+
+Create a `.env` file in `sponsored_transactions`:
+
+```bash [Terminal]
+PAYMASTER_RPC_URL=https://api.developer.coinbase.com/rpc/v1/base/
+PRIVATE_KEY_1=0x01c9720c1dfa3c9...
+PRIVATE_KEY_2=0xbcd6fbc1dfa3c9...
+```
+
+> **Security**
+> **Never** commit `.env` files to a public repo!
+
+## Example `index.js` (Using Twoslash)
+
+Below is a full example of how you might structure `index.js`.
+We’ll use **twoslash** code blocks (````js twoslash`) to highlight key lines and explanations.
+
+```js twoslash
+// --- index.js ---
+// @noErrors
+
+// 1. Import modules and environment variables
+import 'dotenv/config';
+import { http, createPublicClient, encodeFunctionData } from 'viem';
+import { base } from 'viem/chains';
+import { createSmartAccountClient } from 'permissionless';
+import { privateKeyToSimpleSmartAccount } from 'permissionless/accounts';
+import { createPimlicoPaymasterClient } from 'permissionless/clients/pimlico';
+
+// 2. Retrieve secrets from .env
+// Highlight: environment variables for paymaster, private keys
+const rpcUrl = process.env.PAYMASTER_RPC_URL; // highlight
+const firstPrivateKey = process.env.PRIVATE_KEY_1; // highlight
+const secondPrivateKey = process.env.PRIVATE_KEY_2; // highlight
+
+// 3. Declare Base addresses (entrypoint & factory)
+const baseEntryPoint = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789';
+const baseFactoryAddress = '0x15Ba39375ee2Ab563E8873C8390be6f2E2F50232';
+
+// 4. Create a public client for Base
+const publicClient = createPublicClient({
+ chain: base,
+ transport: http(rpcUrl),
+});
+
+// 5. Setup Paymaster client
+const cloudPaymaster = createPimlicoPaymasterClient({
+ chain: base,
+ transport: http(rpcUrl),
+ entryPoint: baseEntryPoint,
+});
+
+// 6. Create Smart Accounts from the private keys
+async function initSmartAccounts() {
+ const simpleAccount = await privateKeyToSimpleSmartAccount(publicClient, {
+ privateKey: firstPrivateKey,
+ factoryAddress: baseFactoryAddress,
+ entryPoint: baseEntryPoint,
+ });
+
+ const simpleAccount2 = await privateKeyToSimpleSmartAccount(publicClient, {
+ privateKey: secondPrivateKey,
+ factoryAddress: baseFactoryAddress,
+ entryPoint: baseEntryPoint,
+ });
+
+ // 7. Create SmartAccountClient for each
+ const smartAccountClient = createSmartAccountClient({
+ account: simpleAccount,
+ chain: base,
+ bundlerTransport: http(rpcUrl),
+ middleware: {
+ sponsorUserOperation: cloudPaymaster.sponsorUserOperation,
+ },
+ });
+
+ const smartAccountClient2 = createSmartAccountClient({
+ account: simpleAccount2,
+ chain: base,
+ bundlerTransport: http(rpcUrl),
+ middleware: {
+ sponsorUserOperation: cloudPaymaster.sponsorUserOperation,
+ },
+ });
+
+ return { smartAccountClient, smartAccountClient2 };
+}
+
+// 8. ABI for the NFT contract
+const nftAbi = [
+ // ...
+ // truncated for brevity
+];
+
+// 9. Example function to send a transaction from a given SmartAccountClient
+async function sendTransaction(client, recipientAddress) {
+ try {
+ // encode the "mintTo" function call
+ const callData = encodeFunctionData({
+ abi: nftAbi,
+ functionName: 'mintTo',
+ args: [recipientAddress], // highlight: specify who gets the minted NFT
+ });
+
+ const txHash = await client.sendTransaction({
+ account: client.account,
+ to: '0x83bd615eb93eE1336acA53e185b03B54fF4A17e8', // address of the NFT contract
+ data: callData,
+ value: 0n,
+ });
+
+ console.log(`✅ Transaction successfully sponsored for ${client.account.address}`);
+ console.log(`🔍 View on BaseScan: https://basescan.org/tx/${txHash}`);
+ } catch (error) {
+ console.error('Transaction failed:', error);
+ }
+}
+
+// 10. Main flow: init accounts, send transactions
+(async () => {
+ const { smartAccountClient, smartAccountClient2 } = await initSmartAccounts();
+
+ // Send a transaction from the first account
+ await sendTransaction(smartAccountClient, smartAccountClient.account.address);
+
+ // Send a transaction from the second account
+ // For variety, let’s also mint to the second account's own address
+ await sendTransaction(smartAccountClient2, smartAccountClient2.account.address);
+})();
+```
+
+> **Note**:
+>
+> - Run this via `node index.js` from your project root.
+> - If your Paymaster settings are strict (e.g., limit 1 transaction per user), the second time you run the script, you may get a “request denied” error, indicating the policy is working.
+
+## Hitting Policy Limits & Troubleshooting
+
+1. **Per-User Limit**
+ If you see an error like:
+
+ ```json
+ {
+ "code": -32001,
+ "message": "request denied - rejected due to maximum per address transaction count reached"
+ }
+ ```
+
+ That means you’ve hit your **UserOperation** limit for a single account. Return to the [Coinbase Developer Platform] UI to adjust the policy.
+
+2. **Global Limit**
+ If you repeatedly run transactions and eventually see:
+ ```json
+ {
+ "code": -32001,
+ "message": "request denied - rejected due to max global usd spend limit reached"
+ }
+ ```
+ You’ve hit the **global** limit of sponsored gas. Increase it in the CDP dashboard and wait a few minutes for changes to take effect.
+
+## Verifying Token Ownership (Optional)
+
+Want to confirm the token actually minted? You can read the NFT’s `balanceOf` function:
+
+```js
+import { readContract } from 'viem'; // highlight
+
+// example function
+async function checkNftBalance(publicClient, contractAddress, abi, ownerAddress) {
+ const balance = await publicClient.readContract({
+ address: contractAddress,
+ abi,
+ functionName: 'balanceOf',
+ args: [ownerAddress],
+ });
+ console.log(`NFT balance of ${ownerAddress} is now: ${balance}`);
+}
+```
+
+## Conclusion
+
+In this tutorial, you:
+
+- Set up and **configured** a Base Paymaster on the Coinbase Developer Platform.
+- **Allowlisted** a contract and specific function (`mintTo`) for sponsorship.
+- Established **per-user** and **global** sponsorship **limits** to control costs.
+- Demonstrated the **sponsorship flow** with Smart Accounts using `permissionless`, `viem`, and Foundry-generated private keys.
+
+This approach can greatly improve your dApp’s user experience by removing gas friction. For more complex sponsorship schemes (like daily or weekly cycles), simply tweak your per-user and global limit settings in the Coinbase Developer Platform.
+
+> **Next Steps**
+>
+> - Use a [proxy service][proxy service] for better endpoint security.
+> - Deploy your own contracts and allowlist them.
+> - Experiment with bundling multiple calls into a single sponsored transaction.
+
+## References
+
+- [list of factory addresses]
+- [Discord]
+- [CDP site]
+- [Coinbase Developer Platform]
+- [UI]
+- [proxy service]
+- [Paymaster Tool]
+- [Foundry Book installation guide]
+- [simple NFT contract]
+
+[list of factory addresses]: https://docs.alchemy.com/reference/factory-addresses
+[Discord]: https://discord.com/invite/cdp
+[CDP site]: https://portal.cdp.coinbase.com/
+[Coinbase Developer Platform]: https://portal.cdp.coinbase.com/
+[UI]: https://portal.cdp.coinbase.com/products/bundler-and-paymaster
+[proxy service]: https://www.smartwallet.dev/guides/paymasters
+[Paymaster Tool]: https://portal.cdp.coinbase.com/products/bundler-and-paymaster
+[Foundry Book installation guide]: https://book.getfoundry.sh/getting-started/installation
+[simple NFT contract]: https://basescan.org/token/0x83bd615eb93ee1336aca53e185b03b54ff4a17e8
+
+**Happy Building on Base!**
diff --git a/_pages/cookbook/client-side-development/introduction-to-providers.mdx b/_pages/cookbook/client-side-development/introduction-to-providers.mdx
new file mode 100644
index 00000000..54d96343
--- /dev/null
+++ b/_pages/cookbook/client-side-development/introduction-to-providers.mdx
@@ -0,0 +1,297 @@
+---
+title: 'Introduction to Providers'
+slug: /intro-to-providers
+description: A tutorial that teaches what providers are, why you need one, and how to configure several providers and use them to connect to the blockchain.
+author: briandoyle81
+---
+
+# Introduction to Providers
+
+This tutorial provides an introduction to providers and shows you how to connect your frontend to the blockchain using JSON RPC blockchain providers, and the [RainbowKit], [wagmi], and [viem] stack.
+
+## Objectives
+
+By the end of this tutorial, you should be able to:
+
+- Compare and contrast public providers vs. vendor providers vs. wallet providers
+- Select the appropriate provider for several use cases
+- Set up a provider in wagmi and use it to connect a wallet
+- Protect API keys that will be exposed to the front end
+
+## Prerequisites
+
+### 1. Be familiar with modern, frontend web development
+
+In this tutorial, we'll be working with a React frontend built with [Next.js]. While you don't need to be an expert, we'll assume that you're comfortable with the basics.
+
+### 2. Possess a general understanding of the EVM and smart contract development
+
+This tutorial assumes that you're reasonably comfortable writing basic smart contracts. If you're just getting started, jump over to our [Base Learn] guides and start learning!
+
+## Types of Providers
+
+Onchain apps need frontends, sometimes called dApps, to enable your users to interact with your smart contracts. A _provider_ makes the connection from frontend to the blockchain, and is used to read data and send transactions.
+
+In blockchain development, the term _provider_ describes a company or service that provides an API enabling access to the blockchain as a service. This is distinct from the providers you wrap your app in using the [React Context API], though you'll use one of those to pass your blockchain provider deeply into your app.
+
+These services enable interacting with smart contracts without the developer needing to run and maintain their own blockchain node. Running a node is expensive, complicated, and challenging. In most cases, you'll want to start out with a provider. Once you start to get traction, you can evaluate the need to [run your own node], or switch to a more advanced architecture solution, such as utilizing [Subgraph].
+
+Figuring out which type of provider to use can be a little confusing at first. As with everything blockchain, the landscape changes rapidly, and search results often return out-of-date information.
+
+
+New onchain devs sometimes get the impression that there are free options for connecting their apps to the blockchain. Unfortunately, this is not really true. Blockchain data is still 1's and 0's, fetched by computation and served to the internet via servers.
+
+It costs money to run these, and you will eventually need to pay for the service.
+
+
+
+You'll encounter providers divided into three general categories: Public Providers, Wallet Providers, and Vendor Providers
+
+### Public Providers
+
+Many tutorials and guides, including the getting started guide for [wagmi], use a _Public Provider_ as the default to get you up and running. Public means that they're open, permissionless, and free, so the guides will also usually warn you that you need to add another provider if you don't want to run into rate limiting. Listen to these warnings! The rate-limits of public providers are severe, and you'll start getting limited very quickly.
+
+In wagmi, a public client is automatically included in the default config. This client is just a wrapper setting up a [JSON RPC] provider using the `chain` and `rpcUrls` listed in Viem's directory of chain information. You can view the [data for Base Sepolia here].
+
+Most chains will list this information in their docs as well. For example, on the network information pages for [Base] and [Optimism]. If you wanted, you could manually set up a `jsonRpcProvider` in wagmi using this information.
+
+### Wallet Providers
+
+Many wallets, including Coinbase Wallet and MetaMask, inject an Ethereum provider into the browser, as defined in [EIP-1193]. The injected provider is accessible via `window.ethereum`.
+
+Under the hood, these are also just JSON RPC providers. Similar to public providers, they are rate-limited.
+
+Older tutorials for early libraries tended to suggest using this method for getting started, so you'll probably encounter references to it. However, it's fallen out of favor, and you'll want to use the public provider for your initial connection experiments.
+
+### Vendor Providers
+
+A growing number of vendors provide access to blockchain nodes as a service. Visiting the landing pages for [QuickNode], [Alchemy], or [Coinbase Developer Platform (CDP)] can be a little confusing. Each of these vendors provides a wide variety of services, SDKs, and information.
+
+Luckily, you can skip most of this if you're just trying to get your frontend connected to your smart contracts. You'll just need to sign up for an account, and get an endpoint, or a key, and configure your app to connect to the provider(s) you choose.
+
+It is worth digging in to get a better understanding of how these providers charge you for their services. The table below summarizes some of the more important API methods, and how you are charged for them by each of the above providers.
+
+Note that the information below may change, and varies by network. Each provider also has different incentives, discounts, and fees for each level of product. They also have different allowances for calls per second, protocols, and number of endpoints. Please check the source to confirm!
+
+| | [Alchemy Costs] | [QuickNode Costs] | [CDP Costs] |
+| :-------------- | :--------------- | :---------------- | :----------------- |
+| Free Tier / Mo. | 3M compute units | 50M credits | 500M billing units |
+| Mid Tier / Mo. | 1.5B CUs @ $199 | 3B credits @ $299 | Coming soon |
+| eth_blocknumber | 10 | 20 | 30 |
+| eth_call | 26 | 20 | 30 |
+| eth_getlogs | 75 | 20 | 100 |
+| eth_getbalance | 19 | 20 | 30 |
+
+To give you an idea of usage amounts, a single wagmi `useContractRead` hook set to watch for changes on a single `view` via a TanStack query and `useBlockNumber` will call `eth_blocknumber` and `eth_call` one time each, every 4 seconds.
+
+## Connecting to the Blockchain
+
+[RainbowKit] is a popular library that works with [wagmi] to make it easy to connect, disconnect, and change between multiple wallets. It's batteries-included out of the box, and allows for a great deal of customization of the list of wallets and connect/disconnect button.
+
+You'll be using RainbowKit's [quick start] to scaffold a new project for this tutorial. Note that at the time of writing, it does **not** use the Next.js app router. See [Building an Onchain App] if you wish to set this up instead.
+
+
+The script doesn't allow you to use `.` to create a project in the root of the folder you run it from, so you'll want to run it from your `src` directory, or wherever you keep your project folders.
+
+It will create a folder with the project name you give, and create the files inside.
+
+
+
+Open up a terminal and run:
+
+```bash
+yarn create @rainbow-me/rainbowkit
+```
+
+Give your project a name, and wait for the script to build it. It will take a minute or two.
+
+
+If you get an error because you are on the wrong version of node, change to the correct version then **delete everything** and run the script again.
+
+
+
+### Scaffolded App
+
+Open your new project in the editor of your choice, and open `pages/_app.tsx`. Here, you'll find a familiar Next.js app wrapped in [context providers] for the TanStack QueryProvider, RainbowKit, and wagmi.
+
+```tsx
+function MyApp({ Component, pageProps }: AppProps) {
+ return (
+
+
+
+
+
+
+
+ );
+}
+```
+
+Note that these providers are using React's context feature to pass the blockchain providers and configuration into your app. It can be confusing to have the word _provider_ meaning two different things in the same file, or even the same line of code!
+
+Before you can do anything else, you need to obtain a _WalletConnect_ `projectId`.
+
+Open up the [WalletConnect] homepage, and create an account, and/or sign in using the method of your choice.
+
+Click the `Create` button in the upper right of the `Projects` tab.
+
+
+
+Enter a name for your project, select the `App` option, and click `Create`.
+
+
+
+Copy the _Project ID_ from the project information page, and paste it in as the `projectId` in `getDefaultWallets`.
+
+```tsx
+const { connectors } = getDefaultWallets({
+ appName: 'RainbowKit App',
+ projectId: 'YOUR_PROJECT_ID',
+ chains,
+});
+```
+
+
+Remember, anything you put on the frontend is public! That includes this id, even if you use environment variables to better manage this type of data. Next.js reminds you of the risk, by requiring you to prepend `NEXT_PUBLIC_` to any environment variables that can be read by the browser.
+
+Before you deploy, make sure you configure the rest of the items in the control panel to ensure only your site can use this id.
+
+
+
+### Public Provider
+
+By default, the setup script will configure your app to use the built-in public provider, and connect to a number of popular chains. To simply matters, remove all but `mainnet` and `base`.
+
+```tsx
+const config = getDefaultConfig({
+ appName: 'RainbowKit App',
+ projectId: 'YOUR_APP_ID_HERE',
+ chains: [mainnet, base],
+ ssr: true,
+});
+```
+
+Open the terminal and start the app with:
+
+```bash
+yarn run dev
+```
+
+Click the `Connect Wallet` button, select your wallet from the modal, approve the connection, and you should see your network, token balance, and address or ENS name at the top of the screen. Select your wallet from the modal.
+
+
+
+You've connected with the Public Provider!
+
+
+
+### QuickNode
+
+To select your provider(s), you'll use [`createConfig`] instead of `getDefaultConfig`. The [`transports`] property allows you to configure how you wish to connect with multiple networks. If you need more than one connector for a given network, you can use [`fallbacks`].
+
+First, set up using [QuickNode] as your provider. Replace your import of the default config from RainbowKit with `createConfig` and `http` from wagmi:
+
+```tsx
+import { createConfig, http, WagmiProvider } from 'wagmi';
+// ...Chains import
+import { RainbowKitProvider } from '@rainbow-me/rainbowkit';
+```
+
+You'll need an RPC URL, so open up [QuickNode]'s site and sign up for an account if you need to. The free tier will be adequate for now, you may need to scroll down to see it. Once you're in, click `Endpoints` on the left side, then click `+ Create Endpoint`.
+
+On the next screen, you'll be asked to select a chain. Each endpoint only works for one. Select `Base`, click `Continue`.
+
+
+
+For now, pick `Base Mainnet`, but you'll probably want to delete this endpoint and create a new one for Sepolia when you start building. The free tier only allows you to have one at a time.
+
+If you haven't already picked a tier, you'll be asked to do so, then you'll be taken to the endpoints page, which will display your endpoints for HTTP and WSS.
+
+
+As with your WalletConnect Id, these endpoints will be visible on the frontend. Be sure to configure the allowlist!
+
+
+
+Use this endpoint to add an `http` `transport` to your config:
+
+```tsx
+const config = createConfig({
+ chains: [mainnet, base],
+ ssr: true,
+ transports: {
+ [base.id]: http('YOUR PROJECT URL'),
+ [mainnet.id]: http('TODO'),
+ },
+});
+```
+
+Now, the app will use your QuickNode endpoint for the Base network. Note that you don't need an app name or WalletConnect Id, because you are no longer using WalletConnect.
+
+To test this out, switch networks a few times. You'll know it's working if you see your balance when Base is the selected network. You haven't added mainnet, so you'll get an error in the console and no balance when you switch to that.
+
+### Alchemy
+
+[Alchemy] is [no longer baked into wagmi], but it still works the same as any other RPC provider. As with QuickNode, you'll need an account and a key. Create an account and/or sign in, navigate to the `Apps` section in the left sidebar, and click `Create new app`.
+
+
+
+Select Base Mainnet, and give your app a name.
+
+
+Once again, remember to configure the [allowlist] when you publish your app, as you'll be exposing your key to the world!
+
+
+
+On the dashboard for your new app, click the `API key` button, and copy the **HTTPS** link to the clipboard. Replace your todo with this link:
+
+```tsx
+const config = createConfig({
+ chains: [mainnet, base],
+ ssr: true,
+ transports: {
+ [base.id]: http('YOUR PROJECT URL'),
+ [mainnet.id]: http('ALCHEMY HTTP URL'),
+ },
+});
+```
+
+As before, you can confirm the Alchemy Provider is working by running the app and changing the network. You should now no longer get an error and should be able to see your balance for Ethereum mainnet.
+
+## Conclusion
+
+In this tutorial, you've learned how Providers supply blockchain connection as a service, eliminating the need for developers to run and maintain their own nodes. You also learned how to connect your app to the blockchain using several different providers, including the public provider(s).
+
+[Base Learn]: https://docs.base.org/learn/welcome
+[Next.js]: https://nextjs.org/
+[RainbowKit]: https://rainbowkit.com/
+[wagmi]: https://wagmi.sh/
+[viem]: https://viem.sh/
+[wagmi]: https://wagmi.sh
+[quick start]: https://www.rainbowkit.com/docs/installation
+[context providers]: https://react.dev/learn/passing-data-deeply-with-context
+[WalletConnect]: https://cloud.reown.com/
+[JSON RPC provider]: https://wagmi.sh/react/providers/jsonRpc
+[Alchemy]: https://www.alchemy.com/
+[QuickNode]: https://www.quicknode.com/
+[allowlist]: https://docs.alchemy.com/docs/how-to-add-allowlists-to-your-apps-for-enhanced-security
+[smart contract development]: https://base.org/learn
+[Subgraph]: https://thegraph.com/docs/en/developing/creating-a-subgraph/
+[data for Base Sepolia here]: https://github.com/wagmi-dev/viem/blob/main/src/chains/definitions/baseSepolia.ts
+[Base]: https://docs.base.org/chain/network-information
+[Optimism]: https://docs.optimism.io/chain/networks
+[EIP-1193]: https://eips.ethereum.org/EIPS/eip-1193
+[QuickNode]: https://www.quicknode.com/
+[Alchemy Costs]: https://docs.alchemy.com/reference/compute-unit-costs
+[QuickNode Costs]: https://www.quicknode.com/api-credits/base
+[Coinbase Developer Platform (CDP)]: https://portal.cdp.coinbase.com/
+[CDP Costs]: https://portal.cdp.coinbase.com/products/base
+[smart contract development]: https://base.org/camp
+[run your own node]: https://docs.base.org/guides/run-a-base-node
+[React Context API]: https://react.dev/learn/passing-data-deeply-with-context
+[Building an Onchain App]: https://docs.base.org/learn/frontend-setup/building-an-onchain-app
+[`createConfig`]: https://wagmi.sh/react/api/createConfig
+[`transports`]: https://wagmi.sh/react/api/transports
+[`fallback`]: https://wagmi.sh/core/api/transports/fallback
+[no longer baked into wagmi]: https://wagmi.sh/react/guides/migrate-from-v1-to-v2#removed-wagmi-providers-entrypoints
+
diff --git a/docs/pages/cookbook/client-side-development/viem.mdx b/_pages/cookbook/client-side-development/viem.mdx
similarity index 98%
rename from docs/pages/cookbook/client-side-development/viem.mdx
rename to _pages/cookbook/client-side-development/viem.mdx
index bb320f1e..46420341 100644
--- a/docs/pages/cookbook/client-side-development/viem.mdx
+++ b/_pages/cookbook/client-side-development/viem.mdx
@@ -6,11 +6,10 @@ description: Documentation for using Viem, a TypeScript interface for EVM-compat
# viem
-:::info
-
+
Viem is currently only available on Base Sepolia testnet.
+
-:::
[viem](https://viem.sh/) a TypeScript interface for Ethereum that provides low-level stateless primitives for interacting with Ethereum.
@@ -38,13 +37,12 @@ const client = createPublicClient({
});
```
-:::info
-
+
To use Base, you must specify `base` as the chain when creating a Client.
To use Base Sepolia (testnet), replace `base` with `baseSepolia`.
+
-:::
## Reading data from the blockchain
@@ -80,13 +78,12 @@ const client = createWalletClient({
client.sendTransaction({ ... })
```
-:::info
-
+
In addition to making a JSON-RPC request (`eth_requestAccounts`) to get an Account, viem provides various helper methods for creating an `Account`, including: [`privateKeyToAccount`](https://viem.sh/docs/accounts/privateKey.html), [`mnemonicToAccount`](https://viem.sh/docs/accounts/mnemonic.html), and [`hdKeyToAccount`](https://viem.sh/docs/accounts/hd.html).
To use Base Sepolia (testnet), replace `base` with `baseSepolia`.
+
-:::
## Interacting with smart contracts
@@ -108,9 +105,8 @@ const contract = getContract({
const result = await contract.read.totalSupply();
```
-:::info
-
+
`CONTRACT_ADDRESS` is the address of the deployed contract.
+
-:::
diff --git a/_pages/cookbook/client-side-development/web3.mdx b/_pages/cookbook/client-side-development/web3.mdx
new file mode 100644
index 00000000..84278142
--- /dev/null
+++ b/_pages/cookbook/client-side-development/web3.mdx
@@ -0,0 +1,112 @@
+---
+title: web3.js
+description: Documentation for using web3.js, a JavaScript library for interacting with EVM-compatible blockchains. This page covers installation, setup, connecting to the Base network and interacting with smart contracts.
+---
+
+# web3.js
+
+[web3.js](https://web3js.org/) is a JavaScript library that allows developers to interact with EVM-compatible blockchain networks.
+
+You can use web3.js to interact with smart contracts deployed on the Base network.
+
+## Install
+
+To install web3.js run the following command:
+
+```bash
+npm install web3
+```
+
+## Setup
+
+Before you can start using web3.js, you need to import it into your project.
+
+Add the following line of code to the top of your file to import web3.js:
+
+```javascript
+//web3.js v1
+const Web3 = require('web3');
+
+//web3.js v4
+const { Web3 } = require('web3');
+```
+
+## Connecting to Base
+
+You can connect to Base by instantiating a new web3.js `Web3` object with a RPC URL of the Base network:
+
+```javascript
+const { Web3 } = require('web3');
+
+const web3 = new Web3('https://mainnet.base.org');
+```
+
+
+To alternatively connect to Base Sepolia (testnet), change the above URL from `https://mainnet.base.org` to `https://sepolia.base.org`.
+
+
+
+## Accessing data
+
+Once you have created a provider, you can use it to read data from the Base network.
+
+For example, you can use the `getBlockNumber` method to get the latest block:
+
+```javascript
+async function getLatestBlock(address) {
+ const latestBlock = await web3.eth.getBlockNumber();
+ console.log(latestBlock.toString());
+}
+```
+
+## Deploying contracts
+
+Before you can deploy a contract to the Base network using web3.js, you must first create an account.
+
+You can create an account by using `web3.eth.accounts`:
+
+```javascript
+const privateKey = "PRIVATE_KEY";
+const account = web3.eth.accounts.privateKeyToAccount(privateKey);
+```
+
+
+`PRIVATE_KEY` is the private key of the wallet to use when creating the account.
+
+
+
+## Interacting with smart contracts
+
+You can use web3.js to interact with a smart contract on Base by instantiating a `Contract` object using the ABI and address of a deployed contract:
+
+```javascript
+const abi = [
+... // ABI of deployed contract
+];
+
+const contractAddress = "CONTRACT_ADDRESS"
+
+const contract = new web3.eth.Contract(abi, contractAddress);
+```
+
+Once you have created a `Contract` object, you can use it to call desired methods on the smart contract:
+
+```javascript
+async function setValue(value) {
+ // write query
+ const tx = await contract.methods.set(value).send();
+ console.log(tx.transactionHash);
+}
+
+async function getValue() {
+ // read query
+ const value = await contract.methods.get().call();
+ console.log(value.toString());
+}
+```
+
+
+For more information on deploying contracts on Base, see [Deploying a Smart Contract](../smart-contract-development/hardhat/deploy-with-hardhat).
+
+
+
diff --git a/docs/pages/cookbook/cross-chain/bridge-tokens-with-layerzero.mdx b/_pages/cookbook/cross-chain/bridge-tokens-with-layerzero.mdx
similarity index 99%
rename from docs/pages/cookbook/cross-chain/bridge-tokens-with-layerzero.mdx
rename to _pages/cookbook/cross-chain/bridge-tokens-with-layerzero.mdx
index 13d0271c..4ede6628 100644
--- a/docs/pages/cookbook/cross-chain/bridge-tokens-with-layerzero.mdx
+++ b/_pages/cookbook/cross-chain/bridge-tokens-with-layerzero.mdx
@@ -91,11 +91,10 @@ This will create a Foundry project with the following basic layout:
└── test
```
-:::info
-
+
You can delete the `src/Counter.sol`, `test/Counter.t.sol`, and `script/Counter.s.sol` boilerplate files that were generated with the project, as you will not be needing them.
+
-:::
## Installing the LayerZero smart contracts
@@ -144,11 +143,10 @@ abstract contract OApp is OAppSender, OAppReceiver {
}
```
-:::info
-
+
You can view the source code for this contract on [GitHub](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oapp/OApp.sol).
+
-:::
To get started using LayerZero, developers simply need to inherit from the [OApp](https://github.com/LayerZero-Labs/LayerZero-v2/blob/main/packages/layerzero-v2/evm/oapp/contracts/oapp/OApp.sol) contract, and implement the following two inherited functions:
@@ -157,17 +155,15 @@ To get started using LayerZero, developers simply need to inherit from the [OApp
In this tutorial, you will be implementing the [OApp](https://docs.layerzero.network/contracts/oapp) standard into your own project to add the capability to send messages from a smart contract on Base to a smart contract on Optimism.
-:::info
-
+
An extension of the [OApp](https://docs.layerzero.network/contracts/oapp) contract standard known as [OFT](https://docs.layerzero.network/contracts/oft) is also available for supporting omnichain fungible token transfers.
+
-:::
-
-:::info
+
For more information on transferring tokens across chains using LayerZero, visit the [LayerZero documentation](https://docs.layerzero.network/contracts/oft).
+
-:::
## Writing the smart contract
@@ -191,11 +187,10 @@ The contract's constructor expects two arguments:
- `_endpoint`: The [LayerZero Endpoint](https://docs.layerzero.network/explore/layerzero-endpoint) `address` for the chain the smart contract is deployed to.
- `_owner`: The `address` of the owner of the smart contract.
-:::info
-
+
[LayerZero Endpoints](https://docs.layerzero.network/explore/layerzero-endpoint) are smart contracts that expose an interface for OApp contracts to manage security configurations and send and receive messages via the LayerZero protocol.
+
-:::
### Implementing message sending (`_lzSend`)
@@ -267,11 +262,10 @@ The `estimateFee` function above calls the inherited `_quote` function, while pa
| `_options` | `bytes` | [Additional options](https://docs.layerzero.network/contracts/options) when sending the message, such as how much gas should be used when receiving the message. |
| `_payInLzToken` | `bool` | Boolean flag for which token to use when returning the fee (native or ZRO token). |
-:::info
-
+
Your contract's `estimateFee` function should always be called immediately before calling `sendMessage` to accurately estimate associated gas fees.
+
-:::
### Implementing message receiving (`_lzReceive`)
@@ -325,11 +319,10 @@ contract ExampleContract is OApp {
}
```
-:::info
-
+
Overriding the `_lzReceive` function allows you to provide any custom logic you wish when receiving messages, including making a call back to the source chain by invoking `_lzSend`. Visit the LayerZero [Message Design Patterns](https://docs.layerzero.network/contracts/message-design-patterns) for common messaging flows.
+
-:::
### Final code
@@ -423,11 +416,10 @@ cast wallet import deployer --interactive
After running the command above, you will be prompted to enter your private key, as well as a password for signing transactions.
-:::caution
-
+
For instructions on how to get your private key from Coinbase Wallet, visit the [Coinbase Wallet documentation](https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings#show-private-key). **It is critical that you do NOT commit this to a public repo**.
+
-:::
To confirm that the wallet was imported as the `deployer` account in your Foundry project, run:
@@ -461,13 +453,12 @@ With your contract compiled and environment setup, you are now ready to deploy t
To deploy a smart contract using Foundry, you can use the `forge create` command. The command requires you to specify the smart contract you want to deploy, an RPC URL of the network you want to deploy to, and the account you want to deploy with.
-:::info
-
+
Your wallet must be funded with ETH on the Base Goerli and Optimism Goerli to cover the gas fees associated with the smart contract deployment. Otherwise, the deployment will fail.
To get testnet ETH, see the [prerequisites](#prerequisites).
+
-:::
To deploy the `ExampleContract` smart contract to the Base Goerli testnet, run the following command:
@@ -514,11 +505,10 @@ To set the peer of the Base Goerli contract to the Optimism Goerli contract, run
cast send --rpc-url $BASE_GOERLI_RPC "setPeer(uint32, bytes32)" $OPTIMISM_GOERLI_LZ_ENDPOINT_ID --account deployer
```
-:::info
-
+
Replace `` with the contract address of your deployed `ExampleContract` contract on Base Goerli, and`` with the contract address (as bytes) of your deployed `ExampleContract` contract on Optimism Goerli before running the provided `cast` command.
+
-:::
To set the peer of the Optimism Goerli contract to the Base Goerli contract, run the following command:
@@ -526,11 +516,10 @@ To set the peer of the Optimism Goerli contract to the Base Goerli contract, run
cast send --rpc-url $OPTIMISM_GOERLI_RPC "setPeer(uint32, bytes32)" $BASE_GOERLI_LZ_ENDPOINT_ID --account deployer
```
-:::info
-
+
Replace `` with the contract address of your deployed `ExampleContract` contract on Optimism Goerli, and`` with the contract address (as bytes) of your deployed `ExampleContract` contract on Base Goerli before running the provided `cast` command.
+
-:::
## Sending messages
@@ -578,11 +567,10 @@ The output of this script results in:
For this tutorial, rather than building and generating your own message options, you can use the bytes output provided above.
-:::info
-
+
Covering all of the different message options in detail is out of scope for this tutorial. If you are interested in learning more about the different message options and how to build them, visit the [LayerZero developer documentation](https://docs.layerzero.network/contracts/options).
+
-:::
### Estimating the gas fee
@@ -594,11 +582,10 @@ To estimate the gas fee for sending a message from Base Goerli to Optimism Goerl
cast send --rpc-url $BASE_GOERLI_RPC "estimateFee(uint32, string, bytes)" $OPTIMISM_GOERLI_LZ_ENDPOINT_ID "Hello World" 0x00030100110100000000000000000000000000030d40 --account deployer
```
-:::info
-
+
Replace `` with the contract address of your deployed `ExampleContract` contract on Base Goerli before running the provided `cast` command.
+
-:::
The command above calls `estimateFee(uint32, string, bytes, bool)`, while providing the required arguments, including: the endpoint ID of the destination chain, the text to send, and the message options (generated in the last section).
@@ -612,11 +599,10 @@ For example, to send a message from Base Goerli to Optimism Goerli with an estim
cast send --rpc-url $BASE_GOERLI_RPC --value "sendMessage(uint32, string, bytes)" $OPTIMISM_GOERLI_LZ_ENDPOINT_ID "Hello World" 0x00030100110100000000000000000000000000030d40 --account deployer
```
-:::info
-
+
Replace `` with the contract address of your deployed `ExampleContract` contract on Base Goerli, and `` with the gas estimate (in wei) returned by the call to estimateFee, before running the provided `cast` command.
+
-:::
You can view the status of your cross-chain transaction on [LayerZero Scan](https://layerzeroscan.com/).
diff --git a/_pages/cookbook/cross-chain/send-messages-and-tokens-from-base-chainlink.mdx b/_pages/cookbook/cross-chain/send-messages-and-tokens-from-base-chainlink.mdx
new file mode 100644
index 00000000..b6331f72
--- /dev/null
+++ b/_pages/cookbook/cross-chain/send-messages-and-tokens-from-base-chainlink.mdx
@@ -0,0 +1,612 @@
+---
+title: Sending messages and tokens from Base to other chains using Chainlink CCIP
+description: A tutorial that teaches how to use Chainlink CCIP to perform cross-chain messaging and token transfers from Base Goerli testnet to Optimism Goerli testnet.
+authors:
+ - taycaldwell
+tags: ['cross-chain']
+difficulty: intermediate
+---
+
+import { Danger } from "/snippets/danger.mdx";
+
+# Sending messages and tokens from Base to other chains using Chainlink CCIP
+
+This tutorial will guide you through the process of sending messages and tokens from a Base smart contract to another smart contract on a different chain using Chainlink's Cross-chain Interoperability Protocol (CCIP).
+
+## Objectives
+
+By the end of this tutorial you should be able to do the following:
+
+- Set up a smart contract project for Base using Foundry
+- Install Chainlink CCIP as a dependency
+- Use Chainlink CCIP within your smart contract to send messages and/or tokens to contracts on other different chains
+- Deploy and test your smart contracts on Base testnet
+
+
+Chainlink CCIP is in an "Early Access" development stage, meaning some of the functionality described within this tutorial is under development and may change in later versions.
+
+
+
+## Prerequisites
+
+### Foundry
+
+This tutorial requires you to have Foundry installed.
+
+- From the command-line (terminal), run: `curl -L https://foundry.paradigm.xyz | bash`
+- Then run `foundryup`, to install the latest (nightly) build of Foundry
+
+For more information, see the Foundry Book [installation guide](https://book.getfoundry.sh/getting-started/installation).
+
+### Coinbase Wallet
+
+In order to deploy a smart contract, you will first need a wallet. You can create a wallet by downloading the Coinbase Wallet browser extension.
+
+- Download [Coinbase Wallet](https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad?hl=en)
+
+### Wallet funds
+
+For this tutorial you will need to fund your wallet with both ETH and LINK on Base Goerli and Optimism Goerli.
+
+The ETH is required for covering gas fees associated with deploying smart contracts to the blockchain, and the LINK token is required to pay for associated fees when using CCIP.
+
+- To fund your wallet with ETH on Base Goerli, visit a faucet listed on the [Base Faucets](https://docs.base.org/tools/network-faucets) page.
+- To fund your wallet with ETH on Optimism Goerli, visit a faucet listed on the [Optimism Faucets](https://docs.optimism.io/builders/tools/faucets) page.
+- To fund your wallet with LINK, visit the [Chainlink Faucet](https://faucets.chain.link/base-testnet).
+
+
+If you are interested in building on Mainnet, you will need to [apply for Chainlink CCIP mainnet access](https://chainlinkcommunity.typeform.com/ccip-form?#ref_id=ccip_docs).
+
+
+
+---
+
+## What is Chainlink CCIP?
+
+Chainlink CCIP (Cross-chain Interoperability Protocol) provides a solution for sending message data and transferring tokens across different chains.
+
+The primary way for users to interface with Chainlink CCIP is through smart contracts known as [Routers](https://docs.chain.link/ccip/architecture#router). A Router contract is responsible for initiating cross-chain interactions.
+
+Users can interact with [Routers](https://docs.chain.link/ccip/architecture#router) to perform the following cross-chain capabilities:
+
+| Capability | Description | Supported receivers |
+| :--------------------------- | :------------------------------------------------------------------------------------------- | :---------------------- |
+| Arbitrary messaging | Send arbitrary (encoded) data from one chain to another. | Smart contracts only |
+| Token transfers | Send tokens from one chain to another. | Smart contracts or EOAs |
+| Programmable token transfers | Send tokens and arbitrary (encoded) data from one chain to another, in a single transaction. | Smart contracts only |
+
+
+Externally owned accounts (EOAs) on EVM blockchains are unable to receive message data, because of this, only smart contracts are supported as receivers when sending arbitrary messages or programmable token transfers. Any attempt to send a programmable token transfer (data and tokens) to an EOA, will result in only the tokens being received.
+
+
+
+### High-level concepts
+
+Although [Routers](https://docs.chain.link/ccip/architecture#router) are the primary interface users will interact with when using CCIP, this section will cover what happens after instructions for a cross-chain interaction are sent to a Router.
+
+#### OnRamps
+
+Once a Router receives an instruction for a cross-chain interaction, it passes it on to another contract known as an [OnRamp](https://docs.chain.link/ccip/architecture#onramp). OnRamps are responsible for a variety of tasks, including: verifying message size and gas limits, preserving the sequencing of messages, managing any fee payments, and interacting with the [token pool](https://docs.chain.link/ccip/architecture#token-pools) to `lock` or `burn` tokens if a token transfer is being made.
+
+#### OffRamps
+
+The destination chain will have a contract known as an [OffRamp](https://docs.chain.link/ccip/architecture#offramp). OffRamps are responsible for a variety of tasks, including: ensuring the authenticity of a message, making sure each transaction is only executed once, and transmitting received messages to the Router contract on the destination chain.
+
+#### Token pools
+
+A [token pool](https://docs.chain.link/ccip/architecture#token-pools) is an abstraction layer over ERC-20 tokens that facilitates OnRamp and OffRamp token-related operations. They are configured to use either a `Lock and Unlock` or `Burn and Mint` mechanism, depending on the type of token.
+
+For example, because blockchain-native gas tokens (i.e. ETH, MATIC, AVAX) can only be minted on their native chains, a `Lock and Mint` mechanism must be used. This mechanism locks the token at the source chain, and mints a synthetic asset on the destination chain.
+
+In contrast, tokens that can be minted on multiple chains (i.e. USDC, USDT, FRAX, etc.), token pools can use a `Burn and Mint` mechanism, where the token is burnt on the source chain and minted on the destination chain.
+
+#### Risk Management Network
+
+Between instructions for a cross-chain interaction making its way from an OnRamp on the source chain to an OffRamp on the destination chain, it will pass through the [Risk Management Network](https://docs.chain.link/ccip/concepts#risk-management-network).
+
+The Risk Management Network is a secondary validation service built using a variety of offchain and onchain components, with the responsibilities of monitoring all chains against abnormal activities.
+
+
+A deep-dive on the technical details of each of these components is too much to cover in this tutorial, but if interested you can learn more by visiting the [Chainlink documentation](https://docs.chain.link/ccip/architecture).
+
+
+
+## Creating a project
+
+Before you begin, you need to set up your smart contract development environment. You can setup a development environment using tools like [Hardhat](../smart-contract-development/hardhat/deploy-with-hardhat) or [Foundry](../smart-contract-development/foundry/deploy-with-foundry). For this tutorial you will use Foundry.
+
+To create a new Foundry project, first create a new directory:
+
+```bash
+mkdir myproject
+```
+
+Then run:
+
+```bash
+cd myproject
+forge init
+```
+
+This will create a Foundry project with the following basic layout:
+
+```bash
+.
+├── foundry.toml
+├── script
+├── src
+└── test
+```
+
+
+You can delete the `src/Counter.sol`, `test/Counter.t.sol`, and `script/Counter.s.sol` boilerplate files that were generated with the project, as you will not be needing them.
+
+
+
+## Installing Chainlink smart contracts
+
+To use Chainlink CCIP within your Foundry project, you need to install Chainlink CCIP smart contracts as a project dependency using `forge install`.
+
+To install Chainlink CCIP smart contracts, run:
+
+```bash
+forge install smartcontractkit/ccip --no-commit
+```
+
+Once installed, update your `foundry.toml` file by appending the following line:
+
+```bash
+remappings = ['@chainlink/contracts-ccip/=lib/ccip/contracts']
+```
+
+## Writing the smart contracts
+
+The most basic use case for Chainlink CCIP is to send data and/or tokens between smart contracts on different blockchains.
+
+To accomplish this, in this tutorial, you will need to create two separate smart contracts:
+
+- `Sender` contract: A smart contract that interacts with CCIP to send data and tokens.
+- `Receiver` contract: A smart contract that interacts with CCIP to receive data and tokens.
+
+### Creating a Sender contract
+
+The code snippet below is for a basic smart contract that uses CCIP to send data:
+
+```solidity
+pragma solidity ^0.8.0;
+
+import {IRouterClient} from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol";
+import {OwnerIsCreator} from "@chainlink/contracts-ccip/src/v0.8/shared/access/OwnerIsCreator.sol";
+import {Client} from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol";
+import {IERC20} from "@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
+
+contract Sender is OwnerIsCreator {
+
+ IRouterClient private router;
+ IERC20 private linkToken;
+
+ /// @notice Initializes the contract with the router and LINK token address.
+ /// @param _router The address of the router contract.
+ /// @param _link The address of the link contract.
+ constructor(address _router, address _link) {
+ router = IRouterClient(_router);
+ linkToken = IERC20(_link);
+ }
+
+ /// @notice Sends data to receiver on the destination chain.
+ /// @param destinationChainSelector The identifier (aka selector) for the destination blockchain.
+ /// @param receiver The address of the recipient on the destination blockchain.
+ /// @param text The string text to be sent.
+ /// @return messageId The ID of the message that was sent.
+ function sendMessage(
+ uint64 destinationChainSelector,
+ address receiver,
+ string calldata text
+ ) external onlyOwner returns (bytes32 messageId) {
+ Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
+ receiver: abi.encode(receiver), // Encode receiver address
+ data: abi.encode(text), // Encode text to send
+ tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array indicating no tokens are being sent
+ extraArgs: Client._argsToBytes(
+ Client.EVMExtraArgsV1({gasLimit: 200_000}) // Set gas limit
+ ),
+ feeToken: address(linkToken) // Set the LINK as the feeToken address
+ });
+
+ // Get the fee required to send the message
+ uint256 fees = router.getFee(
+ destinationChainSelector,
+ message
+ );
+
+ // Revert if contract does not have enough LINK tokens for sending a message
+ require(linkToken.balanceOf(address(this)) > fees, "Not enough LINK balance");
+
+ // Approve the Router to transfer LINK tokens on contract's behalf in order to pay for fees in LINK
+ linkToken.approve(address(router), fees);
+
+ // Send the message through the router
+ messageId = router.ccipSend(destinationChainSelector, message);
+
+ // Return the messageId
+ return messageId;
+ }
+}
+```
+
+Create a new file under your project's `src/` directory named `Sender.sol` and copy the code above into the file.
+
+#### Code walkthrough
+
+The sections below provide a detailed explanation for the code for the `Sender` contract provided above.
+
+##### Initializing the contract
+
+In order to send data using CCIP, the `Sender` contract will need access to the following dependencies:
+
+1. **The `Router` contract**: This contract serves as the primary interface when using CCIP to send and receive messages and tokens.
+2. **The fee token contract**: This contract serves as the contract for the token that will be used to pay fees when sending messages and tokens. For this tutorial, the contract address for LINK token is used.
+
+The `Router` contract address and LINK token address are passed in as parameters to the contract's constructor and stored as member variables for later for sending messages and paying any associated fees.
+
+```solidity
+contract Sender is OwnerIsCreator {
+
+ IRouterClient private router;
+ IERC20 private linkToken;
+
+ /// @notice Initializes the contract with the router and LINK token address.
+ /// @param _router The address of the router contract.
+ /// @param _link The address of the link contract.
+ constructor(address _router, address _link) {
+ router = IRouterClient(_router);
+ linkToken = IERC20(_link);
+ }
+```
+
+The `Router` contract provides two important methods that can be used when sending messages using CCIP:
+
+- `getFee`: Given a chain selector and message, returns the fee amount required to send the message.
+- `ccipSend`: Given a chain selector and message, sends the message through the router and returns an associated message ID.
+
+The next section describes how these methods are utilized to send a message to another chain.
+
+##### Sending a message
+
+The `Sender` contract defines a custom method named `sendMessage` that utilizes the methods described above in order to:
+
+1. Construct a message using the `EVM2AnyMessage` method provided by the `Client` CCIP library, using the following data:
+ 1. `receiver`: The receiver contract address (encoded).
+ 1. `data`: The text data to send with the message (encoded).
+ 1. `tokenAmounts`: The amount of tokens to send with the message. For sending just an arbitrary message this field is defined as an empty array (`new Client.EVMTokenAmount[](0)`), indicating that no tokens will be sent.
+ 1. `extraArgs`: Extra arguments associated with the message, such as `gasLimit`.
+ 1. `feeToken`: The `address` of the token to be used for paying fees.
+1. Get the fees required to send the message using the `getFee` method provided by the `Router` contract.
+1. Check that the contract holds an adequate amount of tokens to cover the fee. If not, revert the transaction.
+1. Approve the `Router` contract to transfer tokens on the `Sender` contracts behalf in order to cover the fees.
+1. Send the message to a specified chain using the `Router` contract's `ccipSend` method.
+1. Return a unique ID associated with the sent message.
+
+```solidity
+/// @param receiver The address of the recipient on the destination blockchain.
+/// @param text The string text to be sent.
+/// @return messageId The ID of the message that was sent.
+function sendMessage(
+ uint64 destinationChainSelector,
+ address receiver,
+ string calldata text
+) external onlyOwner returns (bytes32 messageId) {
+ Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
+ receiver: abi.encode(receiver), // Encode receiver address
+ data: abi.encode(text), // Encode text to send
+ tokenAmounts: new Client.EVMTokenAmount[](0), // Empty array indicating no tokens are being sent
+ extraArgs: Client._argsToBytes(
+ Client.EVMExtraArgsV1({gasLimit: 200_000}) // Set gas limit
+ ),
+ feeToken: address(linkToken) // Set the LINK as the feeToken address
+ });
+
+ // Get the fee required to send the message
+ uint256 fees = router.getFee(
+ destinationChainSelector,
+ message
+ );
+
+ // Revert if contract does not have enough LINK tokens for sending a message
+ require(linkToken.balanceOf(address(this)) > fees, "Not enough LINK balance");
+
+ // Approve the Router to transfer LINK tokens on contract's behalf in order to pay for fees in LINK
+ linkToken.approve(address(router), fees);
+ // Send the message through the router
+ messageId = router.ccipSend(destinationChainSelector, message);
+
+ // Return the messageId
+ return messageId;
+}
+```
+
+### Creating a Receiver contract
+
+The code snippet below is for a basic smart contract that uses CCIP to receive data:
+
+```solidity
+pragma solidity ^0.8.0;
+
+import {Client} from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol";
+import {CCIPReceiver} from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol";
+
+contract Receiver is CCIPReceiver {
+
+ bytes32 private _messageId;
+ string private _text;
+
+ /// @notice Constructor - Initializes the contract with the router address.
+ /// @param router The address of the router contract.
+ constructor(address router) CCIPReceiver(router) {}
+
+ /// @notice Handle a received message
+ /// @param message The cross-chain message being received.
+ function _ccipReceive(
+ Client.Any2EVMMessage memory message
+ ) internal override {
+ _messageId = message.messageId; // Store the messageId
+ _text = abi.decode(message.data, (string)); // Decode and store the message text
+ }
+
+ /// @notice Gets the last received message.
+ /// @return messageId The ID of the last received message.
+ /// @return text The last received text.
+ function getMessage()
+ external
+ view
+ returns (bytes32 messageId, string memory text)
+ {
+ return (_messageId, _text);
+ }
+}
+```
+
+Create a new file under your project's `src/` directory named `Receiver.sol` and copy the code above into the file.
+
+#### Code walkthrough
+
+The sections below provide a detailed explanation for the code for the `Receiver` contract provided above.
+
+##### Initializing the contract
+
+In order to receive data using CCIP, the `Receiver` contract will need to extend to the`CCIPReceiver` interface. Extending this interface allows the `Receiver` contract to initialize the contract with the router address from the constructor, as seen below:
+
+```solidity
+import {CCIPReceiver} from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol";
+
+contract Receiver is CCIPReceiver {
+
+ /// @notice Constructor - Initializes the contract with the router address.
+ /// @param router The address of the router contract.
+ constructor(address router) CCIPReceiver(router) {}
+}
+```
+
+##### Receiving a message
+
+Extending the `CCIPReceiver` interface also allows the `Receiver` contract to override the `_ccipReceive` handler method for when a message is received and define custom logic.
+
+```solidity
+/// @notice Handle a received message
+/// @param message The cross-chain message being received.
+function _ccipReceive(
+ Client.Any2EVMMessage memory message
+) internal override {
+ // Add custom logic here
+}
+```
+
+The `Receiver` contract in this tutorial provides custom logic that stores the `messageId` and `text` (decoded) as member variables.
+
+```solidity
+contract Receiver is CCIPReceiver {
+
+ bytes32 private _messageId;
+ string private _text;
+
+ /// @notice Constructor - Initializes the contract with the router address.
+ /// @param router The address of the router contract.
+ constructor(address router) CCIPReceiver(router) {}
+
+ /// @notice Handle a received message
+ /// @param message The cross-chain message being received.
+ function _ccipReceive(
+ Client.Any2EVMMessage memory message
+ ) internal override {
+ _messageId = message.messageId; // Store the messageId
+ _text = abi.decode(message.data, (string)); // Decode and store the message text
+ }
+}
+```
+
+##### Retrieving a message
+
+The `Receiver` contract defines a custom method named `getMessage` that returns the details of the last received message `_messageId` and `_text`. This method can be called to fetch the message data details after the `_ccipReceive` receives a new message.
+
+```solidity
+/// @notice Gets the last received message.
+/// @return messageId The ID of the last received message.
+/// @return text The last received text.
+function getMessage()
+ external
+ view
+ returns (bytes32 messageId, string memory text)
+{
+ return (_messageId, _text);
+}
+```
+
+## Compiling the smart contracts
+
+To compile your smart contracts, run:
+
+```bash
+forge build
+```
+
+## Deploying the smart contract
+
+### Setting up your wallet as the deployer
+
+Before you can deploy your smart contract to the Base network, you will need to set up a wallet to be used as the deployer.
+
+To do so, you can use the [`cast wallet import`](https://book.getfoundry.sh/reference/cast/cast-wallet-import) command to import the private key of the wallet into Foundry's securely encrypted keystore:
+
+```bash
+cast wallet import deployer --interactive
+```
+
+After running the command above, you will be prompted to enter your private key, as well as a password for signing transactions.
+
+
+For instructions on how to get your private key from Coinbase Wallet, visit the [Coinbase Wallet documentation](https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings#show-private-key). **It is critical that you do NOT commit this to a public repo**.
+
+
+
+To confirm that the wallet was imported as the `deployer` account in your Foundry project, run:
+
+```bash
+cast wallet list
+```
+
+### Setting up environment variables
+
+To setup your environment, create an `.env` file in the home directory of your project, and add the RPC URLs, [CCIP chain selectors](https://docs.chain.link/ccip/supported-networks/v1_2_0/testnet), [CCIP router addresses](https://docs.chain.link/ccip/supported-networks/v1_2_0/testnet), and [LINK token addresses](https://docs.chain.link/resources/link-token-contracts) for both Base Goerli and Optimism Goerli testnets:
+
+```bash
+BASE_GOERLI_RPC="https://goerli.base.org"
+OPTIMISM_GOERLI_RPC="https://goerli.optimism.io"
+
+BASE_GOERLI_CHAIN_SELECTOR=5790810961207155433
+OPTIMISM_GOERLI_CHAIN_SELECTOR=2664363617261496610
+
+BASE_GOERLI_ROUTER_ADDRESS="0x80AF2F44ed0469018922c9F483dc5A909862fdc2"
+OPTIMISM_GOERLI_ROUTER_ADDRESS="0xcc5a0B910D9E9504A7561934bed294c51285a78D"
+
+BASE_GOERLI_LINK_ADDRESS="0x6D0F8D488B669aa9BA2D0f0b7B75a88bf5051CD3"
+OPTIMISM_GOERLI_LINK_ADDRESS="0xdc2CC710e42857672E7907CF474a69B63B93089f"
+```
+
+Once the `.env` file has been created, run the following command to load the environment variables in the current command line session:
+
+```bash
+source .env
+```
+
+### Deploying the smart contracts
+
+With your contracts compiled and environment setup, you are ready to deploy the smart contracts.
+
+To deploy a smart contract using Foundry, you can use the `forge create` command. The command requires you to specify the smart contract you want to deploy, an RPC URL of the network you want to deploy to, and the account you want to deploy with.
+
+
+Your wallet must be funded with ETH on the Base Goerli and Optimism Goerli to cover the gas fees associated with the smart contract deployment. Otherwise, the deployment will fail.
+
+To get testnet ETH for Base Goerli and Optimism Goerli, see the [prerequisites](#prerequisites).
+
+
+
+#### Deploying the Sender contract to Base Goerli
+
+To deploy the `Sender` smart contract to the Base Goerli testnet, run the following command:
+
+```bash
+forge create ./src/Sender.sol:Sender --rpc-url $BASE_GOERLI_RPC --constructor-args $BASE_GOERLI_ROUTER_ADDRESS $BASE_GOERLI_LINK_ADDRESS --account deployer
+```
+
+When prompted, enter the password that you set earlier, when you imported your wallet's private key.
+
+After running the command above, the contract will be deployed on the Base Goerli test network. You can view the deployment status and contract by using a [block explorer]: /docs/chain/block-explorers.
+
+#### Deploying the Receiver contract to Optimism Goerli
+
+To deploy the `Receiver` smart contract to the Optimism Goerli testnet, run the following command:
+
+```bash
+forge create ./src/Receiver.sol:Receiver --rpc-url $OPTIMISM_GOERLI_RPC --constructor-args $OPTIMISM_GOERLI_ROUTER_ADDRESS --account deployer
+```
+
+When prompted, enter the password that you set earlier, when you imported your wallet's private key.
+
+After running the command above, the contract will be deployed on the Optimism Goerli test network. You can view the deployment status and contract by using the [OP Goerli block explorer](https://goerli-optimism.etherscan.io/).
+
+### Funding your smart contracts
+
+In order to pay for the fees associated with sending messages, the `Sender` contract will need to hold a balance of LINK tokens.
+
+Fund your contract directly from your wallet, or by running the following `cast` command:
+
+```bash
+cast send $BASE_GOERLI_LINK_ADDRESS --rpc-url $BASE_GOERLI_RPC "transfer(address,uint256)" 5 --account deployer
+```
+
+The above command sends `5` LINK tokens on Base Goerli testnet to the `Sender` contract.
+
+
+Replace `` with the contract address of your deployed `Sender` contract before running the provided `cast` command.
+
+
+
+## Interacting with the smart contract
+
+Foundry provides the `cast` command-line tool that can be used to interact with deployed smart contracts and call their functions.
+
+### Sending data
+
+The `cast` command can be used to call the `sendMessage(uint64, address, string)` function on the `Sender` contract deployed to Base Goerli in order to send message data to the `Receiver` contract on Optimism Goerli.
+
+To call the `sendMessage(uint64, address, string)` function of the `Sender` smart contract, run:
+
+```bash
+cast send --rpc-url $BASE_GOERLI_RPC "sendMessage(uint64, address, string)" $OPTIMISM_GOERLI_CHAIN_SELECTOR "Based" --account deployer
+```
+
+The command above calls the `sendMessage(uint64, address, string)` to send a message. The parameters passed in to the method include: The chain selector to the destination chain (Optimism Goerli), the `Receiver` contract address, and the text data to be included in the message (`Based`).
+
+
+Replace `` and `` with the contract addresses of your deployed `Sender` and `Receiver` contracts respectively before running the provided `cast` command.
+
+
+
+After running the command, a unique `messageId` should be returned.
+
+Once the transaction has been finalized, it will take a few minutes for CCIP to deliver the data to Optimism Goerli and call the `ccipReceive` function on the `Receiver` contract.
+
+
+You can use the [CCIP explorer](https://ccip.chain.link/) to see the status of the CCIP transaction.
+
+
+
+### Receiving data
+
+The `cast` command can also be used to call the `getMessage()` function on the `Receiver` contract deployed to Optimism Goerli in order to read the received message data.
+
+To call the `getMessage()` function of the `Receiver` smart contract, run:
+
+```bash
+cast send --rpc-url $OPTIMISM_GOERLI_RPC "getMessage()" --account deployer
+```
+
+
+Replace `` with the contract addresses of your deployed `Receiver` contract before running the provided `cast` command.
+
+
+
+After running the command, the `messageId` and `text` of the last received message should be returned.
+
+If the transaction fails, ensure the status of your `ccipSend` transaction has been finalized. You can using the [CCIP explorer](https://ccip.chain.link/).
+
+## Conclusion
+
+Congratulations! You have successfully learned how to perform cross-chain messaging on Base using Chainlink CCIP.
+
+To learn more about cross-chain messaging and Chainlink CCIP, check out the following resources:
+
+- [Cross-chain](https://docs.base.org/docs/tools/cross-chain)
+- [Chainlink CCIP](https://docs.chain.link/ccip)
+
diff --git a/docs/pages/cookbook/nfts/complex-onchain-nfts.mdx b/_pages/cookbook/nfts/complex-onchain-nfts.mdx
similarity index 99%
rename from docs/pages/cookbook/nfts/complex-onchain-nfts.mdx
rename to _pages/cookbook/nfts/complex-onchain-nfts.mdx
index f87cf6ff..c8767cf0 100644
--- a/docs/pages/cookbook/nfts/complex-onchain-nfts.mdx
+++ b/_pages/cookbook/nfts/complex-onchain-nfts.mdx
@@ -122,11 +122,10 @@ import "@openzeppelin/contracts/utils/Base64.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
```
-:::info
-
+
Base64 allows the transport of binary data over the web in a reliable way. It is not a compression algorithm, and actually increased the data size by a 4/3 ratio.
+
-:::
### Planning the override for the `tokenURI()` Function
@@ -163,11 +162,10 @@ function tokenURI(uint _tokenId) public view override returns (string memory) {
}
```
-:::caution
-
+
Getting the quotes and commas correct when the json is broken apart like this is challenging. When debugging, look here first!
+
-:::
### Test Your Progress
@@ -346,11 +344,10 @@ constructor(address _SVGRenderer) ERC721("Land, Sea, and Sky", "LSS") {
}
```
-:::info
-
+
For testing purposes, it may be easier if you add functions to allow you to change these addresses after deployment. But the whole point of all this work is to make immutable, onchain NFTs, so be sure to delete them before you do your real deployment!
+
-:::
Finally, swap your `TODO` with a line to `Base64.encode` a call to the renderer:
diff --git a/docs/pages/cookbook/nfts/dynamic-nfts.mdx b/_pages/cookbook/nfts/dynamic-nfts.mdx
similarity index 100%
rename from docs/pages/cookbook/nfts/dynamic-nfts.mdx
rename to _pages/cookbook/nfts/dynamic-nfts.mdx
diff --git a/docs/pages/cookbook/nfts/signature-mint.mdx b/_pages/cookbook/nfts/signature-mint.mdx
similarity index 99%
rename from docs/pages/cookbook/nfts/signature-mint.mdx
rename to _pages/cookbook/nfts/signature-mint.mdx
index 396bbb84..3a686304 100644
--- a/docs/pages/cookbook/nfts/signature-mint.mdx
+++ b/_pages/cookbook/nfts/signature-mint.mdx
@@ -3,9 +3,10 @@ title: 'Signature Mint NFT'
slug: /signature-mint-nft
description: A tutorial that teaches how to create a signature mint, in which minters pay their own gas, but must first be given a valid signed authorization.
author: briandoyle81
-
---
+import { Danger } from "/snippets/danger.mdx";
+
# Signature Mint NFT
A _signature mint_ is a term for an NFT mint in which the recipient of the NFT pays for their own gas to receive the NFT, but may only do so if they possess a correct message signed by the owner or authorized address of the mint contract. Reasons for doing this include allowing fiat payment of minting fees, allowing holders of an NFT on one chain to mint that NFT on an unrelated chain, or gating the mint to users who meet other specific offchain requirements.
@@ -74,11 +75,10 @@ You're also using `Ownable` to assign an owner to this contract. You could inste
For the `public`-facing mint function, create a function called `mintTo` that accepts an `address` for the `_recipient`.
-:::info
-
+
A common pattern used to be to simply mint the token and give it to `msg.sender`. This practice is falling out of favor. Allowing the recipient to be different than the sender gives greater flexibility. Doing so is also necessary to assign the right NFT owner in the event the user is using a smart contract wallet, paymaster, or other form of account abstraction.
+
-:::
```solidity
function mintTo(address _recipient, bytes memory _signature) public {
@@ -138,11 +138,10 @@ _Soulbound_ is a video-game term that means that an item is permanently attached
To prevent transfers other than the initial mint, you can `override` the `_update` function.
-:::info
-
+
Previously, this was done with the `_beforeTransfer` function. Current versions of OpenZeppelin's ERC-721 implementation have replaced that function with `_update`.
+
-:::
```solidity
/**
@@ -223,13 +222,12 @@ function mintTo(address _recipient, bytes memory _signature) public {
}
```
-:::danger
-
+
Nothing in the above validation method prevents a user, or a third party, from obtaining a valid, signed message from a previous transaction and reusing it for a **new** transaction. In this case, it doesn't matter because signature re-use would only allow minting more soulbound NFTs for the address within the signature.
Other design requirements should use a nonce as a part of the signed data to prevent signature reuse.
+
-:::
## Signing the Message
@@ -357,11 +355,10 @@ const data = encodeFunctionData({
});
```
-:::info
-
+
`privateKeyToAccount` expects that your key starts with `0x`. You may need to manually add that depending on the tool you exported it from.
+
-:::
## Conclusion
diff --git a/docs/pages/cookbook/nfts/simple-onchain-nfts.mdx b/_pages/cookbook/nfts/simple-onchain-nfts.mdx
similarity index 99%
rename from docs/pages/cookbook/nfts/simple-onchain-nfts.mdx
rename to _pages/cookbook/nfts/simple-onchain-nfts.mdx
index 0dfdc508..33507b67 100644
--- a/docs/pages/cookbook/nfts/simple-onchain-nfts.mdx
+++ b/_pages/cookbook/nfts/simple-onchain-nfts.mdx
@@ -55,11 +55,10 @@ contract RandomColorNFT is ERC721 {
}
```
-:::info
-
+
With the Smart Wallet, `msg.sender` is the users custodial address - where you want to send the NFT. This is not always the case with account abstraction. In some other implementations, `msg.sender` is the smart contract address, even if the user signs in with an EOA. Regardless, it's becoming a common practice to pass the address you want the NFT to go to explicitly.
+
-:::
### Onchain Metadata
@@ -168,11 +167,10 @@ function toHexDigit(uint8 d) internal pure returns (bytes1) {
}
```
-:::caution
-
+
Remember, randomness generated using onchain information is not fully secure. A determined attacker could manipulate a block to compromise your contract. That being said, `prevrandao` is a passable solution for anything not involving a large amount of money.
+
-:::
### Saving the Color to the NFT
diff --git a/docs/pages/cookbook/nfts/thirdweb-unreal-nft-items.mdx b/_pages/cookbook/nfts/thirdweb-unreal-nft-items.mdx
similarity index 99%
rename from docs/pages/cookbook/nfts/thirdweb-unreal-nft-items.mdx
rename to _pages/cookbook/nfts/thirdweb-unreal-nft-items.mdx
index a26934e5..9a2c32f2 100644
--- a/docs/pages/cookbook/nfts/thirdweb-unreal-nft-items.mdx
+++ b/_pages/cookbook/nfts/thirdweb-unreal-nft-items.mdx
@@ -5,6 +5,8 @@ description: Learn how to use NFTs as in-game items using Thirdweb and Unreal.
author: briandoyle81
---
+import { Danger } from "/snippets/danger.mdx";
+
# Thirdweb and Unreal - NFT Items
[thirdweb] provides a number of contracts and tools for building onchain. Their [Gaming SDK] enables seamless onboarding, cross-platform support, and provides many other features. It's compatible with [Unreal Engine] and can be used to enable onchain elements in your games.
@@ -89,11 +91,10 @@ It will take awhile to spin up, and you can ignore the warning about the `Chain
Once the engine is running, navigate to `https://localhost:3005/json`. Click through the warning that the connection is not secure. Doing so allows your browser to connect to your engine instance.
-:::caution
-
+
We do not have an official browser recommendation, but during our testing, Chrome worked and Brave did not with the engine setup and configuration.
+
-:::
Navigate to the [thirdweb engine dashboard], and click the `Import` button. Enter a name and the local address for your engine instance:
@@ -101,19 +102,17 @@ Navigate to the [thirdweb engine dashboard], and click the `Import` button. Ente
Next, you must add your wallet to the engine instance. Open up the instance in the dashboard, then click the `Import` button next to `Backend Wallets`. Enter your secret key for the wallet.
-:::danger
-
+
Remember, the wallet key gives full access to all assets within any wallet. Use separate wallets for development and individual production tasks. Don't hold or fund a production wallet with any assets other than the minimum amount necessary for the task it is accomplishing.
+
-:::
**Be sure to fund** this wallet with Base Sepolia ETH. It will be paying the gas for transactions.
-:::caution
-
+
The key to your wallet is stored in ephemeral memory in the engine itself. You'll need to re-add it whenever you restart the engine.
+
-:::
## Setting up the Client and Server
@@ -167,11 +166,10 @@ Click `Deploy Now`, and approve the transactions to deploy the contract and add
Next, click the `Claim Conditions` tab on the left side nav. Then click the `+ Add Phase` button and select `Public`. Review the options, but don't change any of them for this demo. Click `Save Phases`.
-:::caution
-
+
If later in the tutorial, you get an error when you attempt to claim a token, but not an error every four seconds failing to read the balance, it's because you missed this step.
+
-:::
Copy the address from the dashboard:
@@ -208,11 +206,10 @@ Then, click the green play button at the top of the viewport.
Log in using the credentials you created on the website, and play the game for a minute or two. If you get a 404, check that your engine, client, and server are all still running.
-:::caution
-
+
The demo does not actually have a database connected for users. You'll need to recreate your user each time you restart the server. For production, you'll need to swap this out with an actual database.
+
-:::
If you get an error 500 `"No configured wallet found with address 0xABCD...."`, it's because you didn't add your wallet in the [thirdweb engine dashboard].
@@ -279,11 +276,10 @@ const body = {
res.status(400).json({ message: 'Error claiming RandomColorNFT' });
```
-:::info
-
+
A better practice for production would be to make a more generalized function that can handle multiple requests to your contracts. We're skipping that for now to avoid needing to refactor the existing collectibles in the game.
+
-:::
Next, you need to add a route for this function. Open `server/src/routes/engineRoutes.ts`. Import `claimRandomColorNFT` and add a route for it:
@@ -303,11 +299,10 @@ Similarly to what you did in the server, use the existing `PerformClaim()` as a
HttpRequest->SetURL(this->ServerUrl + "/engine/claim-random-color-nft");
```
-:::info
-
+
Again, it would be better practice to generalize this function, but you can skip that for now to avoid needing to update all the collectibles.
+
-:::
Next, you need to let the editor know about this new function. Open `Source/unreal_demo/Public/ThirdwebManager.h`. Add your new function under the one for `PerformClaim();`
@@ -441,11 +436,10 @@ res.json(colors);
// Delete res.json(response.data);
```
-:::info
-
+
To test with Postman or similar, comment out the check for a valid `authToken` and hardcode in an address that you know has NFTs.
+
-:::
### Getting the Colors into the Game
@@ -464,7 +458,7 @@ And expose it to the editor:
// ThirdwebManager.h
// This delegate is triggered in C++, and Blueprints can bind to it.
UPROPERTY(BlueprintAssignable, Category = "Thirdweb", meta = (DisplayName = "OnNFTColorsResponse"))
-FOnNFTColorsResponse OnNFTColorsResponse;;
+FOnNFTColorsResponse OnNFTColorsResponse:
```
Then, add the function to `ThirdwebManager.cpp`. It's similar, but instead hits the endpoint for the NFT color array and uses the response you just created. It also expects the response to be an array of strings instead of searching for a property called `result`:
@@ -567,31 +561,28 @@ You should end up with something like this:
Compile the blueprint then run the game. You should see that last color in the array in the HUD, and you should see the full list printed in the console every two seconds.
-:::caution
-
+
If you have an error in your `GetNFTColors` function that prevents `.Broadcast` from being called, nothing in the NFT Colors branch of this blueprint will run, including printing to the console.
+
-:::
### Changing the Color of the Car
Now that you have the colors, you can use them to change the color of your car! For now, you can just set the car to the last color, but on your own you'll want to add a UI widget to allow the player to pick their color.
-:::info
-
+
If you really wanted to get fancy, you could modify the contract to emit an `event` containing the color of the newly-minted NFT, extract that from the receipt, and optimistically make it available to the player a few seconds earlier.
+
-:::
Unreal doesn't use hex colors, so you'll need to convert your hex string to a linear color and save it in the `Material Parameter Collection` you created earlier.
Converting the hex code with a blueprint is very complicated. Luckily, Unreal has a helpful community that has created many utilities, including a [conversion function].
-:::danger
-
+
Copying and pasting code for a game engine isn't quite as dangerous as copying and pasting unknown smart contract code, but you're working at the intersection of these worlds. Be sure to review and make sure you understand anything you find online.
+
-:::
In the content browser, add a `Blueprints>Blueprint Function Library` called `ColorUtils`. In it, add a function called `HexStringToColor`.
diff --git a/_pages/cookbook/smart-contract-development/foundry/deploy-with-foundry.mdx b/_pages/cookbook/smart-contract-development/foundry/deploy-with-foundry.mdx
new file mode 100644
index 00000000..29cacee4
--- /dev/null
+++ b/_pages/cookbook/smart-contract-development/foundry/deploy-with-foundry.mdx
@@ -0,0 +1,314 @@
+---
+title: Deploying a smart contract using Foundry
+slug: /deploy-with-foundry
+description: "A tutorial that teaches how to deploy a smart contract on the Base test network using Foundry. Includes instructions for setting up the environment, compiling, and deploying the smart contract."
+author: neodaoist
+---
+
+# Deploying a smart contract using Foundry
+
+This article will provide an overview of the [Foundry](https://book.getfoundry.sh/) development toolchain, and show you how to deploy a contract to **Base Sepolia** testnet.
+
+Foundry is a powerful suite of tools to develop, test, and debug your smart contracts. It comprises several individual tools:
+
+- `forge`: the main workhorse of Foundry — for developing, testing, compiling, and deploying smart contracts
+- `cast`: a command-line tool for performing Ethereum RPC calls (e.g., interacting with contracts, sending transactions, and getting onchain data)
+- `anvil`: a local testnet node, for testing contract behavior from a frontend or over RPC
+- `chisel`: a Solidity [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop), for trying out Solidity snippets on a local or forked network
+
+Foundry offers extremely fast feedback loops (due to the under-the-hood Rust implementation) and less context switching — because you'll be writing your contracts, tests, and deployment scripts **All** in Solidity!
+
+
+For production / mainnet deployments the steps below in this tutorial will be almost identical, however, you'll want to ensure that you've configured `Base` (mainnet) as the network rather than `Base Sepolia` (testnet).
+
+
+
+## Objectives
+
+By the end of this tutorial, you should be able to do the following:
+
+- Setup Foundry for Base
+- Create an NFT smart contract for Base
+- Compile a smart contract for Base (using `forge`)
+- Deploy a smart contract to Base (also with `forge`)
+- Interact with a smart contract deployed on Base (using `cast`)
+
+## Prerequisites
+
+### Foundry
+
+This tutorial requires you have Foundry installed.
+
+- From the command-line (terminal), run: `curl -L https://foundry.paradigm.xyz | bash`
+- Then run `foundryup`, to install the latest (nightly) build of Foundry
+
+For more information, see the Foundry Book [installation guide](https://book.getfoundry.sh/getting-started/installation).
+
+### Coinbase Wallet
+
+In order to deploy a smart contract, you will first need a web3 wallet. You can create a wallet by downloading the Coinbase Wallet browser extension.
+
+- Download [Coinbase Wallet](https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad?hl=en)
+
+### Wallet funds
+
+Deploying contracts to the blockchain requires a gas fee. Therefore, you will need to fund your wallet with ETH to cover those gas fees.
+
+For this tutorial, you will be deploying a contract to the Base Sepolia test network. You can fund your wallet with Base Sepolia ETH using one of the faucets listed on the Base [Network Faucets](https://docs.base.org/chain/network-faucets) page.
+
+## Creating a project
+
+Before you can begin deploying smart contracts to Base, you need to set up your development environment by creating a Foundry project.
+
+To create a new Foundry project, first create a new directory:
+
+```bash
+mkdir myproject
+```
+
+Then run:
+
+```bash
+cd myproject
+forge init
+```
+
+This will create a Foundry project, which has the following basic layout:
+
+```bash
+.
+├── foundry.toml
+├── script
+ │ └── Counter.s.sol
+├── src
+ │ └── Counter.sol
+└── test
+ └── Counter.t.sol
+```
+
+## Compiling the smart contract
+
+Below is a simple NFT smart contract ([ERC-721](https://eips.ethereum.org/EIPS/eip-721)) written in the Solidity programming language:
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.23;
+
+import "openzeppelin-contracts/contracts/token/ERC721/ERC721.sol";
+
+contract NFT is ERC721 {
+ uint256 public currentTokenId;
+
+ constructor() ERC721("NFT Name", "NFT") {}
+
+ function mint(address recipient) public payable returns (uint256) {
+ uint256 newItemId = ++currentTokenId;
+ _safeMint(recipient, newItemId);
+ return newItemId;
+ }
+}
+```
+
+The Solidity code above defines a smart contract named `NFT`. The code uses the `ERC721` interface provided by the [OpenZeppelin Contracts library](https://docs.openzeppelin.com/contracts/5.x/) to create an NFT smart contract. OpenZeppelin allows developers to leverage battle-tested smart contract implementations that adhere to official ERC standards.
+
+To add the OpenZeppelin Contracts library to your project, run:
+
+```bash
+forge install openzeppelin/openzeppelin-contracts
+```
+
+In your project, delete the `src/Counter.sol` contract that was generated with the project and add the above code in a new file called `src/NFT.sol`. (You can also delete the `test/Counter.t.sol` and `script/Counter.s.sol` files, but you should add your own tests ASAP!).
+
+To compile our basic NFT contract using Foundry, run:
+
+```bash
+forge build
+```
+
+## Configuring Foundry with Base
+
+Next, you will configure your Foundry project to deploy smart contracts to the Base network. First you'll store your private key in an encrypted keystore, then you'll add Base as a network.
+
+### Storing your private key
+
+The following command will import your private key to Foundry's secure keystore. You will be prompted to enter your private key, as well as a password for signing transactions:
+
+```bash
+cast wallet import deployer --interactive
+```
+
+
+For instructions on how to get your private key from Coinbase Wallet, visit the [Coinbase Wallet documentation](https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings#show-private-key). **It is critical that you do NOT commit this to a public repo**.
+
+
+
+Run this command to confirm that the 'deployer' account is setup in Foundry:
+
+```bash
+cast wallet list
+```
+
+### Adding Base as a network
+
+When verifying a contract with BaseScan, you need an API key. You can get your BaseScan API key from [here](https://basescan.org/myapikey) after you sign up for an account.
+
+
+Although they're made by the same folks, Etherscan API keys will **not** work on BaseScan!
+
+
+
+Now create a `.env` file in the home directory of your project to add the Base network and an API key for verifying your contract on BaseScan:
+
+```
+BASE_MAINNET_RPC="https://mainnet.base.org"
+BASE_SEPOLIA_RPC="https://sepolia.base.org"
+ETHERSCAN_API_KEY=""
+```
+
+Note that even though you're using BaseScan as your block explorer, Foundry expects the API key to be defined as `ETHERSCAN_API_KEY`.
+
+### Loading environment variables
+
+Now that you've created the above `.env` file, run the following command to load the environment variables in the current command line session:
+
+```bash
+source .env
+```
+
+## Deploying the smart contract
+
+With your contract compiled and your environment configured, you are ready to deploy to the Base Sepolia test network!
+
+Today, you'll use the `forge create` command, which is a straightforward way to deploy a single contract at a time. In the future, you may want to look into [`forge script`](https://book.getfoundry.sh/guides/scripting-with-solidity), which enables scripting onchain transactions and deploying more complex smart contract projects.
+
+You'll need testnet ETH in your wallet. See the [prerequisites](#prerequisites) if you haven't done that yet. Otherwise, the deployment attempt will fail.
+
+To deploy the contract to the Base Sepolia test network, run the following command. You will be prompted to enter the password that you set earlier, when you imported your private key:
+
+```bash
+forge create ./src/NFT.sol:NFT --rpc-url $BASE_SEPOLIA_RPC --account deployer
+```
+
+The contract will be deployed on the Base Sepolia test network. You can view the deployment status and contract by using a [block explorer](/chain/block-explorers) and searching for the address returned by your deploy script. If you've deployed an exact copy of the NFT contract above, it will already be verified and you'll be able to read and write to the contract using the web interface.
+
+
+If you'd like to deploy to mainnet, you'll modify the command like so:
+
+```bash
+forge create ./src/NFT.sol:NFT --rpc-url $BASE_MAINNET_RPC --account deployer
+```
+
+
+
+Regardless of the network you're deploying to, if you're deploying a new or modified contract, you'll need to verify it.
+
+## Verifying the Smart Contract
+
+In web3, it's considered best practice to verify your contracts so that users and other developers can inspect the source code, and be sure that it matches the deployed bytecode on the blockchain.
+
+Further, if you want to allow others to interact with your contract using the block explorer, it first needs to be verified. The above contract has already been verified, so you should be able to view your version on a block explorer already, but we'll still walk through how to verify a contract on Base Sepolia testnet.
+
+
+Remember, you need an API key from BaseScan to verify your contracts. You can get your API key from [the BaseScan site](https://basescan.org/myapikey) after you sign up for an account.
+
+
+
+Grab the deployed address and run:
+
+```bash
+forge verify-contract ./src/NFT.sol:NFT --chain 84532 --watch
+```
+
+You should see an output similar to:
+
+```
+Start verifying contract `0x71bfCe1172A66c1c25A50b49156FAe45EB56E009` deployed on base-sepolia
+
+Submitting verification for [src/NFT.sol:NFT] 0x71bfCe1172A66c1c25A50b49156FAe45EB56E009.
+Submitted contract for verification:
+ Response: `OK`
+ GUID: `3i9rmtmtyyzkqpfvy7pcxj1wtgqyuybvscnq8d7ywfuskss1s7`
+ URL:
+ https://sepolia.basescan.org/address/0x71bfce1172a66c1c25a50b49156fae45eb56e009
+Contract verification status:
+Response: `NOTOK`
+Details: `Pending in queue`
+Contract verification status:
+Response: `OK`
+Details: `Pass - Verified`
+Contract successfully verified
+```
+
+Search for your contract on [BaseScan](https://sepolia.basescan.org/) to confirm it is verified.
+
+
+You can't re-verify a contract identical to one that has already been verified. If you attempt to do so, such as verifying the above contract, you'll get an error similar to:
+
+```text
+Start verifying contract `0x71bfCe1172A66c1c25A50b49156FAe45EB56E009` deployed on base-sepolia
+
+Contract [src/NFT.sol:NFT] "0x71bfCe1172A66c1c25A50b49156FAe45EB56E009" is already verified. Skipping verification.
+```
+
+
+
+## Interacting with the Smart Contract
+
+If you verified on BaseScan, you can use the `Read Contract` and `Write Contract` sections under the `Contract` tab to interact with the deployed contract. To use `Write Contract`, you'll need to connect your wallet first, by clicking the `Connect to Web3` button (sometimes this can be a little finicky, and you'll need to click `Connect` twice before it shows your wallet is successfully connected).
+
+To practice using the `cast` command-line tool which Foundry provides, you'll perform a call without publishing a transaction (a read), then sign and publish a transaction (a write).
+
+### Performing a call
+
+A key component of the Foundry toolkit, `cast` enables us to interact with contracts, send transactions, and get onchain data using Ethereum RPC calls. First you will perform a call from your account, without publishing a transaction.
+
+From the command-line, run:
+
+```bash
+cast call --rpc-url $BASE_SEPOLIA_RPC "balanceOf(address)"
+```
+
+You should receive `0x0000000000000000000000000000000000000000000000000000000000000000` in response, which equals `0` in hexadecimal. And that makes sense — while you've deployed the NFT contract, no NFTs have been minted yet and therefore your account's balance is zero.
+
+### Signing and publishing a transaction
+
+Now, sign and publish a transaction, calling the `mint(address)` function on the NFT contract you just deployed.
+
+Run the following command:
+
+```bash
+cast send --rpc-url=$BASE_SEPOLIA_RPC "mint(address)" --account deployer
+```
+
+
+Note that in this `cast send` command, you had to include your private key, but this is not required for `cast call`, because that's for calling view-only contract functions and therefore you don't need to sign anything.
+
+
+
+If successful, Foundry will respond with information about the transaction, including the `blockNumber`, `gasUsed`, and `transactionHash`.
+
+Finally, let's confirm that you did indeed mint yourself one NFT. If you run the first `cast call` command again, you should see that your balance increased from 0 to 1:
+
+```bash
+cast call --rpc-url $BASE_SEPOLIA_RPC "balanceOf(address)"
+```
+
+And the response: `0x0000000000000000000000000000000000000000000000000000000000000001` (`1` in hex) — congratulations, you deployed a contract and minted an NFT with Foundry!
+
+## Conclusion
+
+Phew, that was a lot! You learned how to setup a project, deploy to Base, and interact with our smart contract using Foundry. The process is the same for real networks, just more expensive — and of course, you'll want to invest time and effort testing your contracts, to reduce the likelihood of user-impacting bugs before deploying.
+
+For all things Foundry, check out the [Foundry book](https://book.getfoundry.sh/), or head to the official Telegram [dev chat](https://t.me/foundry_rs) or [support chat](https://t.me/foundry_support).
+
+{/*-- Add reference style links here. These do not render on the page. --*/}
+
+[`sepolia.basescan.org`]: https://sepolia.basescan.org/
+[`basescan.org`]: https://basescan.org/
+[coinbase]: https://www.coinbase.com/wallet
+[MetaMask]: https://metamask.io/
+[coinbase settings]: https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings
+[etherscan]: https://etherscan.io/
+[faucets on the web]: https://coinbase.com/faucets
+[Foundry]: https://book.getfoundry.sh/
+
diff --git a/_pages/cookbook/smart-contract-development/foundry/generate-random-numbers-contracts.mdx b/_pages/cookbook/smart-contract-development/foundry/generate-random-numbers-contracts.mdx
new file mode 100644
index 00000000..57a50ad5
--- /dev/null
+++ b/_pages/cookbook/smart-contract-development/foundry/generate-random-numbers-contracts.mdx
@@ -0,0 +1,408 @@
+---
+title: Generating random numbers contracts using Supra dVRF
+slug: /oracles-supra-vrf
+description: A tutorial that teaches how to use Supra dVRF to serve random numbers using an onchain randomness generation mechanism directly within your smart contracts on the Base testnet.
+author: taycaldwell
+keywords: [
+ Oracle
+ Oracles,
+ Supra,
+ Supra VRF,
+ Supra dVRF,
+ VRF,
+ verifiable random function,
+ verifiable random functions,
+ random numbers,
+ rng,
+ random number generator,
+ random numbers in smart contracts,
+ random numbers on Base,
+ smart contract,
+ Base blockchain,
+ Base network,
+ Base testnet,
+ Base test network,
+ app development,
+ dapp development,
+ build a dapp on Base,
+ build on Base,
+ ]
+tags: ['oracles', 'vrf']
+difficulty: intermediate
+displayed_sidebar: null
+---
+
+This tutorial will guide you through the process of creating a smart contract on Base that utilizes Supra dVRF to serve random numbers using an onchain randomness generation mechanism directly within your smart contracts.
+
+
+
+## Objectives
+
+By the end of this tutorial you should be able to do the following:
+
+- Set up a smart contract project for Base using Foundry
+- Install the Supra dVRF as a dependency
+- Use Supra dVRF within your smart contract
+- Deploy and test your smart contracts on Base
+
+
+
+## Prerequisites
+
+### Foundry
+
+This tutorial requires you to have Foundry installed.
+
+- From the command-line (terminal), run: `curl -L https://foundry.paradigm.xyz | bash`
+- Then run `foundryup`, to install the latest (nightly) build of Foundry
+
+For more information, see the Foundry Book [installation guide](https://book.getfoundry.sh/getting-started/installation).
+
+### Coinbase Wallet
+
+In order to deploy a smart contract, you will first need a wallet. You can create a wallet by downloading the Coinbase Wallet browser extension.
+
+- Download [Coinbase Wallet](https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad?hl=en)
+
+### Wallet funds
+
+Deploying contracts to the blockchain requires a gas fee. Therefore, you will need to fund your wallet with ETH to cover those gas fees.
+
+For this tutorial, you will be deploying a contract to the Base Sepolia test network. You can fund your wallet with Base Sepolia ETH using one of the faucets listed on the Base [Network Faucets](https://docs.base.org/chain/network-faucets) page.
+
+### Supra wallet registration
+
+
+Supra dVRF V2 requires subscription to the service with a customer controlled wallet address to act as the main reference.
+
+Therefore you must register your wallet with the Supra team if you plan to consume Supra dVRF V2 within your smart contracts.
+
+Please refer to the [Supra documentation](https://docs.supra.com/oracles/dvrf/vrf-subscription-model) for the latest steps on how to register your wallet for their service.
+
+
+
+
+
+## What is a Verifiable Random Function (VRF)?
+
+A Verifiable Random Function (VRF) provides a solution for generating random outcomes in a manner that is both decentralized and verifiably recorded onchain. VRFs are crucial for applications where randomness integrity is paramount, such as in gaming or prize drawings.
+
+Supra dVRF provides a decentralized VRF that ensures that the outcomes are not only effectively random but also responsive, scalable, and easily verifiable, thereby addressing the unique needs of onchain applications for trustworthy and transparent randomness.
+
+
+
+## Creating a project
+
+Before you can begin writing smart contracts for Base, you need to set up your development environment by creating a Foundry project.
+
+To create a new Foundry project, first create a new directory:
+
+```bash
+mkdir myproject
+```
+
+Then run:
+
+```bash
+cd myproject
+forge init
+```
+
+This will create a Foundry project, which has the following basic layout:
+
+```bash
+.
+├── foundry.toml
+├── script
+ │ └── Counter.s.sol
+├── src
+ │ └── Counter.sol
+└── test
+ └── Counter.t.sol
+```
+
+
+
+## Writing the Smart Contract
+
+Once your Foundry project has been created, you can now start writing a smart contract.
+
+The Solidity code below defines a basic contract named `RNGContract`. The smart contract's constructor takes in a single `address` and assigns it to a member variable named `supraAddr`. This address corresponds to the [contract address](https://docs.supra.com/oracles/data-feeds/pull-oracle/networks) of the Supra Router Contract that will be used to generate random numbers. The contract address of the Supra Router Contract on Base Sepolia testnet is `0x99a021029EBC90020B193e111Ae2726264a111A2`.
+
+The contract also assigns the contract deployer (`msg.sender`) to a member variable named `supraClientAddress`. This should be the client wallet address that is registered and whitelisted to use Supra VRF (see: [Prerequisites](#prerequisites)).
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+contract RNGContract {
+ address supraAddr;
+ address supraClientAddress;
+
+ constructor(address supraSC) {
+ supraAddr = supraSC;
+ supraClientAddress = msg.sender;
+ }
+}
+```
+
+In your project, add the code provided above to a new file named `src/ExampleContract.sol`, and delete the `src/Counter.sol` contract that was generated with the project. (you can also delete the `test/Counter.t.sol` and `script/Counter.s.sol` files).
+
+The following sections will guide you step-by-step on how to update your contract to generate random numbers using the Supra Router contract.
+
+### Adding the Supra Router Contract interface
+
+In order to help your contract (the requester contract) interact with the Supra Router contract and understand what methods it can call, you will need to add the following interface to your contract file.
+
+```solidity
+interface ISupraRouter {
+ function generateRequest(string memory _functionSig, uint8 _rngCount, uint256 _numConfirmations, uint256 _clientSeed, address _clientWalletAddress) external returns(uint256);
+ function generateRequest(string memory _functionSig, uint8 _rngCount, uint256 _numConfirmations, address _clientWalletAddress) external returns(uint256);
+}
+```
+
+The `ISupraRouter` interface defines a `generateRequest` function. This function is used to create a request for random numbers. The `generateRequest` function is defined twice, because one of the definitions allows for an optional `_clientSeed` (defaults to `0`) for additional unpredictability.
+
+
+Alternatively, you can add the `ISupraRouter` interface in a separate interface file and inherit the interface in your contract.
+
+
+
+### Adding a request function
+
+Once you have defined the `ISupraRouter`, you are ready to add the logic to your smart contract for requesting random numbers.
+
+For Supra dVRF, adding logic for requesting random numbers requires two functions:
+
+- A request function
+- A callback function
+
+The request function is a custom function defined by the developer. There are no requirements when it comes to the signature of the request function.
+
+The following code is an example of a request function named `rng` that requests random numbers using the Supra Router Contract. Add this function to your smart contract:
+
+```solidity
+function rng() external returns (uint256) {
+ // Amount of random numbers to request
+ uint8 rngCount = 5;
+ // Amount of confirmations before the request is considered complete/final
+ uint256 numConfirmations = 1;
+ uint256 nonce = ISupraRouter(supraAddr).generateRequest(
+ "requestCallback(uint256,uint256[])",
+ rngCount,
+ numConfirmations,
+ supraClientAddress
+ );
+ return nonce;
+ // store nonce if necessary (e.g., in a hashmap)
+ // this can be used to track parameters related to the request in a lookup table
+ // these can be accessed inside the callback since the response from supra will include the nonce
+}
+```
+
+The `rng` function above requests `5` random numbers (defined by `rngCount`), and waits `1` confirmation (defined by `numConfirmations`) before considering the result to be final. It makes this request by calling the `generateRequest` function of the Supra Router contract, while providing a callback function with the signature `requestCallback(uint256,uint256[])`.
+
+### Adding a callback function
+
+As seen in the previous section, the `generateRequest` method of the Supra Router contract expects a signature for a callback function. This callback function must be of the form: `uint256 nonce, uint256[] calldata rngList`, and must include validation code, such that only the Supra Router contract can call the function.
+
+To do this, add the following callback function (`requestCallback`) to your smart contract:
+
+```solidity
+function requestCallback(uint256 _nonce ,uint256[] _rngList) external {
+ require(msg.sender == supraAddr, "Only the Supra Router can call this function.");
+ uint8 i = 0;
+ uint256[] memory x = new uint256[](rngList.length);
+ rngForNonce[nonce] = x;
+ for(i=0; i uint256[] ) rngForNonce;
+```
+
+### Adding a function to view the result
+
+To fetch resulting random numbers based on their associated `nonce`, you add a third function:
+
+```solidity
+function viewRngForNonce(uint256 nonce) external view returns (uint256[] memory) {
+ return rngForNonce[nonce];
+}
+```
+
+### Final smart contract code
+
+After following all the steps above, your smart contract code should look like the following:
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+interface ISupraRouter {
+ function generateRequest(string memory _functionSig, uint8 _rngCount, uint256 _numConfirmations, uint256 _clientSeed, address _clientWalletAddress) external returns (uint256);
+ function generateRequest(string memory _functionSig, uint8 _rngCount, uint256 _numConfirmations, address _clientWalletAddress) external returns (uint256);
+}
+
+contract RNGContract {
+ address supraAddr;
+ address supraClientAddress;
+
+ mapping (uint256 => uint256[]) rngForNonce;
+
+ constructor(address supraSC) {
+ supraAddr = supraSC;
+ supraClientAddress = msg.sender;
+ }
+
+ function rng() external returns (uint256) {
+ // Amount of random numbers to request
+ uint8 rngCount = 5;
+ // Amount of confirmations before the request is considered complete/final
+ uint256 numConfirmations = 1;
+ uint256 nonce = ISupraRouter(supraAddr).generateRequest(
+ "requestCallback(uint256,uint256[])",
+ rngCount,
+ numConfirmations,
+ supraClientAddress
+ );
+ return nonce;
+ }
+
+ function requestCallback(uint256 _nonce, uint256[] memory _rngList) external {
+ require(msg.sender == supraAddr, "Only the Supra Router can call this function.");
+ uint8 i = 0;
+ uint256[] memory x = new uint256[](_rngList.length);
+ rngForNonce[_nonce] = x;
+ for (i = 0; i < _rngList.length; i++) {
+ rngForNonce[_nonce][i] = _rngList[i] % 100;
+ }
+ }
+
+ function viewRngForNonce(uint256 nonce) external view returns (uint256[] memory) {
+ return rngForNonce[nonce];
+ }
+}
+```
+
+
+You must whitelist this smart contract under the wallet address you registered with Supra, and deposit funds to be paid for the gas fees associated with transactions for your callback function.
+
+Follow the [guidance steps](https://supraoracles.com/docs/vrf/v2-guide#step-1-create-the-supra-router-contract-interface-1) provided by Supra for whitelisting your contract and depositing funds.
+
+If you have not yet registered your wallet with Supra, see the [Prerequisites](#prerequisites) section.
+
+
+
+
+
+## Compiling the Smart Contract
+
+To compile your smart contract code, run:
+
+```bash
+forge build
+```
+
+
+
+## Deploying the smart contract
+
+### Setting up your wallet as the deployer
+
+Before you can deploy your smart contract to the Base network, you will need to set up a wallet to be used as the deployer.
+
+To do so, you can use the [`cast wallet import`](https://book.getfoundry.sh/reference/cast/cast-wallet-import) command to import the private key of the wallet into Foundry's securely encrypted keystore:
+
+```bash
+cast wallet import deployer --interactive
+```
+
+After running the command above, you will be prompted to enter your private key, as well as a password for signing transactions.
+
+
+For instructions on how to get your private key from Coinbase Wallet, visit the [Coinbase Wallet documentation](https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings#show-private-key).
+
+**It is critical that you do NOT commit this to a public repo**.
+
+
+
+To confirm that the wallet was imported as the `deployer` account in your Foundry project, run:
+
+```bash
+cast wallet list
+```
+
+### Setting up environment variables for Base Sepolia
+
+To setup your environment for deploying to the Base network, create an `.env` file in the home directory of your project, and add the RPC URL for the Base Sepolia testnet, as well as the Supra Router contract address for Base Sepolia testnet:
+
+```
+BASE_SEPOLIA_RPC="https://sepolia.base.org"
+ISUPRA_ROUTER_ADDRESS=0x99a021029EBC90020B193e111Ae2726264a111A2
+```
+
+Once the `.env` file has been created, run the following command to load the environment variables in the current command line session:
+
+```bash
+source .env
+```
+
+### Deploying the smart contract to Base Sepolia
+
+With your contract compiled and environment setup, you are ready to deploy the smart contract to the Base Sepolia Testnet!
+
+For deploying a single smart contract using Foundry, you can use the `forge create` command. The command requires you to specify the smart contract you want to deploy, an RPC URL of the network you want to deploy to, and the account you want to deploy with.
+
+To deploy the `RNGContract` smart contract to the Base Sepolia test network, run the following command:
+
+```bash
+forge create ./src/RNGContract.sol:RNGContract --rpc-url $BASE_SEPOLIA_RPC --constructor-args $ISUPRA_ROUTER_ADDRESS --account deployer
+```
+
+When prompted, enter the password that you set earlier, when you imported your wallet’s private key.
+
+
+Your wallet must be funded with ETH on the Base Sepolia Testnet to cover the gas fees associated with the smart contract deployment. Otherwise, the deployment will fail.
+
+To get testnet ETH for Base Sepolia, see the [prerequisites](#prerequisites).
+
+
+
+After running the command above, the contract will be deployed on the Base Sepolia test network. You can view the deployment status and contract by using a [block explorer](/chain/block-explorers).
+
+
+
+## Interacting with the Smart Contract
+
+Foundry provides the `cast` command-line tool that can be used to interact with the smart contract that was deployed and call the `getLatestPrice()` function to fetch the latest price of ETH.
+
+To call the `getLatestPrice()` function of the smart contract, run:
+
+```bash
+cast call --rpc-url $BASE_SEPOLIA_RPC "rng()"
+```
+
+You should receive a `nonce` value.
+
+You can use this `nonce` value to call the `viewRngForNonce(uint256)` function to get the resulting list of randomly generated numbers:
+
+```bash
+cast call --rpc-url $BASE_SEPOLIA_RPC "viewRngForNonce(uint256)"
+```
+
+
+
+## Conclusion
+
+Congratulations! You have successfully deployed and interacted with a smart contract that generates a list of random numbers using Supra dVRF on the Base blockchain network.
+
+To learn more about VRF and using Supra dVRF to generate random numbers within your smart contracts on Base, check out the following resources:
+
+- [Oracles](https://docs.base.org/tools/oracles)
+- [Supra dVRF - Developer Guide V2](https://supraoracles.com/docs/vrf/v2-guide)
diff --git a/docs/pages/cookbook/smart-contract-development/foundry/setup-with-base.mdx b/_pages/cookbook/smart-contract-development/foundry/setup-with-base.mdx
similarity index 100%
rename from docs/pages/cookbook/smart-contract-development/foundry/setup-with-base.mdx
rename to _pages/cookbook/smart-contract-development/foundry/setup-with-base.mdx
diff --git a/docs/pages/cookbook/smart-contract-development/foundry/testing-smart-contracts.mdx b/_pages/cookbook/smart-contract-development/foundry/testing-smart-contracts.mdx
similarity index 100%
rename from docs/pages/cookbook/smart-contract-development/foundry/testing-smart-contracts.mdx
rename to _pages/cookbook/smart-contract-development/foundry/testing-smart-contracts.mdx
diff --git a/_pages/cookbook/smart-contract-development/foundry/verify-contract-with-basescan.mdx b/_pages/cookbook/smart-contract-development/foundry/verify-contract-with-basescan.mdx
new file mode 100644
index 00000000..e8e2fb8b
--- /dev/null
+++ b/_pages/cookbook/smart-contract-development/foundry/verify-contract-with-basescan.mdx
@@ -0,0 +1,296 @@
+---
+title: 'Verify a Smart Contract using Basescan API'
+slug: /verify-smart-contract-using-basescan
+description: A tutorial that teaches how to verify a smart contract using Basescan APIs.
+author: hughescoin
+---
+
+[Basescan] is a block explorer specifically designed for [Base], offering developers a way to interact with and verify the smart contracts deployed on Base. Smart contract verification is a critical step in ensuring the transparency and security of onchain applications, as it allows others to review and validate the source code of deployed contracts. There are multiple ways to verify contracts and by the end of this tutorial you will learn how to verify a contract using the [Solidity] single file verification method using the [Basescan API].
+
+
+
+## Objectives
+
+By the end of this tutorial, you should be able to:
+
+- Deploy a smart contract using [Foundry]
+- Interact with the [Basescan API] to verify your deployed contract
+- Obtain and configure a (free) Base RPC Node from [Coinbase Developer Platform (CDP)](https://portal.cdp.coinbase.com/products/node)
+
+
+
+## Prerequisites
+
+**Familiarity with smart contract development and the Solidity programming language**
+
+Solidity is the primary programming language for writing smart contracts on Ethereum and Ethereum-compatible blockchains like Base. You should be comfortable with writing, compiling, and deploying basic smart contracts using Solidity. If not, check out [Base Learn].
+
+**Basic understanding of Foundry for Ethereum development**
+
+Foundry is a fast and portable toolkit for Ethereum application development. It simplifies the process of deploying, testing, and interacting with smart contracts. This tutorial assumes you have experience using Foundry to compile and [deploy smart contracts].
+
+**Access to a Coinbase Developer Platform (CDP) account**
+
+The [Coinbase Developer Platform] provides access to tools and services necessary for blockchain development, including RPC nodes for different networks. You'll need to sign up for a CDP account to obtain a [Base RPC Node], which will be essential for deploying and interacting with your smart contracts on the Base blockchain.
+
+**Node + Basic API requests**
+
+## Jump Right In
+
+For this tutorial, you will deploy a simple contract that is included in the Foundry quickstart. To do so, ensure that you have Foundry installed.
+
+If you don't have Foundry install it:
+
+```bash
+curl -L https://foundry.paradigm.xyz | bash
+```
+
+Once installed, create a Foundry project:
+
+```bash
+forge init verify_contracts
+```
+
+then change into the newly made directory:
+
+```bash
+cd verify_contracts
+```
+
+You should have a folder structure similar to this:
+
+```bash
+├── lib
+├── script
+├── src
+└── test
+```
+
+The `src` folder will contain a `Counter.sol` file which will serve as the contract you want to deploy.
+
+
+**You will need ETH on Base to deploy**
+
+You (the deployer wallet) will need some ETH in order to broadcast the transaction to the Base network. Fortunately, transactions are usually < 1 cent on Base mainnet.
+
+If using a [Coinbase Wallet] use the "Buy" button to onramp crypto from your Coinbase account.
+
+
+
+You will need a private key of the wallet that you want to deploy the smart contract from. Obtain it and store it as an env variable in your terminal.
+
+Once you have the private key to the wallet of your choice, open your terminal and store it in an environment variable:
+
+```bash
+export PRIVATE_KEY=""
+```
+
+To deploy our contract you will need an RPC URL to a Base node in order to broadcast our transactions to the network. [CDP] provides us with a free node for interacting with Base mainnet and testnet.
+
+Obtain an rpc url from the [Node product] and store the url as an environment variable similar to the private key in the previous step.
+
+
+
+Then store it as an environment variable in your terminal:
+
+```bash
+export BASE_RPC_URL="your_base_rpc_url"
+```
+
+It's deployment time! Deploy the `Counter.sol` contract using `forge create --rpc-url $BASE_RPC_URL --private-key $PRIVATE_KEY src/Counter.sol:Counter`
+
+Once deployed, it should return something like this:
+
+```bash
+[⠊] Compiling...
+[⠢] Compiling 1 files with Solc 0.8.26
+[⠆] Solc 0.8.26 finished in 1.23s
+Compiler run successful!
+Deployer: 0xLo69e5523D33FBDbF133E81C91639e9d3C6cb369
+Deployed to: 0xEF5fe818Cb814E5c8277C5F12B57106B4EC3DdaA
+Transaction hash: 0xb191f9679a1fee253cf430ac09a6838f6806cfb2a250757fef407880f5546836
+```
+
+Congrats! You've now deployed a contract to Base. The output of the deployment command contains a contract address (e.g `Deployed to: 0xEF5fe818Cb814E5c8277C5F12B57106B4EC3DdaA`). Copy this address as you will need it in the next step.
+
+### Verify the contract
+
+You will now interact with the [Basescan API]. For this, you need API Keys. Create an account using an email or [login to Basescan].
+
+After signing in, navigate to your [Basescan account] then select `API Keys` on the left navigation bar.
+
+
+
+From the [API Key page], click the blue "Add" button to create a new API Key then copy your `API Key Token`
+
+
+
+Save this to your clipboard for the next step.
+
+Create a `.js` file to create a function to that will call the Basescan's contract verification endpoint.
+
+In your terminal create a new file: `touch verifyContractBasescan.js` then open this file in your IDE of choice.
+
+At the top of the file create a variable that contains the `Counter.sol` that was created from your foundry project.
+
+```javascript
+const sourceCode = `pragma solidity ^0.8.13;
+contract Counter {
+ uint256 public number;
+ function setNumber(uint256 newNumber) public {
+ number = newNumber;
+}
+ function increment() public {
+ number++;
+ }
+}`;
+```
+
+Create an `async` function to call the basescan api. Basescan offers a few endpoints to interact with their api with the base url being: `https://api.basescan.org/api`
+
+To verify a contract you will use the `verifysourcecode` route, with the `contract` module, and your `apiKey` as query parameters.
+
+
+**Unsure what data to input?**
+
+In every foundry project you will have a `.json` file that contains the contracts metadata and ABI. For this particular project, this information is located in the `/verify_contracts/out/Counter.sol/Counter.json`
+
+Under the `Metadata` object you will find the compiler version under `evmversion`
+
+
+
+Putting everything together, our function will look like this:
+
+```
+async function verifySourceCode() {
+ const url = 'https://api.basescan.org/api';
+
+ const params = new URLSearchParams({
+ module: 'contract',
+ action: 'verifysourcecode',
+ apikey: 'DK8M329VYXDSKTF633ABTK3SAEZ2U9P8FK', //remove hardcode
+ });
+
+ const data = new URLSearchParams({
+ chainId: '8453',
+ codeformat: 'solidity-single-file',
+ sourceCode: sourceCode,
+ contractaddress: '0x8aB096ea9886ACe363f81068d2439033F67F62E4',
+ contractname: 'Counter',
+ compilerversion: 'v0.8.26+commit.8a97fa7a',
+ optimizationUsed: 0,
+ evmversion: 'paris',
+ });
+ }
+```
+
+Now add a `try-catch` block to send the request and log any errors to the console.
+
+Your final file should look something like this:
+
+```javascript
+const sourceCode = `pragma solidity ^0.8.13;
+
+contract Counter {
+ uint256 public number;
+
+ function setNumber(uint256 newNumber) public {
+ number = newNumber;
+ }
+
+ function increment() public {
+ number++;
+ }
+}`;
+
+async function verifySourceCode() {
+ const url = 'https://api.basescan.org/api';
+
+ const params = new URLSearchParams({
+ module: 'contract',
+ action: 'verifysourcecode',
+ apikey: 'YOUR_API_KEY',
+ });
+
+ const data = new URLSearchParams({
+ chainId: '8453',
+ codeformat: 'solidity-single-file',
+ sourceCode: sourceCode,
+ contractaddress: '0x8aB096ea9886ACe363f81068d2439033F67F62E4',
+ contractname: 'Counter',
+ compilerversion: 'v0.8.26+commit.8a97fa7a',
+ optimizationUsed: 0,
+ evmversion: 'paris',
+ });
+
+ try {
+ const response = await fetch(`${url}?${params}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ body: data,
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const result = await response.json();
+ console.log(result);
+ return result;
+ } catch (error) {
+ console.error('Error:', error);
+ throw error;
+ }
+}
+
+verifySourceCode().catch((error) => console.error('Unhandled error:', error));
+```
+
+Save your file and then run `node verifyContractBasescan.js` in your terminal
+
+If successful, your terminal will output JSON text with three properties `status`, `message` and `result` like below:
+
+```bash
+{
+ status: '1',
+ message: 'OK',
+ result: 'cqjzzvppgswqw5adq4v6iq4xkmf519pj1higvcxsdiwcvwxemd'
+}
+```
+
+Result is the GUID and is a unique identifier for checking the status of your contracts verification.
+
+To verify the contract, let's create a curl request with the following parameters
+
+```bash
+curl "https://api.basescan.org/api?module=contract&action=checkverifystatus&guid=cqjzzvppgswqw5adq4v6iq4xkmf519pj1higvcxsdiwcvwxemd&apikey=DK8M329VYXDSKTF633ABTK3SAEZ2U9P8FK"
+```
+
+Run the command and you will see a that the contract should already be verified based on the `result` field
+
+```json
+{ "status": "0", "message": "NOTOK", "result": "Already Verified" }
+```
+
+## Conclusion
+
+Congratulations! You’ve successfully deployed and verified a smart contract using the Basescan API. Now, your users don’t have to rely solely on your word—they can verify the contract’s functionality through the code itself.
+
+
+
+[Coinbase Developer Platform]: https://portal.cdp.coinbase.com/
+[Base RPC Node]: https://portal.cdp.coinbase.com/products/node
+[CDP]: https://portal.cdp.coinbase.com/
+[Base]: https://base.org/
+[Basescan]: https://basescan.org/
+[Solidity]: https://soliditylang.org/
+[Basescan account]: https://basescan.org/myaccount/
+[API Key page]: https://basescan.org/myapikey/
+[Basescan API]: https://docs.basescan.org/
+[login to Basescan]: https://basescan.org/login/
+[Node product]: https://portal.cdp.coinbase.com/products/node/
+[deploy smart contracts]: https://docs.base.org/tutorials/deploy-with-foundry/
+[Base Learn]: https://docs.base.org/learn/welcome/
+[Foundry]: https://book.getfoundry.sh/getting-started/installation
diff --git a/docs/pages/cookbook/smart-contract-development/hardhat/analyzing-test-coverage.mdx b/_pages/cookbook/smart-contract-development/hardhat/analyzing-test-coverage.mdx
similarity index 100%
rename from docs/pages/cookbook/smart-contract-development/hardhat/analyzing-test-coverage.mdx
rename to _pages/cookbook/smart-contract-development/hardhat/analyzing-test-coverage.mdx
diff --git a/docs/pages/cookbook/smart-contract-development/hardhat/debugging-smart-contracts.mdx b/_pages/cookbook/smart-contract-development/hardhat/debugging-smart-contracts.mdx
similarity index 100%
rename from docs/pages/cookbook/smart-contract-development/hardhat/debugging-smart-contracts.mdx
rename to _pages/cookbook/smart-contract-development/hardhat/debugging-smart-contracts.mdx
diff --git a/docs/pages/cookbook/smart-contract-development/hardhat/deploy-with-hardhat.md b/_pages/cookbook/smart-contract-development/hardhat/deploy-with-hardhat.mdx
similarity index 99%
rename from docs/pages/cookbook/smart-contract-development/hardhat/deploy-with-hardhat.md
rename to _pages/cookbook/smart-contract-development/hardhat/deploy-with-hardhat.mdx
index db3d783a..d05bb514 100644
--- a/docs/pages/cookbook/smart-contract-development/hardhat/deploy-with-hardhat.md
+++ b/_pages/cookbook/smart-contract-development/hardhat/deploy-with-hardhat.mdx
@@ -147,11 +147,10 @@ WALLET_KEY=""
Substituting `` with the private key for your wallet.
-:::caution
-
+
`WALLET_KEY` is the private key of the wallet to use when deploying a contract. For instructions on how to get your private key from Coinbase Wallet, visit the [Coinbase Wallet documentation](https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings#show-private-key). **It is critical that you do NOT commit this to a public repo**
+
-:::
### Local Networks
@@ -239,15 +238,14 @@ npx hardhat run scripts/deploy.ts --network base-sepolia
The contract will be deployed on the Base Sepolia test network. You can view the deployment status and contract by using a [block explorer](/chain/block-explorers) and searching for the address returned by your deploy script. If you've deployed an exact copy of the NFT contract above, it will already be verified and you'll be able to read and write to the contract using the web interface.
-:::info
-
+
If you'd like to deploy to mainnet, you'll modify the command like so:
```bash
npx hardhat run scripts/deploy.ts --network base-mainnet
```
+
-:::
Regardless of the network you're deploying to, if you're deploying a new or modified contract, you'll need to verify it first.
@@ -278,13 +276,12 @@ etherscan: {
},
```
-:::info
-
+
You can get your Basescan API key from [basescan.org](https://basescan.org/myapikey) when you sign up for an account.
+
-:::
-
+{/* */}
```tsx
@@ -306,11 +303,10 @@ etherscan: {
},
```
-:::info
-
+
You can get your Blockscout API key from [here](https://base-sepolia.blockscout.com/account/api_key) after you sign up for an account.
+
-:::
@@ -348,8 +344,7 @@ Successfully verified contract NFT on Etherscan.
-:::info
-
+
You can't re-verify a contract identical to one that has already been verified. If you attempt to do so, such as verifying the above contract, you'll get an error similar to:
```text
@@ -357,8 +352,8 @@ Error in plugin @nomiclabs/hardhat-etherscan: The API responded with an unexpect
Contract verification may have succeeded and should be checked manually.
Message: Already Verified
```
+
-:::
Search for your contract on [Blockscout](https://base-sepolia.blockscout.com/) or [Basescan](https://sepolia.basescan.org/) to confirm it is verified.
diff --git a/docs/pages/cookbook/smart-contract-development/hardhat/optimizing-gas-usage.md b/_pages/cookbook/smart-contract-development/hardhat/optimizing-gas-usage.mdx
similarity index 100%
rename from docs/pages/cookbook/smart-contract-development/hardhat/optimizing-gas-usage.md
rename to _pages/cookbook/smart-contract-development/hardhat/optimizing-gas-usage.mdx
diff --git a/docs/pages/cookbook/smart-contract-development/hardhat/reducing-contract-size.md b/_pages/cookbook/smart-contract-development/hardhat/reducing-contract-size.mdx
similarity index 100%
rename from docs/pages/cookbook/smart-contract-development/hardhat/reducing-contract-size.md
rename to _pages/cookbook/smart-contract-development/hardhat/reducing-contract-size.mdx
diff --git a/docs/pages/cookbook/smart-contract-development/remix/deploy-with-remix.mdx b/_pages/cookbook/smart-contract-development/remix/deploy-with-remix.mdx
similarity index 98%
rename from docs/pages/cookbook/smart-contract-development/remix/deploy-with-remix.mdx
rename to _pages/cookbook/smart-contract-development/remix/deploy-with-remix.mdx
index a82474c4..1b31eed1 100644
--- a/docs/pages/cookbook/smart-contract-development/remix/deploy-with-remix.mdx
+++ b/_pages/cookbook/smart-contract-development/remix/deploy-with-remix.mdx
@@ -5,6 +5,8 @@ description: "A tutorial that teaches how to deploy a smart contract on the Base
author: briandoyle81
---
+import { Danger } from "/snippets/danger.mdx";
+
# Deploying a smart contract using Remix
[Remix] is an online IDE that you can use to rapidly develop and deploy smart contracts. If you're new to smart contracts, it's a great tool that lets you jump right in without needing to configure a local editor or struggle through environment configuration issues before getting started.
@@ -13,11 +15,10 @@ Remix contains a simulation of a blockchain that you can use to rapidly deploy a
In this article, we'll give you an overview of Remix, and show you how to deploy a contract to **Base Sepolia** testnet.
-:::info
-
+
For production / mainnet deployments the steps below in this tutorial will be almost identical, however, you'll want to ensure that you've selected `Base` (mainnet) as the network rather than `Base Sepolia` (testnet).
+
-:::
If you're already familiar with Remix, you probably want to jump down to [here].
@@ -73,15 +74,14 @@ The _Deploy & Run Transactions_ plugin is what you'll use to deploy your contrac
Fix any errors you introduced to `1_Storage.sol` and click the orange `Deploy` button. You'll see your contract appear below as _STORAGE AT \_.
-:::caution
-
+
There are a couple gotchas that can be very confusing with deploying contracts in Remix.
First, every time you hit the Deploy button, a new copy of your contract is deployed, but the previous deployments remain. Unless you are comparing or debugging between different versions of a contract, or deploying multiple contracts at once, you should click the `Trash` button to erase old deployments before deploying again.
Second, if your code will not compile, **clicking the deploy button will not generate an error!** Instead, the last compiled version will be deployed. Visually check and confirm that there are no errors indicated by a number in a red circle on top of the Compiler plugin.
+
-:::
## Prepare for Deployment
@@ -91,13 +91,12 @@ Testnets operate in a similar, **but not exactly the same** manner as the main n
If you already have a wallet set up **exclusively for development**, you can skip to the next section. Otherwise, now is the time to jump in!
-:::danger
-
+
It is very dangerous to use a wallet with valuable assets for development. You could easily write code with a bug that transfers the wrong amount of the wrong token to the wrong address. Transactions cannot be reversed once sent!
Be safe and use separate wallets for separate purposes.
+
-:::
First, add the [Coinbase] or [MetaMask] wallet to your browser, and [set up] a new wallet. As a developer, you need to be doubly careful about the security of your wallet! Many apps grant special powers to the wallet address that is the owner of the contract, such as allowing the withdrawal of all the Ether that customers have paid to the contract, or changing critical settings.
@@ -151,21 +150,19 @@ Click the orange _Deploy_ button. Because it costs gas to deploy a contract, you

-:::danger
-
+
Always carefully review all transactions, confirming the transaction cost, assets transferred, and network. As a developer, you'll get used to approving transactions regularly. Do the best you can to avoid getting into the habit of clicking _Confirm_ without reviewing the transaction carefully. If you feel pressured to _Confirm_ before you run out of time, it is almost certainly a scam.
+
-:::
After you click the _Confirm_ button, return to Remix and wait for the transaction to deploy. Copy its address and navigate to [`sepolia.basescan.org`]. **Note:** If you deployed to mainnet, you'll navigate to [`basescan.org`] instead.
### Verify the Contract
-:::info
-
+
You don't need to verify the contract if you've deployed one identical to a contract that has already been verified.
+
-:::
You can interact with your deployed contract using Remix, the same as before, but it's also possible to interact with it through [BaseScan]. Paste your address in the search field to find it.
diff --git a/docs/pages/cookbook/smart-contract-development/tenderly/deploy-with-tenderly.mdx b/_pages/cookbook/smart-contract-development/tenderly/deploy-with-tenderly.mdx
similarity index 99%
rename from docs/pages/cookbook/smart-contract-development/tenderly/deploy-with-tenderly.mdx
rename to _pages/cookbook/smart-contract-development/tenderly/deploy-with-tenderly.mdx
index 3ac19c24..4aea7617 100644
--- a/docs/pages/cookbook/smart-contract-development/tenderly/deploy-with-tenderly.mdx
+++ b/_pages/cookbook/smart-contract-development/tenderly/deploy-with-tenderly.mdx
@@ -52,15 +52,17 @@ Follow these steps to set up your DevNet template for Base Network:

-:::info
+
If needed, check out the Tenderly documentation for more information on [setting up a Devnet template](https://docs.tenderly.co/devnets/intro-to-devnets#basic-devnet-usage).
-:::
+
+
4. Click **Spawn DevNet,** and that's about it - you've got your own private replica of Base Network.
-:::info
+
If needed, check out the Tenderly documentation for more alternative [methods to spawn a DevNet](https://docs.tenderly.co/devnets/advanced/automated-devnet-spawning-bash-and-javascript).
-:::
+
+
### 4. Customize your DevNet environment
@@ -289,9 +291,10 @@ In addition, we can **change the state of the contract** before simulating a tra
6. Click **Add**.
7. Click **Simulate**.
-:::info
+
Note that this has overridden the existing state with a new default greeting. This functionality allows you to run transaction simulations under custom conditions.
-:::
+
+
## Use DevNets in Continuous Integration (CI)
diff --git a/docs/pages/cookbook/smart-contract-development/thirdweb/build-with-thirdweb.mdx b/_pages/cookbook/smart-contract-development/thirdweb/build-with-thirdweb.mdx
similarity index 99%
rename from docs/pages/cookbook/smart-contract-development/thirdweb/build-with-thirdweb.mdx
rename to _pages/cookbook/smart-contract-development/thirdweb/build-with-thirdweb.mdx
index 17bc78e2..1f224b9d 100644
--- a/docs/pages/cookbook/smart-contract-development/thirdweb/build-with-thirdweb.mdx
+++ b/_pages/cookbook/smart-contract-development/thirdweb/build-with-thirdweb.mdx
@@ -51,11 +51,10 @@ Follow these steps to set up your NFT collection:

-:::info
-
+
For production / mainnet deployments select `Base` (mainnet) as the network rather than `Base Sepolia`.
+
-:::
Post-deployment, you can manage your smart contract via the [thirdweb dashboard](https://thirdweb.com/dashboard/contracts).
@@ -118,11 +117,10 @@ ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
The above code imports and uses `BaseSepoliaTestnet` to be the `activeChain`.
-:::info
-
+
For production / mainnet deployments, update the information above so that the `chain` variable is `base` (step ii), the `blockExplorer` is `https://basescan.org` (step iii), and update both instances of `BaseSepoliaTestnet` to `Base` in the example javascript code.
+
-:::
## Running the Application
diff --git a/docs/pages/cookbook/smart-contract-development/thirdweb/deploy-with-thirdweb.mdx b/_pages/cookbook/smart-contract-development/thirdweb/deploy-with-thirdweb.mdx
similarity index 99%
rename from docs/pages/cookbook/smart-contract-development/thirdweb/deploy-with-thirdweb.mdx
rename to _pages/cookbook/smart-contract-development/thirdweb/deploy-with-thirdweb.mdx
index f4a95dcd..8422579e 100644
--- a/docs/pages/cookbook/smart-contract-development/thirdweb/deploy-with-thirdweb.mdx
+++ b/_pages/cookbook/smart-contract-development/thirdweb/deploy-with-thirdweb.mdx
@@ -105,11 +105,10 @@ From the dashboard, you will need to first enter the values for our contract's c
Finally, select the Base Sepolia test network as the [network](https://blog.thirdweb.com/guides/which-network-should-you-use/) you want to deploy to, and click **Deploy Now**.
-:::info
-
+
For production / mainnet deployments select `Base` (mainnet) as the network rather than `Base Sepolia`.
+
-:::
Once your contract is deployed, you'll be redirected to a [dashboard](https://thirdweb.com/dashboard) for managing your contract.
diff --git a/docs/pages/cookbook/smart-contract-development/thirdweb/thirdweb-cli.mdx b/_pages/cookbook/smart-contract-development/thirdweb/thirdweb-cli.mdx
similarity index 97%
rename from docs/pages/cookbook/smart-contract-development/thirdweb/thirdweb-cli.mdx
rename to _pages/cookbook/smart-contract-development/thirdweb/thirdweb-cli.mdx
index ea31626b..5b6001de 100644
--- a/docs/pages/cookbook/smart-contract-development/thirdweb/thirdweb-cli.mdx
+++ b/_pages/cookbook/smart-contract-development/thirdweb/thirdweb-cli.mdx
@@ -21,8 +21,7 @@ Create a new project with thirdweb installed and configured:
npx thirdweb create
```
-:::info
-
+
When you create a project for smart contracts or web3 apps there are various configurable options.
**For contracts, some options are:**
@@ -36,8 +35,8 @@ When you create a project for smart contracts or web3 apps there are various con
- Front end applications using Next, CRA or Vite
- Backend applications using Node.js or Express.js
- Choice of TypeScript or JavaScript variants
+
-:::
## Deploying a smart contract
@@ -47,17 +46,15 @@ When you create a project for smart contracts or web3 apps there are various con
npx thirdweb deploy
```
-:::info
-
+
To deploy to the Base network, after running `npx thirdweb deploy`, visit the provided dashboard URL and select Base from the Network dropdown.
+
-:::
-
-:::info
+
For a complete guide on using the thirdweb CLI to create and deploy contracts on Base, see [Deploy a smart contract on Base testnet](https://blog.thirdweb.com/guides/how-to-deploy-a-smart-contract-to-base-network-testnet-coinbase-l2/).
+
-:::
## Publishing a smart contract
diff --git a/docs/pages/cookbook/smart-contract-development/thirdweb/thirdweb-sdk.mdx b/_pages/cookbook/smart-contract-development/thirdweb/thirdweb-sdk.mdx
similarity index 99%
rename from docs/pages/cookbook/smart-contract-development/thirdweb/thirdweb-sdk.mdx
rename to _pages/cookbook/smart-contract-development/thirdweb/thirdweb-sdk.mdx
index cf70f54f..2c30eeff 100644
--- a/docs/pages/cookbook/smart-contract-development/thirdweb/thirdweb-sdk.mdx
+++ b/_pages/cookbook/smart-contract-development/thirdweb/thirdweb-sdk.mdx
@@ -36,8 +36,7 @@ const sdk = new ThirdwebSDK(Base);
const contract = await sdk.getContract('0x0000000000000000000000000000000000000000');
```
-:::info
-
+
The code snippet above uses the [React SDK](https://portal.thirdweb.com/react). The thirdweb SDKs are also available in [React Native](https://portal.thirdweb.com/react-native), [TypeScript](https://portal.thirdweb.com/typescript), [Python](https://portal.thirdweb.com/python), [Go](https://portal.thirdweb.com/go), and [Unity](https://portal.thirdweb.com/unity).
If alternatively you'd like to initialize the SDK with Base Sepolia (testnet), use the following code instead:
@@ -49,18 +48,17 @@ import { ThirdwebSDK } from '@thirdweb-dev/sdk/evm';
const sdk = new ThirdwebSDK(BaseSepoliaTestnet);
const contract = await sdk.getContract('0x0000000000000000000000000000000000000000');
```
+
-:::
## Interacting with smart contracts
Once you initialize the SDK and connect to a smart contract deployed to Base, you can start calling functions on it using the SDK.
-:::info
-
+
Any interaction you make with a smart contract will be made from the connected wallet automatically.
+
-:::
### Using contract extension functions
diff --git a/docs/pages/cookbook/token-gating/gate-irl-events-with-nouns.mdx b/_pages/cookbook/token-gating/gate-irl-events-with-nouns.mdx
similarity index 99%
rename from docs/pages/cookbook/token-gating/gate-irl-events-with-nouns.mdx
rename to _pages/cookbook/token-gating/gate-irl-events-with-nouns.mdx
index 723c10e6..e0a9b061 100644
--- a/docs/pages/cookbook/token-gating/gate-irl-events-with-nouns.mdx
+++ b/_pages/cookbook/token-gating/gate-irl-events-with-nouns.mdx
@@ -5,6 +5,8 @@ description: Learn how to gate entry to an IRL event for members of a Nounish DA
author: briandoyle81
---
+import { Danger } from "/snippets/danger.mdx";
+
# Gate IRL Events with Nouns
You've probably seen people in onchain communities use ⌐◨-◨ in their profile names. These are called _Nouns Goggles_, or _Noggles_. They're an ASCII representation of the glasses found on every procedurally generated [Nouns] NFT avatar. The [Nouns Auction] makes one new Noun available for auction every single day - forever!
@@ -42,11 +44,10 @@ You can use the contracts in the [Nouns Monorepo] to deploy your own DAO, but th
Navigate to the [Testnet Builder DAO] site and connect your wallet.
-:::danger
-
+
The name of this site is a little misleading. It will treat the DAOs you create here as test DAOs, but it deploys contracts on Base Mainnet, **not** Base Sepolia. Luckily, gas is inexpensive enough that this isn't a terrible price.
+
-:::
Click the green circle in the upper right, and select `Create a DAO`
@@ -66,11 +67,10 @@ For testing, you'll want the `Auction Reserve Price` as low as possible, .0001 E
Set `Veto Power` and initial `Token Allocation` as you see fit. To speed up testing, you may wish to grant several addresses here.
-:::caution
-
+
The app gets confused if you change addresses from the browser extension wallet, copy them from another window, or another location.
+
-:::
### Artwork
diff --git a/docs/pages/cookbook/use-case-guides/cast-actions.mdx b/_pages/cookbook/use-case-guides/cast-actions.mdx
similarity index 99%
rename from docs/pages/cookbook/use-case-guides/cast-actions.mdx
rename to _pages/cookbook/use-case-guides/cast-actions.mdx
index 9f5d4ba2..424d8a63 100644
--- a/docs/pages/cookbook/use-case-guides/cast-actions.mdx
+++ b/_pages/cookbook/use-case-guides/cast-actions.mdx
@@ -9,11 +9,10 @@ author: briandoyle81
[Cast Actions] are a new feature of [Farcaster] that enable you to create actions that users can install on their Farcaster client and then click a button on any cast to trigger the action. In this tutorial, you'll learn how to build a simple cast action with [OnchainKit] that returns a message to the Farcaster client.
-:::caution
-
+
Cast Actions are brand new and tools for building them are evolving quickly. Check the [Cast Actions] docs and OnchainKit [changelog]!
+
-:::
## Objectives
diff --git a/docs/pages/cookbook/use-case-guides/commerce/build-an-ecommerce-app.mdx b/_pages/cookbook/use-case-guides/commerce/build-an-ecommerce-app.mdx
similarity index 99%
rename from docs/pages/cookbook/use-case-guides/commerce/build-an-ecommerce-app.mdx
rename to _pages/cookbook/use-case-guides/commerce/build-an-ecommerce-app.mdx
index cb8b9c5f..56fa0950 100644
--- a/docs/pages/cookbook/use-case-guides/commerce/build-an-ecommerce-app.mdx
+++ b/_pages/cookbook/use-case-guides/commerce/build-an-ecommerce-app.mdx
@@ -148,10 +148,12 @@ For visual appeal, add an image of your product to the `/public` folder. This im
```
-:::tip[use conditional rendering]
+
+**use conditional rendering**
When setting up the payment component, it's important to implement conditional rendering. This ensures that the payment button only appears once the user's wallet is connected. This approach provides a smoother user experience and prevents potential errors from attempting to initiate a payment before a wallet is available.
-:::
+
+
Finally, configure the Pay component within your JSX. Wrap the `PayButton` and `PayStatus` components inside the `Pay` component, passing your `productId` as a prop to the `Pay` component. Set the `coinbaseBranded` prop on the `PayButton` to true for consistent branding. This setup creates a complete payment flow, allowing users to initiate a payment and view its status all within your application.
diff --git a/docs/pages/cookbook/use-case-guides/commerce/deploy-a-shopify-storefront.mdx b/_pages/cookbook/use-case-guides/commerce/deploy-a-shopify-storefront.mdx
similarity index 97%
rename from docs/pages/cookbook/use-case-guides/commerce/deploy-a-shopify-storefront.mdx
rename to _pages/cookbook/use-case-guides/commerce/deploy-a-shopify-storefront.mdx
index c3bac0a1..ff56cfc9 100644
--- a/docs/pages/cookbook/use-case-guides/commerce/deploy-a-shopify-storefront.mdx
+++ b/_pages/cookbook/use-case-guides/commerce/deploy-a-shopify-storefront.mdx
@@ -67,11 +67,12 @@ Click `Install` and you should be redirected to Coinbase Commerce with a prompt
This tutorial will guide you through the steps to create a new Hydrogen storefront for your Shopify store. This will allow you to showcase the products you already have in your Shopify account. Make sure you've already created your products by following the [Shopify products guide](https://help.shopify.com/en/manual/online-sales-channels/shop/products-and-collections).
-:::warning[Shopify Basic Plan Required]
+
+**Shopify Basic Plan Required**
To access the Hydrogen and Oxygen APIs, Shopify requires users to have at least a Basic Plan. The following steps will not work without this plan configured.
+
-:::
To get started, clone a Shopify demo store using the Hydrogen framework. This will give us a quick setup to work with.
@@ -92,11 +93,12 @@ Next, open a new terminal. You'll need to link your Hydrogen project to your Sho
npx shopify hydrogen link
```
-:::info[Install Hydrogen sales channel]
+
+**Install Hydrogen sales channel**
You will need to create access tokens for your own Shopify store. This is done by installing the [Hydrogen sales channel](https://apps.shopify.com/hydrogen?shpxid=4c8ddf03-1A48-4F61-D565-FB8DC4E5A4A0), which includes built-in support for Oxygen, Shopify's global edge hosting platform.
+
-:::
The Shopify quickstart comes with a Mock Shop as a template. To ensure your storefront is configured with your products, update the project environment variables.
@@ -106,13 +108,14 @@ The following code pulls the necessary settings from your Shopify account into t
npx shopify hydrogen env pull
```
-:::note[Not seeing your products?]
+
+**Not seeing your products?**
Your Shopify store should have products.
Visit [Shopify products guide](https://help.shopify.com/en/manual/online-sales-channels/shop/products-and-collections) for more details.
+
-:::
Now, verify that everything is set up correctly and your site is running. Start the development server again:
@@ -137,11 +140,12 @@ You've successfully created and deployed your Hydrogen storefront.
Visit your new storefront and add an item to your cart. Proceed to view your cart and then proceed to checkout. On the payment screen, you should see Coinbase Commerce automatically appear as an additional payment method alongside your existing payment options.
-:::info[Not seeing a crypto payment option?]
+
+**Not seeing a crypto payment option?**
Remember to link "activate" your Coinbase Commerce plugin.
+
-:::
## Conclusion
diff --git a/docs/pages/cookbook/use-case-guides/create-email-campaigns.mdx b/_pages/cookbook/use-case-guides/create-email-campaigns.mdx
similarity index 99%
rename from docs/pages/cookbook/use-case-guides/create-email-campaigns.mdx
rename to _pages/cookbook/use-case-guides/create-email-campaigns.mdx
index 47000d46..3acff5b0 100644
--- a/docs/pages/cookbook/use-case-guides/create-email-campaigns.mdx
+++ b/_pages/cookbook/use-case-guides/create-email-campaigns.mdx
@@ -41,11 +41,12 @@ This project will house your integration settings and project-specific credentia
You will now set up your development environment.
-:::tip[Integrating Resend to an existing project?]
+
+**Integrating Resend to an existing project?**
If you’re planning to integrate Resend into an existing project, feel free to skip ahead to the backend section where we’ll create custom API routes for interacting with Resend.
+
-:::
To begin, you’ll need to fork the [OnchainKit App template] from GitHub by clicking the green `Use this template` button. This template provides a solid foundation for building onchain applications and will be used as the base for our demo.
@@ -74,11 +75,12 @@ The OnchainKit template uses [Bun] as the package manager. If you don’t have B
bun curl -fsSL | bash
```
-:::tip[Is Bun Installed?]
+
+**Is Bun Installed?**
After installation, you may need to restart your terminal or run source ~/.bashrc (or ~/.zshrc) to ensure Bun is recognized as a command.
+
-:::
Next, install the Resend package to handle email campaign functionality within your app:
@@ -105,11 +107,10 @@ RESEND_API_KEY="YOUR_RESEND_API_KEY"
RESEND_AUDIENCE_ID="YOUR_RESEND_AUDIENCE_ID"
```
-:::note
-
+
Make sure to replace the placeholder values (YOUR_COINBASE_API_KEY, etc.) with your actual keys.
+
-:::
## Deploy template to Vercel
@@ -125,11 +126,12 @@ In the next step, Vercel will prompt you to import a Git repository. Click on Im
This step connects your GitHub (or other Git provider) account with Vercel, allowing Vercel to pull the code from your repository.
-:::note[Private Repos]
+
+**Private Repos**
If your project is private, you’ll see an option to Configure GitHub App. Click this button to give Vercel the necessary permissions to access your private repository. Follow the prompts to complete the authorization process.
+
-:::
After Vercel has access to your repository, you’ll be guided through the final deployment steps. Vercel will automatically detect the settings for your project, but you may want to double-check that everything is correct, such as the project name and deployment settings.
diff --git a/docs/pages/cookbook/use-case-guides/creator/convert-farcaster-frame-to-open-frame.mdx b/_pages/cookbook/use-case-guides/creator/convert-farcaster-frame-to-open-frame.mdx
similarity index 98%
rename from docs/pages/cookbook/use-case-guides/creator/convert-farcaster-frame-to-open-frame.mdx
rename to _pages/cookbook/use-case-guides/creator/convert-farcaster-frame-to-open-frame.mdx
index ad9ecdb7..b1c11937 100644
--- a/docs/pages/cookbook/use-case-guides/creator/convert-farcaster-frame-to-open-frame.mdx
+++ b/_pages/cookbook/use-case-guides/creator/convert-farcaster-frame-to-open-frame.mdx
@@ -24,12 +24,14 @@ To convert your Farcaster Frame to an Open Frame, we need to make several change
3. Adjust button configurations
4. Remove Farcaster-specific validations
-:::tip[Your Frame can support Farcaster and Open Frames]
+
+**Your Frame can support Farcaster and Open Frames**
If you want to have support for Open Frames and Farcaster Frames, create a new route that is specific to the protocol you want.
For example `src/app/frame-fc` is the route for farcaster frames and `src/app/frame-of` will render frames using the open frame spec.
-:::
+
+
Let's go through each of these changes step by step.
@@ -130,11 +132,10 @@ if (!text) {
// Process the request...
```
-:::note
-
+
When converting from a Farcaster Frame to an Open Frame, the message validation process changes significantly. Farcaster Frames use [signed messages] to ensure authenticity, while Open Frames don't require this validation. You should be aware of this trade-off and implement additional security measures if needed.
+
-:::
## Adjust the Button Configurations
@@ -270,13 +271,15 @@ Repeat this process for any of the additional routes you may want to convert fro
Before redeploying your Frame check how the routes differ using the [Frame Debugger]. The frame debugger should be used to validate that your frame follows the Openframe protocol spec.
-:::tip[use `Anonymous`]
+
+**use `Anonymous`**
+
Frame Dugger allows you to select the protocol you wish to debug.
For Open Frame, use the `anonymous (openframes)` option

+
-:::
### Before:
diff --git a/docs/pages/cookbook/use-case-guides/creator/nft-minting-with-zora.mdx b/_pages/cookbook/use-case-guides/creator/nft-minting-with-zora.mdx
similarity index 99%
rename from docs/pages/cookbook/use-case-guides/creator/nft-minting-with-zora.mdx
rename to _pages/cookbook/use-case-guides/creator/nft-minting-with-zora.mdx
index 75799cb3..d5139c00 100644
--- a/docs/pages/cookbook/use-case-guides/creator/nft-minting-with-zora.mdx
+++ b/_pages/cookbook/use-case-guides/creator/nft-minting-with-zora.mdx
@@ -92,11 +92,10 @@ You can also delete the files for the components you removed. You still need `On
### Creating the Premint from the App
-:::info
-
+
Gas on Base is currently inexpensive enough that we're doing this tutorial on the live network! Zora supports Base Sepolia as well, so feel free to use that instead.
+
-:::
Open `src/app/wagmi.ts` and convert the references of `baseSepolia` to `base`.
diff --git a/docs/pages/cookbook/use-case-guides/deploy-to-vercel.mdx b/_pages/cookbook/use-case-guides/deploy-to-vercel.mdx
similarity index 99%
rename from docs/pages/cookbook/use-case-guides/deploy-to-vercel.mdx
rename to _pages/cookbook/use-case-guides/deploy-to-vercel.mdx
index 244c91db..bb60a484 100644
--- a/docs/pages/cookbook/use-case-guides/deploy-to-vercel.mdx
+++ b/_pages/cookbook/use-case-guides/deploy-to-vercel.mdx
@@ -85,21 +85,19 @@ You should see the `Import Git Repository` screen:

-:::info
-
+
If you've come back to Vercel after a few months, it may be unclear how to add more repos. To do so, use the `Add New...` dropdown on the projects page to get to the screen above, then click `Adjust GitHub App Permissions ->`. Scroll down in the popup window to find your list of repos to add.

+
-:::
Click the button, then configure your project. The [a-frame-in-100-lines] example uses `Next.js`, which is made by the same people as Vercel, so the default settings are fine. Pick a new name if you'd like, then click `Deploy`.
-:::caution
-
+
You won't have been the first person to name a project `a-frame-in-100-lines`, so Vercel will adjust the name for you for the file path, if you gave your template copy the same name. Don't be confused when your changes don't show up at `a-frame-in-100-lines.vercel.app`, that one isn't yours!
+
-:::
After the deploy completes, click `Continue to Dashboard`.
diff --git a/_pages/cookbook/use-case-guides/finance/access-real-time-asset-data-pyth-price-feeds.mdx b/_pages/cookbook/use-case-guides/finance/access-real-time-asset-data-pyth-price-feeds.mdx
new file mode 100644
index 00000000..89b038eb
--- /dev/null
+++ b/_pages/cookbook/use-case-guides/finance/access-real-time-asset-data-pyth-price-feeds.mdx
@@ -0,0 +1,248 @@
+---
+title: Accessing real-time asset data using Pyth Price Feeds
+slug: /oracles-pyth-price-feeds
+description: A tutorial that teaches how to use Pyth Price Feeds to access real-time asset data, directly from your smart contracts on the Base testnet.
+author: taycaldwell
+---
+
+# Accessing real-time asset data using Pyth Price Feeds
+
+This tutorial will guide you through the process of creating a smart contract on Base that utilizes Pyth Network oracles to consume a price feed.
+
+## Objectives
+
+By the end of this tutorial you should be able to do the following:
+
+- Set up a smart contract project for Base using Foundry
+- Install the Pyth smart contracts
+- Consume a Pyth Network price feed within your smart contract
+- Deploy and test your smart contracts on Base
+
+## Prerequisites
+
+### Foundry
+
+This tutorial requires you to have Foundry installed.
+
+- From the command-line (terminal), run: `curl -L https://foundry.paradigm.xyz | bash`
+- Then run `foundryup`, to install the latest (nightly) build of Foundry
+
+For more information, see the Foundry Book [installation guide](https://book.getfoundry.sh/getting-started/installation).
+
+### Coinbase Wallet
+
+In order to deploy a smart contract, you will first need a wallet. You can create a wallet by downloading the Coinbase Wallet browser extension.
+
+- Download [Coinbase Wallet](https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad?hl=en)
+
+### Wallet funds
+
+Deploying contracts to the blockchain requires a gas fee. Therefore, you will need to fund your wallet with ETH to cover those gas fees.
+
+For this tutorial, you will be deploying a contract to the Base Sepolia test network. You can fund your wallet with Base Sepolia ETH using one of the faucets listed on the Base [Network Faucets](https://docs.base.org/chain/network-faucets) page.
+
+## What is Pyth Network?
+
+**Pyth Network** focuses on ultra-low latency and real-time data, making it suitable for financial applications that require sub-second updates. Pyth's design emphasizes performance, and it is designed to provide data for a range of traditional and DeFi assets.
+
+## Creating a project
+
+Before you can begin writing smart contracts for Base and consuming Pyth price feeds, you need to set up your development environment by creating a Foundry project.
+
+To create a new Foundry project, first create a new directory:
+
+```bash
+mkdir myproject
+```
+
+Then run:
+
+```bash
+cd myproject
+forge init
+```
+
+This will create a Foundry project, which has the following basic layout:
+
+```bash
+.
+├── foundry.toml
+├── script
+ │ └── Counter.s.sol
+├── src
+ │ └── Counter.sol
+└── test
+ └── Counter.t.sol
+```
+
+## Installing Pyth smart contracts
+
+To use Pyth price feeds within your project, you need to install Pyth oracle contracts as a project dependency using `forge install`.
+
+To install Pyth oracle contracts, run:
+
+```bash
+forge install pyth-network/pyth-sdk-solidity@v2.2.0 --no-git --no-commit
+```
+
+Once installed, update your `foundry.toml` file by appending the following line:
+
+```bash
+remappings = ['@pythnetwork/pyth-sdk-solidity/=lib/pyth-sdk-solidity']
+```
+
+## Writing and compiling the Smart Contract
+
+Once your project has been created and dependencies have been installed, you can now start writing a smart contract.
+
+The Solidity code below defines a smart contract named `ExampleContract`. The code uses the `IPyth` interface from the [Pyth Solidity SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/target_chains/ethereum/sdk/solidity).
+
+An instance of`IPyth` is defined within the contract that provides functions for consuming Pyth price feeds. The constructor for the `IPyth` interface expects a contract address to be provided. This address provided in the code example below (`0xA2aa501b19aff244D90cc15a4Cf739D2725B5729`) corresponds to the Pyth contract address for the Base Sepolia testnet.
+
+
+Pyth also supports other EVM networks, such as Base Mainnet. For a list of all network contract addresses, visit the [Pyth documentation](https://docs.pyth.network/documentation/pythnet-price-feeds/evm).
+
+
+
+The contract also contains a function named `getLatestPrice`. This function takes a provided `priceUpdateData` that is used to get updated price data, and returns the price given a `priceId` of a price feed. The smart contract provided below uses a `priceId` of `0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace`, which corresponds to the price feed for `ETH / USD`.
+
+
+Pyth provides a number of price feeds. For a list of available price feeds, visit the [Pyth documentation](https://pyth.network/developers/price-feed-ids#pyth-evm-stable).
+
+
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import "@pythnetwork/pyth-sdk-solidity/IPyth.sol";
+import "@pythnetwork/pyth-sdk-solidity/PythStructs.sol";
+
+contract ExampleContract {
+ IPyth pyth;
+
+ /**
+ * Network: Base Sepolia (testnet)
+ * Address: 0xA2aa501b19aff244D90cc15a4Cf739D2725B5729
+ */
+ constructor() {
+ pyth = IPyth(0xA2aa501b19aff244D90cc15a4Cf739D2725B5729);
+ }
+
+ function getLatestPrice(
+ bytes[] calldata priceUpdateData
+ ) public payable returns (PythStructs.Price memory) {
+ // Update the prices to the latest available values and pay the required fee for it. The `priceUpdateData` data
+ // should be retrieved from our off-chain Price Service API using the `pyth-evm-js` package.
+ // See section "How Pyth Works on EVM Chains" below for more information.
+ uint fee = pyth.getUpdateFee(priceUpdateData);
+ pyth.updatePriceFeeds{ value: fee }(priceUpdateData);
+
+ bytes32 priceID = 0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace;
+ // Read the current value of priceID, aborting the transaction if the price has not been updated recently.
+ // Every chain has a default recency threshold which can be retrieved by calling the getValidTimePeriod() function on the contract.
+ // Please see IPyth.sol for variants of this function that support configurable recency thresholds and other useful features.
+ return pyth.getPrice(priceID);
+ }
+}
+```
+
+In your project, add the code provided above to a new file named `src/ExampleContract.sol` and delete the `src/Counter.sol` contract that was generated with the project (You can also delete the `test/Counter.t.sol` and `script/Counter.s.sol` files).
+
+To compile the new smart contract, run:
+
+```bash
+forge build
+```
+
+## Deploying the smart contract
+
+### Setting up your wallet as the deployer
+
+Before you can deploy your smart contract to the Base network, you will need to set up a wallet to be used as the deployer.
+
+To do so, you can use the [`cast wallet import`](https://book.getfoundry.sh/reference/cast/cast-wallet-import) command to import the private key of the wallet into Foundry's securely encrypted keystore:
+
+```bash
+cast wallet import deployer --interactive
+```
+
+After running the command above, you will be prompted to enter your private key, as well as a password for signing transactions.
+
+
+For instructions on how to get your private key from Coinbase Wallet, visit the [Coinbase Wallet documentation](https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings#show-private-key).
+
+**It is critical that you do NOT commit this to a public repo**.
+
+
+
+To confirm that the wallet was imported as the `deployer` account in your Foundry project, run:
+
+```bash
+cast wallet list
+```
+
+### Setting up environment variables for Base Sepolia
+
+To setup your environment for deploying to the Base network, create an `.env` file in the home directory of your project, and add the RPC URL for the Base Sepolia testnet:
+
+```
+BASE_SEPOLIA_RPC="https://sepolia.base.org"
+```
+
+Once the `.env` file has been created, run the following command to load the environment variables in the current command line session:
+
+```bash
+source .env
+```
+
+### Deploying the smart contract to Base Sepolia
+
+With your contract compiled and environment setup, you are ready to deploy the smart contract to the Base Sepolia Testnet!
+
+For deploying a single smart contract using Foundry, you can use the `forge create` command. The command requires you to specify the smart contract you want to deploy, an RPC URL of the network you want to deploy to, and the account you want to deploy with.
+
+To deploy the `ExampleContract` smart contract to the Base Sepolia test network, run the following command:
+
+```bash
+forge create ./src/ExampleContract.sol:ExampleContract --rpc-url $BASE_SEPOLIA_RPC --account deployer
+```
+
+When prompted, enter the password that you set earlier, when you imported your wallet's private key.
+
+
+Your wallet must be funded with ETH on the Base Sepolia Testnet to cover the gas fees associated with the smart contract deployment. Otherwise, the deployment will fail.
+
+To get testnet ETH for Base Sepolia, see the [prerequisites](#prerequisites).
+
+
+
+After running the command above, the contract will be deployed on the Base Sepolia test network. You can view the deployment status and contract by using a [block explorer](/chain/block-explorers).
+
+## Interacting with the Smart Contract
+
+The `getLatestPrice(bytes[])` function of the deployed contract takes a `priceUpdateData` argument that is used to get the latest price. This data can be fetched using the Hermes web service. Hermes allows users to easily query for recent price updates via a REST API. Make a curl request to fetch the `priceUpdateData` the `priceId`, `0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace`:
+
+```
+curl https://hermes.pyth.network/api/latest_vaas?ids[]=0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace
+```
+
+Once you have the `priceUpdateData`, you can use Foundry's `cast` command-line tool to interact with the smart contract and call the `getLatestPrice(bytes[])` function to fetch the latest price of ETH.
+
+To call the `getLatestPrice(bytes[])` function of the smart contract, run the following command, replacing `` with the address of your deployed contract, and `` with the `priceUpdateData` returned by the Hermes endpoint:
+
+```bash
+cast call --rpc-url $BASE_SEPOLIA_RPC "getLatestPrice(bytes[])"
+```
+
+You should receive the latest `ETH / USD` price in hexadecimal form.
+
+## Conclusion
+
+Congratulations! You have successfully deployed and interacted with a smart contract that consumes a Pyth Network oracle to access a real-time price feed on Base.
+
+To learn more about Oracles and using Pyth Network price feeds within your smart contracts on Base, check out the following resources:
+
+- [Oracles](https://docs.base.org/chain/oracles)
+- [Pyth Network Price Feeds](https://docs.pyth.network/documentation/pythnet-price-feeds/evm)
+
diff --git a/_pages/cookbook/use-case-guides/finance/access-real-world-data-chainlink.mdx b/_pages/cookbook/use-case-guides/finance/access-real-world-data-chainlink.mdx
new file mode 100644
index 00000000..63fa89e6
--- /dev/null
+++ b/_pages/cookbook/use-case-guides/finance/access-real-world-data-chainlink.mdx
@@ -0,0 +1,232 @@
+---
+title: Accessing real-world data using Chainlink Data Feeds
+slug: /oracles-chainlink-price-feeds
+description: A tutorial that teaches how to use Chainlink Data Feeds to access real-world data, such as asset prices, directly from your smart contracts on the Base testnet.
+author: taycaldwell
+---
+
+# Accessing real-world data using Chainlink Data Feeds
+
+This tutorial will guide you through the process of creating a smart contract on Base that utilizes Chainlink Data Feeds to access real-world data, such as asset prices, directly from your smart contracts.
+
+## Objectives
+
+By the end of this tutorial you should be able to do the following:
+
+- Set up a smart contract project for Base using Foundry
+- Install the Chainlink smart contracts
+- Consume a Chainlink price data feed within your smart contract
+- Deploy and test your smart contracts on Base
+
+## Prerequisites
+
+### Foundry
+
+This tutorial requires you to have Foundry installed.
+
+- From the command-line (terminal), run: `curl -L https://foundry.paradigm.xyz | bash`
+- Then run `foundryup`, to install the latest (nightly) build of Foundry
+
+For more information, see the Foundry Book [installation guide](https://book.getfoundry.sh/getting-started/installation).
+
+### Coinbase Wallet
+
+In order to deploy a smart contract, you will first need a wallet. You can create a wallet by downloading the Coinbase Wallet browser extension.
+
+- Download [Coinbase Wallet](https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad?hl=en)
+
+### Wallet funds
+
+Deploying contracts to the blockchain requires a gas fee. Therefore, you will need to fund your wallet with ETH to cover those gas fees.
+
+For this tutorial, you will be deploying a contract to the Base Goerli test network. You can fund your wallet with Base Goerli ETH using one of the faucets listed on the Base [Network Faucets](https://docs.base.org/chain/network-faucets) page.
+
+## What are Chainlink Data Feeds?
+
+Accurate price data is essential in DeFi applications. However, blockchain networks lack the capability to directly fetch external real-world data, leading to the "[Oracle Problem](https://chain.link/education-hub/oracle-problem)".
+
+Chainlink Data Feeds offer a solution to this problem by serving as a secure middleware layer that bridges the gap between real-world asset prices and onchain smart contracts.
+
+## Creating a project
+
+Before you can begin writing smart contracts for Base and consuming Chainlink data feeds, you need to set up your development environment by creating a Foundry project.
+
+To create a new Foundry project, first create a new directory:
+
+```bash
+mkdir myproject
+```
+
+Then run:
+
+```bash
+cd myproject
+forge init
+```
+
+This will create a Foundry project, which has the following basic layout:
+
+```bash
+.
+├── foundry.toml
+├── script
+ │ └── Counter.s.sol
+├── src
+ │ └── Counter.sol
+└── test
+ └── Counter.t.sol
+```
+
+## Installing Chainlink smart contracts
+
+To use Chainlink's data feeds within your project, you need to install Chainlink smart contracts as a project dependency using `forge install`.
+
+To install Chainlink smart contracts, run:
+
+```bash
+forge install smartcontractkit/chainlink --no-commit
+```
+
+Once installed, update your `foundry.toml` file by appending the following line:
+
+```bash
+remappings = ['@chainlink/contracts/=lib/chainlink/contracts']
+```
+
+## Writing and compiling the Smart Contract
+
+Once your project has been created and dependencies have been installed, you can now start writing a smart contract.
+
+The Solidity code below defines a smart contract named `DataConsumerV3`. The code uses the `AggregatorV3Interface` interface from the [Chainlink contracts library](https://docs.chain.link/data-feeds/api-reference#aggregatorv3interface) to provide access to price feed data.
+
+The smart contract passes an address to `AggregatorV3Interface`. This address (`0xcD2A119bD1F7DF95d706DE6F2057fDD45A0503E2`) corresponds to the `ETH/USD` price feed on the Base Goerli network.
+
+
+Chainlink provides a number of price feeds for Base. For a list of available price feeds on Base, visit the [Chainlink documentation](https://docs.chain.link/data-feeds/price-feeds/addresses/?network=base&page=1).
+
+
+
+```solidity
+ // SPDX-License-Identifier: MIT
+ pragma solidity ^0.8.0;
+
+ import "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol";
+
+ contract DataConsumerV3 {
+ AggregatorV3Interface internal priceFeed;
+
+ /**
+ * Network: Base Goerli
+ * Aggregator: ETH/USD
+ * Address: 0xcD2A119bD1F7DF95d706DE6F2057fDD45A0503E2
+ */
+ constructor() {
+ priceFeed = AggregatorV3Interface(0xcD2A119bD1F7DF95d706DE6F2057fDD45A0503E2);
+ }
+
+ function getLatestPrice() public view returns (int) {
+ (
+ /* uint80 roundID */,
+ int price,
+ /* uint startedAt */,
+ /* uint timeStamp */,
+ /* uint80 answeredInRound */
+ ) = priceFeed.latestRoundData();
+ return price;
+ }
+ }
+```
+
+In your project, add the code provided above to a new file named `src/DataConsumerV3.sol`, and delete the `src/Counter.sol` contract that was generated with the project. (you can also delete the `test/Counter.t.sol` and `script/Counter.s.sol` files).
+
+To compile the new smart contract, run:
+
+```bash
+forge build
+```
+
+## Deploying the smart contract
+
+### Setting up your wallet as the deployer
+
+Before you can deploy your smart contract to the Base network, you will need to set up a wallet to be used as the deployer.
+
+To do so, you can use the [`cast wallet import`](https://book.getfoundry.sh/reference/cast/cast-wallet-import) command to import the private key of the wallet into Foundry's securely encrypted keystore:
+
+```bash
+cast wallet import deployer --interactive
+```
+
+After running the command above, you will be prompted to enter your private key, as well as a password for signing transactions.
+
+
+For instructions on how to get your private key from Coinbase Wallet, visit the [Coinbase Wallet documentation](https://docs.cloud.coinbase.com/wallet-sdk/docs/developer-settings#show-private-key).
+
+**It is critical that you do NOT commit this to a public repo**.
+
+
+
+To confirm that the wallet was imported as the `deployer` account in your Foundry project, run:
+
+```bash
+cast wallet list
+```
+
+### Setting up environment variables for Base Goerli
+
+To setup your environment for deploying to the Base network, create an `.env` file in the home directory of your project, and add the RPC URL for the Base Goerli testnet:
+
+```
+BASE_GOERLI_RPC="https://goerli.base.org"
+```
+
+Once the `.env` file has been created, run the following command to load the environment variables in the current command line session:
+
+```bash
+source .env
+```
+
+### Deploying the smart contract to Base Goerli
+
+With your contract compiled and environment setup, you are ready to deploy the smart contract to the Base Goerli Testnet!
+
+For deploying a single smart contract using Foundry, you can use the `forge create` command. The command requires you to specify the smart contract you want to deploy, an RPC URL of the network you want to deploy to, and the account you want to deploy with.
+
+To deploy the `DataConsumerV3` smart contract to the Base Goerli test network, run the following command:
+
+```bash
+forge create ./src/DataConsumerV3.sol:DataConsumerV3 --rpc-url $BASE_GOERLI_RPC --account deployer
+```
+
+When prompted, enter the password that you set earlier, when you imported your wallet's private key.
+
+
+Your wallet must be funded with ETH on the Base Goerli Testnet to cover the gas fees associated with the smart contract deployment. Otherwise, the deployment will fail.
+
+To get testnet ETH for Base Goerli, see the [prerequisites](#prerequisites).
+
+
+
+After running the command above, the contract will be deployed on the Base Goerli test network. You can view the deployment status and contract by using a [block explorer](/chain/block-explorers).
+
+## Interacting with the Smart Contract
+
+Foundry provides the `cast` command-line tool that can be used to interact with the smart contract that was deployed and call the `getLatestPrice()` function to fetch the latest price of ETH.
+
+To call the `getLatestPrice()` function of the smart contract, run:
+
+```bash
+cast call --rpc-url $BASE_GOERLI_RPC "getLatestPrice()"
+```
+
+You should receive the latest `ETH / USD` price in hexadecimal form.
+
+## Conclusion
+
+Congratulations! You have successfully deployed and interacted with a smart contract that consumes a Chainlink price feed on the Base blockchain network.
+
+To learn more about Oracles and using Chainlink to access real-world data within your smart contracts on Base, check out the following resources:
+
+- [Oracles](https://docs.base.org/chain/oracles)
+- [Chainlink Data Feeds on Base](https://docs.chain.link/data-feeds/price-feeds/addresses?network=base&page=1&search=#networks)
+
diff --git a/_pages/cookbook/use-case-guides/finance/build-a-smart-wallet-funding-app.mdx b/_pages/cookbook/use-case-guides/finance/build-a-smart-wallet-funding-app.mdx
new file mode 100644
index 00000000..5a748ce2
--- /dev/null
+++ b/_pages/cookbook/use-case-guides/finance/build-a-smart-wallet-funding-app.mdx
@@ -0,0 +1,164 @@
+---
+title: Add an In-App Onramp with OnchainKit
+description: Learn how to create a app that detects if a smart wallet has ETH and prompts users to add funds if needed.
+authors: [hughescoin]
+---
+
+# Add an In-App Onramp with OnchainKit
+
+In this tutorial, you'll learn how to build an onchain app that checks a user's wallet balance and either allows them to mint an NFT or prompts them to add funds. We'll use the OnchainKit App Template as a starting point.
+
+## Objectives
+
+By the end of this tutorial you should be able to:
+
+- Set up a project using the Onchain Kit App Template
+- Configure the app for to onboard users easily using [Smart Wallets]
+- Implement balance checking and conditional rendering
+- Use the Fund component to allow users to add funds to their wallet
+
+## Prerequisites
+
+### React and TypeScript
+
+You should be familiar with React and TypeScript. If you're new to these technologies, consider reviewing their [official documentation] first.
+
+### OnchainKit
+
+This tutorial uses Coinbase's Onchain Kit. Familiarity with its basic concepts will be helpful.
+
+### Access to the Coinbase Developer Platform
+
+You'll need to set up an account on with [Coinbase Developer Platform (CDP) Account](https://www.coinbase.com/cloud). The CDP provides various tools and services for blockchain development, including access to API endpoints and other resources that will be instrumental in your project. Once you've created your account, you'll be ready to move forward with integrating these services into your application.
+
+
+**CDP Configurations**
+
+If you see a "something went wrong" error message when navigating to pay.coinbase.com, make sure you have "enforce secure initialization" disabled on the [Onramp config page] in Coinbase Developer Platform Dashboard.
+
+
+
+
+
+## Setting up the Project
+
+To get started, clone the Onchain Kit App Template by running
+
+```bash
+git clone git@github.com:coinbase/onchain-app-template.git
+```
+
+in your terminal, then navigate into the project directory with:
+
+```bash
+cd onchain-app-template
+```
+
+Next, install the necessary dependencies by executing `bun install` followed by `bun install viem`.
+
+After setting up the project, you'll need to configure your environment variables. Create a `.env` file in the root directory of your project and add the following line: `NEXT_PUBLIC_WC_PROJECT_ID=your_project_id_here`. Remember to replace 'your_project_id_here' with your actual project ID. Additionally, don't forget to configure your apiKey in the `src/app/components/OnchainProviders.tsx` file.
+
+## Configuring for Smart Wallets
+
+To make the app work only with smart wallets, modify `src/wagmi.ts`:
+
+```typescript
+// Inside the useWagmiConfig() function, before the useMemo() hook
+coinbaseWallet.preference = 'smartWalletOnly';
+```
+
+## Implementing Balance Checking
+
+Now well implement a check on the user's wallet to see if they have enough funds. Before we implement this check, let's create a helper function that grabs the user's Ethereum balance using [viem]. To do so, create a `utils.ts` file in the `src` directory that creates a client connected to Base and fetches the user's ETH balance:
+
+```typescript
+import { createPublicClient, http } from 'viem';
+import { base } from 'viem/chains';
+import type { GetBalanceParameters } from 'viem';
+
+const publicClient = createPublicClient({
+ transport: http(),
+ chain: base,
+});
+
+export async function getBalance(address: GetBalanceParameters) {
+ const balance = publicClient.getBalance(address);
+ return balance;
+}
+```
+
+Next, import the `getBalance()` function into your main component file (e.g., `src/app/page.tsx`). You will want to add a few [react hooks] to fetch the balance and store it as a state variable. Add the following lines of code to your `page.tsx` file:
+
+```typescript
+import { useState, useEffect } from 'react';
+import { getBalance } from '../utils';
+import { FundButton } from '@coinbase/onchainkit/fund';
+
+// Inside your component
+const [walletBalance, setWalletBalance] = useState('');
+
+useEffect(() => {
+ async function fetchBalance() {
+ if (address) {
+ const balance = await getBalance({ address });
+ setWalletBalance(String(balance));
+ }
+ }
+ fetchBalance();
+}, [address]);
+```
+
+## Implementing Conditional Rendering
+
+Now that we know the user's balance, we can then have them mint an NFT or prompt them to fund their wallet if they do not have enough ETH.
+
+The end state is to show their balance along with the appropriate call to actions like so:
+
+
+
+Update your component's return statement with the following code:
+
+```typescript
+return (
+
+);
+```
+
+Sweet! Now our conditional rendering is in full force. If a user clicks on the `+ Add funds to transact` button they will be given three options for topping up their smart wallet:
+
+
+
+## Conclusion
+
+Congratulations! You've built a app that checks a user's smart wallet balance and provides appropriate options based on their funds.
+This app can serve as a foundation for more complex onchain applications that require users to have funded smart wallets.
+
+[Onchain Kit]: https://github.com/coinbase/onchainkit
+[Viem]: https://viem.sh/
+[Smart Wallets]: https://keys.coinbase.com/onboarding
+[viem]: https://viem.sh/docs/introduction
+[react hooks]: https://react.dev/reference/react/hooks
+[Onramp config page]: https://portal.cdp.coinbase.com/products/onramp
+[official documentation]: https://react.dev/
+
diff --git a/docs/pages/cookbook/use-case-guides/gating-and-redirects.mdx b/_pages/cookbook/use-case-guides/gating-and-redirects.mdx
similarity index 99%
rename from docs/pages/cookbook/use-case-guides/gating-and-redirects.mdx
rename to _pages/cookbook/use-case-guides/gating-and-redirects.mdx
index 8083f2e2..5d188cb0 100644
--- a/docs/pages/cookbook/use-case-guides/gating-and-redirects.mdx
+++ b/_pages/cookbook/use-case-guides/gating-and-redirects.mdx
@@ -226,11 +226,10 @@ Note that we're returning a `getFrameHtmlResponse` here, **not** a `getFrameMeta
On your own, try changing the "like" gate to require the user to follow you, recast, or all three!
-:::info
-
+
**Hint:** Take a close look at the `FrameValidationData` properties. [OnchainKit] makes this easy!
+
-:::
## Conclusion
diff --git a/docs/pages/cookbook/use-case-guides/hyperframes.mdx b/_pages/cookbook/use-case-guides/hyperframes.mdx
similarity index 99%
rename from docs/pages/cookbook/use-case-guides/hyperframes.mdx
rename to _pages/cookbook/use-case-guides/hyperframes.mdx
index 94773f41..4b3b9b18 100644
--- a/docs/pages/cookbook/use-case-guides/hyperframes.mdx
+++ b/_pages/cookbook/use-case-guides/hyperframes.mdx
@@ -69,11 +69,10 @@ const frameMetadata = getFrameMetadata({
});
```
-:::caution
-
+
Per the [Frames] specification, `state` is not an allowed property on the first frame.
+
-:::
Configure the rest of the metadata as you see fit. Remember, this won't show up in your frame, but it will appear if someone links your site to another platform that uses the standard Open Graph metadata.
diff --git a/docs/pages/cookbook/use-case-guides/nft-minting.mdx b/_pages/cookbook/use-case-guides/nft-minting.mdx
similarity index 99%
rename from docs/pages/cookbook/use-case-guides/nft-minting.mdx
rename to _pages/cookbook/use-case-guides/nft-minting.mdx
index 11532ead..46b43c53 100644
--- a/docs/pages/cookbook/use-case-guides/nft-minting.mdx
+++ b/_pages/cookbook/use-case-guides/nft-minting.mdx
@@ -6,6 +6,8 @@ authors:
- briandoyle81
---
+import { Danger } from "/snippets/danger.mdx";
+
# Farcaster Frames: Building an NFT airdrop Frame
[Frames] have taken the [Farcaster] world by storm. They allow you to place a small onchain app inside of a cast! In this tutorial, we'll show you how to build your first frame using [OnchainKit], and our [a-frame-in-100-lines] template.
@@ -88,19 +90,17 @@ function mintTo(address _recipient) public onlyOwner {
}
```
-:::info
-
+
You should also use a `mintTo` function that accepts an `address _recipient` if you are doing a mint transaction button. Doing so helps Farcaster more easily scan your transaction for safety.
+
-:::
You'll also want to keep track of addresses that have already minted, to prevent a few spammers from claiming all the NFTs!
-:::danger
-
+
Make sure you added `.env.local` to ``.gitignore`! **If you don't do this you are going to expose your key and lose your wallet!**
+
-:::
Create `.env.local` and add:
@@ -362,11 +362,10 @@ const url = new URL(req.url);
You'll use the BaseScan api to find the token information. Add your api key to your `.env` if you didn't already.
-:::caution
-
+
Note that BaseScan and Etherscan use different keys!
+
-:::
There isn't an sdk to install.
@@ -560,9 +559,10 @@ return new NextResponse(img, {
});
```
-:::caution
+
SVG images aren't working in Frames on mobile clients. Stay tuned on the Base channel for a fix! Or add a library here to return the image as a `.png` instead of a `.svg`.
-:::
+
+
**Remember to update your envars in Vercel**, redeploy, and test. You'll now see your NFT in the frame!
diff --git a/docs/pages/cookbook/use-case-guides/no-code-minting.mdx b/_pages/cookbook/use-case-guides/no-code-minting.mdx
similarity index 100%
rename from docs/pages/cookbook/use-case-guides/no-code-minting.mdx
rename to _pages/cookbook/use-case-guides/no-code-minting.mdx
diff --git a/docs/pages/cookbook/use-case-guides/transactions.mdx b/_pages/cookbook/use-case-guides/transactions.mdx
similarity index 99%
rename from docs/pages/cookbook/use-case-guides/transactions.mdx
rename to _pages/cookbook/use-case-guides/transactions.mdx
index 7e60c323..730d0694 100644
--- a/docs/pages/cookbook/use-case-guides/transactions.mdx
+++ b/_pages/cookbook/use-case-guides/transactions.mdx
@@ -224,11 +224,10 @@ Finally, return the transaction as a `NextResponse`:
return NextResponse.json(txData);
```
-:::info
-
+
If you find Warpcast errors or spins forever after receiving your transaction data, it can be handy to simulate the transaction on your service first. It makes debugging much easier and will rule out any errors in forming the transaction arguments. To learn how, check out viem's documentation on [Simulating Contract Interactions](https://viem.sh/docs/contract/simulateContract#simulatecontract).
+
-:::
### Setting Up the After Transaction Endpoint
@@ -282,11 +281,10 @@ export async function POST(req: NextRequest): Promise {
export const dynamic = 'force-dynamic';
```
-:::info
-
+
In certain applications you might want to monitor the status of the transaction at this point. It's possible it fails, takes a while, and/or you may want to do another operation _only after_ it has been confirmed. To do so you can make use of `message.transaction.hash` and build a frame flow that checks the status of the transaction by fetching the [transaction receipt](https://viem.sh/docs/actions/public/getTransactionReceipt#gettransactionreceipt).
+
-:::
## Conclusion
diff --git a/docs/pages/cookie-policy.mdx b/_pages/cookie-policy.mdx
similarity index 100%
rename from docs/pages/cookie-policy.mdx
rename to _pages/cookie-policy.mdx
diff --git a/docs/pages/docs.mdx b/_pages/docs.mdx
similarity index 100%
rename from docs/pages/docs.mdx
rename to _pages/docs.mdx
diff --git a/_pages/feedback.mdx b/_pages/feedback.mdx
new file mode 100644
index 00000000..203638e8
--- /dev/null
+++ b/_pages/feedback.mdx
@@ -0,0 +1,4 @@
+---
+title: "Feedback\n\nComing Soon"
+---
+
diff --git a/docs/pages/identity/basenames/basenames-faq.mdx b/_pages/identity/basenames/basenames-faq.mdx
similarity index 99%
rename from docs/pages/identity/basenames/basenames-faq.mdx
rename to _pages/identity/basenames/basenames-faq.mdx
index 8f0e6f42..082509cf 100644
--- a/docs/pages/identity/basenames/basenames-faq.mdx
+++ b/_pages/identity/basenames/basenames-faq.mdx
@@ -72,9 +72,10 @@ You can set your Basename as your primary name through Profile Management. Setti
You can transfer your Basename to another address through Profile Management:
-:::warning
+
**Make sure to use the Basenames UI to send Basenames properly, sends on platforms like OpenSea will only transfer the NFT.**
-:::
+
+
Transfer token ownership - transfers ownership of the Basename token and associated permissions.
Transfer management - transfers ability to manage and update profile records.
@@ -90,11 +91,10 @@ Step by step:
* Paste the ENS or address of the wallet you want to transfer the basename to
* Proceed to sign all four transactions to properly update the basename address, ownership, and profile records. The last transaction will be sending the NFT.
-:::info
-
+
**For the new owner to use the basename they will need to confirm by setting it as their [primary name](#9-how-do-i-set-my-basename-as-my-primary-name-for-my-address).**
+
-:::
### 11. What happens if I forget to renew my Basename?
diff --git a/docs/pages/identity/basenames/basenames-onchainkit-tutorial.mdx b/_pages/identity/basenames/basenames-onchainkit-tutorial.mdx
similarity index 98%
rename from docs/pages/identity/basenames/basenames-onchainkit-tutorial.mdx
rename to _pages/identity/basenames/basenames-onchainkit-tutorial.mdx
index 87a4598d..8bd0ace2 100644
--- a/docs/pages/identity/basenames/basenames-onchainkit-tutorial.mdx
+++ b/_pages/identity/basenames/basenames-onchainkit-tutorial.mdx
@@ -91,9 +91,12 @@ This configuration sets up the wagmi project to connect to the Base and BaseSepo
Now we’ll create a component to display the Basenames associated with an address.
-:::tip[Use Base as your chain]
+
+**Use Base as your chain**
+
Ensure Chain is Set to Base Be sure to set the `chain={base}` parameter; otherwise, it will default to ENS (Ethereum Name Service).
-:::
+
+
```typescript filename="src/components/basename.tsx"
'use client';
diff --git a/docs/pages/identity/basenames/basenames-wagmi-tutorial.mdx b/_pages/identity/basenames/basenames-wagmi-tutorial.mdx
similarity index 99%
rename from docs/pages/identity/basenames/basenames-wagmi-tutorial.mdx
rename to _pages/identity/basenames/basenames-wagmi-tutorial.mdx
index 0d11a03d..583ed431 100644
--- a/docs/pages/identity/basenames/basenames-wagmi-tutorial.mdx
+++ b/_pages/identity/basenames/basenames-wagmi-tutorial.mdx
@@ -43,11 +43,10 @@ export default [
] as const;
```
-:::tip
-
+
You will need to replace the placeholder comment with the actual ABI. Here is the link to the full [L2ResolverAbi].
+
-:::
To interact with the Base blockchain, you will need to update the wagmi configuration. This will allow your project to connect to the Base network and use its features.
@@ -86,11 +85,14 @@ Next, we'll create a new directory to house the functions that will resolve and
In your project folder, create the apis directory and add a basenames.tsx file:
-:::note[What's happening in the code?]
+
+**What's happening in the code?**
+
`convertReverseNodeToBytes()`: This function is creating the reverse node so we can look up a name given an address. Each address gets its own reverse record in our registry that's created in a deterministic way.
You can see the implementation of `convertReverseNodeToBytes()` in the [OnchainKit repo]
`BasenameTextRecordKeys`: Metadata (e.g., github, twitter, etc.) are stored as text records so we can look them up based on the enum key.
-:::
+
+
```typescript filename="src/apis/basenames.tsx"
import {
@@ -127,9 +129,10 @@ export async function getBasename(address: Address) {
This code provides the foundation for resolving Basenames using the Base network.
-:::tip
+
You can find the complete implementation in the full [basenames.tsx] file.
-:::
+
+
Now that the necessary functions are in place, you can implement the Basenames functionality in your app. For this example, we'll modify the `page.tsx` file to display Basename information on the server and client side.
diff --git a/docs/pages/identity/index.mdx b/_pages/identity/index.mdx
similarity index 100%
rename from docs/pages/identity/index.mdx
rename to _pages/identity/index.mdx
diff --git a/docs/pages/identity/mobile-wallet-protocol/batch.mdx b/_pages/identity/mobile-wallet-protocol/batch.mdx
similarity index 98%
rename from docs/pages/identity/mobile-wallet-protocol/batch.mdx
rename to _pages/identity/mobile-wallet-protocol/batch.mdx
index 5b39f8b1..1558f05c 100644
--- a/docs/pages/identity/mobile-wallet-protocol/batch.mdx
+++ b/_pages/identity/mobile-wallet-protocol/batch.mdx
@@ -1,4 +1,7 @@
-# Batch requests
+---
+title: "Batch requests"
+---
+
To improve UX by minimizing app switches,
MWP allows client apps to make requests with multiple actions at once.
diff --git a/docs/pages/identity/mobile-wallet-protocol/encryption.mdx b/_pages/identity/mobile-wallet-protocol/encryption.mdx
similarity index 99%
rename from docs/pages/identity/mobile-wallet-protocol/encryption.mdx
rename to _pages/identity/mobile-wallet-protocol/encryption.mdx
index 6beb216e..992ce832 100644
--- a/docs/pages/identity/mobile-wallet-protocol/encryption.mdx
+++ b/_pages/identity/mobile-wallet-protocol/encryption.mdx
@@ -1,4 +1,7 @@
-# Encryption
+---
+title: "Encryption"
+---
+
MWP uses deep links for direct communication between peers.
diff --git a/docs/pages/identity/mobile-wallet-protocol/handshake.mdx b/_pages/identity/mobile-wallet-protocol/handshake.mdx
similarity index 98%
rename from docs/pages/identity/mobile-wallet-protocol/handshake.mdx
rename to _pages/identity/mobile-wallet-protocol/handshake.mdx
index 83331d33..a6bfa14a 100644
--- a/docs/pages/identity/mobile-wallet-protocol/handshake.mdx
+++ b/_pages/identity/mobile-wallet-protocol/handshake.mdx
@@ -1,4 +1,7 @@
-# Handshake
+---
+title: "Handshake"
+---
+
For key exchange, client apps make `handshake` calls to ask wallets to generate and share a key to encrypt subsequent messages on the session.
diff --git a/docs/pages/identity/mobile-wallet-protocol/messages-example.mdx b/_pages/identity/mobile-wallet-protocol/messages-example.mdx
similarity index 100%
rename from docs/pages/identity/mobile-wallet-protocol/messages-example.mdx
rename to _pages/identity/mobile-wallet-protocol/messages-example.mdx
diff --git a/docs/pages/identity/mobile-wallet-protocol/messages-request.mdx b/_pages/identity/mobile-wallet-protocol/messages-request.mdx
similarity index 96%
rename from docs/pages/identity/mobile-wallet-protocol/messages-request.mdx
rename to _pages/identity/mobile-wallet-protocol/messages-request.mdx
index 27b43f1b..614524bb 100644
--- a/docs/pages/identity/mobile-wallet-protocol/messages-request.mdx
+++ b/_pages/identity/mobile-wallet-protocol/messages-request.mdx
@@ -1,4 +1,7 @@
-# Request content
+---
+title: "Request content"
+---
+
Request message has `request` as its `content`, which contains following:
diff --git a/docs/pages/identity/mobile-wallet-protocol/messages-response.mdx b/_pages/identity/mobile-wallet-protocol/messages-response.mdx
similarity index 97%
rename from docs/pages/identity/mobile-wallet-protocol/messages-response.mdx
rename to _pages/identity/mobile-wallet-protocol/messages-response.mdx
index 4de52dc8..d27f2389 100644
--- a/docs/pages/identity/mobile-wallet-protocol/messages-response.mdx
+++ b/_pages/identity/mobile-wallet-protocol/messages-response.mdx
@@ -1,4 +1,7 @@
-# Response content
+---
+title: "Response content"
+---
+
Response content can be either `response` or `failure`.
diff --git a/docs/pages/identity/mobile-wallet-protocol/messages.mdx b/_pages/identity/mobile-wallet-protocol/messages.mdx
similarity index 98%
rename from docs/pages/identity/mobile-wallet-protocol/messages.mdx
rename to _pages/identity/mobile-wallet-protocol/messages.mdx
index 2613ce60..c01abdfe 100644
--- a/docs/pages/identity/mobile-wallet-protocol/messages.mdx
+++ b/_pages/identity/mobile-wallet-protocol/messages.mdx
@@ -1,4 +1,7 @@
-# Messages
+---
+title: "Messages"
+---
+
Communications between client and server (wallet host) in MWP are through exchanging discrete stateless messages.
diff --git a/docs/pages/identity/mobile-wallet-protocol/multi-chain.mdx b/_pages/identity/mobile-wallet-protocol/multi-chain.mdx
similarity index 92%
rename from docs/pages/identity/mobile-wallet-protocol/multi-chain.mdx
rename to _pages/identity/mobile-wallet-protocol/multi-chain.mdx
index 9265e759..2b2845bf 100644
--- a/docs/pages/identity/mobile-wallet-protocol/multi-chain.mdx
+++ b/_pages/identity/mobile-wallet-protocol/multi-chain.mdx
@@ -1,4 +1,7 @@
-# Multi-chain support
+---
+title: "Multi-chain support"
+---
+
MWP is chain-agnostic.
As long as the wallet supports the chain and is able to process the requested actions, apps can communicate using MWP.
diff --git a/docs/pages/identity/mobile-wallet-protocol/network.mdx b/_pages/identity/mobile-wallet-protocol/network.mdx
similarity index 69%
rename from docs/pages/identity/mobile-wallet-protocol/network.mdx
rename to _pages/identity/mobile-wallet-protocol/network.mdx
index 4422686d..9b45670c 100644
--- a/docs/pages/identity/mobile-wallet-protocol/network.mdx
+++ b/_pages/identity/mobile-wallet-protocol/network.mdx
@@ -1,4 +1,7 @@
-# Transport layer
+---
+title: "Transport layer"
+---
+
Deep linking through universal links on iOS.
Intent + app links on android.
diff --git a/docs/pages/identity/mobile-wallet-protocol/spec-overview.mdx b/_pages/identity/mobile-wallet-protocol/spec-overview.mdx
similarity index 100%
rename from docs/pages/identity/mobile-wallet-protocol/spec-overview.mdx
rename to _pages/identity/mobile-wallet-protocol/spec-overview.mdx
diff --git a/docs/pages/identity/mobile-wallet-protocol/verification.mdx b/_pages/identity/mobile-wallet-protocol/verification.mdx
similarity index 96%
rename from docs/pages/identity/mobile-wallet-protocol/verification.mdx
rename to _pages/identity/mobile-wallet-protocol/verification.mdx
index 60aae1d7..72fab2a7 100644
--- a/docs/pages/identity/mobile-wallet-protocol/verification.mdx
+++ b/_pages/identity/mobile-wallet-protocol/verification.mdx
@@ -1,4 +1,7 @@
-# Verification
+---
+title: "Verification"
+---
+
Decentralized verification of participating apps’ authenticity using [.well-known](https://en.wikipedia.org/wiki/Well-known_URI) data without centralized registry
- [apple-app-site-association](https://developer.apple.com/documentation/xcode/supporting-associated-domains)
diff --git a/docs/pages/identity/smart-wallet/concepts/base-gasless-campaign.mdx b/_pages/identity/smart-wallet/concepts/base-gasless-campaign.mdx
similarity index 99%
rename from docs/pages/identity/smart-wallet/concepts/base-gasless-campaign.mdx
rename to _pages/identity/smart-wallet/concepts/base-gasless-campaign.mdx
index 9f42e852..79e9765f 100644
--- a/docs/pages/identity/smart-wallet/concepts/base-gasless-campaign.mdx
+++ b/_pages/identity/smart-wallet/concepts/base-gasless-campaign.mdx
@@ -1,4 +1,7 @@
-# Base Gasless Campaign
+---
+title: "Base Gasless Campaign"
+---
+
Base is offering gas credits to help developers make the most of
Smart Wallet's [paymaster (sponsored transactions)](/identity/smart-wallet/concepts/features/optional/gas-free-transactions) features.
diff --git a/docs/pages/identity/smart-wallet/concepts/features/built-in/MagicSpend.mdx b/_pages/identity/smart-wallet/concepts/features/built-in/MagicSpend.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/concepts/features/built-in/MagicSpend.mdx
rename to _pages/identity/smart-wallet/concepts/features/built-in/MagicSpend.mdx
index 81afff49..40f736e8 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/built-in/MagicSpend.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/built-in/MagicSpend.mdx
@@ -1,4 +1,7 @@
-# MagicSpend
+---
+title: "MagicSpend"
+---
+
MagicSpend enables Smart Wallet users to spend their Coinbase balances directly onchain. Users can connect their Coinbase account during the transaction flow, eliminating the need for manual onramps or transfers.
diff --git a/docs/pages/identity/smart-wallet/concepts/features/built-in/networks.mdx b/_pages/identity/smart-wallet/concepts/features/built-in/networks.mdx
similarity index 89%
rename from docs/pages/identity/smart-wallet/concepts/features/built-in/networks.mdx
rename to _pages/identity/smart-wallet/concepts/features/built-in/networks.mdx
index 18f26eae..4d51a723 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/built-in/networks.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/built-in/networks.mdx
@@ -1,6 +1,9 @@
-import { Callout } from "vocs/components";
+---
+title: "Networks"
+---
+
+;
-# Networks
The Smart Wallet contracts can be [permissionlessly deployed](https://github.com/coinbase/smart-wallet/tree/main?tab=readme-ov-file#deployments) on any EVM-compatible network.
Our SDK and client support the following networks.
diff --git a/docs/pages/identity/smart-wallet/concepts/features/built-in/passkeys.mdx b/_pages/identity/smart-wallet/concepts/features/built-in/passkeys.mdx
similarity index 91%
rename from docs/pages/identity/smart-wallet/concepts/features/built-in/passkeys.mdx
rename to _pages/identity/smart-wallet/concepts/features/built-in/passkeys.mdx
index da20fe71..4cf3ea5b 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/built-in/passkeys.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/built-in/passkeys.mdx
@@ -1,5 +1,3 @@
-import { Callout } from "vocs/components";
-
## Passkeys
Passkeys enable instant account creation and seamless authentication for Smart Wallet users, dramatically simplifying onboarding. By leveraging FIDO2-compliant authentication, passkeys eliminate seed phrases while providing enterprise-grade security for both wallet access and onchain ownership.
@@ -19,8 +17,8 @@ Passkeys leverage platform authenticator APIs for cross-device synchronization t
This enables seamless multi-device support without exposing the underlying cryptographic material.
-
- Account Recovery Considerations
+
+ **Account Recovery Considerations**
Without access to their passkey or a configured recovery key, users will permanently lose wallet access.
-
+
diff --git a/docs/pages/identity/smart-wallet/concepts/features/built-in/recovery-keys.mdx b/_pages/identity/smart-wallet/concepts/features/built-in/recovery-keys.mdx
similarity index 95%
rename from docs/pages/identity/smart-wallet/concepts/features/built-in/recovery-keys.mdx
rename to _pages/identity/smart-wallet/concepts/features/built-in/recovery-keys.mdx
index fc3a0995..5d83c504 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/built-in/recovery-keys.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/built-in/recovery-keys.mdx
@@ -1,6 +1,9 @@
-import { Callout } from "vocs/components";
+---
+title: "Recovery Keys"
+---
+
+;
-# Recovery Keys
Recovery keys provide a fallback authentication and signing mechanism for Smart Wallets when passkey access is lost.
diff --git a/docs/pages/identity/smart-wallet/concepts/features/built-in/single-sign-on.mdx b/_pages/identity/smart-wallet/concepts/features/built-in/single-sign-on.mdx
similarity index 94%
rename from docs/pages/identity/smart-wallet/concepts/features/built-in/single-sign-on.mdx
rename to _pages/identity/smart-wallet/concepts/features/built-in/single-sign-on.mdx
index 136bd256..4161ec77 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/built-in/single-sign-on.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/built-in/single-sign-on.mdx
@@ -1,4 +1,7 @@
-# Single Sign On
+---
+title: "Single Sign On"
+---
+
Smart Wallet is a single sign on for onchain apps. Users bring the same account, identity, and assets across apps.
diff --git a/docs/pages/identity/smart-wallet/concepts/features/optional/batch-operations.mdx b/_pages/identity/smart-wallet/concepts/features/optional/batch-operations.mdx
similarity index 91%
rename from docs/pages/identity/smart-wallet/concepts/features/optional/batch-operations.mdx
rename to _pages/identity/smart-wallet/concepts/features/optional/batch-operations.mdx
index 27c6df2d..bfe7d546 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/optional/batch-operations.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/optional/batch-operations.mdx
@@ -1,4 +1,7 @@
-# Batch Operations
+---
+title: "Batch Operations"
+---
+
Smart Wallet supports batch operations, which allow developers to perform multiple operations in a single transaction.
This is useful for reducing the number of transactions required to perform a complex operation, such as a swap or a multi-step transaction.
diff --git a/docs/pages/identity/smart-wallet/concepts/features/optional/custom-gas-tokens.mdx b/_pages/identity/smart-wallet/concepts/features/optional/custom-gas-tokens.mdx
similarity index 93%
rename from docs/pages/identity/smart-wallet/concepts/features/optional/custom-gas-tokens.mdx
rename to _pages/identity/smart-wallet/concepts/features/optional/custom-gas-tokens.mdx
index bdd84f91..f0bf7d2b 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/optional/custom-gas-tokens.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/optional/custom-gas-tokens.mdx
@@ -1,4 +1,7 @@
-# ERC20 Paymasters
+---
+title: "ERC20 Paymasters"
+---
+
Smart Wallet enables users to pay for gas in ERC20 tokens! This enables users to use app-specific tokens as payment for gas.
diff --git a/docs/pages/identity/smart-wallet/concepts/features/optional/gas-free-transactions.mdx b/_pages/identity/smart-wallet/concepts/features/optional/gas-free-transactions.mdx
similarity index 92%
rename from docs/pages/identity/smart-wallet/concepts/features/optional/gas-free-transactions.mdx
rename to _pages/identity/smart-wallet/concepts/features/optional/gas-free-transactions.mdx
index 20649d91..b15b0ba7 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/optional/gas-free-transactions.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/optional/gas-free-transactions.mdx
@@ -1,4 +1,7 @@
-# Gas-free Transactions
+---
+title: "Gas-free Transactions"
+---
+
Smart Wallet enables apps to pay for users' transaction gas fees, allowing free transactions or removing the need for users to hold native tokens.
diff --git a/docs/pages/identity/smart-wallet/concepts/features/optional/spend-permissions.mdx b/_pages/identity/smart-wallet/concepts/features/optional/spend-permissions.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/concepts/features/optional/spend-permissions.mdx
rename to _pages/identity/smart-wallet/concepts/features/optional/spend-permissions.mdx
index 1b7773c3..b7334880 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/optional/spend-permissions.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/optional/spend-permissions.mdx
@@ -1,4 +1,7 @@
-# Spend Permissions
+---
+title: "Spend Permissions"
+---
+
Spend Permissions enable third-party signers to spend assets (native and ERC-20 tokens) from users' wallets. Once granted, spend permissions
allow you to move your users' assets without any further signatures, unlocking use cases like subscriptions & trading bots. The reduced signing friction
diff --git a/docs/pages/identity/smart-wallet/concepts/features/optional/sub-accounts.mdx b/_pages/identity/smart-wallet/concepts/features/optional/sub-accounts.mdx
similarity index 95%
rename from docs/pages/identity/smart-wallet/concepts/features/optional/sub-accounts.mdx
rename to _pages/identity/smart-wallet/concepts/features/optional/sub-accounts.mdx
index 6f13e203..d6190a06 100644
--- a/docs/pages/identity/smart-wallet/concepts/features/optional/sub-accounts.mdx
+++ b/_pages/identity/smart-wallet/concepts/features/optional/sub-accounts.mdx
@@ -1,6 +1,9 @@
+---
+title: "Sub Accounts"
+---
+
import SubAccount from '@/components/smart-wallet/SubAccount';
-# Sub Accounts
Sub Accounts are hierarchical, app-specific accounts that extend from a user's primary Smart Wallet. Each Sub Account operates as a distinct account that can:
@@ -20,8 +23,11 @@ Sub Accounts are hierarchical, app-specific accounts that extend from a user's p
Refer to the [Implementation Guide](/identity/smart-wallet/guides/sub-accounts) or the [Technical Reference](/identity/smart-wallet/technical-reference/sdk/sub-account-reference) for more details on how to create and manage Sub Accounts.
-:::tip[Development]
+
+**Development**
+
Sub Accounts are currently only available in the Coinbase Smart Wallet development environment.
If you would like to use Sub Accounts with Coinbase Smart Wallet in our production environment, please [reach out](https://discord.com/invite/buildonbase) to the Base team.
-:::
+
+
diff --git a/docs/pages/identity/smart-wallet/concepts/usage-details/gas-usage.mdx b/_pages/identity/smart-wallet/concepts/usage-details/gas-usage.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/concepts/usage-details/gas-usage.mdx
rename to _pages/identity/smart-wallet/concepts/usage-details/gas-usage.mdx
index 6838bdc8..2a9d7ab6 100644
--- a/docs/pages/identity/smart-wallet/concepts/usage-details/gas-usage.mdx
+++ b/_pages/identity/smart-wallet/concepts/usage-details/gas-usage.mdx
@@ -1,4 +1,7 @@
-# Gas Usage
+---
+title: "Gas Usage"
+---
+
Smart Wallets use more gas for transactions than traditional Ethereum accounts. On L2 networks, the cost difference to the user is a matter of cents.
The gas difference is due to the additional overhead required for:
diff --git a/docs/pages/identity/smart-wallet/concepts/usage-details/popups.mdx b/_pages/identity/smart-wallet/concepts/usage-details/popups.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/concepts/usage-details/popups.mdx
rename to _pages/identity/smart-wallet/concepts/usage-details/popups.mdx
index 1c7c83dc..2bb616ac 100644
--- a/docs/pages/identity/smart-wallet/concepts/usage-details/popups.mdx
+++ b/_pages/identity/smart-wallet/concepts/usage-details/popups.mdx
@@ -1,4 +1,7 @@
-# Popup Tips
+---
+title: "Popup Tips"
+---
+
## Overview
When a Smart Wallet is connected and Coinbase Wallet SDK receives a request, it opens
diff --git a/docs/pages/identity/smart-wallet/concepts/usage-details/self-calls.mdx b/_pages/identity/smart-wallet/concepts/usage-details/self-calls.mdx
similarity index 87%
rename from docs/pages/identity/smart-wallet/concepts/usage-details/self-calls.mdx
rename to _pages/identity/smart-wallet/concepts/usage-details/self-calls.mdx
index 75e4af1d..ddef4cdb 100644
--- a/docs/pages/identity/smart-wallet/concepts/usage-details/self-calls.mdx
+++ b/_pages/identity/smart-wallet/concepts/usage-details/self-calls.mdx
@@ -1,4 +1,7 @@
-# Self Calls
+---
+title: "Self Calls"
+---
+
For security reasons, we do not allow 3rd party apps to make calls to a user's own Smart Wallet address.
This could allow apps to change owners, upgrade the user's account, or cause other issues.
\ No newline at end of file
diff --git a/docs/pages/identity/smart-wallet/concepts/usage-details/signature-verification.mdx b/_pages/identity/smart-wallet/concepts/usage-details/signature-verification.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/concepts/usage-details/signature-verification.mdx
rename to _pages/identity/smart-wallet/concepts/usage-details/signature-verification.mdx
index b9e370be..cb692fed 100644
--- a/docs/pages/identity/smart-wallet/concepts/usage-details/signature-verification.mdx
+++ b/_pages/identity/smart-wallet/concepts/usage-details/signature-verification.mdx
@@ -1,4 +1,7 @@
-# Signature Verification
+---
+title: "Signature Verification"
+---
+
There are important details to verifying smart contract wallet signatures. The smart contract itself
cannot produce a signature. Instead, the contract has a function
diff --git a/docs/pages/identity/smart-wallet/concepts/usage-details/simulations.mdx b/_pages/identity/smart-wallet/concepts/usage-details/simulations.mdx
similarity index 91%
rename from docs/pages/identity/smart-wallet/concepts/usage-details/simulations.mdx
rename to _pages/identity/smart-wallet/concepts/usage-details/simulations.mdx
index ae705fcb..0776dc4e 100644
--- a/docs/pages/identity/smart-wallet/concepts/usage-details/simulations.mdx
+++ b/_pages/identity/smart-wallet/concepts/usage-details/simulations.mdx
@@ -1,4 +1,7 @@
-# Transaction Simulation Data
+---
+title: "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
diff --git a/docs/pages/identity/smart-wallet/concepts/usage-details/wallet-library-support.mdx b/_pages/identity/smart-wallet/concepts/usage-details/wallet-library-support.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/concepts/usage-details/wallet-library-support.mdx
rename to _pages/identity/smart-wallet/concepts/usage-details/wallet-library-support.mdx
index 739d3463..253ce0c2 100644
--- a/docs/pages/identity/smart-wallet/concepts/usage-details/wallet-library-support.mdx
+++ b/_pages/identity/smart-wallet/concepts/usage-details/wallet-library-support.mdx
@@ -1,4 +1,7 @@
-# Wallet Library Support
+---
+title: "Wallet Library Support"
+---
+
Below are some popular wallet libraries and what we know of their plans for day 1 support for Smart Wallet.
diff --git a/docs/pages/identity/smart-wallet/concepts/what-is-smart-wallet.mdx b/_pages/identity/smart-wallet/concepts/what-is-smart-wallet.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/concepts/what-is-smart-wallet.mdx
rename to _pages/identity/smart-wallet/concepts/what-is-smart-wallet.mdx
index ae6c303c..ca6cdaa2 100644
--- a/docs/pages/identity/smart-wallet/concepts/what-is-smart-wallet.mdx
+++ b/_pages/identity/smart-wallet/concepts/what-is-smart-wallet.mdx
@@ -1,4 +1,7 @@
-# What is Smart Wallet?
+---
+title: "What is Smart Wallet?"
+---
+
Smart Wallet is a multi-chain self-custodial cryptocurrency wallet.
It enables users to create an onchain account in seconds
diff --git a/docs/pages/identity/smart-wallet/contribute/contribute-to-smart-wallet-docs.mdx b/_pages/identity/smart-wallet/contribute/contribute-to-smart-wallet-docs.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/contribute/contribute-to-smart-wallet-docs.mdx
rename to _pages/identity/smart-wallet/contribute/contribute-to-smart-wallet-docs.mdx
index 8f41680e..a40f51db 100644
--- a/docs/pages/identity/smart-wallet/contribute/contribute-to-smart-wallet-docs.mdx
+++ b/_pages/identity/smart-wallet/contribute/contribute-to-smart-wallet-docs.mdx
@@ -1,17 +1,17 @@
-import { Callout } from 'vocs/components'
-
-# Contribute to the Smart Wallet Docs
+---
+title: "Contribute to the Smart Wallet Docs"
+---
This guide is intended for all contributors who are adding new features, content, or making updates to the Smart Wallet documentation.
Following these guidelines ensures consistency and maintains
the documentation structure, making it easier for developers to find information.
-
+
**Why Documentation is Important**
Good documentation significantly accelerates developer adoption. Focus on creating content that helps developers understand and implement Smart Wallet features efficiently, while maintaining the documentation's structural integrity.
-
+
## Documentation Structure Guidelines
@@ -26,12 +26,12 @@ The Smart Wallet documentation is organized into the following main sections:
5. **Technical Reference**
6. **Contribute**
-
+
**Do not create new top-level sections**
All new content must fit within these existing sections.
-
+
### Section Purpose and Content Placement
@@ -82,14 +82,14 @@ When adding new content, determine the appropriate section based on the followin
- Information for contributors to the Smart Wallet project
- Update when contribution processes change
-
+
**Avoiding Subsection Proliferation**
- **For Guides**: Keep all guides at the same level under the Guides section
- **For Technical Reference**: Organize by component or feature, not by use case
- When tempted to add a new subsection, consider if the content could be reorganized to fit existing sections
- Use cross-referencing between related content rather than creating new organizational structures
-
+
## Documentation Style Guidelines
@@ -101,7 +101,7 @@ When adding new content, determine the appropriate section based on the followin
4. **Happy Path**: Focus on the happy path, but don't forget to mention the alternative paths.
5. [**AI-friendly**](#ai-friendly-writing-tips): Write in a way that is easy for AI to understand and follow.
-
+
**Make sure to review any AI generated content**
If you use AI to generate content:
@@ -110,7 +110,7 @@ If you use AI to generate content:
- Make sure that the content follows the guidelines in this document.
- Make sure that the content is easy for AI to understand and follow.
-
+
### AI-friendly Writing Tips
@@ -121,7 +121,7 @@ If you use AI to generate content:
- Use code blocks to highlight code.
- Use semantic urls that make sense even without context. Avoid abbreviations.
-
+
**Think like a Large Language Model**
When writing documentation, think about how a Large Language Model would understand the content.
@@ -134,7 +134,7 @@ You should continuously ask yourself:
If you can't answer yes to all of these questions, you need to rewrite the content.
-
+
### Formatting
diff --git a/docs/pages/identity/smart-wallet/contribute/security-and-bug-bounty.mdx b/_pages/identity/smart-wallet/contribute/security-and-bug-bounty.mdx
similarity index 93%
rename from docs/pages/identity/smart-wallet/contribute/security-and-bug-bounty.mdx
rename to _pages/identity/smart-wallet/contribute/security-and-bug-bounty.mdx
index 51a0d219..114946ed 100644
--- a/docs/pages/identity/smart-wallet/contribute/security-and-bug-bounty.mdx
+++ b/_pages/identity/smart-wallet/contribute/security-and-bug-bounty.mdx
@@ -1,4 +1,7 @@
-# Security and Bug Bounty
+---
+title: "Security and Bug Bounty"
+---
+
## Security Audits
diff --git a/docs/pages/identity/smart-wallet/examples/coin-a-joke-app.mdx b/_pages/identity/smart-wallet/examples/coin-a-joke-app.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/examples/coin-a-joke-app.mdx
rename to _pages/identity/smart-wallet/examples/coin-a-joke-app.mdx
index 4ad93aaa..58f23de8 100644
--- a/docs/pages/identity/smart-wallet/examples/coin-a-joke-app.mdx
+++ b/_pages/identity/smart-wallet/examples/coin-a-joke-app.mdx
@@ -1,7 +1,9 @@
-import GithubRepoCard from "@/components/GithubRepoCard"
-import { Callout } from 'vocs/components'
+---
+title: "Coin Your Bangers: Turn Your Jokes into Coins"
+---
+
+import { GithubRepoCard } from "/snippets/GithubRepoCard.mdx"
-# Coin Your Bangers: Turn Your Jokes into Coins
In this guide we illustrate how to use Smart Wallet and Zora's content coin SDK to create an engaging consumer application with great UX.
@@ -63,7 +65,7 @@ Smart Wallet allows you to onboard them with passkeys, a simple pop-up, and no n
allowFullScreen
>
-
+
**Does Zora use Smart Wallet?**
Yes, Zora integrates Smart Wallet smart contracts directly into their protocol.
@@ -71,7 +73,7 @@ This allows users to sign in to the app and create contentcoins without any addi
You can see the share of Zora from Smart Wallet transactions on the [Dune Dashboard](https://dune.com/wilsoncusack/coinbase-smart-wallet-kpis).
-
+
## Run the app
diff --git a/_pages/identity/smart-wallet/guides/batch-transactions.mdx b/_pages/identity/smart-wallet/guides/batch-transactions.mdx
new file mode 100644
index 00000000..59fe52b4
--- /dev/null
+++ b/_pages/identity/smart-wallet/guides/batch-transactions.mdx
@@ -0,0 +1,183 @@
+---
+title: "Batch Transactions"
+---
+
+
+With Smart Wallet, you can send multiple onchain calls in a single transaction. Doing so improves the UX of multi-step interactions by reducing them to a single click. A common example of where you might want to leverage batch transactions is an ERC-20 `approve` followed by a swap.
+
+You can submit batch transactions by using new `wallet_sendCalls` RPC, defined [here](https://eip5792.xyz/reference/sendCalls).
+
+## Using Wagmi
+
+
+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.
+
+
+
+
+
+ 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.
+
+ ```ts twoslash [App.tsx]
+ // @filename: App.tsx
+ import React from 'react'
+ // ---cut---
+ import { useCapabilities } from 'wagmi/experimental'
+
+ function App() {
+ const { data: capabilities } = useCapabilities() // [!code hl]
+ // @log: {
+ // @log: 84532: {
+ // @log: atomicBatch: {
+ // @log: supported: true,
+ // @log: },
+ // @log: }
+ // @log: }
+
+ return
+ }
+ ```
+
+ The `useCapabilities` method will return, per chain, the capabilities that the connected wallet supports. If the connected wallet supports atomic batching, it will return an `atomicBatch` capability with a `supported` field equal to `true` for each chain it supports atomic batching on.
+
+
+
+ If you have your smart contract ABIs, the easiest way to send multiple calls is to use the Wagmi `useWriteContracts` hook.
+
+ ```ts twoslash [App.tsx]
+ // @filename: App.tsx
+ import React from 'react'
+ // ---cut---
+ import { useAccount } from 'wagmi'
+ import { useWriteContracts } from 'wagmi/experimental'
+
+ const abi = [
+ {
+ stateMutability: 'nonpayable',
+ type: 'function',
+ inputs: [{ name: 'to', type: 'address' }],
+ name: 'safeMint',
+ outputs: [],
+ }
+ ] as const
+
+ function App() {
+ const account = useAccount()
+ const { writeContracts } = useWriteContracts() // [!code hl]
+
+ const handleMint = () => {
+ writeContracts({ // [!code hl]
+ contracts: [ // [!code hl]
+ { // [!code hl]
+ address: "0x119Ea671030FBf79AB93b436D2E20af6ea469a19", // [!code hl]
+ abi, // [!code hl]
+ functionName: "safeMint", // [!code hl]
+ args: [account.address], // [!code hl]
+ }, // [!code hl]
+ { // [!code hl]
+ address: "0x119Ea671030FBf79AB93b436D2E20af6ea469a19", // [!code hl]
+ abi, // [!code hl]
+ functionName: "safeMint", // [!code hl]
+ args: [account.address], // [!code hl]
+ } // [!code hl]
+ ], // [!code hl]
+ }) // [!code hl]
+ }
+
+ return (
+
+
+
+ )
+ }
+ ```
+
+
+
+ The `useWriteContracts` hook returns an object with a `data` field. This `data` is a call bundle identifier. Use the Wagmi `useCallsStatus` hook with this identifier to check on the status of your calls.
+
+ This will return a `PENDING` or `CONFIRMED` status along with a subset of a transaction receipt.
+
+ ```ts twoslash [App.tsx]
+ // @errors: 2352 2367
+ // @filename: App.tsx
+ import React from 'react'
+ // ---cut---
+ import { useAccount } from 'wagmi'
+ import { useWriteContracts, useCallsStatus } from 'wagmi/experimental'
+
+ const abi = [
+ {
+ stateMutability: 'nonpayable',
+ type: 'function',
+ inputs: [{ name: 'to', type: 'address' }],
+ name: 'safeMint',
+ outputs: [],
+ }
+ ] as const
+
+ function App() {
+ const account = useAccount()
+ const { data: id, writeContracts } = useWriteContracts()
+ const { data: callsStatus } = useCallsStatus({ // [!code hl]
+ id: id as string, // [!code hl]
+ query: { // [!code hl]
+ enabled: !!id, // [!code hl]
+ // Poll every second until the calls are confirmed // [!code hl]
+ refetchInterval: (data) => // [!code hl]
+ data.state.data?.status === "CONFIRMED" ? false : 1000, // [!code hl]
+ }, // [!code hl]
+ }); // [!code hl]
+ // @log: {
+ // @log: status: 'CONFIRMED',
+ // @log: receipts: [
+ // @log: {
+ // @log: logs: [
+ // @log: {
+ // @log: address: '0x...',
+ // @log: topics: [
+ // @log: '0x...'
+ // @log: ],
+ // @log: data: '0x...'
+ // @log: },
+ // @log: ],
+ // @log: status: 'success',
+ // @log: blockHash: '0x...',
+ // @log: blockNumber: 122414523n,
+ // @log: gasUsed: 390000n,
+ // @log: transactionHash: '0x...'
+ // @log: }
+ // @log: ]
+ // @log: }
+
+ const handleMint = () => {
+ writeContracts({
+ contracts: [
+ {
+ address: "0x...",
+ abi,
+ functionName: "safeMint",
+ args: [account.address],
+ },
+ {
+ address: "0x...",
+ abi,
+ functionName: "safeMint",
+ args: [account.address],
+ }
+ ],
+ })
+ }
+
+ return (
+
+
+ {callsStatus &&
Status: {callsStatus.status}
}
+
+ )
+ }
+ ```
+
+
+
diff --git a/docs/pages/identity/smart-wallet/guides/components/create-wallet-button.mdx b/_pages/identity/smart-wallet/guides/components/create-wallet-button.mdx
similarity index 99%
rename from docs/pages/identity/smart-wallet/guides/components/create-wallet-button.mdx
rename to _pages/identity/smart-wallet/guides/components/create-wallet-button.mdx
index b4a0ac9c..9f018b57 100644
--- a/docs/pages/identity/smart-wallet/guides/components/create-wallet-button.mdx
+++ b/_pages/identity/smart-wallet/guides/components/create-wallet-button.mdx
@@ -1,6 +1,6 @@
-import { Callout } from 'vocs/components';
-
-# Create Wallet Button
+---
+title: "Create Wallet Button"
+---
## Simplify user onboarding with Smart Wallet
@@ -12,7 +12,7 @@ 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:
- Increased volume of gas credits via our Cloud paymaster
@@ -24,7 +24,7 @@ form](https://docs.google.com/forms/d/e/1FAIpQLSdmTnSjbI-wkkf2TzmuSEv3iYzkbZBsY0
on [coinbase.com/smart-wallet](http://coinbase.com/smart-wallet) so our team can get
in touch with you.
-
+
## Implementation
@@ -48,8 +48,7 @@ Example:
To implement the Create Wallet button with Wagmi, all you need to do is call `connect`.
-:::code-group
-
+
```tsx twoslash [BlueCreateWalletButton.tsx] filename="BlueCreateWalletButton.tsx"
import React, { useCallback } from 'react';
import { useConnect } from 'wagmi';
@@ -273,8 +272,7 @@ declare module 'wagmi' {
}
}
```
-
-:::
+
#### Notes
@@ -286,8 +284,7 @@ declare module 'wagmi' {
To implement the Create Wallet button using only the SDK, all you need to do is make an `eth_requestAccounts` request.
-:::code-group
-
+
```tsx twoslash [BlueCreateWalletButton.tsx] filename="BlueCreateWalletButton.tsx"
import React, { useCallback } from 'react';
import { createCoinbaseWalletSDK } from '@coinbase/wallet-sdk';
@@ -528,5 +525,5 @@ declare module 'wagmi' {
}
}
```
+
-:::
diff --git a/docs/pages/identity/smart-wallet/guides/erc20-paymasters.mdx b/_pages/identity/smart-wallet/guides/erc20-paymasters.mdx
similarity index 99%
rename from docs/pages/identity/smart-wallet/guides/erc20-paymasters.mdx
rename to _pages/identity/smart-wallet/guides/erc20-paymasters.mdx
index ab02569c..0b9188a4 100644
--- a/docs/pages/identity/smart-wallet/guides/erc20-paymasters.mdx
+++ b/_pages/identity/smart-wallet/guides/erc20-paymasters.mdx
@@ -1,4 +1,7 @@
-# ERC20 Paymasters
+---
+title: "ERC20 Paymasters"
+---
+
Smart Wallet enables users to pay for gas in ERC20 tokens!
Tokens can be accepted for payment by passed in app paymasters in addition to a set of universally supported tokens, such as USDC (this set to be expanded soon).
diff --git a/docs/pages/identity/smart-wallet/guides/magic-spend.mdx b/_pages/identity/smart-wallet/guides/magic-spend.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/guides/magic-spend.mdx
rename to _pages/identity/smart-wallet/guides/magic-spend.mdx
index 51dc0984..5dca3edb 100644
--- a/docs/pages/identity/smart-wallet/guides/magic-spend.mdx
+++ b/_pages/identity/smart-wallet/guides/magic-spend.mdx
@@ -1,4 +1,7 @@
-# MagicSpend
+---
+title: "MagicSpend"
+---
+
With MagicSpend, Smart Wallet users can use their Coinbase balances onchain. This means users can easily start using onchain apps without needing to onramp funds into their wallet.
diff --git a/_pages/identity/smart-wallet/guides/paymasters.mdx b/_pages/identity/smart-wallet/guides/paymasters.mdx
new file mode 100644
index 00000000..52d8a8aa
--- /dev/null
+++ b/_pages/identity/smart-wallet/guides/paymasters.mdx
@@ -0,0 +1,262 @@
+---
+title: "Build with Paymasters (Sponsored Transactions)"
+---
+
+One of the biggest UX enhancements unlocked by Smart Wallet is the ability for app developers to sponsor their users' transactions.
+If your app supports Smart Wallet, you can start sponsoring your users'
+transactions by using [standardized Paymaster service communication](https://erc7677.xyz) enabled by [new wallet RPC methods](https://eip5792.xyz).
+
+This guide is specific to using Smart Wallet, you can find our more about using Paymasters with Base in
+the [Base Go Gasless page](https://docs.base.org/use-cases/go-gasless).
+
+The code below is also in our [Wagmi Smart Wallet template](https://github.com/wilsoncusack/wagmi-scw/).
+
+## Skip ahead and clone the template
+
+If you are looking for a complete example, you can skip the steps below and clone the [Wagmi Smart Wallet template](https://github.com/wilsoncusack/wagmi-scw/). Simply open a terminal and run:
+
+```bash
+git clone https://github.com/wilsoncusack/wagmi-scw.git
+```
+
+Follow the instructions in the README to install the dependencies and run the app.
+
+## Add Support in your Next.js app (using Wagmi/Viem)
+
+
+
+ As a prerequisite, you'll need to obtain a Paymaster service URL from a Paymaster service provider.
+
+ We'll use [Coinbase Developer Platform](https://www.coinbase.com/developer-platform) as a Paymaster service provider,
+ currently offering up to $15k in gas credits as part of the [Base Gasless Campaign](/identity/smart-wallet/concepts/base-gasless-campaign).
+
+
+ **ERC-7677-Compliant Paymaster Providers**
+
+ If you choose to use a different Paymaster service provider, ensure they are [ERC-7677-compliant](https://www.erc7677.xyz/ecosystem/Paymasters).
+
+
+
+ Once you have signed up for [Coinbase Developer Platform](https://www.coinbase.com/developer-platform), you get your Paymaster service URL by navigating to **Onchain Tools > Paymaster** as shown below:
+
+
+
+ How to get your Paymaster service URL
+
+
+
+ **Should you create a proxy for your Paymaster service?**
+
+ As you can see in the Paymaster transaction [component](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/TransactWithPaymaster.tsx), we use a proxy to protect
+ the Paymaster service URL to prevent it from being exposed/leaked on a frontend client
+
+ For local development, you can use the same URL for the Paymaster service and the proxy.
+
+ We also created a [minimalist proxy API](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/app/api/Paymaster/route.ts)
+ which you can use as the `PaymasterServiceUrl` in the [`TransactWithPaymaster` component](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/TransactWithPaymaster.tsx).
+
+
+
+ Once you have your Paymaster service URL, you can proceed to setting up your contracts allowlist.
+ This is a list of contracts and function calls that you want to be sponsored by the Paymaster.
+
+
+
+ How to set your Paymaster contracts allowlist
+
+
+ Congrats! You've set up your Paymaster service and contracts allowlist.
+ It's time to create Wagmi and Viem clients.
+
+
+ **You can also choose to create custom advanced policies !**
+
+ For example, in the [template](https://github.com/wilsoncusack/wagmi-scw), we create a `willSponsor` function in [`utils.ts`](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/app/api/utils.ts) to add some extra validation if you need
+ more control over the policy enforcement.
+
+ `willSponsor` is most likely not needed if you are using [Coinbase Developer Platform](https://www.coinbase.com/developer-platform) as it has built-in policy enforcement features,
+ but know that this is still possible if you need it.
+
+
+
+
+
+ This section shows you how to create Wagmi and Viem clients to interact with Smart Wallet using
+ the Paymaster service you set up in the previous steps.
+
+
+ ```ts twoslash [wagmi.ts] filename="wagmi.ts"
+ // @noErrors
+ import { http, createConfig } from "wagmi";
+ import { baseSepolia } from "wagmi/chains";
+ import { coinbaseWallet } from "wagmi/connectors";
+
+ export const cbWalletConnector = coinbaseWallet({
+ appName: "Wagmi Smart Wallet",
+ preference: "smartWalletOnly",
+ });
+
+ export const config = createConfig({
+ chains: [baseSepolia],
+ // turn off injected provider discovery
+ multiInjectedProviderDiscovery: false,
+ connectors: [cbWalletConnector],
+ ssr: true,
+ transports: {
+ [baseSepolia.id]: http(),
+ },
+ });
+ ```
+
+ ```ts twoslash [app/config.ts] filename="app/config.ts"
+ // @noErrors
+ import { createClient, createPublicClient, http } from "viem";
+ import { baseSepolia } from "viem/chains";
+ import { entryPoint06Address, createPaymasterClient, createBundlerClient } from "viem/account-abstraction";
+
+ export const client = createPublicClient({
+ chain: baseSepolia,
+ transport: http(),
+ });
+
+ const PaymasterService = process.env.PAYMASTER_SERVICE_URL!;
+
+ export const PaymasterClient = createPaymasterClient({
+ transport: http(PaymasterService),
+ });
+
+ export const bundlerClient = createBundlerClient({
+ chain: baseSepolia,
+ Paymaster: PaymasterClient,
+ transport: http(PaymasterService),
+ })
+ ```
+
+
+
+
+ Once you have your Paymaster service set up, you can now pass its URL along to Wagmi's `useWriteContracts` hook.
+
+
+ **Pass in the proxy URL**
+
+ 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.
+
+
+
+
+ ```ts twoslash [page.tsx] filename="page.tsx"
+ // @noErrors
+ import { useAccount } from "wagmi";
+ import { useCapabilities, useWriteContracts } from "wagmi/experimental";
+ import { useMemo, useState } from "react";
+ import { CallStatus } from "./CallStatus";
+ import { myNFTABI, myNFTAddress } from "./myNFT";
+
+ export function App() {
+ const account = useAccount();
+ const [id, setId] = useState(undefined);
+ const { writeContracts } = useWriteContracts({
+ mutation: { onSuccess: (id) => setId(id) },
+ });
+ const { data: availableCapabilities } = useCapabilities({
+ account: account.address,
+ });
+ const capabilities = useMemo(() => {
+ if (!availableCapabilities || !account.chainId) return {};
+ const capabilitiesForChain = availableCapabilities[account.chainId];
+ if (
+ capabilitiesForChain["PaymasterService"] &&
+ capabilitiesForChain["PaymasterService"].supported
+ ) {
+ return {
+ const PaymasterServiceUrl = process.env.NEXT_PUBLIC_PAYMASTER_PROXY_SERVER_URL
+ PaymasterService: {
+ url: PaymasterServiceUrl // You can also use the minimalist proxy we created: `${document.location.origin}/api/Paymaster`
+ },
+ };
+ }
+ return {};
+ }, [availableCapabilities, account.chainId]);
+
+ return (
+
+
Transact With Paymaster
+
{JSON.stringify(capabilities)}
+
+
+ {id && }
+
+
+ );
+ }
+ ```
+
+ ```ts twoslash [myNFT.ts] filename="myNFT.ts"
+ // @noErrors
+ export const myNFTABI = [
+ {
+ stateMutability: "nonpayable",
+ type: "function",
+ inputs: [{ name: "to", type: "address" }],
+ name: "safeMint",
+ outputs: [],
+ },
+ ] as const;
+
+ export const myNFTAddress = "0x119Ea671030FBf79AB93b436D2E20af6ea469a19";
+
+ ```
+
+
+
+ **About The Hooks Used Above**
+
+ 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.
+
+
+
+
+ **How to find this code in the repository?**
+
+ The code above is a simplified version of the code in the
+ [template](https://github.com/wilsoncusack/wagmi-scw/).
+
+ In the template, we create a [`TransactWithPaymaster`](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/TransactWithPaymaster.tsx) component that uses the `useWriteContracts` hook to send a transaction with a Paymaster.
+
+ The [`TransactWithPaymaster`](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/TransactWithPaymaster.tsx) component is used in the [`page.tsx`](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/app/page.tsx) file.
+
+
+
+ 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.
+
+
+
diff --git a/docs/pages/identity/smart-wallet/guides/signature-verification.mdx b/_pages/identity/smart-wallet/guides/signature-verification.mdx
similarity index 99%
rename from docs/pages/identity/smart-wallet/guides/signature-verification.mdx
rename to _pages/identity/smart-wallet/guides/signature-verification.mdx
index b98e948e..33184434 100644
--- a/docs/pages/identity/smart-wallet/guides/signature-verification.mdx
+++ b/_pages/identity/smart-wallet/guides/signature-verification.mdx
@@ -1,4 +1,7 @@
-# Signature Verification
+---
+title: "Signature Verification"
+---
+
There are important details to verifying smart contract wallet signatures. The smart contract itself
cannot produce a signature. Instead, the contract has a function
diff --git a/docs/pages/identity/smart-wallet/guides/signing-and-verifying-messages.mdx b/_pages/identity/smart-wallet/guides/signing-and-verifying-messages.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/guides/signing-and-verifying-messages.mdx
rename to _pages/identity/smart-wallet/guides/signing-and-verifying-messages.mdx
index 4b84260f..dde537b1 100644
--- a/docs/pages/identity/smart-wallet/guides/signing-and-verifying-messages.mdx
+++ b/_pages/identity/smart-wallet/guides/signing-and-verifying-messages.mdx
@@ -1,6 +1,6 @@
-import { Callout } from "vocs/components";
-
-# Sign Messages Using Smart Wallet
+---
+title: "Sign Messages Using Smart Wallet"
+---
Smart contract wallets introduce a few differences in how messages are signed compared to traditional Externally Owned Accounts (EOAs). This guide explains how to properly implement message signing using Smart Wallet, covering both standard messages and typed data signatures, as well as some edge cases.
@@ -34,9 +34,10 @@ Before implementing message signing, ensure:
- You're signing an offchain message
- Your Smart Wallet can be deployed or undeployed (methods are ERC-6492 compatible)
-:::info
+
If your implementation is more complicated and is not covered by the above assumptions, please refer to the [Handling Advanced Cases section](#handling-advanced-cases) below.
-:::
+
+
### Signing a Simple Message (Sign-In with Ethereum)
@@ -125,9 +126,9 @@ To run this example:
3. Install packages: `bun i`
4. Run next app: `bun run dev`
-
+
The example above is a typical Sign-In with Ethereum (SIWE) implementation as detailed in [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361).
-
+
### Signing Typed Data (EIP-712)
@@ -250,9 +251,10 @@ However, you should be careful when looking to validate the signatures:
- Use Viem's [`parseErc6492Signature`](https://viem.sh/docs/utilities/parseErc6492Signature#parseerc6492signature) utility to parse these elements
- For non-Viem implementations, see alternative approaches below
-:::info
+
There is an example implementation of Permit2 using Wagmi in the [wagmi-scw repository](https://github.com/wilsoncusack/wagmi-scw/blob/main/src/components/Permit2.tsx).
-:::
+
+
### Alternative Frameworks
@@ -341,6 +343,7 @@ export async function POST(request: NextRequest) {
-:::warning
+
Storing signatures safely requires advanced security guarantees. Ensure your database cannot be tampered with.
-:::
+
+
diff --git a/_pages/identity/smart-wallet/guides/siwe.mdx b/_pages/identity/smart-wallet/guides/siwe.mdx
new file mode 100644
index 00000000..be659d09
--- /dev/null
+++ b/_pages/identity/smart-wallet/guides/siwe.mdx
@@ -0,0 +1,202 @@
+---
+title: "Using Smart Wallet with Sign-In with Ethereum"
+---
+
+This guide covers creating a new Sign-In with Ethereum template project that uses Smart Wallet.
+
+
+ This simple implementation is for demo purposes only and is not meant to be an example of a
+ production app. A production app should: 1. Generate a random nonce for each message on the
+ backend. 2. Check the nonce and verify the message signature on the backend as specified in
+ [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361). 3. Invalidate nonces on logout to prevent
+ replay attacks through session duplication.
+
+
+
+
+ Follow the [Wagmi guide](/identity/smart-wallet/quickstart/nextjs-project) to set up a template project and connect a Smart Wallet.
+
+
+
+ ```bash [pnpm]
+ pnpm install siwe
+ ```
+
+ ```bash [bun]
+ bun install siwe
+ ```
+
+
+
+
+ ```tsx twoslash [src/SignInWithEthereum.tsx]
+ import React from 'react';
+
+ export function SignInWithEthereum() {
+ return (
+
+
+ >
+ )
+ }
+
+ export default App
+
+ ```
+
+
+
+ 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]
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
+ import { useAccount, usePublicClient, useSignMessage } from 'wagmi';
+ import { SiweMessage } from 'siwe';
+ import type { Hex } from 'viem';
+
+ export function SignInWithEthereum() {
+ const [signature, setSignature] = useState(undefined);
+ const { signMessage } = useSignMessage({ mutation: { onSuccess: (sig) => setSignature(sig) } });
+ const account = useAccount();
+
+ const siweMessage = useMemo(() => {
+ return new SiweMessage({
+ domain: document.location.host,
+ address: account.address,
+ chainId: account.chainId,
+ uri: document.location.origin,
+ version: '1',
+ statement: 'Smart Wallet SIWE Example',
+ nonce: '12345678', // replace with nonce generated by your backend
+ });
+ }, []);
+
+ const promptToSign = () => {
+ signMessage({ message: siweMessage.prepareMessage() });
+ };
+
+ return (
+
+
SIWE Example
+
+ {signature &&
Signature: {signature}
}
+
+ );
+ }
+ ```
+
+
+
+
+ For Smart Wallet, [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) should be used to verify the SIWE message signature.
+
+
+ This simple example does not check the nonce during verification, all production implementations
+ should. Furthermore, nonces should be invalidated on logout to prevent replay attacks through
+ session duplication (e.g. store expired nonce and make sure they can't be used again). In
+ production apps, SIWE message verification is generally handled on the backend.
+
+
+ ```tsx twoslash [src/SignInWithEthereum.tsx]
+ // @noErrors: 2339
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
+ import type { Hex } from 'viem';
+ import { useAccount, usePublicClient, useSignMessage } from 'wagmi';
+ import { SiweMessage } from 'siwe';
+ export function SignInWithEthereum() {
+ const [signature, setSignature] = useState(undefined);
+ const [valid, setValid] = useState(undefined); // [!code focus]
+ const client = usePublicClient(); // [!code focus]
+ const { signMessage } = useSignMessage({ mutation: { onSuccess: (sig) => setSignature(sig) } });
+ const account = useAccount();
+
+ const message = useMemo(() => {
+ return new SiweMessage({
+ domain: document.location.host,
+ address: account.address,
+ chainId: account.chainId,
+ uri: document.location.origin,
+ version: '1',
+ statement: 'Smart Wallet SIWE Example',
+ nonce: '12345678', // replace with nonce generated by your backend
+ });
+ }, []);
+
+ const checkValid = useCallback(async () => { // [!code focus]
+ if (!signature || !account.address || !client) return; // [!code focus]
+ const isValid = await client.verifyMessage({ // [!code focus]
+ // [!code focus]
+ address: account.address, // [!code focus]
+ message: message.prepareMessage(), // [!code focus]
+ signature, // [!code focus]
+ }); // [!code focus]
+ setValid(isValid); // [!code focus]
+ }, [signature, account]); // [!code focus]
+
+ useEffect(() => { // [!code focus]
+ checkValid(); // [!code focus]
+ }, [signature, account]); // [!code focus]
+
+ const promptToSign = () => {
+ signMessage({ message: message.prepareMessage() });
+ };
+ return (
+
+
SIWE Example
+
+ {signature &&
Signature: {signature}
}
+ {valid !== undefined &&
Is valid: {valid.toString()}
}{/* // [!code focus] */}
+
+ );
+ }
+ ```
+
+
+ Visit your local server and click "Sign In with Ethereum"
+
+
diff --git a/_pages/identity/smart-wallet/guides/spend-permissions.mdx b/_pages/identity/smart-wallet/guides/spend-permissions.mdx
new file mode 100644
index 00000000..68e3ca01
--- /dev/null
+++ b/_pages/identity/smart-wallet/guides/spend-permissions.mdx
@@ -0,0 +1,619 @@
+---
+title: "Build with Spend Permissions"
+---
+
+import { Danger } from "/snippets/danger.mdx";
+
+## Overview
+
+Spend Permissions enable third-party signers to spend assets (native and ERC-20 tokens) from a user's Smart Wallet.
+Once granted, Spend Permissions
+allow developers to move users'
+assets without any further signatures, unlocking use cases like subscriptions & trading bots.
+
+The following is a technical guide to build with Spend Permissions. If you want to learn more about high level details of this feature, check out the [Spend Permissions feature page](/identity/smart-wallet/concepts/features/optional/spend-permissions).
+
+## Let's build!
+
+This guide will walk you through a simple example of building an app that leverages Spend Permissions using
+[OnchainKit](https://onchainkit.xyz/), [Viem](https://viem.sh/) and [Wagmi](https://wagmi.sh/).
+
+The repository for the complete example of this demo can be found [here](https://github.com/ilikesymmetry/spend-permissions-quickstart).
+A hosted version of the demo can be found [here](https://subscribe-onchain.vercel.app/).
+Smart contract deployment addresses for `SpendPermissionManager.sol` can be found [here](https://github.com/coinbase/spend-permissions).
+
+
+
+ Set up a boilerplate React/Next app by running the following command and following the instructions. Don't worry about getting a Coinbase
+ Developer Platform API Key, you don't need one for this example. When prompted to use Coinbase Smart Wallet select "yes".
+
+ ```bash
+ npm create onchain@latest
+ ```
+
+ This will generate an app that is ready to run and contains a wallet connection button that users can use
+ to connect their smart wallet to the application.
+
+ From here, we'll modify the app to assemble, sign, approve and use a spend permission to spend our users' funds!
+
+
+ Add the following variables to your `.env`:
+
+ ```
+ SPENDER_PRIVATE_KEY=
+ NEXT_PUBLIC_SPENDER_ADDRESS=
+ ```
+
+
+ Always secure your private keys appropriately! We insecurely use an
+ environment variable in this demo for simplicity.
+
+
+ Our spender will need to sign transactions from our app, so we'll create a wallet (private key and address) for our spender.
+ If you have [Foundry](https://book.getfoundry.sh/) installed, you can generate a new wallet via `cast wallet new`. If you already have a
+ development keypair you can use that too. Assign the private key and address to
+ `SPENDER_PRIVATE_KEY` and `NEXT_PUBLIC_SPENDER_ADDRESS`, respectively.
+
+
+ Our client is what our app will use to communicate with the blockchain.
+
+ Create a sibling directory to `app` called `lib` and add the following `spender.ts` file to create your spender client.
+
+ ```ts [lib/spender. ts]
+ import { createPublicClient, createWalletClient, Hex, http } from "viem";
+ import { baseSepolia } from "viem/chains";
+ import { privateKeyToAccount } from "viem/accounts";
+
+ export async function getPublicClient() {
+ const client = createPublicClient({
+ chain: baseSepolia,
+ transport: http(),
+ });
+ return client;
+ }
+
+ export async function getSpenderWalletClient() {
+ const spenderAccount = privateKeyToAccount(
+ process.env.SPENDER_PRIVATE_KEY! as Hex
+ );
+
+ const spenderWallet = await createWalletClient({
+ account: spenderAccount,
+ chain: baseSepolia,
+ transport: http(),
+ });
+ return spenderWallet;
+ }
+ ```
+
+
+
+ In `app/providers.tsx`, update your configuration based on your environment:
+
+ - For testnets:
+ - Set `keysUrl: "https://keys-dev.coinbase.com/connect"`
+ - Replace all instances of `base` with `baseSepolia` (including the import)
+ - For mainnets:
+ - Leave `keysUrl` undefined (defaults to keys.coinbase.com)
+ - Keep the default `base` chain from the template
+
+ Your config in `app/providers.tsx` should look like this for testnet:
+
+ ```ts
+ const config = createConfig({
+ chains: [baseSepolia],
+ connectors: [
+ coinbaseWallet({
+ appName: process.env.NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME,
+ preference: process.env.NEXT_PUBLIC_ONCHAINKIT_WALLET_CONFIG as
+ | "smartWalletOnly"
+ | "all",
+ // @ts-ignore
+ keysUrl: "https://keys-dev.coinbase.com/connect"
+ }),
+ ],
+ storage: createStorage({
+ storage: cookieStorage,
+ }),
+ ssr: true,
+ transports: {
+ [baseSepolia.id]: http(),
+ },
+ });
+ ```
+
+
+ Spend permissions are managed by a singleton contract called the `SpendPermissionManager`. We'll add some
+ configuration so our client knows how to interact with this contract.
+
+ Inside your `/lib` directory, create a new subdirectory called `/abi`. This is where we'll store information about
+ [smart contract interfaces](https://docs.soliditylang.org/en/latest/abi-spec.html) and addresses.
+
+ Add a new file called `SpendPermissionManager.ts` and copy and paste the code from [this file](https://github.com/ilikesymmetry/spend-permissions-quickstart/blob/main/lib/abi/SpendPermissionManager.ts).
+
+
+ [Here's an example](https://docs.basescan.org/api-endpoints/contracts) of
+ finding the ABI for any verified contract on Basescan.
+
+
+
+ Let's create a button that will prompt a user to subscribe to our services by authorizing
+ a spend permission for our app to spend their assets.
+
+ Create a subdirectory inside `/app` called `/components` and paste the following code into a new file called `Subscribe.tsx`.
+
+ We'll walk through what's happening here in subsequent steps.
+
+ ```tsx showLineNumbers
+ "use client";
+ import { cn, color, pressable, text } from "@coinbase/onchainkit/theme";
+ import { useEffect, useState } from "react";
+ import {
+ useAccount,
+ useChainId,
+ useConnect,
+ useConnectors,
+ useSignTypedData,
+ } from "wagmi";
+ import { Address, Hex, parseUnits } from "viem";
+ import { useQuery } from "@tanstack/react-query";
+ import { spendPermissionManagerAddress } from "@/lib/abi/SpendPermissionManager";
+
+ export default function Subscribe() {
+ const [isDisabled, setIsDisabled] = useState(false);
+ const [signature, setSignature] = useState();
+ const [transactions, setTransactions] = useState([]);
+ const [spendPermission, setSpendPermission] = useState
+
+ A `SpendPermission` is the struct that defines the parameters of the permission.
+ See the solidity struct [here](https://github.com/coinbase/spend-permissions/blob/main/src/SpendPermissionManager.sol#L18-L38).
+
+ You can see the spend permission object being defined in lines 49-59 of our `Subscribe` component:
+
+ ```tsx [Subscribe.tsx]
+
+ export default function Subscribe() {
+ ...
+
+ async function handleSubmit() {
+ setIsDisabled(true);
+ let accountAddress = account?.address;
+ if (!accountAddress) {
+ try {
+ const requestAccounts = await connectAsync({
+ connector: connectors[0],
+ });
+ accountAddress = requestAccounts.accounts[0];
+ } catch {
+ return;
+ }
+ }
+
+ // Define a `SpendPermission` to request from the user // [!code focus]
+ const spendPermission = { // [!code focus]
+ account: accountAddress, // User wallet address // [!code focus]
+ spender: process.env.NEXT_PUBLIC_SPENDER_ADDRESS! as Address, // Spender smart contract wallet address // [!code focus]
+ token: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" as Address, // ETH (https://eips.ethereum.org/EIPS/eip-7528) // [!code focus]
+ allowance: parseUnits("10", 18), // [!code focus]
+ period: 86400, // seconds // [!code focus]
+ start: 0, // unix time, seconds // [!code focus]
+ end: 281474976710655, // max uint48 // [!code focus]
+ salt: BigInt(0), // [!code focus]
+ extraData: "0x" as Hex, // [!code focus]
+ }; // [!code focus]
+ }
+ ...
+
+ return (
+
+ );
+ }
+ ```
+
+
+
+ Now that we have a signature from the user, we can approve the permission onchain by submitting the
+ signature and the permission details to `approveWithSignature` on the `SpendPermissionManager` contract.
+
+ Our `handleCollectSubscription` function that's defined in our `Subscribe` will pass this signature and data to our
+ backend, so the spender client we created earlier can handle our onchain calls.
+
+ ```ts [Subscribe.tsx]
+ // We send the permission details and the user signature to our backend route
+ async function handleCollectSubscription() {
+ setIsDisabled(true);
+ let data;
+ try {
+ const replacer = (key: string, value: any) => {
+ if (typeof value === "bigint") {
+ return value.toString();
+ }
+ return value;
+ };
+ const response = await fetch("/collect", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(
+ {
+ spendPermission,
+ signature,
+ dummyData: Math.ceil(Math.random() * 100),
+ },
+ replacer
+ ),
+ });
+ if (!response.ok) {
+ throw new Error("Network response was not ok");
+ }
+ data = await response.json();
+ } catch (e) {
+ console.error(e);
+ }
+ setIsDisabled(false);
+ return data;
+ }
+ ```
+
+ But wait, we don't have any backend routes set up yet! Let's define what should happen when we want to
+ approve and use our spend permission.
+
+ Create a new subdirectory under `/app` called `collect`. Create a new file there called `route.tsx` and paste the following
+ code:
+
+ ```ts [route.tsx]
+ import { NextRequest, NextResponse } from "next/server";
+ import { getPublicClient, getSpenderWalletClient } from "../../lib/spender";
+ import {
+ spendPermissionManagerAbi,
+ spendPermissionManagerAddress,
+ } from "../../lib/abi/SpendPermissionManager";
+
+ export async function POST(request: NextRequest) {
+ const spenderBundlerClient = await getSpenderWalletClient();
+ const publicClient = await getPublicClient();
+ try {
+ const body = await request.json();
+ const { spendPermission, signature } = body;
+
+ const approvalTxnHash = await spenderBundlerClient.writeContract({
+ address: spendPermissionManagerAddress,
+ abi: spendPermissionManagerAbi,
+ functionName: "approveWithSignature",
+ args: [spendPermission, signature],
+ });
+
+ const approvalReceipt = await publicClient.waitForTransactionReceipt({
+ hash: approvalTxnHash,
+ });
+
+ const spendTxnHash = await spenderBundlerClient.writeContract({
+ address: spendPermissionManagerAddress,
+ abi: spendPermissionManagerAbi,
+ functionName: "spend",
+ args: [spendPermission, "1"],
+ });
+
+ const spendReceipt = await publicClient.waitForTransactionReceipt({
+ hash: spendTxnHash,
+ });
+
+ return NextResponse.json({
+ status: spendReceipt.status ? "success" : "failure",
+ transactionHash: spendReceipt.transactionHash,
+ transactionUrl: `https://sepolia.basescan.org/tx/${spendReceipt.transactionHash}`,
+ });
+ } catch (error) {
+ console.error(error);
+ return NextResponse.json({}, { status: 500 });
+ }
+ }
+ ```
+
+ This code is using our spender client to do two things:
+
+ 1. calls `approveWithSignature` to approve the spend permission
+ 2. calls `spend` to make use of our allowance and spend our user's funds
+
+
+
+ Run your app locally with `npm run dev` and visit `localhost:3000`.
+
+ When you click the "Subscribe" button you should be prompted to create or connect your Smart Wallet.
+
+ You can create a new Smart Wallet via the popup. Note that you'll need a little ETH in this wallet to fund the
+ deployment of your account. If you don't have any testnet ETH, try this [Coinbase faucet](https://portal.cdp.coinbase.com/products/faucet).
+
+ Note that we'll need a little bit of base sepolia ETH in both wallet addresses (the "user" wallet and the "app" wallet).
+ In a more involved implementation you would use a paymaster to eliminate this requirement.
+ For now, If you don't have any base sepolia ETH, try this [Coinbase faucet](https://portal.cdp.coinbase.com/products/faucet).
+
+ Once your wallet is created and both wallets are funded, return to the app and click "Subscribe", then sign the prompt to allow the spend permission.
+
+ Once you've subscribed, you should see a spend transaction hash show up on screen after a few seconds.
+ You can prompt subsequent spends by clicking the "Collect Subscription" button. Click the transactions to check them out on Etherscan!
+
+ We've made it! 🎉
+
+ Our app successfully
+
+ - prompts the user to connect their Coinbase Smart Wallet to our app
+ - assembles a spend permission representing our recurring spending needs as an app
+ - retrieves a signature from the user authorizing this spend permission
+ - approves the spend permission onchain
+ - uses this permission to retrieve user assets within our allowance
+
+
+
+
diff --git a/docs/pages/identity/smart-wallet/guides/sub-accounts/index.mdx b/_pages/identity/smart-wallet/guides/sub-accounts/index.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/guides/sub-accounts/index.mdx
rename to _pages/identity/smart-wallet/guides/sub-accounts/index.mdx
index 704e6f8f..9db3dd09 100644
--- a/docs/pages/identity/smart-wallet/guides/sub-accounts/index.mdx
+++ b/_pages/identity/smart-wallet/guides/sub-accounts/index.mdx
@@ -3,7 +3,7 @@ title: 'Creating Sub Accounts with Smart Wallet'
description: 'Learn how to create and manage Sub Accounts using Smart Wallet'
---
-import GithubRepoCard from "@/components/GithubRepoCard"
+import { GithubRepoCard } from "/snippets/GithubRepoCard.mdx"
# Build with Sub Accounts
diff --git a/docs/pages/identity/smart-wallet/guides/sub-accounts/setup.mdx b/_pages/identity/smart-wallet/guides/sub-accounts/setup.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/guides/sub-accounts/setup.mdx
rename to _pages/identity/smart-wallet/guides/sub-accounts/setup.mdx
index 59ae99ac..4c2c866b 100644
--- a/docs/pages/identity/smart-wallet/guides/sub-accounts/setup.mdx
+++ b/_pages/identity/smart-wallet/guides/sub-accounts/setup.mdx
@@ -3,8 +3,8 @@ title: 'Project Setup'
description: 'Set up a NextJS project with Smart Wallet integration'
---
-import GithubRepoCard from "@/components/GithubRepoCard"
-import { Callout } from "vocs/components"
+import { GithubRepoCard } from "/snippets/GithubRepoCard.mdx"
+
# Project Setup
@@ -52,10 +52,13 @@ Let's override the default `@coinbase/wallet-sdk` version with the latest canary
npm pkg set overrides.@coinbase/wallet-sdk=canary
```
-:::warning[Override before installing]
+
+**Override before installing**
+
Sub Accounts are currently only available in the Smart Wallet development environment (Canary).
Make sure to override the `@coinbase/wallet-sdk` version BEFORE installing the packages.
-:::
+
+
Install packages
@@ -126,13 +129,13 @@ Let's break down the key preference parameters:
- Allowance WEI amount (in Hex)
- Time period for the allowance (in seconds, e.g., 86400 for 24 hours)
-
+
**About `keysUrl`**
Sub Accounts are currently only available in the Smart Wallet development environment.
To use this environment, you need to set the `keysUrl` to `https://keys-dev.coinbase.com/connect` in your configuration.
-
+
## Creating the Home Page
diff --git a/docs/pages/identity/smart-wallet/guides/sub-accounts/using-sub-accounts.mdx b/_pages/identity/smart-wallet/guides/sub-accounts/using-sub-accounts.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/guides/sub-accounts/using-sub-accounts.mdx
rename to _pages/identity/smart-wallet/guides/sub-accounts/using-sub-accounts.mdx
index 1f509d93..99a62c9e 100644
--- a/docs/pages/identity/smart-wallet/guides/sub-accounts/using-sub-accounts.mdx
+++ b/_pages/identity/smart-wallet/guides/sub-accounts/using-sub-accounts.mdx
@@ -3,7 +3,7 @@ title: 'Using Sub Accounts'
description: 'Learn how to sign messages and send transactions with your Sub Account'
---
-import GithubRepoCard from "@/components/GithubRepoCard"
+import { GithubRepoCard } from "/snippets/GithubRepoCard.mdx"
# Using Sub Accounts
diff --git a/docs/pages/identity/smart-wallet/guides/tips/inspect-txn-simulation.mdx b/_pages/identity/smart-wallet/guides/tips/inspect-txn-simulation.mdx
similarity index 90%
rename from docs/pages/identity/smart-wallet/guides/tips/inspect-txn-simulation.mdx
rename to _pages/identity/smart-wallet/guides/tips/inspect-txn-simulation.mdx
index f525ad07..742cccab 100644
--- a/docs/pages/identity/smart-wallet/guides/tips/inspect-txn-simulation.mdx
+++ b/_pages/identity/smart-wallet/guides/tips/inspect-txn-simulation.mdx
@@ -1,4 +1,7 @@
-# Transaction Simulation Data
+---
+title: "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
diff --git a/docs/pages/identity/smart-wallet/guides/tips/popup-tips.mdx b/_pages/identity/smart-wallet/guides/tips/popup-tips.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/guides/tips/popup-tips.mdx
rename to _pages/identity/smart-wallet/guides/tips/popup-tips.mdx
index 1c7c83dc..2bb616ac 100644
--- a/docs/pages/identity/smart-wallet/guides/tips/popup-tips.mdx
+++ b/_pages/identity/smart-wallet/guides/tips/popup-tips.mdx
@@ -1,4 +1,7 @@
-# Popup Tips
+---
+title: "Popup Tips"
+---
+
## Overview
When a Smart Wallet is connected and Coinbase Wallet SDK receives a request, it opens
diff --git a/docs/pages/identity/smart-wallet/quickstart/ai-tools-available-for-devs.mdx b/_pages/identity/smart-wallet/quickstart/ai-tools-available-for-devs.mdx
similarity index 95%
rename from docs/pages/identity/smart-wallet/quickstart/ai-tools-available-for-devs.mdx
rename to _pages/identity/smart-wallet/quickstart/ai-tools-available-for-devs.mdx
index ff701551..7c81d197 100644
--- a/docs/pages/identity/smart-wallet/quickstart/ai-tools-available-for-devs.mdx
+++ b/_pages/identity/smart-wallet/quickstart/ai-tools-available-for-devs.mdx
@@ -1,6 +1,9 @@
+---
+title: "AI Tools for Smart Wallet Developers"
+---
+
import SmartWalletAITools from '@/components/SmartWalletAITools';
-# AI Tools for Smart Wallet Developers
Smart Wallet has a number of AI tools available for builders and developers.
We keep expanding the list of tools and features, so please check back soon for updates.
diff --git a/docs/pages/identity/smart-wallet/quickstart/index.mdx b/_pages/identity/smart-wallet/quickstart/index.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/quickstart/index.mdx
rename to _pages/identity/smart-wallet/quickstart/index.mdx
index beede160..3734d9dd 100644
--- a/docs/pages/identity/smart-wallet/quickstart/index.mdx
+++ b/_pages/identity/smart-wallet/quickstart/index.mdx
@@ -1,6 +1,9 @@
+---
+title: "Get Started with Smart Wallet"
+---
+
import SmartWalletQuickstartOptions from '@/components/SmartWalletQuickstartOptions';
-# Get Started with Smart Wallet
Smart Wallet is a multi-chain self-custodial cryptocurrency wallet. It enables users to create an account in seconds
with no app or extension required, thanks to its reliance on [Passkeys](https://passkeys.com).
diff --git a/docs/pages/identity/smart-wallet/quickstart/nextjs-project.mdx b/_pages/identity/smart-wallet/quickstart/nextjs-project.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/quickstart/nextjs-project.mdx
rename to _pages/identity/smart-wallet/quickstart/nextjs-project.mdx
index abfcb2bb..e9e24fe4 100644
--- a/docs/pages/identity/smart-wallet/quickstart/nextjs-project.mdx
+++ b/_pages/identity/smart-wallet/quickstart/nextjs-project.mdx
@@ -1,6 +1,6 @@
-import { Callout } from "vocs/components";
-
-# Add to Existing Next.js Project (with Wagmi)
+---
+title: "Add to Existing Next.js Project (with Wagmi)"
+---
This option guides you through adding Smart Wallet to an existing
[Next.js](https://nextjs.org/) application using [Wagmi](https://wagmi.sh/).
@@ -9,8 +9,7 @@ This option guides you through adding Smart Wallet to an existing
Let's start by navigating to your project directory and installing the dependencies:
-:::code-group
-
+
```bash [npm]
npm install @coinbase/wallet-sdk wagmi viem @tanstack/react-query
```
@@ -26,8 +25,7 @@ yarn add @coinbase/wallet-sdk wagmi viem @tanstack/react-query
```bash [bun]
bun add @coinbase/wallet-sdk wagmi viem @tanstack/react-query
```
-
-:::
+
## Step 2: Create Wagmi Config
@@ -61,9 +59,9 @@ declare module "wagmi" {
}
```
-
+
The wagmi config is modified to include the Smart Wallet connector `cbWalletConnector`.
-
+
## Step 3: Create Providers Component
@@ -206,7 +204,7 @@ export default function Home() {
}
```
-
+
Congratulations! You just integrated Smart Wallet in your app.
You can now [Explore More Features](/identity/smart-wallet/quickstart#explore-more-features).
-
+
diff --git a/docs/pages/identity/smart-wallet/quickstart/quick-demo.mdx b/_pages/identity/smart-wallet/quickstart/quick-demo.mdx
similarity index 95%
rename from docs/pages/identity/smart-wallet/quickstart/quick-demo.mdx
rename to _pages/identity/smart-wallet/quickstart/quick-demo.mdx
index 9eb98bcf..fd40602b 100644
--- a/docs/pages/identity/smart-wallet/quickstart/quick-demo.mdx
+++ b/_pages/identity/smart-wallet/quickstart/quick-demo.mdx
@@ -1,10 +1,10 @@
-import { Callout } from "vocs/components";
-
-# Quick Demo using OnchainKit (5 mins)
+---
+title: "Quick Demo using OnchainKit (5 mins)"
+---
This option uses the OnchainKit [Wallet component](/builderkits/onchainkit/wallet/wallet). It is perfect for quickly experiencing Smart Wallet functionality with minimal setup.
-
+
**What is OnchainKit?**
[OnchainKit](https://www.base.org/builders/onchainkit)
@@ -12,7 +12,7 @@ is a suite of components allowing you to build
your onchain app fast and quick. It is a
very popular solution to build on Base. You can learn more about it [here](/builderkits/onchainkit/getting-started).
-
+
## Step 1: Clone the Template Repository
@@ -82,7 +82,7 @@ bun i
bun run dev
```
-
+
**Make sure Bun is installed**
This example uses [Bun](https://bun.sh/) as a preferred package manager. If you run into an error because you don't have Bun installed you can run the following command to install it:
@@ -91,7 +91,7 @@ This example uses [Bun](https://bun.sh/) as a preferred package manager. If you
curl -fsSL https://bun.sh/install | bash
```
-
+
Your app will be available at http://localhost:3000
diff --git a/docs/pages/identity/smart-wallet/quickstart/react-native-project.mdx b/_pages/identity/smart-wallet/quickstart/react-native-project.mdx
similarity index 94%
rename from docs/pages/identity/smart-wallet/quickstart/react-native-project.mdx
rename to _pages/identity/smart-wallet/quickstart/react-native-project.mdx
index 3b0065d7..f702b846 100644
--- a/docs/pages/identity/smart-wallet/quickstart/react-native-project.mdx
+++ b/_pages/identity/smart-wallet/quickstart/react-native-project.mdx
@@ -1,19 +1,23 @@
-import { Callout } from "vocs/components";
+---
+title: "Add to Existing React Native App"
+---
-# Add to Existing React Native App
+import { Danger } from "/snippets/danger.mdx";
This guide helps you add support for Smart Wallet into a React Native app
by integrating the
[Mobile Wallet Protocol Client](https://www.npmjs.com/package/@mobile-wallet-protocol/client).
-
+
This doc is updated for Mobile Wallet Protocol Client `v1.0.0`
-
+
+
+
+ **Deep Link Handling**
-
Breaking change in v1.0.0: Universal Links and App Links requirements are
removed in favor of custom schemes (e.g. `myapp://`).
-
+
## Before You Start
@@ -31,8 +35,7 @@ If you are looking to integrate Smart Wallet into an existing React Native app o
Add the latest version of [Mobile Wallet Protocol Client](https://mobilewalletprotocol.github.io/wallet-mobile-sdk/) to your project.
-:::code-group
-
+
```zsh [npm]
npm i @mobile-wallet-protocol/client@latest
```
@@ -40,8 +43,7 @@ npm i @mobile-wallet-protocol/client@latest
```zsh [yarn]
yarn add @mobile-wallet-protocol/client@latest
```
-
-:::
+
## Step 2: Add Polyfills
@@ -50,8 +52,7 @@ yarn add @mobile-wallet-protocol/client@latest
The Mobile Wallet Protocol Client library requires the [Expo WebBrowser](https://docs.expo.dev/versions/latest/sdk/webbrowser/) and [Async Storage](https://react-native-async-storage.github.io/async-storage/docs/install) packages to be installed.
Follow the instructions on the respective pages for any additional setup.
-:::code-group
-
+
```zsh [npm]
npm i expo expo-web-browser @react-native-async-storage/async-storage
```
@@ -59,8 +60,7 @@ npm i expo expo-web-browser @react-native-async-storage/async-storage
```zsh [yarn]
yarn add expo expo-web-browser @react-native-async-storage/async-storage
```
-
-:::
+
### Polyfills
@@ -68,8 +68,7 @@ Mobile Wallet Protocol Client requires `crypto.randomUUID`, `crypto.getRandomVal
Below is an example of how to polyfill these functions in your app using the [expo-crypto](https://docs.expo.dev/versions/latest/sdk/crypto/) and [expo-standard-web-crypto](https://github.com/expo/expo/tree/master/packages/expo-standard-web-crypto/) packages.
-:::code-group
-
+
```zsh [npm]
npm i expo-crypto expo-standard-web-crypto react-native-url-polyfill
```
@@ -77,11 +76,9 @@ npm i expo-crypto expo-standard-web-crypto react-native-url-polyfill
```zsh [yarn]
yarn add expo-crypto expo-standard-web-crypto react-native-url-polyfill
```
+
-:::
-
-:::code-group
-
+
```js [polyfills.js]
import "react-native-url-polyfill/auto";
import { polyfillWebCrypto } from "expo-standard-web-crypto";
@@ -98,23 +95,22 @@ import { CoinbaseWalletSDK } from "@mobile-wallet-protocol/client";
/// ...
```
-
-:::
+
## Step 3: Usage
Mobile Wallet Protocol Client provides 2 interfaces for mobile app to interact with the Smart Wallet, an EIP-1193 compliant provider interface and a wagmi connector.
-
+
If your app is using wallet aggregator, go straight to [**Option 2: Wagmi
Connector**](#option-2-wagmi-connector) for 1-line integration.
-
+
### Option 1: EIP-1193 Provider
-
+
The `app` prefix in SDK config params is removed in v1.0.0.
-
+
Create a new `EIP1193Provider` instance, which is EIP-1193 compliant.
@@ -147,8 +143,7 @@ const signedData = await provider.request({
Add the latest version of Mobile Wallet Protocol wagmi-connectors to your project.
-:::code-group
-
+
```zsh [npm]
npm i @mobile-wallet-protocol/wagmi-connectors@latest
```
@@ -156,8 +151,7 @@ npm i @mobile-wallet-protocol/wagmi-connectors@latest
```zsh [yarn]
yarn add @mobile-wallet-protocol/wagmi-connectors@latest
```
-
-:::
+
Simply import the `createConnectorFromWallet` function and pass in the wallet you want to use to wagmi config.
@@ -210,5 +204,3 @@ return (
## Give feedback!
Send us feedback on the [Coinbase Developer Platform](https://discord.com/invite/cdp/) Discord or create a new issue on the [MobileWalletProtocol/react-native-client](https://github.com/MobileWalletProtocol/react-native-client/issues) repository.
-
-::::
diff --git a/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/Overview.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/Overview.mdx
new file mode 100644
index 00000000..843763c5
--- /dev/null
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/Overview.mdx
@@ -0,0 +1,103 @@
+---
+title: "Overview"
+---
+
+
+The request method allows apps to make Ethereum RPC requests to the wallet.
+
+## Specification
+
+```typescript
+interface RequestArguments {
+readonly method: string;
+readonly params?: readonly unknown[] | object;
+}
+
+interface ProviderRpcError extends Error {
+code: number;
+data?: unknown;
+}
+
+interface CoinbaseWalletProvider {
+/\*\*
+
+- @param {RequestArguments} args request arguments.
+- @returns A promise that resolves with the result.
+- @throws {ProviderRpcError} incase of error.
+- @fires CoinbaseWalletProvider#connect When the provider successfully connects.
+ \*/
+ request: (args: RequestArguments) => Promise
+ }
+```
+
+## Example
+
+
+```typescript [example.ts]
+
+import {provider} from "./setup";
+
+const addresses = await provider.request({method: 'eth_requestAccounts'});
+const txHash = await provider.request({
+method: 'eth_sendTransaction',
+params: [{from: addresses[0], to: addresses[0], value: 1}]
+}
+);
+```
+
+```typescript [setup.ts]
+
+import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'
+
+const baseSepoliaChainId = 84532;
+
+export const sdk = new CoinbaseWalletSDK({
+ appName: 'My App Name',
+ appChainIds: [baseSepoliaChainId]
+});
+
+const provider = sdk.makeWeb3Provider();
+```
+
+
+## Request Handling
+
+Requests are handled in one of three ways
+
+Sent to the Wallet application (Wallet mobile app, extension, or popup window).
+Handled locally by the SDK.
+Passed onto default RPC provider for the given chain, if it exists.
+
+### 1. Sent to the Wallet application
+
+The following RPC requests are sent to the Wallet application:
+
+- eth_ecRecover
+- personal_sign
+- personal_ecRecover
+- eth_signTransaction
+- eth_sendTransaction
+- eth_signTypedData_v1
+- eth_signTypedData_v3
+- eth_signTypedData_v4
+- eth_signTypedData
+- wallet_addEthereumChain
+- wallet_watchAsset
+- wallet_sendCalls
+- wallet_showCallsStatus
+
+### 2. Handled Locally by the SDK
+
+The following requests are handled locally by the SDK, with no external calls.
+
+- eth_requestAccounts
+- eth_accounts
+- eth_coinbase
+- net_version
+- eth_chainId
+- wallet_getCapabilities
+- wallet_switchEthereumChain
+
+```
+
+```
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_accounts.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_accounts.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_accounts.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_accounts.mdx
index 247a7260..e09fd4e9 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_accounts.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_accounts.mdx
@@ -1,4 +1,7 @@
-# eth_accounts
+---
+title: "eth_accounts"
+---
+
Defined in [EIP-1474](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1474.md)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_blockNumber.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_blockNumber.mdx
similarity index 88%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_blockNumber.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_blockNumber.mdx
index 4d21edc8..02a3f9ed 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_blockNumber.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_blockNumber.mdx
@@ -1,4 +1,7 @@
-# eth_blockNumber
+---
+title: "eth_blockNumber"
+---
+
> Returns the number of the most recent block.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_chainId.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_chainId.mdx
similarity index 94%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_chainId.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_chainId.mdx
index b3dc1051..44855f0a 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_chainId.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_chainId.mdx
@@ -1,4 +1,7 @@
-# eth_chainId
+---
+title: "eth_chainId"
+---
+
Defined in [EIP-695](https://eips.ethereum.org/EIPS/eip-695)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_coinbase.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_coinbase.mdx
similarity index 89%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_coinbase.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_coinbase.mdx
index 358b0e58..dc2dde6f 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_coinbase.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_coinbase.mdx
@@ -1,4 +1,7 @@
-# eth_coinbase
+---
+title: "eth_coinbase"
+---
+
Returns the current coinbase address, which is the account the wallet will use as the default sender.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_estimateGas.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_estimateGas.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_estimateGas.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_estimateGas.mdx
index e9e5caa9..f3ace6a0 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_estimateGas.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_estimateGas.mdx
@@ -1,4 +1,7 @@
-# eth_estimateGas
+---
+title: "eth_estimateGas"
+---
+
> Generates and returns an estimate of how much gas is necessary to allow the transaction to complete.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_feeHistory.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_feeHistory.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_feeHistory.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_feeHistory.mdx
index f493f243..e8765b56 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_feeHistory.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_feeHistory.mdx
@@ -1,4 +1,7 @@
-# eth_feeHistory
+---
+title: "eth_feeHistory"
+---
+
> Returns a collection of historical gas information from which you can recompute gas costs.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_gasPrice.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_gasPrice.mdx
similarity index 89%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_gasPrice.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_gasPrice.mdx
index 27be45c5..b40fcaa8 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_gasPrice.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_gasPrice.mdx
@@ -1,4 +1,7 @@
-# eth_gasPrice
+---
+title: "eth_gasPrice"
+---
+
> Returns the current price per gas in wei.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBalance.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBalance.mdx
similarity index 94%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBalance.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBalance.mdx
index d5fe5b5e..8249c3b3 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBalance.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBalance.mdx
@@ -1,4 +1,7 @@
-# eth_getBalance
+---
+title: "eth_getBalance"
+---
+
> Returns the balance of the account of given address.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByHash.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByHash.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByHash.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByHash.mdx
index a4ff02ea..8a0ea2e1 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByHash.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByHash.mdx
@@ -1,4 +1,7 @@
-# eth_getBlockByHash
+---
+title: "eth_getBlockByHash"
+---
+
Defined in the [Ethereum JSON-RPC Specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByNumber.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByNumber.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByNumber.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByNumber.mdx
index a24531b1..261b21e9 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByNumber.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByNumber.mdx
@@ -1,4 +1,7 @@
-# eth_getBlockByNumber
+---
+title: "eth_getBlockByNumber"
+---
+
> Returns information about a block by block number.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByHash.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByHash.mdx
similarity index 92%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByHash.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByHash.mdx
index b848c06b..b0269462 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByHash.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByHash.mdx
@@ -1,4 +1,7 @@
-# eth_getBlockTransactionCountByHash
+---
+title: "eth_getBlockTransactionCountByHash"
+---
+
Defined in the [Ethereum JSON-RPC Specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByNumber.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByNumber.mdx
similarity index 92%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByNumber.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByNumber.mdx
index 95dc8898..6b53bf78 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByNumber.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByNumber.mdx
@@ -1,4 +1,7 @@
-# eth_getBlockTransactionCountByNumber
+---
+title: "eth_getBlockTransactionCountByNumber"
+---
+
Defined in the [Ethereum JSON-RPC Specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getCode.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getCode.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getCode.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getCode.mdx
index 9c35d90e..d74f413a 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getCode.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getCode.mdx
@@ -1,4 +1,7 @@
-# eth_getCode
+---
+title: "eth_getCode"
+---
+
> Returns the bytecode at a given address.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getLogs.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getLogs.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getLogs.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getLogs.mdx
index 0c02fdfa..7e4588d8 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getLogs.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getLogs.mdx
@@ -1,4 +1,7 @@
-# eth_getLogs
+---
+title: "eth_getLogs"
+---
+
> Returns an array of all logs matching the given filter object.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getProof.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getProof.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getProof.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getProof.mdx
index 6152e3cd..be5550d9 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getProof.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getProof.mdx
@@ -1,4 +1,7 @@
-# eth_getProof
+---
+title: "eth_getProof"
+---
+
Defined in [EIP-1186](https://eips.ethereum.org/EIPS/eip-1186)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getStorageAt.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getStorageAt.mdx
similarity index 95%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getStorageAt.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getStorageAt.mdx
index 4f959499..e9d3c694 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getStorageAt.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getStorageAt.mdx
@@ -1,4 +1,7 @@
-# eth_getStorageAt
+---
+title: "eth_getStorageAt"
+---
+
Defined in the [Ethereum JSON-RPC Specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockHashAndIndex.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockHashAndIndex.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockHashAndIndex.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockHashAndIndex.mdx
index 432f4779..5c9a94bf 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockHashAndIndex.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockHashAndIndex.mdx
@@ -1,4 +1,7 @@
-# eth_getTransactionByBlockHashAndIndex
+---
+title: "eth_getTransactionByBlockHashAndIndex"
+---
+
Defined in the [Ethereum JSON-RPC Specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockNumberAndIndex.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockNumberAndIndex.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockNumberAndIndex.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockNumberAndIndex.mdx
index 3f9d9a11..f5dc6e24 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockNumberAndIndex.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockNumberAndIndex.mdx
@@ -1,4 +1,7 @@
-# eth_getTransactionByBlockNumberAndIndex
+---
+title: "eth_getTransactionByBlockNumberAndIndex"
+---
+
Defined in the [Ethereum JSON-RPC Specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByHash.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByHash.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByHash.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByHash.mdx
index 6662a73c..101f5015 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByHash.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByHash.mdx
@@ -1,4 +1,7 @@
-# eth_getTransactionByHash
+---
+title: "eth_getTransactionByHash"
+---
+
> Returns information about a transaction by transaction hash.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionCount.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionCount.mdx
similarity index 93%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionCount.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionCount.mdx
index d9a9baaf..7315d247 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionCount.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionCount.mdx
@@ -1,4 +1,7 @@
-# eth_getTransactionCount
+---
+title: "eth_getTransactionCount"
+---
+
> Returns the number of transactions sent from an address.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionReceipt.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionReceipt.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionReceipt.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionReceipt.mdx
index a522b439..82de800f 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionReceipt.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionReceipt.mdx
@@ -1,4 +1,7 @@
-# eth_getTransactionReceipt
+---
+title: "eth_getTransactionReceipt"
+---
+
> Returns the receipt of a transaction by transaction hash.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockHash.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockHash.mdx
similarity index 92%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockHash.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockHash.mdx
index c8de081b..a66f9707 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockHash.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockHash.mdx
@@ -1,4 +1,7 @@
-# eth_getUncleCountByBlockHash
+---
+title: "eth_getUncleCountByBlockHash"
+---
+
Defined in the [Ethereum JSON-RPC Specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockNumber.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockNumber.mdx
similarity index 93%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockNumber.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockNumber.mdx
index 5ee673cb..40d4b9ba 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockNumber.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockNumber.mdx
@@ -1,4 +1,7 @@
-# eth_getUncleCountByBlockNumber
+---
+title: "eth_getUncleCountByBlockNumber"
+---
+
Defined in the [Ethereum JSON-RPC Specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_requestAccounts.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_requestAccounts.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_requestAccounts.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_requestAccounts.mdx
index c8af6c45..c0c14601 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_requestAccounts.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_requestAccounts.mdx
@@ -1,4 +1,7 @@
-# eth_requestAccounts
+---
+title: "eth_requestAccounts"
+---
+
Defined in [EIP-1102](https://eips.ethereum.org/EIPS/eip-1102)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendRawTransaction.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendRawTransaction.mdx
similarity index 94%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendRawTransaction.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendRawTransaction.mdx
index b0129777..aa5ae378 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendRawTransaction.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendRawTransaction.mdx
@@ -1,4 +1,7 @@
-# eth_sendRawTransaction
+---
+title: "eth_sendRawTransaction"
+---
+
> Submits a pre-signed transaction for broadcast to the Ethereum network.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendTransaction.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendTransaction.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendTransaction.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendTransaction.mdx
index 3548320c..3223bb81 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendTransaction.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendTransaction.mdx
@@ -1,4 +1,7 @@
-# eth_sendTransaction
+---
+title: "eth_sendTransaction"
+---
+
Defined in [EIP-1474](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1474.md)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_signTypedData_v4.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_signTypedData_v4.mdx
similarity index 99%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_signTypedData_v4.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_signTypedData_v4.mdx
index fec245e1..77bc036b 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_signTypedData_v4.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_signTypedData_v4.mdx
@@ -1,4 +1,7 @@
-# eth_signTypedData_v4
+---
+title: "eth_signTypedData_v4"
+---
+
Defined in [EIP-712](https://eips.ethereum.org/EIPS/eip-712)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/personal_sign.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/personal_sign.mdx
similarity index 95%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/personal_sign.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/personal_sign.mdx
index f532dc17..5e8c7d6d 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/personal_sign.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/personal_sign.mdx
@@ -1,4 +1,7 @@
-# personal_sign
+---
+title: "personal_sign"
+---
+
Defined in [EIP-191](https://eips.ethereum.org/EIPS/eip-191)
diff --git a/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/request-overview.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/request-overview.mdx
new file mode 100644
index 00000000..3758fac3
--- /dev/null
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/request-overview.mdx
@@ -0,0 +1,96 @@
+---
+title: "Overview"
+---
+
+
+The `request` method allows apps to make make Ethereum RPC requests to the wallet.
+
+## Specification
+
+```ts twoslash
+interface RequestArguments {
+ readonly method: string;
+ readonly params?: readonly unknown[] | object;
+}
+
+interface ProviderRpcError extends Error {
+ code: number;
+ data?: unknown;
+}
+
+interface CoinbaseWalletProvider {
+ /**
+ * @param {RequestArguments} args request arguments.
+ * @returns A promise that resolves with the result.
+ * @throws {ProviderRpcError} incase of error.
+ * @fires CoinbaseWalletProvider#connect When the provider successfully connects.
+ */
+ request: (args: RequestArguments) => Promise
+}
+```
+
+### Example
+
+
+```ts twoslash [example.ts]
+import {provider} from "./setup";
+
+const addresses = await provider.request({method: 'eth_requestAccounts'});
+const txHash = await provider.request({
+ method: 'eth_sendTransaction',
+ params: [{from: addresses[0], to: addresses[0], value: 1}]
+ }
+);
+```
+
+```ts twoslash [setup.ts] filename="setup.ts"
+import { CoinbaseWalletSDK } from '@coinbase/wallet-sdk'
+
+const baseSepoliaChainId = 84532;
+
+export const sdk = new CoinbaseWalletSDK({
+ appName: 'My App Name',
+ appChainIds: [baseSepoliaChainId]
+});
+
+const provider = sdk.makeWeb3Provider();
+```
+
+
+## Request Handling
+
+Requests are handled in one of three ways
+
+1. Sent to the Wallet application (Wallet mobile app, extension, or popup window).
+2. Handled locally by the SDK.
+3. Passed onto default RPC provider for the given chain, if it exists.
+
+### 1. Sent to the Wallet application
+
+The following RPC requests are sent to the Wallet application:
+
+- eth_ecRecover
+- personal_sign
+- personal_ecRecover
+- eth_signTransaction
+- eth_sendTransaction
+- eth_signTypedData_v1
+- eth_signTypedData_v3
+- eth_signTypedData_v4
+- eth_signTypedData
+- wallet_addEthereumChain
+- wallet_watchAsset
+- wallet_sendCalls
+- wallet_showCallsStatus
+
+### 2. Handled Locally by the SDK
+
+The following requests are handled locally by the SDK, with no external calls.
+
+- eth_requestAccounts
+- eth_accounts
+- eth_coinbase
+- net_version
+- eth_chainId
+- wallet_getCapabilities
+- wallet_switchEthereumChain
diff --git a/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/sdk-overview.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/sdk-overview.mdx
new file mode 100644
index 00000000..66030f0f
--- /dev/null
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/sdk-overview.mdx
@@ -0,0 +1,14 @@
+---
+title: "Overview"
+---
+
+
+## Introduction
+
+CoinbaseWalletProvider is an [JavaScript Ethereum provider](https://eips.ethereum.org/EIPS/eip-1193).
+It allows JavaScript applications to make Ethereum RPC requests, via its `request` method.
+These requests will be handled in one of three ways
+
+1. Sent to the Wallet (Wallet mobile app, extension, or popup window).
+2. Handled locally
+3. Passed onto default RPC provider for the given chain, if it exists.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addEthereumChain.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addEthereumChain.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addEthereumChain.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addEthereumChain.mdx
index e8167526..d1b5694b 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addEthereumChain.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addEthereumChain.mdx
@@ -1,4 +1,7 @@
-# wallet_addEthereumChain
+---
+title: "wallet_addEthereumChain"
+---
+
Defined in [EIP-3085](https://eips.ethereum.org/EIPS/eip-3085)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addSubAccount.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addSubAccount.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addSubAccount.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addSubAccount.mdx
index f4cbc4b9..0c57bc4e 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addSubAccount.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addSubAccount.mdx
@@ -1,4 +1,7 @@
-# wallet_addSubAccount
+---
+title: "wallet_addSubAccount"
+---
+
Experimental RPC Defined in [EIP-7895](https://eip.tools/eip/7895)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_connect.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_connect.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_connect.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_connect.mdx
index af03a0cf..965328a4 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_connect.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_connect.mdx
@@ -1,4 +1,7 @@
-# wallet_connect
+---
+title: "wallet_connect"
+---
+
Experimental RPC defined in [ERC-7846](https://github.com/ethereum/ERCs/pull/779)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_switchEthereumChain.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_switchEthereumChain.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_switchEthereumChain.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_switchEthereumChain.mdx
index fe2f684c..6ff76e4b 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_switchEthereumChain.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_switchEthereumChain.mdx
@@ -1,4 +1,7 @@
-# wallet_switchEthereumChain
+---
+title: "wallet_switchEthereumChain"
+---
+
Defined in [EIP-3326](https://github.com/ethereum/EIPs/pull/3326)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_watchAsset.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_watchAsset.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_watchAsset.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_watchAsset.mdx
index 3f189d54..43682386 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_watchAsset.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_watchAsset.mdx
@@ -1,4 +1,7 @@
-# wallet_watchAsset
+---
+title: "wallet_watchAsset"
+---
+
Defined in [EIP-747](https://eips.ethereum.org/EIPS/eip-747)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/web3_clientVersion.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/web3_clientVersion.mdx
similarity index 90%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/web3_clientVersion.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/web3_clientVersion.mdx
index 48ad32e9..561b690b 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/web3_clientVersion.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/web3_clientVersion.mdx
@@ -1,4 +1,7 @@
-# web3_clientVersion
+---
+title: "web3_clientVersion"
+---
+
Defined in the [Ethereum JSON-RPC Specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/index.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/index.mdx
similarity index 96%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/index.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/index.mdx
index 01302633..812bcd5a 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/index.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/index.mdx
@@ -1,11 +1,13 @@
-# Coinbase Wallet SDK
+---
+title: "Coinbase Wallet SDK"
+---
+
The Coinbase Wallet SDK is a JavaScript library that allows you to connect to the Coinbase Wallet Provider.
## Installation
-:::code-group
-
+
```bash [npm]
npm i @coinbase/wallet-sdk
```
@@ -21,8 +23,7 @@ yarn add @coinbase/wallet-sdk
```bash [bun]
bun i @coinbase/wallet-sdk
```
-
-:::
+
## makeWeb3Provider
@@ -30,8 +31,7 @@ Creates a new `CoinbaseWalletProvider` instance using a `CoinbaseWalletSDK` inst
### Usage
-:::code-group
-
+
```ts twoslash [provider.ts]
import {sdk} from "./setup";
@@ -49,8 +49,7 @@ export const sdk = new CoinbaseWalletSDK({
appChainIds: [8453]
});
```
-
-:::
+
### Returns
@@ -68,10 +67,11 @@ Determines which connection options users will see. Defaults to `all`.
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.
-:::
+
+
##### `smartWalletOnly`
diff --git a/docs/pages/identity/smart-wallet/technical-reference/sdk/sub-account-reference.mdx b/_pages/identity/smart-wallet/technical-reference/sdk/sub-account-reference.mdx
similarity index 98%
rename from docs/pages/identity/smart-wallet/technical-reference/sdk/sub-account-reference.mdx
rename to _pages/identity/smart-wallet/technical-reference/sdk/sub-account-reference.mdx
index 4ff2a97e..543484e2 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/sdk/sub-account-reference.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/sdk/sub-account-reference.mdx
@@ -1,15 +1,21 @@
-# Sub Accounts
+---
+title: "Sub Accounts"
+---
+
## Overview
The Coinbase Wallet SDK now supports Sub Accounts, allowing apps to create and manage additional smart contract accounts for users.
Sub Accounts can have multiple owners and operate as smart contract wallets with enhanced security and flexibility.
-:::warning[Sub Account scope]
+
+**Sub Account scope**
+
Sub Accounts are currently scoped to an application's fully qualified domain name (FQDN).
This means that a user has one sub account for your application,
and it cannot be used on other applications on separate domains.
-:::
+
+
## Getting Started
diff --git a/_pages/identity/smart-wallet/technical-reference/spend-permissions/coinbase-fetchpermissions.mdx b/_pages/identity/smart-wallet/technical-reference/spend-permissions/coinbase-fetchpermissions.mdx
new file mode 100644
index 00000000..fa6cf6d4
--- /dev/null
+++ b/_pages/identity/smart-wallet/technical-reference/spend-permissions/coinbase-fetchpermissions.mdx
@@ -0,0 +1,115 @@
+---
+title: "Coinbase Wallet API - Spend Permissions"
+---
+
+
+The `coinbase_fetchPermissions` RPC method retrieves permissions associated with a specific account, chain, and spender. This method excludes permissions that have expired or been revoked.
+
+## Overview
+
+**RPC Method:** `coinbase_fetchPermissions`
+
+**Endpoint:** `https://rpc.wallet.coinbase.com`
+
+This RPC method allows you to query active spend permissions for an account on a specific chain and spender.
+
+## Example Request
+
+Below is an example of how to use the `coinbase_fetchPermissions` method with a cURL request:
+
+```bash
+curl --location 'https://rpc.wallet.coinbase.com' \
+--header 'Content-Type: application/json' \
+--data '{
+ "jsonrpc": "2.0",
+ "method": "coinbase_fetchPermissions",
+ "params": [
+ {
+ "account": "0xfB2adc8629FC9F54e243377ffcECEb437a42934C",
+ "chainId": "0x14A34",
+ "spender": "0x2a83b0e4462449660b6e7567b2c81ac6d04d877d"
+ }
+ ],
+ "id": 1
+}'
+```
+
+## Request Schema
+
+```typescript
+type FetchPermissionsRequest = {
+ chainId: string; // hex, uint256
+ account: string; // address
+ spender: string; // address
+ pageOptions?: {
+ pageSize: number; // number of items requested, defaults to 50
+ cursor: string; // identifier for where the page should start
+ };
+};
+```
+
+### Parameters
+
+- **`chainId`**: The ID of the blockchain, in hexadecimal format.
+- **`account`**: The address of the account whose permissions are being queried.
+- **`spender`**: The entity granted with the permission to spend the `account`'s funds.
+- **`pageOptions`** _(optional)_:
+ - **`pageSize`**: The number of permissions to fetch in a single request (default: 50).
+ - **`cursor`**: A unique identifier to start fetching from a specific page.
+
+## Response Schema
+
+```typescript
+type FetchPermissionsResult = {
+ permissions: FetchPermissionsResultItem[];
+ pageDescription: {
+ pageSize: number; // number of items returned
+ nextCursor: string; // identifier for where the next page should start
+ };
+};
+
+type FetchPermissionsResultItem = {
+ createdAt: number; // UTC timestamp for when the permission was granted
+ permissionHash: string; // hex
+ signature: string; // hex
+ permission: {
+ account: string; // address
+ spender: string; // address
+ token: string; // address
+ allowance: string; // base 10 numeric string
+ period: number; // unix seconds
+ start: number; // unix seconds
+ end: number; // unix seconds
+ salt: string; // base 10 numeric string
+ extraData: string; // hex
+ };
+};
+```
+
+### Fields
+
+- **`permissions`**: An array of permission objects.
+- **`pageDescription`**:
+ - **`pageSize`**: Number of permissions returned in this response.
+ - **`nextCursor`**: The cursor to be used for the next page of results.
+
+### Permission Object
+
+- **`createdAt`**: The UTC timestamp when the permission was granted.
+- **`permissionHash`**: A unique hash representing the permission.
+- **`signature`**: The cryptographic signature for the permission.
+- **`permission`**:
+ - **`account`**: The address of the account granting the permission.
+ - **`spender`**: The address of the spender receiving the permission.
+ - **`token`**: The address of the token involved.
+ - **`allowance`**: The amount allowed, represented as a base 10 numeric string.
+ - **`period`**: Duration of the permission in Unix seconds.
+ - **`start`**: Start time of the permission in Unix seconds.
+ - **`end`**: End time of the permission in Unix seconds.
+ - **`salt`**: A unique salt value as a base 10 numeric string.
+ - **`extraData`**: Additional data in hexadecimal format.
+
+## Notes
+
+- Ensure the `chainId`, `account`, and `spender` parameters are correctly formatted and valid for the blockchain you are querying.
+- This RPC method only returns active permissions.
diff --git a/docs/pages/identity/smart-wallet/technical-reference/spend-permissions/spendpermissionmanager.mdx b/_pages/identity/smart-wallet/technical-reference/spend-permissions/spendpermissionmanager.mdx
similarity index 97%
rename from docs/pages/identity/smart-wallet/technical-reference/spend-permissions/spendpermissionmanager.mdx
rename to _pages/identity/smart-wallet/technical-reference/spend-permissions/spendpermissionmanager.mdx
index 18ef2a10..37cc2c99 100644
--- a/docs/pages/identity/smart-wallet/technical-reference/spend-permissions/spendpermissionmanager.mdx
+++ b/_pages/identity/smart-wallet/technical-reference/spend-permissions/spendpermissionmanager.mdx
@@ -1,6 +1,9 @@
-import { Callout } from "vocs/components";
+---
+title: "`SpendPermissionManager.sol` smart contract"
+---
+
+;
-# `SpendPermissionManager.sol` smart contract
The open-source contracts repository is [here](https://github.com/coinbase/spend-permissions).
@@ -10,10 +13,10 @@ The open-source contracts repository is [here](https://github.com/coinbase/spend
Defines the complete parameters of a spend permission.
-
+
The fields of the `SpendPermission` structure must be strictly ordered as
defined below.
-
+
| Field | Type | Description |
| ----------- | --------- | ------------------------------------------------------------------------------------------ |
diff --git a/docs/pages/identity/wallet-sdk/adding-tokens-to-coinbase-wallet.mdx b/_pages/identity/wallet-sdk/adding-tokens-to-coinbase-wallet.mdx
similarity index 98%
rename from docs/pages/identity/wallet-sdk/adding-tokens-to-coinbase-wallet.mdx
rename to _pages/identity/wallet-sdk/adding-tokens-to-coinbase-wallet.mdx
index 6435bb0e..7c7ba527 100644
--- a/docs/pages/identity/wallet-sdk/adding-tokens-to-coinbase-wallet.mdx
+++ b/_pages/identity/wallet-sdk/adding-tokens-to-coinbase-wallet.mdx
@@ -12,9 +12,12 @@ Coinbase Wallet makes any ERC-20 token instantly available for swapping seconds
Follow the instructions below to ensure your token logo, asset name, and other metadata also appear on Coinbase Wallet.
-:::info[Disclaimer]
+
+**Disclaimer**
+
Base does not endorse any specific token that is deployed on mainnet and made available for swapping.
-:::
+
+
---
@@ -61,7 +64,10 @@ How to get your custom link:
**Step 2:** Click the share button
-:::info[Disclaimer]
+
+**Disclaimer**
+
New assets with low liquidity may result in failed swaps or may result in a user receiving less of the destination token due to slippage. An important responsibility of the token creator is to communicate to the community these risks.
-:::
+
+
diff --git a/docs/pages/identity/wallet-sdk/android-api-reference.mdx b/_pages/identity/wallet-sdk/android-api-reference.mdx
similarity index 99%
rename from docs/pages/identity/wallet-sdk/android-api-reference.mdx
rename to _pages/identity/wallet-sdk/android-api-reference.mdx
index 898c5420..02bf5afb 100644
--- a/docs/pages/identity/wallet-sdk/android-api-reference.mdx
+++ b/_pages/identity/wallet-sdk/android-api-reference.mdx
@@ -33,8 +33,7 @@ None.
#### Example
-:::code-group
-
+
```kotlin [Kotlin]
val requestAccounts = Web3JsonRPC.RequestAccounts().action()
```
@@ -42,6 +41,5 @@ val requestAccounts = Web3JsonRPC.RequestAccounts().action()
```java [Java]
Action requestAccounts = new Web3JsonRPC.RequestAccounts().action(false);
```
-
-:::
+
diff --git a/docs/pages/identity/wallet-sdk/android-establishing-a-connection.mdx b/_pages/identity/wallet-sdk/android-establishing-a-connection.mdx
similarity index 98%
rename from docs/pages/identity/wallet-sdk/android-establishing-a-connection.mdx
rename to _pages/identity/wallet-sdk/android-establishing-a-connection.mdx
index aec4ee58..364d9090 100644
--- a/docs/pages/identity/wallet-sdk/android-establishing-a-connection.mdx
+++ b/_pages/identity/wallet-sdk/android-establishing-a-connection.mdx
@@ -6,8 +6,7 @@ slug: 'android-establishing-a-connection'
A connection to Coinbase Wallet can be initiated by calling the `initiateHandshake` function provided by the SDK. The function also takes in an optional `initialActions` parameter which apps can use to take certain actions along with the initial handshake request.
-:::code-group
-
+
```kotlin [Kotlin]
val requestAccount = Web3JsonRPC.RequestAccounts().action()
val handShakeActions = listOf(requestAccount)
@@ -47,8 +46,7 @@ client.initiateHandshake(
}
);
```
-
-:::
+
An example handshake request is provided in the [sample application](https://github.com/MobileWalletProtocol/wallet-mobile-sdk/blob/main/android/example/src/main/java/com/coinbase/android/beta/MainActivity.kt).
diff --git a/docs/pages/identity/wallet-sdk/android-install.mdx b/_pages/identity/wallet-sdk/android-install.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/android-install.mdx
rename to _pages/identity/wallet-sdk/android-install.mdx
diff --git a/docs/pages/identity/wallet-sdk/android-making-requests.mdx b/_pages/identity/wallet-sdk/android-making-requests.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/android-making-requests.mdx
rename to _pages/identity/wallet-sdk/android-making-requests.mdx
diff --git a/docs/pages/identity/wallet-sdk/android-setup.mdx b/_pages/identity/wallet-sdk/android-setup.mdx
similarity index 97%
rename from docs/pages/identity/wallet-sdk/android-setup.mdx
rename to _pages/identity/wallet-sdk/android-setup.mdx
index e2889e9e..c5b46159 100644
--- a/docs/pages/identity/wallet-sdk/android-setup.mdx
+++ b/_pages/identity/wallet-sdk/android-setup.mdx
@@ -14,8 +14,7 @@ In order for your app to interact with Coinbase Wallet, you must add a [queries
Before the SDK can be used, it needs to be configured with an App Link to your application. This callback URL will be used by the Coinbase Wallet application to navigate back to your application.
-:::code-group
-
+
```kotlin [Kotlin]
CoinbaseWalletSDK(
appContext = applicationContext,
@@ -34,13 +33,11 @@ new CoinbaseWalletSDK(
}
);
```
-
-:::
+
When your application receives a response from Coinbase Wallet via App Links, this URL needs to be handed off to the SDK via the `handleResponse` function.
-:::code-group
-
+
```kotlin [Kotlin]
launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val uri = result.data?.data ?: return@registerForActivityResult
@@ -65,8 +62,7 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
client.handleResponse(url);
}
```
-
-:::
+
An example is provided in our [sample application](https://github.com/coinbase/wallet-mobile-sdk/blob/master/android/example/src/main/java/com/coinbase/android/beta/ui/MainActivity.kt#L42).
diff --git a/docs/pages/identity/wallet-sdk/developer-settings.mdx b/_pages/identity/wallet-sdk/developer-settings.mdx
similarity index 97%
rename from docs/pages/identity/wallet-sdk/developer-settings.mdx
rename to _pages/identity/wallet-sdk/developer-settings.mdx
index 7e4a2c95..40a2b211 100644
--- a/docs/pages/identity/wallet-sdk/developer-settings.mdx
+++ b/_pages/identity/wallet-sdk/developer-settings.mdx
@@ -16,27 +16,28 @@ Enable and disable test networks.
To see a list of supported test networks, see [Whitelisted Networks](./whitelisted-networks.mdx).
-:::info
+
Testnets are enabled by default for the Coinbase Wallet browser extension. When enabled, Testnet assets display separately from Mainnet assets in a dedicated Testnets tab.
-:::
+
+
## Show private key
View the private key associated with your wallet.
-:::info
+
If `Show Private Key` is disabled, you are connected to the extension through your mobile app or your hardware wallet.
To export your private key and get full functionality, first sign out of the extension and import your seed phrase into Coinbase Wallet Extension.
-:::
+
-
-:::caution
+
+
Do not share your private key with anyone, even Coinbase. Anyone with your private key can steal your funds.
+
-:::
## Export custom networks
diff --git a/docs/pages/identity/wallet-sdk/disconnecting-links.mdx b/_pages/identity/wallet-sdk/disconnecting-links.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/disconnecting-links.mdx
rename to _pages/identity/wallet-sdk/disconnecting-links.mdx
diff --git a/docs/pages/identity/wallet-sdk/environments.mdx b/_pages/identity/wallet-sdk/environments.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/environments.mdx
rename to _pages/identity/wallet-sdk/environments.mdx
diff --git a/docs/pages/identity/wallet-sdk/errors.mdx b/_pages/identity/wallet-sdk/errors.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/errors.mdx
rename to _pages/identity/wallet-sdk/errors.mdx
diff --git a/_pages/identity/wallet-sdk/existing-welcome-page-features.mdx b/_pages/identity/wallet-sdk/existing-welcome-page-features.mdx
new file mode 100644
index 00000000..323269b5
--- /dev/null
+++ b/_pages/identity/wallet-sdk/existing-welcome-page-features.mdx
@@ -0,0 +1,5 @@
+---
+title: "Existing Welcome Page Features"
+---
+
+
diff --git a/docs/pages/identity/wallet-sdk/faq.mdx b/_pages/identity/wallet-sdk/faq.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/faq.mdx
rename to _pages/identity/wallet-sdk/faq.mdx
diff --git a/docs/pages/identity/wallet-sdk/getting-eth-accounts.mdx b/_pages/identity/wallet-sdk/getting-eth-accounts.mdx
similarity index 99%
rename from docs/pages/identity/wallet-sdk/getting-eth-accounts.mdx
rename to _pages/identity/wallet-sdk/getting-eth-accounts.mdx
index 17ca831b..29a646ab 100644
--- a/docs/pages/identity/wallet-sdk/getting-eth-accounts.mdx
+++ b/_pages/identity/wallet-sdk/getting-eth-accounts.mdx
@@ -31,10 +31,10 @@ ethereum.enable().then((accounts: string[]) => {
Once the user obtains authorization, the Web3 object (`web3`) and the Web3 Provider (`ethereum`) are ready to be used.
-:::info
-
+
If you were using `ethereum.on("accountsChanged")`, remove it and obtain addresses with EIP-1102 callbacks instead. It was removed to improve compatibility with the latest `web3.js`.
-:::
+
+
**Next steps:**
diff --git a/docs/pages/identity/wallet-sdk/injected-provider-guidance.mdx b/_pages/identity/wallet-sdk/injected-provider-guidance.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/injected-provider-guidance.mdx
rename to _pages/identity/wallet-sdk/injected-provider-guidance.mdx
diff --git a/docs/pages/identity/wallet-sdk/injected-provider.mdx b/_pages/identity/wallet-sdk/injected-provider.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/injected-provider.mdx
rename to _pages/identity/wallet-sdk/injected-provider.mdx
diff --git a/docs/pages/identity/wallet-sdk/installing.mdx b/_pages/identity/wallet-sdk/installing.mdx
similarity index 99%
rename from docs/pages/identity/wallet-sdk/installing.mdx
rename to _pages/identity/wallet-sdk/installing.mdx
index 9b830055..745593bd 100644
--- a/docs/pages/identity/wallet-sdk/installing.mdx
+++ b/_pages/identity/wallet-sdk/installing.mdx
@@ -6,9 +6,10 @@ slug: 'installing'
This page explains how to install and upgrade Coinbase Wallet SDK.
-:::caution
+
The installation package for **Coinbase Wallet SDK** (formerly WalletLink) is now named `@coinbase/wallet-sdk`.
-:::
+
+
## Installing Wallet SDK
diff --git a/docs/pages/identity/wallet-sdk/ios-api-reference.mdx b/_pages/identity/wallet-sdk/ios-api-reference.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/ios-api-reference.mdx
rename to _pages/identity/wallet-sdk/ios-api-reference.mdx
diff --git a/docs/pages/identity/wallet-sdk/ios-establishing-a-connection.mdx b/_pages/identity/wallet-sdk/ios-establishing-a-connection.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/ios-establishing-a-connection.mdx
rename to _pages/identity/wallet-sdk/ios-establishing-a-connection.mdx
diff --git a/docs/pages/identity/wallet-sdk/ios-install.mdx b/_pages/identity/wallet-sdk/ios-install.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/ios-install.mdx
rename to _pages/identity/wallet-sdk/ios-install.mdx
diff --git a/docs/pages/identity/wallet-sdk/ios-making-requests.mdx b/_pages/identity/wallet-sdk/ios-making-requests.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/ios-making-requests.mdx
rename to _pages/identity/wallet-sdk/ios-making-requests.mdx
diff --git a/docs/pages/identity/wallet-sdk/ios-setup.mdx b/_pages/identity/wallet-sdk/ios-setup.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/ios-setup.mdx
rename to _pages/identity/wallet-sdk/ios-setup.mdx
diff --git a/docs/pages/identity/wallet-sdk/message-payment-xmtp-content-type.mdx b/_pages/identity/wallet-sdk/message-payment-xmtp-content-type.mdx
similarity index 99%
rename from docs/pages/identity/wallet-sdk/message-payment-xmtp-content-type.mdx
rename to _pages/identity/wallet-sdk/message-payment-xmtp-content-type.mdx
index 1a0dc2fc..8de20a6c 100644
--- a/docs/pages/identity/wallet-sdk/message-payment-xmtp-content-type.mdx
+++ b/_pages/identity/wallet-sdk/message-payment-xmtp-content-type.mdx
@@ -50,9 +50,10 @@ A regular payment message contains details of standard cryptocurrency transactio
| `toAddress` | The recipient's cryptocurrency wallet address. |
| `transactionHash` | A unique identifier for the transaction. |
-:::info
+
The `transactionHash` can be used to fetch additional details and verify that the transaction has succeeded.
-:::
+
+
## Coinbase Sponsored Payments
diff --git a/_pages/identity/wallet-sdk/mobile-dapp-integration-via-deep-linking.mdx b/_pages/identity/wallet-sdk/mobile-dapp-integration-via-deep-linking.mdx
new file mode 100644
index 00000000..ec066e9c
--- /dev/null
+++ b/_pages/identity/wallet-sdk/mobile-dapp-integration-via-deep-linking.mdx
@@ -0,0 +1,5 @@
+---
+title: "Mobile DApp Integration via Deep Linking"
+---
+
+
diff --git a/docs/pages/identity/wallet-sdk/mobile-sdk-overview.mdx b/_pages/identity/wallet-sdk/mobile-sdk-overview.mdx
similarity index 98%
rename from docs/pages/identity/wallet-sdk/mobile-sdk-overview.mdx
rename to _pages/identity/wallet-sdk/mobile-sdk-overview.mdx
index 343175c3..08b3d6e9 100644
--- a/docs/pages/identity/wallet-sdk/mobile-sdk-overview.mdx
+++ b/_pages/identity/wallet-sdk/mobile-sdk-overview.mdx
@@ -6,9 +6,10 @@ slug: 'mobile-sdk-overview'
[Coinbase Wallet Mobile SDK](https://github.com/MobileWalletProtocol/wallet-mobile-sdk) is an open source SDK that allows you to connect your native mobile applications to millions of Coinbase Wallet users.
-:::info
+
Coinbase Wallet Mobile SDK does not work with [Smart Wallet](https://www.smartwallet.dev/).
-:::
+
+
## Platforms
diff --git a/docs/pages/identity/wallet-sdk/sample-applications.mdx b/_pages/identity/wallet-sdk/sample-applications.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/sample-applications.mdx
rename to _pages/identity/wallet-sdk/sample-applications.mdx
diff --git a/docs/pages/identity/wallet-sdk/setup.mdx b/_pages/identity/wallet-sdk/setup.mdx
similarity index 98%
rename from docs/pages/identity/wallet-sdk/setup.mdx
rename to _pages/identity/wallet-sdk/setup.mdx
index 4f48caa9..69d99df0 100644
--- a/docs/pages/identity/wallet-sdk/setup.mdx
+++ b/_pages/identity/wallet-sdk/setup.mdx
@@ -8,13 +8,15 @@ This page explains how to integrate Coinbase Wallet SDK as the default provider
## Setting up Coinbase Wallet SDK
-:::caution
+
The code snippets have been updated to reflect the rebranding of Coinbase Wallet SDK from its previous name of WalletLink.
-:::
+
-:::info
+
+
Instructions are in TypeScript. The usage is the same in JavaScript, except for the occasional TypeScript type annotation such as `string[]` or `as any`.
-:::
+
+
### Prerequisites
diff --git a/_pages/identity/wallet-sdk/smart-wallet.mdx b/_pages/identity/wallet-sdk/smart-wallet.mdx
new file mode 100644
index 00000000..33caaa76
--- /dev/null
+++ b/_pages/identity/wallet-sdk/smart-wallet.mdx
@@ -0,0 +1,6 @@
+---
+title: "Smart Wallet"
+---
+
+
+// ... existing code ...
diff --git a/docs/pages/identity/wallet-sdk/solana-adapter-guide.mdx b/_pages/identity/wallet-sdk/solana-adapter-guide.mdx
similarity index 99%
rename from docs/pages/identity/wallet-sdk/solana-adapter-guide.mdx
rename to _pages/identity/wallet-sdk/solana-adapter-guide.mdx
index 1bcf6e88..060fb517 100644
--- a/docs/pages/identity/wallet-sdk/solana-adapter-guide.mdx
+++ b/_pages/identity/wallet-sdk/solana-adapter-guide.mdx
@@ -18,9 +18,10 @@ To set up a new React app, run:
npx create-react-app
```
-:::info
+
For additional front-end framework support, visit the Solana wallet adapter [documentation](https://github.com/solana-labs/wallet-adapter#solanawallet-adapter) to find more [starter projects](https://github.com/solana-labs/wallet-adapter#starter-projects) and [packages](https://github.com/solana-labs/wallet-adapter#starter-projects).
-:::
+
+
## Install
@@ -76,11 +77,10 @@ export default function WalletAdapter() {
}
```
-:::info
-
+
For additional UI framework support, such as [Material UI](https://mui.com/) and [Ant Design](https://ant.design/), visit the Solana wallet adapter [documentation](https://github.com/solana-labs/wallet-adapter#ui-components).
+
-:::
## Step 3: Configure wallets
@@ -140,9 +140,10 @@ export default function WalletAdapter() {
```
-:::info
+
You can also specify the `autoconnect` attribute on the `WalletProvider` component to automatically attempt to reconnect a user wallet upon a page refresh.
-:::
+
+
## Step 4: Configure network connection
diff --git a/docs/pages/identity/wallet-sdk/solana-connecting-accounts.mdx b/_pages/identity/wallet-sdk/solana-connecting-accounts.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/solana-connecting-accounts.mdx
rename to _pages/identity/wallet-sdk/solana-connecting-accounts.mdx
diff --git a/docs/pages/identity/wallet-sdk/solana-overview.mdx b/_pages/identity/wallet-sdk/solana-overview.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/solana-overview.mdx
rename to _pages/identity/wallet-sdk/solana-overview.mdx
diff --git a/docs/pages/identity/wallet-sdk/solana-provider-api.mdx b/_pages/identity/wallet-sdk/solana-provider-api.mdx
similarity index 98%
rename from docs/pages/identity/wallet-sdk/solana-provider-api.mdx
rename to _pages/identity/wallet-sdk/solana-provider-api.mdx
index ab13f88a..6077b640 100644
--- a/docs/pages/identity/wallet-sdk/solana-provider-api.mdx
+++ b/_pages/identity/wallet-sdk/solana-provider-api.mdx
@@ -35,11 +35,10 @@ If successful, sets the `isConnected` property to `true`, and sets the `publicKe
Disconnects the user’s wallet.
If successful, sets the `isConnected` property to `false`, and sets the `publicKey` property to `null`.
-:::info
-
+
This method does not disconnect the app from the wallet under **Settings > Dapp Connections**.
+
-:::
### sendTransaction
#### `sendTransaction(transaction: Transaction, options?: SendOptions): Promise<{ signature: string }>`
@@ -47,11 +46,10 @@ This method does not disconnect the app from the wallet under **Settings > Dapp
Sends a transaction.
Returns a Promise for an object containing the signature.
-:::info
-
+
[SendOptions](https://solana-labs.github.io/solana-web3.js/modules.html#SendOptions) can be specified as a optional second argument.
+
-:::
#### Parameters
| Name | Type | Description |
@@ -80,11 +78,10 @@ Returns a Promise for the list of signed transactions.
Signs and sends a transaction.
Returns a Promise for an object containing the signature.
-:::info
-
+
[SendOptions](https://solana-labs.github.io/solana-web3.js/modules.html#SendOptions) can be specified as a optional second argument.
+
-:::
#### Parameters
| Name | Type | Description |
diff --git a/docs/pages/identity/wallet-sdk/solana-provider.mdx b/_pages/identity/wallet-sdk/solana-provider.mdx
similarity index 97%
rename from docs/pages/identity/wallet-sdk/solana-provider.mdx
rename to _pages/identity/wallet-sdk/solana-provider.mdx
index 184f8c7d..11bd50fa 100644
--- a/docs/pages/identity/wallet-sdk/solana-provider.mdx
+++ b/_pages/identity/wallet-sdk/solana-provider.mdx
@@ -18,7 +18,8 @@ const getProvider = () => {
};
```
-:::info
+
If a user does have Coinbase Wallet installed and no provider is found, we recommend redirecting the user to download Coinbase Wallet.
-:::
+
+
diff --git a/docs/pages/identity/wallet-sdk/solana-sending-transactions.mdx b/_pages/identity/wallet-sdk/solana-sending-transactions.mdx
similarity index 99%
rename from docs/pages/identity/wallet-sdk/solana-sending-transactions.mdx
rename to _pages/identity/wallet-sdk/solana-sending-transactions.mdx
index 0428e7cc..9c294eea 100644
--- a/docs/pages/identity/wallet-sdk/solana-sending-transactions.mdx
+++ b/_pages/identity/wallet-sdk/solana-sending-transactions.mdx
@@ -41,9 +41,10 @@ transaction.add(
```
-:::info
+
You can learn more about creating transactions on Solana by visiting the [Solana documentation](https://docs.solana.com/developing/clients/javascript-api#creating-and-sending-transactions).
-:::
+
+
## Signing a transaction
diff --git a/docs/pages/identity/wallet-sdk/solana-signing-messages.mdx b/_pages/identity/wallet-sdk/solana-signing-messages.mdx
similarity index 98%
rename from docs/pages/identity/wallet-sdk/solana-signing-messages.mdx
rename to _pages/identity/wallet-sdk/solana-signing-messages.mdx
index a0ad084f..c8e86998 100644
--- a/docs/pages/identity/wallet-sdk/solana-signing-messages.mdx
+++ b/_pages/identity/wallet-sdk/solana-signing-messages.mdx
@@ -16,9 +16,10 @@ const { signature } = await window.coinbaseSolana.signMessage(encodedMessage);
If the user successfully signs the message, the call returns a Promise for an object with the signature.
-:::info
+
The message passed to the `signMessage` method must be a UTF-8 encoded string as a [Uint8Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array).
-:::
+
+
## Verifying a message
diff --git a/docs/pages/identity/wallet-sdk/solana-wallet-adapter.mdx b/_pages/identity/wallet-sdk/solana-wallet-adapter.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/solana-wallet-adapter.mdx
rename to _pages/identity/wallet-sdk/solana-wallet-adapter.mdx
diff --git a/_pages/identity/wallet-sdk/supported-environments.mdx b/_pages/identity/wallet-sdk/supported-environments.mdx
new file mode 100644
index 00000000..aa3f8768
--- /dev/null
+++ b/_pages/identity/wallet-sdk/supported-environments.mdx
@@ -0,0 +1,5 @@
+---
+title: "Supported Environments"
+---
+
+
diff --git a/docs/pages/identity/wallet-sdk/sw-rainbowkit.mdx b/_pages/identity/wallet-sdk/sw-rainbowkit.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/sw-rainbowkit.mdx
rename to _pages/identity/wallet-sdk/sw-rainbowkit.mdx
diff --git a/docs/pages/identity/wallet-sdk/sw-setup.mdx b/_pages/identity/wallet-sdk/sw-setup.mdx
similarity index 94%
rename from docs/pages/identity/wallet-sdk/sw-setup.mdx
rename to _pages/identity/wallet-sdk/sw-setup.mdx
index 656af3db..783039f2 100644
--- a/docs/pages/identity/wallet-sdk/sw-setup.mdx
+++ b/_pages/identity/wallet-sdk/sw-setup.mdx
@@ -4,6 +4,7 @@ sidebar_label: "Smart Wallet"
slug: "sw-setup"
---
-:::info
+
Our Smart Wallet documentation has moved! Visit the new [Smart Wallet Documentation](https://www.smartwallet.dev/) or join the [Smart Wallet Discord Channel](https://discord.gg/invite/cdp).
-:::
+
+
diff --git a/docs/pages/identity/wallet-sdk/switching-chains.mdx b/_pages/identity/wallet-sdk/switching-chains.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/switching-chains.mdx
rename to _pages/identity/wallet-sdk/switching-chains.mdx
diff --git a/docs/pages/identity/wallet-sdk/tracking-assets.mdx b/_pages/identity/wallet-sdk/tracking-assets.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/tracking-assets.mdx
rename to _pages/identity/wallet-sdk/tracking-assets.mdx
diff --git a/_pages/identity/wallet-sdk/ux-guidelines.mdx b/_pages/identity/wallet-sdk/ux-guidelines.mdx
new file mode 100644
index 00000000..1ff107cb
--- /dev/null
+++ b/_pages/identity/wallet-sdk/ux-guidelines.mdx
@@ -0,0 +1,6 @@
+---
+title: "UX Guidelines"
+---
+
+
+// ... existing code ...
diff --git a/docs/pages/identity/wallet-sdk/ux-tips.mdx b/_pages/identity/wallet-sdk/ux-tips.mdx
similarity index 99%
rename from docs/pages/identity/wallet-sdk/ux-tips.mdx
rename to _pages/identity/wallet-sdk/ux-tips.mdx
index cc77cc51..d7dc725b 100644
--- a/docs/pages/identity/wallet-sdk/ux-tips.mdx
+++ b/_pages/identity/wallet-sdk/ux-tips.mdx
@@ -4,9 +4,10 @@ sidebar_label: "UX Guidelines"
slug: "ux-tips"
---
-:::tip
+
Coinbase Wallet SDK, or Wallet SDK, has been fully rebranded from its former name of WalletLink.
-:::
+
+
## Mobile UX guidance
diff --git a/docs/pages/identity/wallet-sdk/wallet-features.mdx b/_pages/identity/wallet-sdk/wallet-features.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/wallet-features.mdx
rename to _pages/identity/wallet-sdk/wallet-features.mdx
diff --git a/_pages/identity/wallet-sdk/wallet-mobile-sdk.mdx b/_pages/identity/wallet-sdk/wallet-mobile-sdk.mdx
new file mode 100644
index 00000000..c7b16195
--- /dev/null
+++ b/_pages/identity/wallet-sdk/wallet-mobile-sdk.mdx
@@ -0,0 +1,5 @@
+---
+title: "Wallet Mobile SDK"
+---
+
+
diff --git a/_pages/identity/wallet-sdk/wallet-sdk-existing-section.mdx b/_pages/identity/wallet-sdk/wallet-sdk-existing-section.mdx
new file mode 100644
index 00000000..8988f00e
--- /dev/null
+++ b/_pages/identity/wallet-sdk/wallet-sdk-existing-section.mdx
@@ -0,0 +1,5 @@
+---
+title: "Wallet SDK Existing Section"
+---
+
+
diff --git a/_pages/identity/wallet-sdk/wallet-sdk-mobile-sdk.mdx b/_pages/identity/wallet-sdk/wallet-sdk-mobile-sdk.mdx
new file mode 100644
index 00000000..0cdf1385
--- /dev/null
+++ b/_pages/identity/wallet-sdk/wallet-sdk-mobile-sdk.mdx
@@ -0,0 +1,5 @@
+---
+title: "Wallet SDK Mobile SDK"
+---
+
+
diff --git a/docs/pages/identity/wallet-sdk/welcome.mdx b/_pages/identity/wallet-sdk/welcome.mdx
similarity index 97%
rename from docs/pages/identity/wallet-sdk/welcome.mdx
rename to _pages/identity/wallet-sdk/welcome.mdx
index d14d0ec3..f7f2b143 100644
--- a/docs/pages/identity/wallet-sdk/welcome.mdx
+++ b/_pages/identity/wallet-sdk/welcome.mdx
@@ -4,10 +4,11 @@ sidebar_label: "Welcome"
slug: "welcome"
---
-:::announcement dapps are apps
-
+
+**dapps are apps**
+
Dapps are now called apps! If you still see references to "dapps", please forgive us while we clean things up.
-:::
+
Welcome to the Coinbase Wallet developer documentation. Coinbase Wallet is a self-custody crypto wallet, available as a browser extension and a mobile app on Android and iOS.
diff --git a/docs/pages/identity/wallet-sdk/whitelisted-networks.mdx b/_pages/identity/wallet-sdk/whitelisted-networks.mdx
similarity index 100%
rename from docs/pages/identity/wallet-sdk/whitelisted-networks.mdx
rename to _pages/identity/wallet-sdk/whitelisted-networks.mdx
diff --git a/_pages/identity/wallet-sdk/xmtp.mdx b/_pages/identity/wallet-sdk/xmtp.mdx
new file mode 100644
index 00000000..f0022bf3
--- /dev/null
+++ b/_pages/identity/wallet-sdk/xmtp.mdx
@@ -0,0 +1,5 @@
+---
+title: "XMTP"
+---
+
+
diff --git a/docs/pages/index.mdx b/_pages/index.mdx
similarity index 97%
rename from docs/pages/index.mdx
rename to _pages/index.mdx
index ad84407a..47a28a5b 100644
--- a/docs/pages/index.mdx
+++ b/_pages/index.mdx
@@ -16,13 +16,13 @@ content:
`}
-import { BrowseCard } from '@/components/BrowseCard';
+import { BrowseUseCaseCard } from '/snippets/BrowseUseCaseCard';
+import { BrowseCard } from '/snippets/BrowseCard';
import { onchainKitSvg } from '@/components/svg/onchainKitSvg';
import { smartWalletSvg } from '@/components/svg/smartWalletSvg';
import { agentKitSvg } from '@/components/svg/agentKitSvg';
import { verificationsSvg } from '@/components/svg/verificationsSvg';
import { miniKitSvg } from '@/components/svg/miniKitSvg';
-import { BrowseUseCaseCard } from '@/components/BrowseUseCaseCard';
import { onboardingSvg } from '@/components/svg/onboardingSvg';
import { agentSvg } from '@/components/svg/agentSvg';
import { paymentsSvg } from '@/components/svg/paymentsSvg';
diff --git a/docs/pages/learn/address-and-payable/address-and-payable.mdx b/_pages/learn/address-and-payable/address-and-payable.mdx
similarity index 100%
rename from docs/pages/learn/address-and-payable/address-and-payable.mdx
rename to _pages/learn/address-and-payable/address-and-payable.mdx
diff --git a/docs/pages/learn/advanced-functions/function-modifiers-vid.mdx b/_pages/learn/advanced-functions/function-modifiers-vid.mdx
similarity index 79%
rename from docs/pages/learn/advanced-functions/function-modifiers-vid.mdx
rename to _pages/learn/advanced-functions/function-modifiers-vid.mdx
index 3fc6a7b3..10616e52 100644
--- a/docs/pages/learn/advanced-functions/function-modifiers-vid.mdx
+++ b/_pages/learn/advanced-functions/function-modifiers-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Function Modifiers
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/advanced-functions/function-modifiers.mdx b/_pages/learn/advanced-functions/function-modifiers.mdx
similarity index 99%
rename from docs/pages/learn/advanced-functions/function-modifiers.mdx
rename to _pages/learn/advanced-functions/function-modifiers.mdx
index 307b09cf..87aee2bc 100644
--- a/docs/pages/learn/advanced-functions/function-modifiers.mdx
+++ b/_pages/learn/advanced-functions/function-modifiers.mdx
@@ -24,11 +24,10 @@ By default, `public` functions can be called by **anyone**, without restriction.
However, there will be many functions you **don't** want any user to be able to do, such as setting the fee for using the app, or withdrawing all funds in the contract! A common pattern to protect these functions is to use `modifier`s to make sure that only the owner can call these functions.
-:::caution
-
+
For a production app, you'll want to use a more robust implementation of `onlyOwner`, such as the [one provided by OpenZeppelin].
+
-:::
### Adding an Owner
@@ -115,11 +114,10 @@ Parameters:
Debug the transaction to get more information.
```
-:::caution
-
+
Always verify the output of a function call in the console. The result that appears under the button for the function is convenient, but it does **not** clear or change if a subsequent call reverts.
+
-:::
---
diff --git a/docs/pages/learn/advanced-functions/function-visibility-vid.mdx b/_pages/learn/advanced-functions/function-visibility-vid.mdx
similarity index 80%
rename from docs/pages/learn/advanced-functions/function-visibility-vid.mdx
rename to _pages/learn/advanced-functions/function-visibility-vid.mdx
index 8119fab3..7af2d842 100644
--- a/docs/pages/learn/advanced-functions/function-visibility-vid.mdx
+++ b/_pages/learn/advanced-functions/function-visibility-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Function Visibility
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/advanced-functions/function-visibility.mdx b/_pages/learn/advanced-functions/function-visibility.mdx
similarity index 99%
rename from docs/pages/learn/advanced-functions/function-visibility.mdx
rename to _pages/learn/advanced-functions/function-visibility.mdx
index d489656d..42f4f0cd 100644
--- a/docs/pages/learn/advanced-functions/function-visibility.mdx
+++ b/_pages/learn/advanced-functions/function-visibility.mdx
@@ -73,11 +73,10 @@ function _foo(uint _number) private returns (uint) {
}
```
-:::warning
-
+
All data on a blockchain is public. Don't mistake hiding visibility while coding for hiding information from the world!
+
-:::
---
diff --git a/docs/pages/learn/arrays/array-storage-layout-vid.mdx b/_pages/learn/arrays/array-storage-layout-vid.mdx
similarity index 79%
rename from docs/pages/learn/arrays/array-storage-layout-vid.mdx
rename to _pages/learn/arrays/array-storage-layout-vid.mdx
index b2958702..77d6665c 100644
--- a/docs/pages/learn/arrays/array-storage-layout-vid.mdx
+++ b/_pages/learn/arrays/array-storage-layout-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Array Storage Layout
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/arrays/arrays-exercise.mdx b/_pages/learn/arrays/arrays-exercise.mdx
similarity index 97%
rename from docs/pages/learn/arrays/arrays-exercise.mdx
rename to _pages/learn/arrays/arrays-exercise.mdx
index fc4868f6..1967e8b5 100644
--- a/docs/pages/learn/arrays/arrays-exercise.mdx
+++ b/_pages/learn/arrays/arrays-exercise.mdx
@@ -32,17 +32,15 @@ Write a function called `getNumbers` that returns the entire `numbers` array.
Write a `public` function called `resetNumbers` that resets the `numbers` array to its initial value, holding the numbers from 1-10.
-:::note
-
+
We'll award the pin for any solution that works, but one that **doesn't** use `.push()` is more gas-efficient!
+
-:::
-
-:::caution
+
Remember, _anyone_ can call a `public` function! You'll learn how to protect functionality in another lesson.
+
-:::
### Append to an Existing Array
@@ -54,11 +52,10 @@ At the contract level, add an `address` array called `senders` and a `uint` arra
Write a function called `saveTimestamp` that takes a `uint` called `_unixTimestamp` as an argument. When called, it should add the address of the caller to the end of `senders` and the `_unixTimestamp` to `timestamps`.
-:::tip
-
+
You'll need to research on your own to discover the correct _Special Variables and Functions_ that can help you with this challenge!
+
-:::
### Timestamp Filtering
@@ -76,8 +73,7 @@ Add `public` functions called `resetSenders` and `resetTimestamps` that reset th
### Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -85,8 +81,8 @@ Add `public` functions called `resetSenders` and `resetTimestamps` that reset th
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/arrays/arrays-in-solidity-vid.mdx b/_pages/learn/arrays/arrays-in-solidity-vid.mdx
similarity index 78%
rename from docs/pages/learn/arrays/arrays-in-solidity-vid.mdx
rename to _pages/learn/arrays/arrays-in-solidity-vid.mdx
index dc9dd901..ac651d90 100644
--- a/docs/pages/learn/arrays/arrays-in-solidity-vid.mdx
+++ b/_pages/learn/arrays/arrays-in-solidity-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Arrays
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/arrays/arrays-in-solidity.mdx b/_pages/learn/arrays/arrays-in-solidity.mdx
similarity index 100%
rename from docs/pages/learn/arrays/arrays-in-solidity.mdx
rename to _pages/learn/arrays/arrays-in-solidity.mdx
diff --git a/docs/pages/learn/arrays/filtering-an-array-sbs.mdx b/_pages/learn/arrays/filtering-an-array-sbs.mdx
similarity index 99%
rename from docs/pages/learn/arrays/filtering-an-array-sbs.mdx
rename to _pages/learn/arrays/filtering-an-array-sbs.mdx
index 47042fc5..bd2ab54e 100644
--- a/docs/pages/learn/arrays/filtering-an-array-sbs.mdx
+++ b/_pages/learn/arrays/filtering-an-array-sbs.mdx
@@ -34,11 +34,10 @@ contract ArrayDemo {
}
```
-:::caution
-
+
You don't have to declare the size of the memory array to be returned. You usually don't want to either, unless the results will always be the same, known size.
+
-:::
### Finding the Number of Even Numbers
diff --git a/docs/pages/learn/arrays/fixed-size-arrays-vid.mdx b/_pages/learn/arrays/fixed-size-arrays-vid.mdx
similarity index 78%
rename from docs/pages/learn/arrays/fixed-size-arrays-vid.mdx
rename to _pages/learn/arrays/fixed-size-arrays-vid.mdx
index c7c3954e..14a16671 100644
--- a/docs/pages/learn/arrays/fixed-size-arrays-vid.mdx
+++ b/_pages/learn/arrays/fixed-size-arrays-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Fixed-Size Arrays
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/arrays/writing-arrays-in-solidity-vid.mdx b/_pages/learn/arrays/writing-arrays-in-solidity-vid.mdx
similarity index 80%
rename from docs/pages/learn/arrays/writing-arrays-in-solidity-vid.mdx
rename to _pages/learn/arrays/writing-arrays-in-solidity-vid.mdx
index 2ed5be90..59b428a9 100644
--- a/docs/pages/learn/arrays/writing-arrays-in-solidity-vid.mdx
+++ b/_pages/learn/arrays/writing-arrays-in-solidity-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Writing Arrays in Solidity
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/contracts-and-basic-functions/basic-functions-exercise.mdx b/_pages/learn/contracts-and-basic-functions/basic-functions-exercise.mdx
similarity index 99%
rename from docs/pages/learn/contracts-and-basic-functions/basic-functions-exercise.mdx
rename to _pages/learn/contracts-and-basic-functions/basic-functions-exercise.mdx
index 1d48131c..bd9f4202 100644
--- a/docs/pages/learn/contracts-and-basic-functions/basic-functions-exercise.mdx
+++ b/_pages/learn/contracts-and-basic-functions/basic-functions-exercise.mdx
@@ -8,13 +8,12 @@ hide_table_of_contents: false
Each module in this course will contain exercises in which you are given a specification for a contract **without** being given specific instructions on how to build the contract. You must use what you've learned to figure out the best solution on your own!
-:::info
-
+
Once you've learned how to deploy your contracts to a test network, you'll be given the opportunity to submit your contract address for review by an onchain unit test. If it passes, you'll receive an NFT pin recognizing your accomplishment.
**You'll deploy and submit this contract in the next module.**
+
-:::
The following exercise asks you to create a contract that adheres to the following stated specifications.
diff --git a/docs/pages/learn/contracts-and-basic-functions/basic-types.mdx b/_pages/learn/contracts-and-basic-functions/basic-types.mdx
similarity index 99%
rename from docs/pages/learn/contracts-and-basic-functions/basic-types.mdx
rename to _pages/learn/contracts-and-basic-functions/basic-types.mdx
index 7caf1057..4702393b 100644
--- a/docs/pages/learn/contracts-and-basic-functions/basic-types.mdx
+++ b/_pages/learn/contracts-and-basic-functions/basic-types.mdx
@@ -4,6 +4,8 @@ description: Introduction to basic types in Solidity.
hide_table_of_contents: false
---
+import { Danger } from "/snippets/danger.mdx";
+
# Basic Types
Solidity contains most of the basic [types] you are used to from other languages, but their properties and usage are often a little different than other languages and are likely much more restrictive. In particular, Solidity is a very **explicit** language and will not allow you to make inferences most of the time.
@@ -38,16 +40,15 @@ uint256 first = 1;
int8 second = int8(int256(first));
```
-:::danger
-
+
Overflow/underflow protection (described below), does not provide protection when casting.
```solidity
uint256 first = 256;
int8 second = int8(int256(first)); // <- The value stored in second is 0
```
+
-:::
## Boolean
diff --git a/docs/pages/learn/contracts-and-basic-functions/hello-world-step-by-step.mdx b/_pages/learn/contracts-and-basic-functions/hello-world-step-by-step.mdx
similarity index 100%
rename from docs/pages/learn/contracts-and-basic-functions/hello-world-step-by-step.mdx
rename to _pages/learn/contracts-and-basic-functions/hello-world-step-by-step.mdx
diff --git a/docs/pages/learn/contracts-and-basic-functions/intro-to-contracts-vid.mdx b/_pages/learn/contracts-and-basic-functions/intro-to-contracts-vid.mdx
similarity index 81%
rename from docs/pages/learn/contracts-and-basic-functions/intro-to-contracts-vid.mdx
rename to _pages/learn/contracts-and-basic-functions/intro-to-contracts-vid.mdx
index 99eb95dc..af6cff63 100644
--- a/docs/pages/learn/contracts-and-basic-functions/intro-to-contracts-vid.mdx
+++ b/_pages/learn/contracts-and-basic-functions/intro-to-contracts-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Introduction to Contracts
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/control-structures/control-structures-exercise.mdx b/_pages/learn/control-structures/control-structures-exercise.mdx
similarity index 99%
rename from docs/pages/learn/control-structures/control-structures-exercise.mdx
rename to _pages/learn/control-structures/control-structures-exercise.mdx
index 499a95ec..2b88a536 100644
--- a/docs/pages/learn/control-structures/control-structures-exercise.mdx
+++ b/_pages/learn/control-structures/control-structures-exercise.mdx
@@ -38,8 +38,7 @@ Create a function called `doNotDisturb` that accepts a `uint` called `_time`, an
### Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -47,8 +46,8 @@ Create a function called `doNotDisturb` that accepts a `uint` called `_time`, an
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/control-structures/control-structures.mdx b/_pages/learn/control-structures/control-structures.mdx
similarity index 99%
rename from docs/pages/learn/control-structures/control-structures.mdx
rename to _pages/learn/control-structures/control-structures.mdx
index 41b00d32..481e69a3 100644
--- a/docs/pages/learn/control-structures/control-structures.mdx
+++ b/_pages/learn/control-structures/control-structures.mdx
@@ -28,11 +28,10 @@ Solidity supports the basic conditional and iterative [control structures] found
Solidity does support `try`/`catch`, but only for calls to other contracts.
-:::caution
-
+
[Yul] is an intermediate-level language that can be embedded in Solidity contracts and is documented within the docs for Solidity. Yul **does** contain the `switch` statement, which can confuse search results.
+
-:::
### Conditional Control Structure Examples
@@ -54,11 +53,10 @@ function ConditionalExample(uint _number) external pure returns (string memory)
The `while`, `for`, and `do`, keywords function the same as in other languages. You can use `continue` to skip the rest of a loop and start the next iteration. `break` will terminate execution of the loop, and you can use `return` to exit the function and return a value at any point.
-:::info
-
+
You can use `console.log` by importing `import "hardhat/console.sol";`. Doing so will require you to mark otherwise `pure` contracts as `view`.
+
-:::
```solidity
uint times; // Default value is 0!
diff --git a/docs/pages/learn/control-structures/loops-vid.mdx b/_pages/learn/control-structures/loops-vid.mdx
similarity index 74%
rename from docs/pages/learn/control-structures/loops-vid.mdx
rename to _pages/learn/control-structures/loops-vid.mdx
index 0c8bf776..f49457f9 100644
--- a/docs/pages/learn/control-structures/loops-vid.mdx
+++ b/_pages/learn/control-structures/loops-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Loops
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/control-structures/require-revert-error-vid.mdx b/_pages/learn/control-structures/require-revert-error-vid.mdx
similarity index 80%
rename from docs/pages/learn/control-structures/require-revert-error-vid.mdx
rename to _pages/learn/control-structures/require-revert-error-vid.mdx
index 3832e4a7..3c8ec4c0 100644
--- a/docs/pages/learn/control-structures/require-revert-error-vid.mdx
+++ b/_pages/learn/control-structures/require-revert-error-vid.mdx
@@ -5,6 +5,6 @@ hide_table_of_contents: false
---
# Require, Revert, and Error
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/control-structures/standard-control-structures-vid.mdx b/_pages/learn/control-structures/standard-control-structures-vid.mdx
similarity index 80%
rename from docs/pages/learn/control-structures/standard-control-structures-vid.mdx
rename to _pages/learn/control-structures/standard-control-structures-vid.mdx
index 23dd31e4..47357a33 100644
--- a/docs/pages/learn/control-structures/standard-control-structures-vid.mdx
+++ b/_pages/learn/control-structures/standard-control-structures-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# If, Else, and Else If
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/deployment-to-testnet/contract-verification-sbs.mdx b/_pages/learn/deployment-to-testnet/contract-verification-sbs.mdx
similarity index 99%
rename from docs/pages/learn/deployment-to-testnet/contract-verification-sbs.mdx
rename to _pages/learn/deployment-to-testnet/contract-verification-sbs.mdx
index 38a76bc3..ff130cd5 100644
--- a/docs/pages/learn/deployment-to-testnet/contract-verification-sbs.mdx
+++ b/_pages/learn/deployment-to-testnet/contract-verification-sbs.mdx
@@ -45,11 +45,10 @@ On the next page, copy and paste your source code in the window. Verify that you
Click the linked address to your contract to return to the contract page. You'll now see your code!
-:::tip
-
+
If you have imports, you'll need to right-click on the name of the file and choose `Flatten`. Submit the newly generated `filename_flattened.sol` for verification.
+
-:::
### Interact with the Contract
diff --git a/docs/pages/learn/deployment-to-testnet/deployment-to-base-sepolia-sbs.mdx b/_pages/learn/deployment-to-testnet/deployment-to-base-sepolia-sbs.mdx
similarity index 98%
rename from docs/pages/learn/deployment-to-testnet/deployment-to-base-sepolia-sbs.mdx
rename to _pages/learn/deployment-to-testnet/deployment-to-base-sepolia-sbs.mdx
index 30277d0a..fda143a6 100644
--- a/docs/pages/learn/deployment-to-testnet/deployment-to-base-sepolia-sbs.mdx
+++ b/_pages/learn/deployment-to-testnet/deployment-to-base-sepolia-sbs.mdx
@@ -4,6 +4,8 @@ description: Deploy your smart contract to a test network.
hide_table_of_contents: false
---
+import { Danger } from "/snippets/danger.mdx";
+
# Deployment to Base Sepolia
Remix contains a simulation of a blockchain that you can use to rapidly deploy and test your contracts. This simulation only exists within your browser so you can't share it with others, use external tools, or a front end to interact with it. However, you can also deploy to a variety of testnets from within Remix. Doing so will allow you to share your contract with others, at the cost of making it public.
@@ -25,13 +27,12 @@ Testnets operate in a similar, **but not exactly the same** manner as the main n
If you already have a wallet set up **exclusively for development**, you can skip to the next section. Otherwise, now is the time to jump in!
-:::danger
-
+
It is very dangerous to use a wallet with valuable assets for development. You could easily write code with a bug that transfers the wrong amount of the wrong token to the wrong address. Transactions cannot be reversed once sent!
Be safe and use separate wallets for separate purposes.
+
-:::
First, add the [Coinbase] or [Metamask] wallet to your browser, and then [set up] a new wallet. As a developer, you need to be doubly careful about the security of your wallet! Many apps grant special powers to the wallet address that is the owner of the contract, such as allowing the withdrawal of all the Ether that customers have paid to the contract or changing critical settings.
@@ -83,11 +84,10 @@ Click the orange _Deploy_ button. Because it costs gas to deploy a contract, you

-:::danger
-
+
Always carefully review all transactions, confirming the transaction cost, assets transferred, and network. As a developer, you'll get used to approving transactions regularly. Do the best you can to avoid getting into the habit of clicking _Confirm_ without reviewing the transaction carefully. If you feel pressured to _Confirm_ before you run out of time, it is almost certainly a scam.
+
-:::
After you click the _Confirm_ button, return to Remix and wait for the transaction to deploy. Copy its address and navigate to [`sepolia.basescan.org`].
diff --git a/docs/pages/learn/deployment-to-testnet/deployment-to-testnet-exercise.mdx b/_pages/learn/deployment-to-testnet/deployment-to-testnet-exercise.mdx
similarity index 97%
rename from docs/pages/learn/deployment-to-testnet/deployment-to-testnet-exercise.mdx
rename to _pages/learn/deployment-to-testnet/deployment-to-testnet-exercise.mdx
index 7e522db5..ea4ecb67 100644
--- a/docs/pages/learn/deployment-to-testnet/deployment-to-testnet-exercise.mdx
+++ b/_pages/learn/deployment-to-testnet/deployment-to-testnet-exercise.mdx
@@ -8,18 +8,16 @@ hide_table_of_contents: false
You've already built and deployed your [Basic Math] contract for this exercise. Now it's time to submit the address and earn an NFT pin to commemorate your accomplishment!
-:::caution
-
+
We're currently in beta, so you'll only need to pay testnet funds to submit your contract, but this means you'll be getting a testnet NFT.
Stay tuned for updates!
+
-:::
### Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -27,8 +25,8 @@ Stay tuned for updates!
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/deployment-to-testnet/overview-of-test-networks-vid.mdx b/_pages/learn/deployment-to-testnet/overview-of-test-networks-vid.mdx
similarity index 80%
rename from docs/pages/learn/deployment-to-testnet/overview-of-test-networks-vid.mdx
rename to _pages/learn/deployment-to-testnet/overview-of-test-networks-vid.mdx
index 1502d427..ea25a654 100644
--- a/docs/pages/learn/deployment-to-testnet/overview-of-test-networks-vid.mdx
+++ b/_pages/learn/deployment-to-testnet/overview-of-test-networks-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Overview of Test Networks
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/deployment-to-testnet/test-networks.mdx b/_pages/learn/deployment-to-testnet/test-networks.mdx
similarity index 100%
rename from docs/pages/learn/deployment-to-testnet/test-networks.mdx
rename to _pages/learn/deployment-to-testnet/test-networks.mdx
diff --git a/docs/pages/learn/development-tools/overview.mdx b/_pages/learn/development-tools/overview.mdx
similarity index 100%
rename from docs/pages/learn/development-tools/overview.mdx
rename to _pages/learn/development-tools/overview.mdx
diff --git a/docs/pages/learn/erc-20-token/analyzing-erc-20-vid.mdx b/_pages/learn/erc-20-token/analyzing-erc-20-vid.mdx
similarity index 80%
rename from docs/pages/learn/erc-20-token/analyzing-erc-20-vid.mdx
rename to _pages/learn/erc-20-token/analyzing-erc-20-vid.mdx
index de4b26ec..e2e3a258 100644
--- a/docs/pages/learn/erc-20-token/analyzing-erc-20-vid.mdx
+++ b/_pages/learn/erc-20-token/analyzing-erc-20-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Analyzing the ERC-20 Token
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/erc-20-token/erc-20-exercise.mdx b/_pages/learn/erc-20-token/erc-20-exercise.mdx
similarity index 97%
rename from docs/pages/learn/erc-20-token/erc-20-exercise.mdx
rename to _pages/learn/erc-20-token/erc-20-exercise.mdx
index 72b31fb3..607add22 100644
--- a/docs/pages/learn/erc-20-token/erc-20-exercise.mdx
+++ b/_pages/learn/erc-20-token/erc-20-exercise.mdx
@@ -28,11 +28,10 @@ Create a contract called `WeightedVoting`. Add the following:
- Storage for the number of `votesFor`, `votesAgainst`, `votesAbstain`, `totalVotes`, and `quorum`
- Bools storing if the issue is `passed` and `closed`
-:::caution
-
+
The unit tests require this `struct` to be constructed with the variables in the order above.
+
-:::
- An array of `Issue`s called `issues`
- An `enum` for `Vote` containing:
@@ -53,13 +52,12 @@ Add a `public` function called `claim`. When called, so long as a number of toke
Once all tokens have been claimed, this function should revert with an error `AllTokensClaimed`.
-:::caution
-
+
In our simple token, we used `totalSupply` to mint our tokens up front. The ERC20 implementation we're using also tracks `totalSupply`, but does it differently.
Review the docs and code comments to learn how.
+
-:::
### Create Issue
@@ -69,11 +67,10 @@ Only token holders are allowed to create issues, and issues cannot be created th
This function must return the index of the newly-created issue.
-:::caution
-
+
One of the unit tests will break if you place your check for `quorum` before the check that the user holds a token. The test compares encoded error names, which are **not** human-readable. If you are getting `-> AssertionError: �s is not equal to �9�` or similar, this is likely the issue.
+
-:::
### Get Issue
@@ -81,11 +78,11 @@ Add an `external` function called `getIssue` that can return all of the data for
`EnumerableSet` has a `mapping` underneath, so it can't be returned outside of the contract. You'll have to figure something else out.
-:::info Hint
+
+**Hint**
The return type for this function should be a `struct` very similar to the one that stores the issues.
-
-:::
+
### Vote
@@ -102,8 +99,7 @@ If this vote takes the total number of votes to or above the `quorum` for that v
### Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -111,16 +107,15 @@ If this vote takes the total number of votes to or above the `quorum` for that v
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
-
-:::caution
+
The contract specification contains actions that can only be performed once by a given address. As a result, the unit tests for a passing contract will only be successful the **first** time you test.
**You may need to submit a fresh deployment to pass**
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/erc-20-token/erc-20-standard.mdx b/_pages/learn/erc-20-token/erc-20-standard.mdx
similarity index 100%
rename from docs/pages/learn/erc-20-token/erc-20-standard.mdx
rename to _pages/learn/erc-20-token/erc-20-standard.mdx
diff --git a/docs/pages/learn/erc-20-token/erc-20-testing-vid.mdx b/_pages/learn/erc-20-token/erc-20-testing-vid.mdx
similarity index 78%
rename from docs/pages/learn/erc-20-token/erc-20-testing-vid.mdx
rename to _pages/learn/erc-20-token/erc-20-testing-vid.mdx
index 45a55a92..531321f9 100644
--- a/docs/pages/learn/erc-20-token/erc-20-testing-vid.mdx
+++ b/_pages/learn/erc-20-token/erc-20-testing-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# ERC-20 Testing
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/erc-20-token/erc-20-token-sbs.mdx b/_pages/learn/erc-20-token/erc-20-token-sbs.mdx
similarity index 99%
rename from docs/pages/learn/erc-20-token/erc-20-token-sbs.mdx
rename to _pages/learn/erc-20-token/erc-20-token-sbs.mdx
index f6a336f1..107101cd 100644
--- a/docs/pages/learn/erc-20-token/erc-20-token-sbs.mdx
+++ b/_pages/learn/erc-20-token/erc-20-token-sbs.mdx
@@ -49,11 +49,10 @@ constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {
}
```
-:::caution
-
+
There is neither a governing body nor built-in programmatic rules preventing you, or anyone else, from using the same name and symbol as an already in-use token. Scammers often take advantage of this fact, and even well-meaning developers can cause confusion by not being careful here.
+
-:::
That's it. You're done! Deploy and test, and you should see all of the functionality called for by the standard and provided by the OpenZeppelin implementation.
diff --git a/docs/pages/learn/erc-20-token/openzeppelin-erc-20-vid.mdx b/_pages/learn/erc-20-token/openzeppelin-erc-20-vid.mdx
similarity index 82%
rename from docs/pages/learn/erc-20-token/openzeppelin-erc-20-vid.mdx
rename to _pages/learn/erc-20-token/openzeppelin-erc-20-vid.mdx
index 029fc588..ffbd1ecb 100644
--- a/docs/pages/learn/erc-20-token/openzeppelin-erc-20-vid.mdx
+++ b/_pages/learn/erc-20-token/openzeppelin-erc-20-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# OpenZeppelin ERC-20 Implementation
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/erc-721-token/erc-721-exercise.mdx b/_pages/learn/erc-721-token/erc-721-exercise.mdx
similarity index 97%
rename from docs/pages/learn/erc-721-token/erc-721-exercise.mdx
rename to _pages/learn/erc-721-token/erc-721-exercise.mdx
index 82a15867..09958993 100644
--- a/docs/pages/learn/erc-721-token/erc-721-exercise.mdx
+++ b/_pages/learn/erc-721-token/erc-721-exercise.mdx
@@ -4,6 +4,8 @@ description: Exercise - Create your own NFT!
hide_table_of_contents: false
---
+import { Danger } from "/snippets/danger.mdx";
+
# ERC-721 Tokens Exercise
Create a contract that adheres to the following specifications.
@@ -42,13 +44,12 @@ Add a `public` function called `shareHaiku` that allows the owner of a Haiku NFT
If the sender isn't the owner of the Haiku, instead revert with an error of `NotYourHaiku`. Include the id of the Haiku in the error.
-:::danger
-
+
Remember, everything on the blockchain is public. This sharing functionality can be expanded for features similar to allowing an app user to display the selected shared haiku on their profile.
It does nothing to prevent anyone and everyone from seeing or copy/pasting the haiku!
+
-:::
### Get Your Shared Haikus
@@ -58,18 +59,16 @@ If there are no haikus shared with the caller's wallet, it should revert with a
---
-:::caution
-
+
The contract specification contains actions that can only be performed once by a given address. As a result, the unit tests for a passing contract will only be successful the **first** time you test.
**You may need to submit a fresh deployment to pass**
+
-:::
### Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](../deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -77,8 +76,8 @@ The contract specification contains actions that can only be performed once by a
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/erc-721-token/erc-721-on-opensea-vid.mdx b/_pages/learn/erc-721-token/erc-721-on-opensea-vid.mdx
similarity index 81%
rename from docs/pages/learn/erc-721-token/erc-721-on-opensea-vid.mdx
rename to _pages/learn/erc-721-token/erc-721-on-opensea-vid.mdx
index 8101531c..1e69d5f8 100644
--- a/docs/pages/learn/erc-721-token/erc-721-on-opensea-vid.mdx
+++ b/_pages/learn/erc-721-token/erc-721-on-opensea-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# ERC-721 Token On Opensea
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/erc-721-token/erc-721-sbs.mdx b/_pages/learn/erc-721-token/erc-721-sbs.mdx
similarity index 99%
rename from docs/pages/learn/erc-721-token/erc-721-sbs.mdx
rename to _pages/learn/erc-721-token/erc-721-sbs.mdx
index a2956afb..120e960a 100644
--- a/docs/pages/learn/erc-721-token/erc-721-sbs.mdx
+++ b/_pages/learn/erc-721-token/erc-721-sbs.mdx
@@ -4,6 +4,8 @@ description: Build your own NFT based on the ERC-721 standard.
hide_table_of_contents: false
---
+import { Danger } from "/snippets/danger.mdx";
+
# ERC-721 Token
Punks, Apes, and birds of all kinds. You've heard about them, seen them, and may even be lucky enough to own a famous NFT. Or maybe you've just bought into a random collection and aren't sure what to do with your NFT. NFTs aren't really pictures, or anything else specific. They're a method of proving ownership of a digital asset. Anyone can right-click on a picture of a monkey and set it as their profile picture, but only the owner can use it with apps that utilize web3 ownership.
@@ -67,11 +69,12 @@ The owner is easy, you can simply use `msg.sender` to grant ownership to the wal
ID is slightly more challenging. A common practice is to simply assign the total number of NFTs, including the one being minted, as the `tokenId`. Doing so is straightforward, makes it easier to find all of the NFTs within a collection, and helps lean in to the common community perception that lower-number NFTs are better, just like other limited-edition collectibles.
-:::caution
+
Obfuscating certain information, such as customer IDs, is often considered a best practice. Doing so might make it harder for an attacker who has circumvented other security functions from getting access to more data. If `134` is a valid `customer_id`, it is likely that `135` is too. The same can't be said for `bfcb51bd-c04f-42d5-8116-3def754e8c32`.
This practice is not as useful on the blockchain, because all information is public.
-:::
+
+
To implement ID generation, simply add a `uint` called `counter` to storage and initialize it as 1, either at declaration or in the constructor.
@@ -92,15 +95,14 @@ function redeemNFT() external {
-:::danger
-
+
As a programmer, you've probably gone through great pains to internalize the idea of zero-indexing. Arrays start at 0. The pixel in the top-left corner of your screen is located at 0, 0.
As a result, you need to be very careful when working with Solidity because there isn't the concept of `undefined`, and "deleted" values return to their default value, which is 0 for numbers.
To prevent security risks, you'll need to make sure that you never give an ID or array index of 0 to anything. Otherwise, attempting to delete a value, such as a `struct` member called `authorizedSellerID` might give the wallet address stored at index 0 access to that resource.
+
-:::
Deploy and test. Be sure to:
diff --git a/docs/pages/learn/erc-721-token/erc-721-standard-video.mdx b/_pages/learn/erc-721-token/erc-721-standard-video.mdx
similarity index 81%
rename from docs/pages/learn/erc-721-token/erc-721-standard-video.mdx
rename to _pages/learn/erc-721-token/erc-721-standard-video.mdx
index dcfdee10..d04942ed 100644
--- a/docs/pages/learn/erc-721-token/erc-721-standard-video.mdx
+++ b/_pages/learn/erc-721-token/erc-721-standard-video.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# ERC-721 Token Standard
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/erc-721-token/erc-721-standard.mdx b/_pages/learn/erc-721-token/erc-721-standard.mdx
similarity index 100%
rename from docs/pages/learn/erc-721-token/erc-721-standard.mdx
rename to _pages/learn/erc-721-token/erc-721-standard.mdx
diff --git a/docs/pages/learn/erc-721-token/implementing-an-erc-721-vid.mdx b/_pages/learn/erc-721-token/implementing-an-erc-721-vid.mdx
similarity index 79%
rename from docs/pages/learn/erc-721-token/implementing-an-erc-721-vid.mdx
rename to _pages/learn/erc-721-token/implementing-an-erc-721-vid.mdx
index f1802793..a40b6999 100644
--- a/docs/pages/learn/erc-721-token/implementing-an-erc-721-vid.mdx
+++ b/_pages/learn/erc-721-token/implementing-an-erc-721-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Implementing an ERC-721
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/erc-721-token/openzeppelin-erc-721-vid.mdx b/_pages/learn/erc-721-token/openzeppelin-erc-721-vid.mdx
similarity index 83%
rename from docs/pages/learn/erc-721-token/openzeppelin-erc-721-vid.mdx
rename to _pages/learn/erc-721-token/openzeppelin-erc-721-vid.mdx
index 57699896..0df8fd00 100644
--- a/docs/pages/learn/erc-721-token/openzeppelin-erc-721-vid.mdx
+++ b/_pages/learn/erc-721-token/openzeppelin-erc-721-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# OpenZeppelin ERC-721 Implementation
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/error-triage/error-triage-exercise-source.sol b/_pages/learn/error-triage/error-triage-exercise-source.sol
similarity index 100%
rename from docs/pages/learn/error-triage/error-triage-exercise-source.sol
rename to _pages/learn/error-triage/error-triage-exercise-source.sol
diff --git a/docs/pages/learn/error-triage/error-triage-exercise.mdx b/_pages/learn/error-triage/error-triage-exercise.mdx
similarity index 99%
rename from docs/pages/learn/error-triage/error-triage-exercise.mdx
rename to _pages/learn/error-triage/error-triage-exercise.mdx
index a8d42cd1..4cf2f672 100644
--- a/docs/pages/learn/error-triage/error-triage-exercise.mdx
+++ b/_pages/learn/error-triage/error-triage-exercise.mdx
@@ -78,8 +78,7 @@ contract ErrorTriageExercise {
## Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -87,8 +86,8 @@ contract ErrorTriageExercise {
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/error-triage/error-triage-vid.mdx b/_pages/learn/error-triage/error-triage-vid.mdx
similarity index 76%
rename from docs/pages/learn/error-triage/error-triage-vid.mdx
rename to _pages/learn/error-triage/error-triage-vid.mdx
index 22a95185..e13152d3 100644
--- a/docs/pages/learn/error-triage/error-triage-vid.mdx
+++ b/_pages/learn/error-triage/error-triage-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Error Triage
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/error-triage/error-triage.mdx b/_pages/learn/error-triage/error-triage.mdx
similarity index 99%
rename from docs/pages/learn/error-triage/error-triage.mdx
rename to _pages/learn/error-triage/error-triage.mdx
index 7a626207..bb881d01 100644
--- a/docs/pages/learn/error-triage/error-triage.mdx
+++ b/_pages/learn/error-triage/error-triage.mdx
@@ -100,11 +100,10 @@ function compilerConversionErrorFixed() public pure returns (uint) {
-:::tip
-
+
You'll commonly need to use multiple conversions to bridge from one type to another.
+
-:::
### Operator Errors
@@ -166,11 +165,10 @@ function compilerOperatorErrorFixed() public pure returns (uint) {
The [EVM stack] has 1024 slots, but only the top 16 slots are accessible. As a result, you can only have fewer than 16 variables in scope at one time.
-:::caution
-
+
Other items can also use up these slots. You are **not** guaranteed 15 slots, it can be lower.
+
-:::
```solidity
// Bad code example, do not use
@@ -285,11 +283,10 @@ Logical errors occur when your code is syntactically correct, but still results
A [panic] occurs when your code tries to do an illegal operation. These return with a very basic error code, which Remix unfortunately hides. However, it makes up for that annoyance by providing a very powerful debugger.
-:::caution
-
+
The Remix VM doesn't behave exactly the same as true onchain operations, so note that these errors will not behave exactly the same if triggered while testing with Hardhat, or called from a front end.
-
-:::caution
+
+caution
For each of these examples, copy them into Remix to explore with the debugger on your own.
@@ -355,11 +352,10 @@ If you write code that can have an ambiguous execution time, it becomes very dif
In this example, each loop has a 1 in 1000 chance of ending.
-:::warning
-
+
`block.timestamp` can be manipulated. **DO NOT** use this as a source of randomness if any value can be derived from one outcome over another!
+
-:::
```solidity
// Bad code example, do not use
diff --git a/docs/pages/learn/ethereum-virtual-machine/evm-diagram.mdx b/_pages/learn/ethereum-virtual-machine/evm-diagram.mdx
similarity index 100%
rename from docs/pages/learn/ethereum-virtual-machine/evm-diagram.mdx
rename to _pages/learn/ethereum-virtual-machine/evm-diagram.mdx
diff --git a/docs/pages/learn/etherscan/etherscan-sbs.mdx b/_pages/learn/etherscan/etherscan-sbs.mdx
similarity index 99%
rename from docs/pages/learn/etherscan/etherscan-sbs.mdx
rename to _pages/learn/etherscan/etherscan-sbs.mdx
index cc14c813..93bda321 100644
--- a/docs/pages/learn/etherscan/etherscan-sbs.mdx
+++ b/_pages/learn/etherscan/etherscan-sbs.mdx
@@ -98,11 +98,10 @@ After you connect, the following UI appears:
You can then call the functions you wish to write to.
-:::info
-
+
Be aware that you may need to have real Ethereum in case you want to write to a contract in Ethereum mainnet. Also, any logic that the smart contract defines will be respected. This means that if you try to write to a contract that verifies certain conditions during the transaction (e.g., a function where only the owner of the contract can write information), then you won't be able to execute the transaction if you are not the owner.
+
-:::
## Conclusion
diff --git a/docs/pages/learn/etherscan/etherscan-vid.mdx b/_pages/learn/etherscan/etherscan-vid.mdx
similarity index 79%
rename from docs/pages/learn/etherscan/etherscan-vid.mdx
rename to _pages/learn/etherscan/etherscan-vid.mdx
index 6c3c6458..b06f7964 100644
--- a/docs/pages/learn/etherscan/etherscan-vid.mdx
+++ b/_pages/learn/etherscan/etherscan-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Etherscan
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/events/hardhat-events-sbs.mdx b/_pages/learn/events/hardhat-events-sbs.mdx
similarity index 99%
rename from docs/pages/learn/events/hardhat-events-sbs.mdx
rename to _pages/learn/events/hardhat-events-sbs.mdx
index 79325858..89815714 100644
--- a/docs/pages/learn/events/hardhat-events-sbs.mdx
+++ b/_pages/learn/events/hardhat-events-sbs.mdx
@@ -8,11 +8,10 @@ hide_table_of_contents: false
In this article, you'll learn how events work in Solidity by reviewing some practical examples and common use cases of events.
-:::caution
-
+
This tutorial has been moved as part of a reorganization! It assumes you are using Hardhat. Everything in this lesson will work with minor adjustments if you are working in Foundry or Remix.
+
-:::
---
diff --git a/docs/pages/learn/exercise-contracts.mdx b/_pages/learn/exercise-contracts.mdx
similarity index 100%
rename from docs/pages/learn/exercise-contracts.mdx
rename to _pages/learn/exercise-contracts.mdx
diff --git a/docs/pages/learn/frontend-setup/building-an-onchain-app.mdx b/_pages/learn/frontend-setup/building-an-onchain-app.mdx
similarity index 98%
rename from docs/pages/learn/frontend-setup/building-an-onchain-app.mdx
rename to _pages/learn/frontend-setup/building-an-onchain-app.mdx
index 984d9832..99ddd07f 100644
--- a/docs/pages/learn/frontend-setup/building-an-onchain-app.mdx
+++ b/_pages/learn/frontend-setup/building-an-onchain-app.mdx
@@ -4,6 +4,8 @@ description: Learn step-by-step how to turn a regular template app into an oncha
hide_table_of_contents: false
---
+import { Danger } from "/snippets/danger.mdx";
+
# Building an Onchain App
While it's convenient and fast to start from a template, the template may not fit your needs. Whether you prefer a different stack, or have already started building the traditional web components of your app, it's common to need to manually add onchain libraries to get your app working.
@@ -39,11 +41,10 @@ This script will accept `.`, if you want to add the project to the root of a fol
- Use App Router?: Yes
- Customize the default import alias?: No
-:::info
-
+
The default Next.js script installs [Tailwind]. [RainbowKit]'s does not.
+
-:::
Run your app with `yarn dev` to make sure it generated correctly.
@@ -57,9 +58,10 @@ Start by installing the dependencies:
npm install @rainbow-me/rainbowkit wagmi viem@2.x @tanstack/react-query
```
-:::info
+
Onchain libraries and packages tend to require very current versions of Node. If you're not already using it, you may want to install [nvm].
-:::
+
+
## Adding Imports, Connectors, Config
@@ -67,11 +69,10 @@ In Next.js with the app router, the root of your app is found in `app/layout.tsx
You'll need to set up your providers in a second file, so that you can add `'use client';` to the top. Doing so forces this code to be run client side, which is necessary since your server won't have access to your users' wallet information.
-:::caution
-
+
You must configure these wrappers in a separate file. It will not work if you try to add them and `'use client';` directly in `layout.tsx`!
+
-:::
Add a new file in the `app` folder called `providers.tsx`.
@@ -90,29 +91,26 @@ import { base, baseSepolia } from 'wagmi/chains';
import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
```
-:::caution
-
+
If you're adapting this guide to a different set of libraries or platforms, you may need to import `styles.css` differently. You'll know this is the case if you get ugly text at the bottom of the page instead of a nice modal when you click the connect button.
+
-:::
### Config
Now, you need to configure the chains, wallet connectors, and providers for your app. You'll use `getDefaultConfig` for now, to get started. See our guide on [Connecting to the Blockchain] for more information on blockchain providers.
-:::info
-
+
To take advantage of a more advanced set of options with [OnchainKit], see our tutorial on how to [Use the Coinbase Smart Wallet and EOAs with OnchainKit]. If you just want to customize the list of wallets in [RainbowKit], see our tutorial for [Coinbase Smart Wallet with RainbowKit].
+
-:::
You'll need a `projectId` from [Wallet Connect Cloud], which you can get for free on their site. Make sure to insert it in the appropriate place.
-:::danger
-
+
Remember, everything on the frontend is public! Be sure to configure the allowlist for your WalletConnect id!
+
-:::
```tsx
const config = getDefaultConfig({
diff --git a/docs/pages/learn/frontend-setup/overview.mdx b/_pages/learn/frontend-setup/overview.mdx
similarity index 100%
rename from docs/pages/learn/frontend-setup/overview.mdx
rename to _pages/learn/frontend-setup/overview.mdx
diff --git a/docs/pages/learn/frontend-setup/wallet-connectors.mdx b/_pages/learn/frontend-setup/wallet-connectors.mdx
similarity index 99%
rename from docs/pages/learn/frontend-setup/wallet-connectors.mdx
rename to _pages/learn/frontend-setup/wallet-connectors.mdx
index 5b3220f6..fa45223f 100644
--- a/docs/pages/learn/frontend-setup/wallet-connectors.mdx
+++ b/_pages/learn/frontend-setup/wallet-connectors.mdx
@@ -41,11 +41,10 @@ If you're just trying to get up and running as quickly as possible, you can use
yarn create @rainbow-me/rainbowkit
```
-:::info
-
+
The script doesn't accept `.` as a project name, so you'll want to run this script in your `src` directory, or wherever you keep your projects. It will create a folder with the same name as your project, and install the project files inside.
+
-:::
Once it's done, simply run the app with:
@@ -55,13 +54,12 @@ yarn run dev
Using the script is fast, but it does mean less choice. In this case, it builds the app on top of [Next.js], which is great if you want to use it, but not helpful if you prefer to work from a different framework, such as [Create React App], or [Remix] (the React framework, not the Solidity IDE). The script also doesn't help you if you want to add an onchain integration to an existing site.
-:::info
-
+
The Rainbowkit template has been updated to wagmi 2.X, but it does **not** use the Next.js app router. You'll need to install it manually if you wish to use the latest patterns.
The [Building an Onchain App] tutorial will show you how to do this!
+
-:::
### Coinbase Smart Wallet
diff --git a/_pages/learn/hardhat-deploy/deployment-vid.mdx b/_pages/learn/hardhat-deploy/deployment-vid.mdx
new file mode 100644
index 00000000..3e3527c5
--- /dev/null
+++ b/_pages/learn/hardhat-deploy/deployment-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Deployment
+description: Configure test networks.
+hide_table_of_contents: false
+---
+
+# Deployment
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/_pages/learn/hardhat-deploy/hardhat-deploy-sbs.mdx b/_pages/learn/hardhat-deploy/hardhat-deploy-sbs.mdx
new file mode 100644
index 00000000..82f55fb8
--- /dev/null
+++ b/_pages/learn/hardhat-deploy/hardhat-deploy-sbs.mdx
@@ -0,0 +1,262 @@
+---
+title: Deploying Smart Contracts
+description: Deploy smart contracts with hardhat deploy and hardhat
+hide_table_of_contents: false
+---
+
+# Deploying Smart Contracts
+
+In this article, you'll learn how to deploy smart contracts to multiple Blockchain networks using Hardhat and Hardhat deploy.
+
+---
+
+## Objectives
+
+By the end of this lesson, you should be able to:
+
+- Deploy a smart contract to the Base Sepolia Testnet with hardhat-deploy
+- Deploy a smart contract to the Sepolia Testnet with hardhat-deploy
+- Use BaseScan to view a deployed smart contract
+
+---
+
+## Overview
+
+Hardhat capabilities enable developers to deploy smart contracts easily to any Blockchain by simply creating `tasks` or `scripts`. However, due to the Hardhat architecture that enables its extension by creating plugins, you can rely on existing solutions developed by the community.
+
+[Hardhat deploy](https://github.com/wighawag/hardhat-deploy) is a community-developed plugin that enables the deployment of your smart contracts in a simple way.
+
+## Setting up Hardhat deploy
+
+To install:
+
+1. Run `npm install -D hardhat-deploy`. Then, import hardhat-deploy in `hardhat.config.ts`:
+
+```tsx
+import 'hardhat-deploy';
+```
+
+2. Create a folder called deploy and inside it create a new file called `001_deploy_lock.ts`.
+
+3. Include the following:
+
+```tsx
+import { HardhatRuntimeEnvironment } from 'hardhat/types';
+import { DeployFunction } from 'hardhat-deploy/types';
+
+const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
+ // code here
+};
+export default func;
+```
+
+4. Modify the `tsconfig.json` file to look like:
+
+```json
+{
+ "compilerOptions": {
+ "target": "es2020",
+ "module": "commonjs",
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "skipLibCheck": true,
+ "resolveJsonModule": true
+ },
+ "include": ["./hardhat.config.ts", "./scripts", "./deploy", "./test"]
+}
+```
+
+5. Before implementing the deploy functionality, configure a deployer account in the `hardhat.config.ts` file. Hardhat deployment includes a way to name accounts in the config file.
+
+6. Run the following, which adds an alias to the account 0 of your environment:
+
+```tsx
+const config: HardhatUserConfig = {
+ solidity: '0.8.23',
+ namedAccounts: {
+ deployer: 0,
+ },
+};
+```
+
+7. Implement the deploy function by including the following in the `001_deploy_lock.ts` file:
+
+```tsx
+import { HardhatRuntimeEnvironment } from 'hardhat/types';
+import { DeployFunction } from 'hardhat-deploy/types';
+import { ethers } from 'hardhat';
+
+const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
+ const { deploy } = hre.deployments;
+ // We can now use deployer
+ const { deployer } = await hre.getNamedAccounts();
+
+ // The value we want to lock
+ const VALUE_LOCKED = hre.ethers.parseEther('0.01');
+
+ // The unlock time after deployment
+ const UNLOCK_TIME = 10000;
+
+ // We use ethers to get the current time stamp
+ const blockNumber = await ethers.provider.getBlockNumber();
+ const lastBlockTimeStamp = (await ethers.provider.getBlock(blockNumber))?.timestamp as number;
+
+ // We say we want to deploy our Lock contract using the deployer
+ // account and passing the value and arguments.
+ await deploy('Lock', {
+ from: deployer,
+ args: [lastBlockTimeStamp + UNLOCK_TIME],
+ value: VALUE_LOCKED.toString(),
+ });
+};
+
+export default func;
+
+// This tag will help us in the next section to trigger this deployment file programmatically
+func.tags = ['DeployAll'];
+```
+
+## Testing your deployment
+
+The easiest way to test your deployment is by modifying the test.
+
+Go to `Lock.ts` and include in the imports the following:
+
+```tsx
+import { ethers, deployments } from 'hardhat';
+```
+
+`deployments` will allow you to execute the deployment files from your test.
+
+Change the `before` function to look like the following:
+
+```tsx
+before(async () => {
+ lastBlockTimeStamp = await time.latest();
+
+ const signers = await ethers.getSigners();
+ ownerSigner = signers[0];
+ otherUserSigner = signers[1];
+
+ await deployments.fixture(['DeployAll']);
+ const lockDeployment = await deployments.get('Lock');
+
+ lockInstance = Lock__factory.connect(lockDeployment.address, ownerSigner);
+});
+```
+
+Notice how you execute `deployments.fixture` and pass a tag that matches the one you specified in the deployment file (`001_deploy_lock.ts`).
+
+The deployment file is then executed and you can then reuse that functionality and simply consume the address of the newly-deployed contract by using:
+
+```tsx
+const lockDeployment = await deployments.get('Lock');
+```
+
+Reuse `Lock__factory` but use the connect function and pass the address of the newly-created contract plus a signer. Then, run `npx hardhat test` and you should get the same result:
+
+```
+ Lock
+ ✔ should get the unlockTime value
+ ✔ should have the right ether balance
+ ✔ should have the right owner
+ ✔ shouldn't allow to withdraw before unlock time (51ms)
+ ✔ shouldn't allow to withdraw a non owner
+ ✔ should allow to withdraw an owner
+
+ 6 passing (2s)
+```
+
+## Deploying to a test network
+
+Deploying to a real test network involves configuring the network parameters in the hardhat config file. You need to include parameters such as:
+
+- The JSON RPC URL
+- The account you want to use
+- Real test ether or the native Blockchain token for gas costs
+
+Include the following in the `hardhat.config.ts` file:
+
+```tsx
+const config: HardhatUserConfig = {
+ solidity: '0.8.18',
+ namedAccounts: {
+ deployer: 0,
+ },
+ networks: {
+ base_sepolia: {
+ url: 'https://sepolia.base.org',
+ accounts: {
+ mnemonic: process.env.MNEMONIC ?? '',
+ },
+ },
+ sepolia: {
+ url: `https://eth-sepolia.g.alchemy.com/v2/${process.env.ALCHEMY_SEPOLIA_KEY ?? ''}`,
+ accounts: {
+ mnemonic: process.env.MNEMONIC ?? '',
+ },
+ },
+ },
+};
+```
+
+You've configured 2 networks:
+
+- base_sepolia
+- sepolia
+
+You also need to create a `.env` file with the following variables:
+
+```
+MNEMONIC=""
+ALCHEMY_SEPOLIA_KEY=
+```
+
+In order to ensure the environment variables are loaded, you need to install another package called `dotenv`:
+
+```bash
+npm install -D dotenv
+```
+
+Then, include the following in the `hardhat.config.ts` file:
+
+```tsx
+import dotenv from 'dotenv';
+
+dotenv.config();
+```
+
+Deploy to base with the following command:
+
+```bash
+npx hardhat deploy --network base_sepolia
+```
+
+After you run the command, a deployments folder appears with a newly-created deployment for `base_sepolia`:
+
+
+
+If you want to deploy to another network, change the network name as follows:
+
+```bash
+npx hardhat deploy --network sepolia
+```
+
+
+Be aware that you must have the correct environment variables for the JSON RPC URLs. For example, for Sepolia use `ALCHEMY_SEPOLIA_KEY`.
+
+
+
+## Conclusion
+
+In this lesson, you've learned how to deploy smart contracts using Hardhat and Hardhat-deploy. You have configured hardhat to easily deploy to multiple networks and you created deployment files to abstract this task.
+
+---
+
+## See also
+
+[Solidity Docs](https://docs.soliditylang.org/en/v0.8.17/)
+[Remix Project]: https://remix-project.org/
+[Hardhat]: https://hardhat.org/
+[Hardhat Deploy]: https://github.com/wighawag/hardhat-deploy
diff --git a/_pages/learn/hardhat-deploy/installing-hardhat-deploy-vid.mdx b/_pages/learn/hardhat-deploy/installing-hardhat-deploy-vid.mdx
new file mode 100644
index 00000000..457411cd
--- /dev/null
+++ b/_pages/learn/hardhat-deploy/installing-hardhat-deploy-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Installing Hardhat Deploy
+description: Install a community plugin that makes deployments easier.
+hide_table_of_contents: false
+---
+
+# Installing Hardhat Deploy
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/_pages/learn/hardhat-deploy/setup-deploy-script-vid.mdx b/_pages/learn/hardhat-deploy/setup-deploy-script-vid.mdx
new file mode 100644
index 00000000..c770ef48
--- /dev/null
+++ b/_pages/learn/hardhat-deploy/setup-deploy-script-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Setting up the Deploy Script
+description: Prepare a script to deploy your contract.
+hide_table_of_contents: false
+---
+
+# Setting up the Deploy Script
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/_pages/learn/hardhat-deploy/test-network-configuration-vid.mdx b/_pages/learn/hardhat-deploy/test-network-configuration-vid.mdx
new file mode 100644
index 00000000..70b3e88e
--- /dev/null
+++ b/_pages/learn/hardhat-deploy/test-network-configuration-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Test Network Configuration
+description: Configure test networks.
+hide_table_of_contents: false
+---
+
+# Test Network Configuration
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/_pages/learn/hardhat-deploy/testing-our-deployment-vid.mdx b/_pages/learn/hardhat-deploy/testing-our-deployment-vid.mdx
new file mode 100644
index 00000000..405a0b9f
--- /dev/null
+++ b/_pages/learn/hardhat-deploy/testing-our-deployment-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Testing Our Deployment
+description: Test the newly created deploy script.
+hide_table_of_contents: false
+---
+
+# Testing Our Deployment
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/docs/pages/learn/hardhat-forking/hardhat-forking.mdx b/_pages/learn/hardhat-forking/hardhat-forking.mdx
similarity index 100%
rename from docs/pages/learn/hardhat-forking/hardhat-forking.mdx
rename to _pages/learn/hardhat-forking/hardhat-forking.mdx
diff --git a/_pages/learn/hardhat-forking/mainnet-forking-vid.mdx b/_pages/learn/hardhat-forking/mainnet-forking-vid.mdx
new file mode 100644
index 00000000..493738e9
--- /dev/null
+++ b/_pages/learn/hardhat-forking/mainnet-forking-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Forking Mainnet
+description: Create a copy of the mainnet to run advanced tests.
+hide_table_of_contents: false
+---
+
+# Forking Mainnet
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/docs/pages/learn/hardhat-setup-overview/creating-a-project-vid.mdx b/_pages/learn/hardhat-setup-overview/creating-a-project-vid.mdx
similarity index 79%
rename from docs/pages/learn/hardhat-setup-overview/creating-a-project-vid.mdx
rename to _pages/learn/hardhat-setup-overview/creating-a-project-vid.mdx
index 2c290cea..e52aa960 100644
--- a/docs/pages/learn/hardhat-setup-overview/creating-a-project-vid.mdx
+++ b/_pages/learn/hardhat-setup-overview/creating-a-project-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Creating a Project
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/hardhat-setup-overview/hardhat-overview-vid.mdx b/_pages/learn/hardhat-setup-overview/hardhat-overview-vid.mdx
similarity index 76%
rename from docs/pages/learn/hardhat-setup-overview/hardhat-overview-vid.mdx
rename to _pages/learn/hardhat-setup-overview/hardhat-overview-vid.mdx
index cc310528..2c0ccd70 100644
--- a/docs/pages/learn/hardhat-setup-overview/hardhat-overview-vid.mdx
+++ b/_pages/learn/hardhat-setup-overview/hardhat-overview-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Overview
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/hardhat-setup-overview/hardhat-setup-overview-sbs.mdx b/_pages/learn/hardhat-setup-overview/hardhat-setup-overview-sbs.mdx
similarity index 100%
rename from docs/pages/learn/hardhat-setup-overview/hardhat-setup-overview-sbs.mdx
rename to _pages/learn/hardhat-setup-overview/hardhat-setup-overview-sbs.mdx
diff --git a/_pages/learn/hardhat-testing/contract-abi-and-testing-vid.mdx b/_pages/learn/hardhat-testing/contract-abi-and-testing-vid.mdx
new file mode 100644
index 00000000..99199b33
--- /dev/null
+++ b/_pages/learn/hardhat-testing/contract-abi-and-testing-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Contract ABIs and Testing
+description: Learn how the contract ABI is related to writing tests.
+hide_table_of_contents: false
+---
+
+# Contract ABIs and Testing
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/docs/pages/learn/hardhat-testing/hardhat-testing-sbs.mdx b/_pages/learn/hardhat-testing/hardhat-testing-sbs.mdx
similarity index 100%
rename from docs/pages/learn/hardhat-testing/hardhat-testing-sbs.mdx
rename to _pages/learn/hardhat-testing/hardhat-testing-sbs.mdx
diff --git a/_pages/learn/hardhat-testing/testing-overview-vid.mdx b/_pages/learn/hardhat-testing/testing-overview-vid.mdx
new file mode 100644
index 00000000..e3dac2ce
--- /dev/null
+++ b/_pages/learn/hardhat-testing/testing-overview-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Testing Overview
+description: An overview of writing tests in Hardhat.
+hide_table_of_contents: false
+---
+
+# Testing Overview
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/_pages/learn/hardhat-testing/writing-tests-vid.mdx b/_pages/learn/hardhat-testing/writing-tests-vid.mdx
new file mode 100644
index 00000000..e0fe433a
--- /dev/null
+++ b/_pages/learn/hardhat-testing/writing-tests-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Writing Tests
+description: An introduction to writing tests.
+hide_table_of_contents: false
+---
+
+# Writing Tests
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/docs/pages/learn/hardhat-tools-and-testing/overview.mdx b/_pages/learn/hardhat-tools-and-testing/overview.mdx
similarity index 100%
rename from docs/pages/learn/hardhat-tools-and-testing/overview.mdx
rename to _pages/learn/hardhat-tools-and-testing/overview.mdx
diff --git a/docs/pages/learn/hardhat-verify/hardhat-verify-sbs.mdx b/_pages/learn/hardhat-verify/hardhat-verify-sbs.mdx
similarity index 100%
rename from docs/pages/learn/hardhat-verify/hardhat-verify-sbs.mdx
rename to _pages/learn/hardhat-verify/hardhat-verify-sbs.mdx
diff --git a/_pages/learn/hardhat-verify/hardhat-verify-vid.mdx b/_pages/learn/hardhat-verify/hardhat-verify-vid.mdx
new file mode 100644
index 00000000..0464866b
--- /dev/null
+++ b/_pages/learn/hardhat-verify/hardhat-verify-vid.mdx
@@ -0,0 +1,11 @@
+---
+title: Verifying Smart Contracts
+description: Verify your contracts with Hardhat.
+hide_table_of_contents: false
+---
+
+# Verifying Smart Contracts
+
+import { Video } from '/snippets/VideoPlayer.mdx';
+
+
diff --git a/docs/pages/learn/help-on-discord.mdx b/_pages/learn/help-on-discord.mdx
similarity index 100%
rename from docs/pages/learn/help-on-discord.mdx
rename to _pages/learn/help-on-discord.mdx
diff --git a/docs/pages/learn/imports/imports-exercise.mdx b/_pages/learn/imports/imports-exercise.mdx
similarity index 98%
rename from docs/pages/learn/imports/imports-exercise.mdx
rename to _pages/learn/imports/imports-exercise.mdx
index 8020f861..f07a061f 100644
--- a/docs/pages/learn/imports/imports-exercise.mdx
+++ b/_pages/learn/imports/imports-exercise.mdx
@@ -45,11 +45,10 @@ Add the following two functions.
`getHaiku` should return the haiku as a `Haiku` type.
-:::info
-
+
Remember, the compiler will automatically create a getter for `public` `struct`s, but these return each member individually. Create your own getters to return the type.
+
-:::
### Shruggie Haiku
@@ -59,8 +58,7 @@ Remember, the compiler will automatically create a getter for `public` `struct`s
## Submit your Contract and Earn an NFT Badge! (BETA)
-:::caution
-
+
#### Contract Verification Best Practices
To simplify the verification of your contract on a blockchain explorer like BaseScan.org, consider these two common strategies:
@@ -70,11 +68,10 @@ To simplify the verification of your contract on a blockchain explorer like Base
2. **Modular Deployment**: Alternatively, you can deploy each imported contract separately and then reference them in your main contract via their deployed addresses. This approach maintains the modularity and readability of your code. Each contract is deployed and verified independently, which can facilitate easier updates and reusability.
3. **Use Desktop Tools**: Forge and Hardhat both have tools to write scripts that both deploy and verify your contracts.
+
-:::
-
-:::info
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -82,8 +79,8 @@ To simplify the verification of your contract on a blockchain explorer like Base
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/imports/imports-sbs.mdx b/_pages/learn/imports/imports-sbs.mdx
similarity index 99%
rename from docs/pages/learn/imports/imports-sbs.mdx
rename to _pages/learn/imports/imports-sbs.mdx
index 4fede0d7..e3472c9e 100644
--- a/docs/pages/learn/imports/imports-sbs.mdx
+++ b/_pages/learn/imports/imports-sbs.mdx
@@ -57,11 +57,10 @@ EnumerableSet.AddressSet private visitors;
Add a function called `registerVisitor` that makes use of the library's `add` function to add the sender of the message to the `visitors` set.
-:::tip
-
+
There's also an `_add` function, which is private.
+
-:::
diff --git a/docs/pages/learn/imports/imports-vid.mdx b/_pages/learn/imports/imports-vid.mdx
similarity index 78%
rename from docs/pages/learn/imports/imports-vid.mdx
rename to _pages/learn/imports/imports-vid.mdx
index b0186c78..34fce4e3 100644
--- a/docs/pages/learn/imports/imports-vid.mdx
+++ b/_pages/learn/imports/imports-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Imports
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/inheritance/abstract-contracts-sbs.mdx b/_pages/learn/inheritance/abstract-contracts-sbs.mdx
similarity index 100%
rename from docs/pages/learn/inheritance/abstract-contracts-sbs.mdx
rename to _pages/learn/inheritance/abstract-contracts-sbs.mdx
diff --git a/docs/pages/learn/inheritance/abstract-contracts-vid.mdx b/_pages/learn/inheritance/abstract-contracts-vid.mdx
similarity index 80%
rename from docs/pages/learn/inheritance/abstract-contracts-vid.mdx
rename to _pages/learn/inheritance/abstract-contracts-vid.mdx
index a2241fc0..f8d59358 100644
--- a/docs/pages/learn/inheritance/abstract-contracts-vid.mdx
+++ b/_pages/learn/inheritance/abstract-contracts-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Abstract Contracts
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/inheritance/inheritance-exercise.mdx b/_pages/learn/inheritance/inheritance-exercise.mdx
similarity index 98%
rename from docs/pages/learn/inheritance/inheritance-exercise.mdx
rename to _pages/learn/inheritance/inheritance-exercise.mdx
index 7dff5d73..f98cd1f0 100644
--- a/docs/pages/learn/inheritance/inheritance-exercise.mdx
+++ b/_pages/learn/inheritance/inheritance-exercise.mdx
@@ -38,11 +38,10 @@ Implement a contract called `Hourly`. It should:
- Have a public variable storing `hourlyRate`
- Include any other necessary setup and implementation
-:::tip
-
+
The annual cost of an hourly employee is their hourly rate \* 2080 hours.
+
-:::
### Manager
@@ -100,8 +99,7 @@ contract InheritanceSubmission {
## Submit your Contracts and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -109,14 +107,13 @@ contract InheritanceSubmission {
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
-
-:::caution
+
Submit your address for your copy of the `InheritanceSubmission` contract that contains your other contract addresses.
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/inheritance/inheritance-sbs.mdx b/_pages/learn/inheritance/inheritance-sbs.mdx
similarity index 100%
rename from docs/pages/learn/inheritance/inheritance-sbs.mdx
rename to _pages/learn/inheritance/inheritance-sbs.mdx
diff --git a/docs/pages/learn/inheritance/inheritance-vid.mdx b/_pages/learn/inheritance/inheritance-vid.mdx
similarity index 78%
rename from docs/pages/learn/inheritance/inheritance-vid.mdx
rename to _pages/learn/inheritance/inheritance-vid.mdx
index aa559cd1..2a8270eb 100644
--- a/docs/pages/learn/inheritance/inheritance-vid.mdx
+++ b/_pages/learn/inheritance/inheritance-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Inheritance
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/inheritance/multiple-inheritance-vid.mdx b/_pages/learn/inheritance/multiple-inheritance-vid.mdx
similarity index 81%
rename from docs/pages/learn/inheritance/multiple-inheritance-vid.mdx
rename to _pages/learn/inheritance/multiple-inheritance-vid.mdx
index c38ab098..f8ca1a37 100644
--- a/docs/pages/learn/inheritance/multiple-inheritance-vid.mdx
+++ b/_pages/learn/inheritance/multiple-inheritance-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Multiple Inheritance
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/inheritance/multiple-inheritance.mdx b/_pages/learn/inheritance/multiple-inheritance.mdx
similarity index 100%
rename from docs/pages/learn/inheritance/multiple-inheritance.mdx
rename to _pages/learn/inheritance/multiple-inheritance.mdx
diff --git a/docs/pages/learn/interfaces/calling-another-contract-vid.mdx b/_pages/learn/interfaces/calling-another-contract-vid.mdx
similarity index 85%
rename from docs/pages/learn/interfaces/calling-another-contract-vid.mdx
rename to _pages/learn/interfaces/calling-another-contract-vid.mdx
index 01776b86..9e2da311 100644
--- a/docs/pages/learn/interfaces/calling-another-contract-vid.mdx
+++ b/_pages/learn/interfaces/calling-another-contract-vid.mdx
@@ -6,12 +6,11 @@ hide_table_of_contents: false
# Calling Another Contract
-:::caution
-
+
This tutorial has been moved as part of a reorganization! It assumes you are using Hardhat. Everything in this lesson will work with minor adjustments if you are working in Foundry or Remix.
+
-:::
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/interfaces/contract-to-contract-interaction.mdx b/_pages/learn/interfaces/contract-to-contract-interaction.mdx
similarity index 99%
rename from docs/pages/learn/interfaces/contract-to-contract-interaction.mdx
rename to _pages/learn/interfaces/contract-to-contract-interaction.mdx
index 01b989f1..7622b558 100644
--- a/docs/pages/learn/interfaces/contract-to-contract-interaction.mdx
+++ b/_pages/learn/interfaces/contract-to-contract-interaction.mdx
@@ -8,11 +8,10 @@ hide_table_of_contents: false
In this article, you'll learn how to interact with other smart contracts using interfaces and the `.call()` function, which allows you to interact with other smart contracts without using an interface.
-:::caution
-
+
This tutorial has been moved as part of a reorganization! It assumes you are using Hardhat. Everything in this lesson will work with minor adjustments if you are working in Foundry or Remix.
+
-:::
---
diff --git a/docs/pages/learn/interfaces/intro-to-interfaces-vid.mdx b/_pages/learn/interfaces/intro-to-interfaces-vid.mdx
similarity index 85%
rename from docs/pages/learn/interfaces/intro-to-interfaces-vid.mdx
rename to _pages/learn/interfaces/intro-to-interfaces-vid.mdx
index b331b7be..12a3d326 100644
--- a/docs/pages/learn/interfaces/intro-to-interfaces-vid.mdx
+++ b/_pages/learn/interfaces/intro-to-interfaces-vid.mdx
@@ -6,12 +6,11 @@ hide_table_of_contents: false
# Intro to Interfaces
-:::caution
-
+
This tutorial has been moved as part of a reorganization! It assumes you are using Hardhat. Everything in this lesson will work with minor adjustments if you are working in Foundry or Remix.
+
-:::
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/interfaces/testing-the-interface-vid.mdx b/_pages/learn/interfaces/testing-the-interface-vid.mdx
similarity index 84%
rename from docs/pages/learn/interfaces/testing-the-interface-vid.mdx
rename to _pages/learn/interfaces/testing-the-interface-vid.mdx
index 444da199..d5934b01 100644
--- a/docs/pages/learn/interfaces/testing-the-interface-vid.mdx
+++ b/_pages/learn/interfaces/testing-the-interface-vid.mdx
@@ -6,12 +6,11 @@ hide_table_of_contents: false
# Testing the Interface
-:::caution
-
+
This tutorial has been moved as part of a reorganization! It assumes you are using Hardhat. Everything in this lesson will work with minor adjustments if you are working in Foundry or Remix.
+
-:::
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/intro-to-tokens/intro-to-tokens-vid.mdx b/_pages/learn/intro-to-tokens/intro-to-tokens-vid.mdx
similarity index 79%
rename from docs/pages/learn/intro-to-tokens/intro-to-tokens-vid.mdx
rename to _pages/learn/intro-to-tokens/intro-to-tokens-vid.mdx
index a4393659..1fde6e2b 100644
--- a/docs/pages/learn/intro-to-tokens/intro-to-tokens-vid.mdx
+++ b/_pages/learn/intro-to-tokens/intro-to-tokens-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Introduction
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/intro-to-tokens/misconceptions-about-tokens-vid.mdx b/_pages/learn/intro-to-tokens/misconceptions-about-tokens-vid.mdx
similarity index 81%
rename from docs/pages/learn/intro-to-tokens/misconceptions-about-tokens-vid.mdx
rename to _pages/learn/intro-to-tokens/misconceptions-about-tokens-vid.mdx
index dcb8000e..4b6aa5e0 100644
--- a/docs/pages/learn/intro-to-tokens/misconceptions-about-tokens-vid.mdx
+++ b/_pages/learn/intro-to-tokens/misconceptions-about-tokens-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Common Misconceptions
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/intro-to-tokens/tokens-overview.mdx b/_pages/learn/intro-to-tokens/tokens-overview.mdx
similarity index 100%
rename from docs/pages/learn/intro-to-tokens/tokens-overview.mdx
rename to _pages/learn/intro-to-tokens/tokens-overview.mdx
diff --git a/docs/pages/learn/introduction-to-ethereum/ethereum-applications.mdx b/_pages/learn/introduction-to-ethereum/ethereum-applications.mdx
similarity index 100%
rename from docs/pages/learn/introduction-to-ethereum/ethereum-applications.mdx
rename to _pages/learn/introduction-to-ethereum/ethereum-applications.mdx
diff --git a/docs/pages/learn/introduction-to-ethereum/ethereum-dev-overview-vid.mdx b/_pages/learn/introduction-to-ethereum/ethereum-dev-overview-vid.mdx
similarity index 81%
rename from docs/pages/learn/introduction-to-ethereum/ethereum-dev-overview-vid.mdx
rename to _pages/learn/introduction-to-ethereum/ethereum-dev-overview-vid.mdx
index 304ee259..9c9a389f 100644
--- a/docs/pages/learn/introduction-to-ethereum/ethereum-dev-overview-vid.mdx
+++ b/_pages/learn/introduction-to-ethereum/ethereum-dev-overview-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Ethereum Applications
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/introduction-to-ethereum/evm-diagram.mdx b/_pages/learn/introduction-to-ethereum/evm-diagram.mdx
similarity index 99%
rename from docs/pages/learn/introduction-to-ethereum/evm-diagram.mdx
rename to _pages/learn/introduction-to-ethereum/evm-diagram.mdx
index d112f5da..4385522c 100644
--- a/docs/pages/learn/introduction-to-ethereum/evm-diagram.mdx
+++ b/_pages/learn/introduction-to-ethereum/evm-diagram.mdx
@@ -85,7 +85,7 @@ During contract execution, memory serves as a collection of bytes, organized in
To understand the inner workings of the EVM, the following diagram offers a streamlined visualization of its transaction execution process. It begins with the transaction initiation, and progresses to the gas computations for each operation. Integral to the process are the EVM's stack, memory, and storage, which are engaged to manage and persist data throughout the lifecycle of a transaction. Checks and validations at each step ensure the validity of operations, safeguarding the network's integrity. This systemized sequence of actions forms the bedrock of transaction and smart contract execution, ensuring Ethereum's consistent and secure operation.

-:::info
+
**Data Bytecode in the EVM**
Every transaction or smart contract call within the EVM uses "bytecode", which
@@ -105,7 +105,8 @@ Decoding the example sequence: `0x6080604052`
```
This bytecode sequence is not a random set of characters. Each segment corresponds to specific operations or data in the EVM. Opcodes dictate actions, while subsequent data provides specifics.
-:::
+
+
---
diff --git a/docs/pages/learn/introduction-to-ethereum/gas-use-in-eth-transactions.mdx b/_pages/learn/introduction-to-ethereum/gas-use-in-eth-transactions.mdx
similarity index 100%
rename from docs/pages/learn/introduction-to-ethereum/gas-use-in-eth-transactions.mdx
rename to _pages/learn/introduction-to-ethereum/gas-use-in-eth-transactions.mdx
diff --git a/docs/pages/learn/introduction-to-ethereum/intro-to-ethereum-vid.mdx b/_pages/learn/introduction-to-ethereum/intro-to-ethereum-vid.mdx
similarity index 79%
rename from docs/pages/learn/introduction-to-ethereum/intro-to-ethereum-vid.mdx
rename to _pages/learn/introduction-to-ethereum/intro-to-ethereum-vid.mdx
index 510a06eb..2c112c32 100644
--- a/docs/pages/learn/introduction-to-ethereum/intro-to-ethereum-vid.mdx
+++ b/_pages/learn/introduction-to-ethereum/intro-to-ethereum-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Introduction
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid.mdx b/_pages/learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid.mdx
similarity index 81%
rename from docs/pages/learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid.mdx
rename to _pages/learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid.mdx
index 88b55c34..d43d50d0 100644
--- a/docs/pages/learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid.mdx
+++ b/_pages/learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Anatomy of a Smart Contract
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/introduction-to-solidity/deployment-in-remix-vid.mdx b/_pages/learn/introduction-to-solidity/deployment-in-remix-vid.mdx
similarity index 80%
rename from docs/pages/learn/introduction-to-solidity/deployment-in-remix-vid.mdx
rename to _pages/learn/introduction-to-solidity/deployment-in-remix-vid.mdx
index c7174a00..1625e677 100644
--- a/docs/pages/learn/introduction-to-solidity/deployment-in-remix-vid.mdx
+++ b/_pages/learn/introduction-to-solidity/deployment-in-remix-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Deployment in Remix
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/introduction-to-solidity/deployment-in-remix.mdx b/_pages/learn/introduction-to-solidity/deployment-in-remix.mdx
similarity index 100%
rename from docs/pages/learn/introduction-to-solidity/deployment-in-remix.mdx
rename to _pages/learn/introduction-to-solidity/deployment-in-remix.mdx
diff --git a/docs/pages/learn/introduction-to-solidity/introduction-to-remix-vid.mdx b/_pages/learn/introduction-to-solidity/introduction-to-remix-vid.mdx
similarity index 79%
rename from docs/pages/learn/introduction-to-solidity/introduction-to-remix-vid.mdx
rename to _pages/learn/introduction-to-solidity/introduction-to-remix-vid.mdx
index bd7c9012..028871b5 100644
--- a/docs/pages/learn/introduction-to-solidity/introduction-to-remix-vid.mdx
+++ b/_pages/learn/introduction-to-solidity/introduction-to-remix-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Introduction to Remix
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/introduction-to-solidity/introduction-to-remix.mdx b/_pages/learn/introduction-to-solidity/introduction-to-remix.mdx
similarity index 99%
rename from docs/pages/learn/introduction-to-solidity/introduction-to-remix.mdx
rename to _pages/learn/introduction-to-solidity/introduction-to-remix.mdx
index 2ae3d515..53cb29a8 100644
--- a/docs/pages/learn/introduction-to-solidity/introduction-to-remix.mdx
+++ b/_pages/learn/introduction-to-solidity/introduction-to-remix.mdx
@@ -69,14 +69,13 @@ The _Deploy & Run Transactions_ plugin is what you'll use to deploy your contrac
Fix any errors you introduced to `1_Storage.sol` and then click the orange `Deploy` button. You'll see your contract appear below as _STORAGE AT \_.
-:::caution
-
+
There are two common gotchas that can be very confusing when deploying contracts in Remix.
1. Each time you hit the Deploy button, a new copy of your contract is deployed but the previous deployments remain. Unless you are comparing or debugging between different versions of a contract, or deploying multiple contracts at once, you should click the `Trash` button to erase old deployments before deploying again.
1. If your code will not compile, **clicking the deploy button will not generate an error!** Instead, the last compiled version will be deployed. Visually check and confirm that there are no errors indicated by a number in a red circle on top of the Compiler plugin.
+
-:::
---
diff --git a/docs/pages/learn/introduction-to-solidity/introduction-to-solidity-overview.mdx b/_pages/learn/introduction-to-solidity/introduction-to-solidity-overview.mdx
similarity index 100%
rename from docs/pages/learn/introduction-to-solidity/introduction-to-solidity-overview.mdx
rename to _pages/learn/introduction-to-solidity/introduction-to-solidity-overview.mdx
diff --git a/docs/pages/learn/introduction-to-solidity/introduction-to-solidity-vid.mdx b/_pages/learn/introduction-to-solidity/introduction-to-solidity-vid.mdx
similarity index 79%
rename from docs/pages/learn/introduction-to-solidity/introduction-to-solidity-vid.mdx
rename to _pages/learn/introduction-to-solidity/introduction-to-solidity-vid.mdx
index bb0aa8f7..621f63d9 100644
--- a/docs/pages/learn/introduction-to-solidity/introduction-to-solidity-vid.mdx
+++ b/_pages/learn/introduction-to-solidity/introduction-to-solidity-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Introduction
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/introduction-to-solidity/solidity-overview.mdx b/_pages/learn/introduction-to-solidity/solidity-overview.mdx
similarity index 99%
rename from docs/pages/learn/introduction-to-solidity/solidity-overview.mdx
rename to _pages/learn/introduction-to-solidity/solidity-overview.mdx
index 94d7230d..b00be240 100644
--- a/docs/pages/learn/introduction-to-solidity/solidity-overview.mdx
+++ b/_pages/learn/introduction-to-solidity/solidity-overview.mdx
@@ -4,6 +4,8 @@ description: An overview of the Solidity programming language.
hide_table_of_contents: false
---
+import { Danger } from "/snippets/danger.mdx";
+
# Solidity Overview
In this article, you'll learn about the origins and history of Solidity, where to find the docs, and review some of the considerations that make programming in Solidity relatively unique. You'll also learn about how to get started with development!
@@ -115,13 +117,12 @@ We'll start with [Remix], an online IDE similar to Codepen, Replit, or CodeSandb

-:::danger
-
+
**BE VERY CAREFUL** while using Remix, as it can also be used by scammers. Remix itself will warn you about this, so take heed! One common scam is for the scammer to convince you to paste and deploy code that is allegedly some sort of automated moneymaker, such as a staking tool, or a bot.
If you paste and run code that you don't understand, you may lose all assets from your currently connected wallet. You should also be careful to always navigate directly to `remix.ethereum.org`. More experienced developers prefer to use static versions of Remix deployed to [IPFS], but be careful. There are also deployments that are compromised and used as a part of a scam!
+
-:::
### Hardhat
diff --git a/_pages/learn/learning-objectives.mdx b/_pages/learn/learning-objectives.mdx
new file mode 100644
index 00000000..59955449
--- /dev/null
+++ b/_pages/learn/learning-objectives.mdx
@@ -0,0 +1,258 @@
+---
+title: "Learning Objectives"
+---
+
+
+### [Ethereum Applications](/learn/introduction-to-ethereum/ethereum-applications)
+
+- Describe the origin and goals of the Ethereum blockchain
+- List common types of applications that can be developed with the Ethereum blockchain
+- Compare and contrast Web2 vs. Web3 development
+- Compare and contrast the concept of "ownership" in Web2 vs. Web3
+
+### [Gas Use in Ethereum Transactions](/learn/introduction-to-ethereum/gas-use-in-eth-transactions)
+
+- Explain what gas is in Ethereum
+- Explain why gas is necessary in Ethereum
+- Understand how gas works in Ethereum transactions
+
+### [EVM Diagram](/learn/introduction-to-ethereum/evm-diagram)
+
+- Diagram the EVM
+
+### [Setup and Overview](/learn/hardhat-setup-overview/hardhat-setup-overview-sbs)
+
+- Install and create a new Hardhat project with Typescript support
+- Describe the organization and folder structure of a Hardhat project
+- List the use and properties of hardhat.config.ts
+
+### [Testing with Hardhat and Typechain](/learn/hardhat-testing/hardhat-testing-sbs)
+
+- Set up TypeChain to enable testing
+- Write unit tests for smart contracts using Mocha, Chai, and the Hardhat Toolkit
+- Set up multiple signers and call smart contract functions with different signers
+
+### [Etherscan](/learn/etherscan/etherscan-sbs)
+
+- List some of the features of Etherscan
+- Read data from the Bored Ape Yacht Club contract on Etherscan
+- Write data to a contract using Etherscan.
+
+### [Deploying Smart Contracts](/learn/hardhat-deploy/hardhat-deploy-sbs)
+
+- Deploy a smart contract to the Base Sepolia Testnet with hardhat-deploy
+- Deploy a smart contract to the Sepolia Testnet with hardhat-deploy
+- Use BaseScan to view a deployed smart contract
+
+### [Verifying Smart Contracts](/learn/hardhat-verify/hardhat-verify-sbs)
+
+- Verify a deployed smart contract on Etherscan
+- Connect a wallet to a contract in Etherscan
+- Use etherscan to interact with your own deployed contract
+
+### [Hardhat Forking](/learn/hardhat-forking/hardhat-forking)
+
+- Use Hardhat Network to create a local fork of mainnet and deploy a contract to it
+- Utilize Hardhat forking features to configure the fork for several use cases
+
+### ['Introduction to Remix'](/learn/introduction-to-solidity/introduction-to-remix)
+
+- List the features, pros, and cons of using Remix as an IDE
+- Deploy and test the Storage.sol demo contract in Remix
+
+### [Deployment in Remix](/learn/introduction-to-solidity/deployment-in-remix)
+
+- Deploy and test the Storage.sol demo contract in Remix
+
+### [Hello World](/learn/contracts-and-basic-functions/hello-world-step-by-step)
+
+- Construct a simple "Hello World" contract
+- List the major differences between data types in Solidity as compared to other languages
+- Select the appropriate visibility for a function
+
+### [Basic Types](/learn/contracts-and-basic-functions/basic-types)
+
+- Categorize basic data types
+- List the major differences between data types in Solidity as compared to other languages
+- Compare and contrast signed and unsigned integers
+
+### [Test Networks](/learn/deployment-to-testnet/test-networks)
+
+- Describe the uses and properties of the Base testnet
+- Compare and contrast Ropsten, Rinkeby, Goerli, and Sepolia
+
+### [Deployment to Base Sepolia](/learn/deployment-to-testnet/deployment-to-base-sepolia-sbs)
+
+- Deploy a contract to the Base Sepolia testnet and interact with it in [BaseScan]
+
+### [Contract Verification](/learn/deployment-to-testnet/contract-verification-sbs)
+
+- Verify a contract on the Base Sepolia testnet and interact with it in [BaseScan]
+
+### [Control Structures](/learn/control-structures/control-structures)
+
+- Control code flow with `if`, `else`, `while`, and `for`
+- List the unique constraints for control flow in Solidity
+- Utilize `require` to write a function that can only be used when a variable is set to `true`
+- Write a `revert` statement to abort execution of a function in a specific state
+- Utilize `error` to control flow more efficiently than with `require`
+
+### [Storing Data](/learn/storage/simple-storage-sbs)
+
+- Use the constructor to initialize a variable
+- Access the data in a public variable with the automatically generated getter
+- Order variable declarations to use storage efficiently
+
+### [How Storage Works](/learn/storage/how-storage-works)
+
+- Diagram how a contract's data is stored on the blockchain (Contract -> Blockchain)
+- Order variable declarations to use storage efficiently
+- Diagram how variables in a contract are stored (Variable -> Contract)
+
+### [Arrays](/learn/arrays/arrays-in-solidity)
+
+- Describe the difference between storage, memory, and calldata arrays
+
+### [Filtering an Array](/learn/arrays/filtering-an-array-sbs)
+
+- Write a function that can return a filtered subset of an array
+
+### [Mappings](/learn/mappings/mappings-sbs)
+
+- Construct a Map (dictionary) data type
+- Recall that assignment of the Map data type is not as flexible as for other data types/in other languages
+- Restrict function calls with the `msg.sender` global variable
+- Recall that there is no collision protection in the EVM and why this is (probably) ok
+
+### [Function Visibility and State Mutability](/learn/advanced-functions/function-visibility)
+
+- Categorize functions as public, private, internal, or external based on their usage
+- Describe how pure and view functions are different than functions that modify storage
+
+### [Function Modifiers](/learn/advanced-functions/function-modifiers)
+
+- Use modifiers to efficiently add functionality to multiple functions
+
+### [Structs](/learn/structs/structs-sbs)
+
+- Construct a `struct` (user-defined type) that contains several different data types
+- Declare members of the `struct` to maximize storage efficiency
+- Describe constraints related to the assignment of `struct`s depending on the types they contain
+
+### [Inheritance](/learn/inheritance/inheritance-sbs)
+
+- Write a smart contract that inherits from another contract
+- Describe the impact inheritance has on the byte code size limit
+
+### [Multiple Inheritance](/learn/inheritance/multiple-inheritance)
+
+- Write a smart contract that inherits from multiple contracts
+
+### [Abstract Contracts](/learn/inheritance/abstract-contracts-sbs)
+
+- Use the virtual, override, and abstract keywords to create and use an abstract contract
+
+### [Imports](/learn/imports/imports-sbs)
+
+- Import and use code from another file
+- Utilize OpenZeppelin contracts within Remix
+
+### [Error Triage](/learn/error-triage/error-triage)
+
+- Debug common solidity errors including transaction reverted, out of gas, stack overflow, value overflow/underflow, index out of range, etc.
+
+### [The New Keyword](/learn/new-keyword/new-keyword-sbs)
+
+- Write a contract that creates a new contract with the new keyword
+
+### ['Contract to Contract Interaction'](/learn/interfaces/contract-to-contract-interaction)
+
+- Use interfaces to allow a smart contract to call functions in another smart contract
+- Use the `call()` function to interact with another contract without using an interface
+
+### [Events](/learn/events/hardhat-events-sbs)
+
+- Write and trigger an event
+- List common uses of events
+- Understand events vs. smart contract storage
+
+### [Address and Payable in Solidity](/learn/address-and-payable/address-and-payable)
+
+- Differentiate between address and address payable types in Solidity
+- Determine when to use each type appropriately in contract development
+- Employ address payable to send Ether and interact with payable functions
+
+### [Minimal Token](/learn/minimal-tokens/minimal-token-sbs)
+
+- Construct a minimal token and deploy to testnet
+- Identify the properties that make a token a token
+
+### [The ERC-20 Token Standard](/learn/erc-20-token/erc-20-standard)
+
+- Analyze the anatomy of an ERC-20 token
+- Review the formal specification for ERC-20
+
+### [ERC-20 Implementation](/learn/erc-20-token/erc-20-token-sbs)
+
+- Describe OpenZeppelin
+- Import the OpenZeppelin ERC-20 implementation
+- Describe the difference between the ERC-20 standard and OpenZeppelin's ERC20.sol
+- Build and deploy an ERC-20 compliant token
+
+### [The ERC-721 Token Standard](/learn/erc-721-token/erc-721-standard)
+
+- Analyze the anatomy of an ERC-721 token
+- Compare and contrast the technical specifications of ERC-20 and ERC-721
+- Review the formal specification for ERC-721
+
+### [ERC-721 Token](/learn/erc-721-token/erc-721-sbs)
+
+- Analyze the anatomy of an ERC-721 token
+- Compare and contrast the technical specifications of ERC-20 and ERC-721
+- Review the formal specification for ERC-721
+- Build and deploy an ERC-721 compliant token
+- Use an ERC-721 token to control ownership of another data structure
+
+### [Wallet Connectors](/learn/frontend-setup/wallet-connectors)
+
+- Identify the role of a wallet aggregator in an onchain app
+- Debate the pros and cons of using a template
+- Scaffold a new onchain app with RainbowKit
+- Support users of EOAs and the Coinbase Smart Wallet with the same app
+
+### [Building an Onchain App](/learn/frontend-setup/building-an-onchain-app)
+
+- Identify the role of a wallet aggregator in an onchain app
+- Debate the pros and cons of using a template
+- Add a wallet connection to a standard template app
+
+### [The `useAccount` Hook](/learn/reading-and-displaying-data/useAccount)
+
+- Implement the `useAccount` hook to show the user's address, connection state, network, and balance
+- Implement an `isMounted` hook to prevent hydration errors
+
+### [The `useReadContract` Hook](/learn/reading-and-displaying-data/useReadContract)
+
+- Implement wagmi's `useReadContract` hook to fetch data from a smart contract
+- Convert data fetched from a smart contract to information displayed to the user
+- Identify the caveats of reading data from automatically-generated getters
+
+### [Configuring `useReadContract`](/learn/reading-and-displaying-data/configuring-useReadContract)
+
+- Use `useBlockNumber` and the `queryClient` to automatically fetch updates from the blockchain
+- Describe the costs of using the above, and methods to reduce those costs
+- Configure arguments to be passed with a call to a `pure` or `view` smart contract function
+- Call an instance of `useReadContract` on demand
+- Utilize `isLoading` and `isFetching` to improve user experience
+
+### [The `useWriteContract` hook](/learn/writing-to-contracts/useWriteContract)
+
+- Implement wagmi's `useWriteContract` hook to send transactions to a smart contract
+- Configure the options in `useWriteContract`
+- Display the execution, success, or failure of a function with button state changes, and data display
+
+### [The `useSimulateContract` hook](/learn/writing-to-contracts/useSimulateContract)
+
+- Implement wagmi's `useSimulateContract` and `useWriteContract` to send transactions to a smart contract
+- Configure the options in `useSimulateContract` and `useWriteContract`
+- Call a smart contract function on-demand using the write function from `useWriteContract`, with arguments and a value
\ No newline at end of file
diff --git a/docs/pages/learn/mappings/how-mappings-are-stored-vid.mdx b/_pages/learn/mappings/how-mappings-are-stored-vid.mdx
similarity index 79%
rename from docs/pages/learn/mappings/how-mappings-are-stored-vid.mdx
rename to _pages/learn/mappings/how-mappings-are-stored-vid.mdx
index 3d2e4fa9..84aee1c3 100644
--- a/docs/pages/learn/mappings/how-mappings-are-stored-vid.mdx
+++ b/_pages/learn/mappings/how-mappings-are-stored-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# How Mappings are Stored
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/mappings/mappings-exercise.mdx b/_pages/learn/mappings/mappings-exercise.mdx
similarity index 99%
rename from docs/pages/learn/mappings/mappings-exercise.mdx
rename to _pages/learn/mappings/mappings-exercise.mdx
index 0bc76732..724af816 100644
--- a/docs/pages/learn/mappings/mappings-exercise.mdx
+++ b/_pages/learn/mappings/mappings-exercise.mdx
@@ -55,8 +55,7 @@ Add a function called `resetUserFavorites` that resets `userFavorites` for the s
### Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -64,8 +63,8 @@ Add a function called `resetUserFavorites` that resets `userFavorites` for the s
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/mappings/mappings-sbs.mdx b/_pages/learn/mappings/mappings-sbs.mdx
similarity index 100%
rename from docs/pages/learn/mappings/mappings-sbs.mdx
rename to _pages/learn/mappings/mappings-sbs.mdx
diff --git a/docs/pages/learn/mappings/mappings-vid.mdx b/_pages/learn/mappings/mappings-vid.mdx
similarity index 74%
rename from docs/pages/learn/mappings/mappings-vid.mdx
rename to _pages/learn/mappings/mappings-vid.mdx
index 53a2c757..bab69568 100644
--- a/docs/pages/learn/mappings/mappings-vid.mdx
+++ b/_pages/learn/mappings/mappings-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Mappings
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/mappings/using-msg-sender-vid.mdx b/_pages/learn/mappings/using-msg-sender-vid.mdx
similarity index 78%
rename from docs/pages/learn/mappings/using-msg-sender-vid.mdx
rename to _pages/learn/mappings/using-msg-sender-vid.mdx
index 884588d1..9403dfa3 100644
--- a/docs/pages/learn/mappings/using-msg-sender-vid.mdx
+++ b/_pages/learn/mappings/using-msg-sender-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Using `msg.sender`
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/minimal-tokens/creating-a-minimal-token-vid.mdx b/_pages/learn/minimal-tokens/creating-a-minimal-token-vid.mdx
similarity index 80%
rename from docs/pages/learn/minimal-tokens/creating-a-minimal-token-vid.mdx
rename to _pages/learn/minimal-tokens/creating-a-minimal-token-vid.mdx
index 9db59542..b2bb1d0f 100644
--- a/docs/pages/learn/minimal-tokens/creating-a-minimal-token-vid.mdx
+++ b/_pages/learn/minimal-tokens/creating-a-minimal-token-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Create a Minimal Token
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/minimal-tokens/minimal-token-sbs.mdx b/_pages/learn/minimal-tokens/minimal-token-sbs.mdx
similarity index 99%
rename from docs/pages/learn/minimal-tokens/minimal-token-sbs.mdx
rename to _pages/learn/minimal-tokens/minimal-token-sbs.mdx
index fcab0324..dd878885 100644
--- a/docs/pages/learn/minimal-tokens/minimal-token-sbs.mdx
+++ b/_pages/learn/minimal-tokens/minimal-token-sbs.mdx
@@ -169,11 +169,10 @@ A more guaranteed way to destroy, or _burn_ a token, is to transfer it to the de
The `totalSupply` remains unchanged, and the balance of the zero address is visible, but those tokens are stuck there forever.
-:::info
-
+
The [zero address] currently has a balance of more than 11,000 ETH, worth over **20 million dollars**! Its total holding of burned assets is estimated to be worth more than **200 million dollars**!!!
+
-:::
---
diff --git a/docs/pages/learn/minimal-tokens/minimal-tokens-exercise.mdx b/_pages/learn/minimal-tokens/minimal-tokens-exercise.mdx
similarity index 98%
rename from docs/pages/learn/minimal-tokens/minimal-tokens-exercise.mdx
rename to _pages/learn/minimal-tokens/minimal-tokens-exercise.mdx
index 8697a890..4c920784 100644
--- a/docs/pages/learn/minimal-tokens/minimal-tokens-exercise.mdx
+++ b/_pages/learn/minimal-tokens/minimal-tokens-exercise.mdx
@@ -46,8 +46,7 @@ A failure of either of these checks should result in a revert with an `UnsafeTra
### Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -55,16 +54,15 @@ A failure of either of these checks should result in a revert with an `UnsafeTra
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
-
-:::caution
+
The contract specification contains actions that can only be performed once by a given address. As a result, the unit tests for a passing contract will only be successful the **first** time you test.
**You may need to submit a fresh deployment to pass**
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/minimal-tokens/transferring-a-minimal-token-vid.mdx b/_pages/learn/minimal-tokens/transferring-a-minimal-token-vid.mdx
similarity index 82%
rename from docs/pages/learn/minimal-tokens/transferring-a-minimal-token-vid.mdx
rename to _pages/learn/minimal-tokens/transferring-a-minimal-token-vid.mdx
index fc7ce412..6d250d2a 100644
--- a/docs/pages/learn/minimal-tokens/transferring-a-minimal-token-vid.mdx
+++ b/_pages/learn/minimal-tokens/transferring-a-minimal-token-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Transferring a Minimal Token
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/new-keyword/creating-a-new-contract-vid.mdx b/_pages/learn/new-keyword/creating-a-new-contract-vid.mdx
similarity index 83%
rename from docs/pages/learn/new-keyword/creating-a-new-contract-vid.mdx
rename to _pages/learn/new-keyword/creating-a-new-contract-vid.mdx
index f5538056..f9795c0b 100644
--- a/docs/pages/learn/new-keyword/creating-a-new-contract-vid.mdx
+++ b/_pages/learn/new-keyword/creating-a-new-contract-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Creating a `new` Contract
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/new-keyword/new-keyword-exercise.mdx b/_pages/learn/new-keyword/new-keyword-exercise.mdx
similarity index 98%
rename from docs/pages/learn/new-keyword/new-keyword-exercise.mdx
rename to _pages/learn/new-keyword/new-keyword-exercise.mdx
index 4aaadb9b..89a42de8 100644
--- a/docs/pages/learn/new-keyword/new-keyword-exercise.mdx
+++ b/_pages/learn/new-keyword/new-keyword-exercise.mdx
@@ -50,21 +50,21 @@ If the `_id` is not found, it should revert with an error called `ContactNotFoun
The `getContact` function returns the contact information of the supplied `_id` number. It reverts to `ContactNotFound` if the contact isn't present.
-:::tip[Question]
+
+**Question**
For bonus points (that only you will know about), explain why we can't just use the automatically generated getter for `contacts`?
+
-:::
### Get All Contacts
The `getAllContacts` function returns an array with all of the user's current, non-deleted contacts.
-:::caution
-
+
You shouldn't use `onlyOwner` for the two _get_ functions. Doing so won't prevent a third party from accessing the information, because all information on the blockchain is public. However, it may give the mistaken impression that information is hidden, which could lead to a security incident.
+
-:::
## AddressBookFactory
@@ -74,8 +74,7 @@ The `AddressBookFactory` contains one function, `deploy`. It creates an instance
## Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -83,8 +82,8 @@ The `AddressBookFactory` contains one function, `deploy`. It creates an instance
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/new-keyword/new-keyword-sbs.mdx b/_pages/learn/new-keyword/new-keyword-sbs.mdx
similarity index 99%
rename from docs/pages/learn/new-keyword/new-keyword-sbs.mdx
rename to _pages/learn/new-keyword/new-keyword-sbs.mdx
index d49a9d44..c514e68b 100644
--- a/docs/pages/learn/new-keyword/new-keyword-sbs.mdx
+++ b/_pages/learn/new-keyword/new-keyword-sbs.mdx
@@ -103,13 +103,12 @@ Click _At Address_ and the instance of `Complimenter` should appear below `Compl

-:::tip
-
+
If the deployed contract appears, but is instead a broken copy of the factory, it's because you didn't change the contract in the _CONTRACT_ dropdown above the deploy button.
Remix is trying to interact with `Complimenter` using the _ABI_ from the factory contract, which won't work.
+
-:::
---
diff --git a/docs/pages/learn/reading-and-displaying-data/configuring-useReadContract.mdx b/_pages/learn/reading-and-displaying-data/configuring-useReadContract.mdx
similarity index 99%
rename from docs/pages/learn/reading-and-displaying-data/configuring-useReadContract.mdx
rename to _pages/learn/reading-and-displaying-data/configuring-useReadContract.mdx
index 3232b184..eb4b5e6f 100644
--- a/docs/pages/learn/reading-and-displaying-data/configuring-useReadContract.mdx
+++ b/_pages/learn/reading-and-displaying-data/configuring-useReadContract.mdx
@@ -72,11 +72,10 @@ It works! Unfortunately, you can't really stop here, unless you're working on a
If you were to take the obvious approach of adding a `useReadContract` for every function you wanted data from, and set it to `watch`, things would quickly get out of hand. A single open web page with 15 functions watched in this way will hit rate-limiting in as short as an hour.
-:::info
-
+
Don't do this, either use multi-call via [`useReadContracts`], or consolidate your `view`s into a single function that fetches all the data you need in one call.
+
-:::
Luckily, you have options to control these calls a little better.
diff --git a/docs/pages/learn/reading-and-displaying-data/useAccount.mdx b/_pages/learn/reading-and-displaying-data/useAccount.mdx
similarity index 100%
rename from docs/pages/learn/reading-and-displaying-data/useAccount.mdx
rename to _pages/learn/reading-and-displaying-data/useAccount.mdx
diff --git a/docs/pages/learn/reading-and-displaying-data/useReadContract.mdx b/_pages/learn/reading-and-displaying-data/useReadContract.mdx
similarity index 99%
rename from docs/pages/learn/reading-and-displaying-data/useReadContract.mdx
rename to _pages/learn/reading-and-displaying-data/useReadContract.mdx
index 31a24068..9699179d 100644
--- a/docs/pages/learn/reading-and-displaying-data/useReadContract.mdx
+++ b/_pages/learn/reading-and-displaying-data/useReadContract.mdx
@@ -28,8 +28,7 @@ The contract creates a very simple DAO, in which users can create issues and vot
But it makes it much easier to test!
-:::caution
-
+
If you're using your own contract, please redeploy it with the following `view` functions:
```solidity
@@ -49,8 +48,8 @@ function getAllIssues() public view returns(ReturnableIssue[] memory) {
```
**You also need to make the `getIssue` function `public`. The original spec called for it to be `external`.**
+
-:::
### Create Demo Issues
@@ -122,11 +121,10 @@ interface Issue {
}
```
-:::warning
-
+
Be very careful here! `bigint` is the name of the type, `BigInt` is the name of the constructor for that type. If you incorrectly use the constructor as the type, much of your code will still work, but other parts will express very confusing bugs.
+
-:::
Now, import `useState` and add a state variable to hold your list of `Issue`s.
@@ -283,11 +281,12 @@ In this guide, you've learned how to use the `useReadContract` hook to call `pur
Use this contract if you don't have your own from the [ERC 20 Tokens Exercise]. You can also use this if you want to cheat to get that badge. Doing so would be silly though!
-:::caution
+
If you use your own contract, redeploy it with the `numberOfIssues` and `getAllIssues` functions from the bottom of the contract below. We'll need this for our first pass solution for getting all the `Issues` in the contract.
**You also need to make the `getIssue` function `public`. The original spec called for it to be `external`.**
-:::
+
+
```Solidity
// SPDX-License-Identifier: MIT
diff --git a/docs/pages/learn/storage/how-storage-works-video.mdx b/_pages/learn/storage/how-storage-works-video.mdx
similarity index 78%
rename from docs/pages/learn/storage/how-storage-works-video.mdx
rename to _pages/learn/storage/how-storage-works-video.mdx
index cd4c4365..4be58f49 100644
--- a/docs/pages/learn/storage/how-storage-works-video.mdx
+++ b/_pages/learn/storage/how-storage-works-video.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# How Storage Works
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/storage/how-storage-works.mdx b/_pages/learn/storage/how-storage-works.mdx
similarity index 100%
rename from docs/pages/learn/storage/how-storage-works.mdx
rename to _pages/learn/storage/how-storage-works.mdx
diff --git a/docs/pages/learn/storage/simple-storage-sbs.mdx b/_pages/learn/storage/simple-storage-sbs.mdx
similarity index 99%
rename from docs/pages/learn/storage/simple-storage-sbs.mdx
rename to _pages/learn/storage/simple-storage-sbs.mdx
index d2354681..453a160e 100644
--- a/docs/pages/learn/storage/simple-storage-sbs.mdx
+++ b/_pages/learn/storage/simple-storage-sbs.mdx
@@ -139,15 +139,14 @@ function updateNumberOfCars(uint8 _numberOfCars) public {
Deploy and test to make sure it works as expected.
-:::warning
-
+
While packing variables can save on gas costs, it can also increase them. The EVM operates on 32 bytes at a time, so it will take additional steps to reduce the size of the element for storage.
Furthermore, the savings in writing to storage only apply when writing multiple values in the same slot at the same time.
Review the **Warning** in the [layout] section of the docs for more details!
+
-:::
### Add a Function to Update `age`
diff --git a/docs/pages/learn/storage/simple-storage-video.mdx b/_pages/learn/storage/simple-storage-video.mdx
similarity index 77%
rename from docs/pages/learn/storage/simple-storage-video.mdx
rename to _pages/learn/storage/simple-storage-video.mdx
index a4b593f9..052dc035 100644
--- a/docs/pages/learn/storage/simple-storage-video.mdx
+++ b/_pages/learn/storage/simple-storage-video.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Simple Storage
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/storage/storage-exercise.mdx b/_pages/learn/storage/storage-exercise.mdx
similarity index 97%
rename from docs/pages/learn/storage/storage-exercise.mdx
rename to _pages/learn/storage/storage-exercise.mdx
index e4630973..f6a96d73 100644
--- a/docs/pages/learn/storage/storage-exercise.mdx
+++ b/_pages/learn/storage/storage-exercise.mdx
@@ -4,6 +4,8 @@ description: Exercise - Demonstrate your knowledge of storage.
hide_table_of_contents: false
---
+import { Danger } from "/snippets/danger.mdx";
+
# Storage Exercise
Create a contract that adheres to the following specifications:
@@ -44,13 +46,12 @@ For the purposes of the test, you **must** deploy the contract with the followin
### View Salary and View Shares
-:::danger
-
+
In the world of blockchain, nothing is ever secret!\* `private` variables prevent other contracts from reading the value. You should use them as a part of clean programming practices, but marking a variable as private **does _not_ hide the value**. All data is trivially available to anyone who knows how to fetch data from the chain.
\*You can make clever use of encryption though!
+
-:::
Write a function called `viewSalary` that returns the value in `salary`.
@@ -98,8 +99,7 @@ function debugResetShares() public {
### Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -107,8 +107,8 @@ function debugResetShares() public {
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/structs/structs-exercise.mdx b/_pages/learn/structs/structs-exercise.mdx
similarity index 99%
rename from docs/pages/learn/structs/structs-exercise.mdx
rename to _pages/learn/structs/structs-exercise.mdx
index 3099abdc..0eb4dc8e 100644
--- a/docs/pages/learn/structs/structs-exercise.mdx
+++ b/_pages/learn/structs/structs-exercise.mdx
@@ -59,8 +59,7 @@ Add a public function called `resetMyGarage`. It should delete the entry in `gar
### Submit your Contract and Earn an NFT Badge! (BETA)
-:::info
-
+
#### Hey, where'd my NFT go!?
[Testnets](/learn/deployment-to-testnet/test-networks) are not permanent! Base Goerli [will soon be sunset](https://base.mirror.xyz/kkz1-KFdUwl0n23PdyBRtnFewvO48_m-fZNzPMJehM4), in favor of Base Sepolia.
@@ -68,8 +67,8 @@ Add a public function called `resetMyGarage`. It should delete the entry in `gar
As these are separate networks with separate data, your NFTs **will not** transfer over.
**Don't worry!** We've captured the addresses of all NFT owners on Base Goerli and will include them when we release the mechanism to transfer these NFTs to mainnet later this year! You can also redeploy on Sepolia and resubmit if you'd like!
+
-:::
import CafeUnitTest from '../../../components/CafeUnitTest/index.jsx'
diff --git a/docs/pages/learn/structs/structs-sbs.mdx b/_pages/learn/structs/structs-sbs.mdx
similarity index 100%
rename from docs/pages/learn/structs/structs-sbs.mdx
rename to _pages/learn/structs/structs-sbs.mdx
diff --git a/docs/pages/learn/structs/structs-vid.mdx b/_pages/learn/structs/structs-vid.mdx
similarity index 74%
rename from docs/pages/learn/structs/structs-vid.mdx
rename to _pages/learn/structs/structs-vid.mdx
index 2f92eecb..f90ed8d6 100644
--- a/docs/pages/learn/structs/structs-vid.mdx
+++ b/_pages/learn/structs/structs-vid.mdx
@@ -6,6 +6,6 @@ hide_table_of_contents: false
# Structs
-import Video from '@/components/VideoPlayer.jsx'
+import { Video } from '/snippets/VideoPlayer.mdx';
diff --git a/docs/pages/learn/welcome.mdx b/_pages/learn/welcome.mdx
similarity index 95%
rename from docs/pages/learn/welcome.mdx
rename to _pages/learn/welcome.mdx
index 79752225..1550f7f1 100644
--- a/docs/pages/learn/welcome.mdx
+++ b/_pages/learn/welcome.mdx
@@ -16,6 +16,8 @@ hide_table_of_contents: false
image: /img/base-learn-open-graph.png
---
+import LearningObjectives from '/snippets/learning-objectives.mdx';
+
# Welcome

@@ -32,7 +34,6 @@ Begin your journey today!
Base Learn covers the following topics. If you're looking for quickstarts, or deeper guides on advanced topics, check out our [Base Builder Tutorials]!
-import LearningObjectives from './learning-objectives.mdx';
diff --git a/docs/pages/learn/writing-to-contracts/useSimulateContract.mdx b/_pages/learn/writing-to-contracts/useSimulateContract.mdx
similarity index 100%
rename from docs/pages/learn/writing-to-contracts/useSimulateContract.mdx
rename to _pages/learn/writing-to-contracts/useSimulateContract.mdx
diff --git a/docs/pages/learn/writing-to-contracts/useWriteContract.mdx b/_pages/learn/writing-to-contracts/useWriteContract.mdx
similarity index 99%
rename from docs/pages/learn/writing-to-contracts/useWriteContract.mdx
rename to _pages/learn/writing-to-contracts/useWriteContract.mdx
index f86ec38b..df01c3b8 100644
--- a/docs/pages/learn/writing-to-contracts/useWriteContract.mdx
+++ b/_pages/learn/writing-to-contracts/useWriteContract.mdx
@@ -22,19 +22,17 @@ By the end of this guide you should be able to:
## Sending a Transaction to the Blockchain
-:::warning
-
+
In this step-by-step, you're going to start with the [`useWriteContract`] hook. You probably won't want to use this method in production. In the next step-by-step, we'll show you the [`useSimulateContract`] hook, how it works with `useWriteContract`, and how you can use it to create a better user experience.
Exploring them separately will highlight the functionality provided by the prepare hook.
+
-:::
-
-:::caution
+
In this module, you'll extend the onchain app you build in the previous module, [Reading and Displaying Data].
+
-:::
You've built an app that can read from your Simple DAO smart contract, but so far, you've used BaseScan to send transactions that call your write functions. You can use the [`useWriteContract`] hook in a similar way to call those functions directly from your app.
@@ -76,11 +74,10 @@ useEffect(() => {
}, [blockNumber, queryClient]);
```
-:::caution
-
+
Remember, this is an expensive method to watch for data to change on the blockchain. In this case, a more production-suitable solution might be to call `balanceOf` after the user has done something that might change the balance.
+
-:::
Set the `return` for your component to display this balance to the user:
diff --git a/docs/pages/privacy-policy.md b/_pages/privacy-policy.mdx
similarity index 100%
rename from docs/pages/privacy-policy.md
rename to _pages/privacy-policy.mdx
diff --git a/_pages/quickstart.mdx b/_pages/quickstart.mdx
new file mode 100644
index 00000000..e509d250
--- /dev/null
+++ b/_pages/quickstart.mdx
@@ -0,0 +1,250 @@
+---
+title: Quickstart
+description: Deploy on Base and build your first onchain app.
+---
+
+# Quickstart
+
+Welcome to the Base quickstart guide! In this walkthrough, we'll create a simple onchain app from start to finish. Whether you're a seasoned developer or just starting out, this guide has got you covered.
+
+## What You'll Achieve
+
+By the end of this quickstart, you'll have built an onchain app by:
+
+- Configuring your development environment
+- Deploying your smart contracts to Base
+- Interacting with your deployed contracts from the frontend
+
+Our simple app will be an onchain tally app which lets you add to a total tally, stored onchain, by pressing a button.
+
+
+**Why Base?**
+
+Base is a fast, low-cost, builder-friendly Ethereum L2 built to bring the next billion users onchain. By following this guide, you'll join a vibrant ecosystem of developers, creators, and innovators who are building a global onchain economy.
+
+
+
+## Set Up Your Development Environment
+
+
+
+ OnchainKit is a library of ready-to-use React components and Typescript utilities for building onchain apps. Run the following command in your terminal and follow the prompts to bootstrap your project.
+
+ ```bash [Terminal]
+ npm create onchain@latest
+ ```
+
+ The prompots will ask you for a CDP API Key which you can get [here](https://portal.cdp.coinbase.com/projects/api-keys/client-key).
+
+ Once you've gone through the prompts, you'll have a new project directory with a basic OnchainKit app. Run the following to see it live.
+
+ ```bash [Terminal]
+ cd my-onchainkit-app
+ npm install
+ npm run dev
+ ```
+
+ You should see the following screen.
+
+
+
+ Once we've deployed our contracts, we'll add a button that lets us interact with our contracts.
+
+
+
+ The total tally will be stored onchain in a smart contract. We'll use the Foundry framework to deploy our contract to the Base Sepolia testnet.
+
+ 1. Create a new "contracts" folder in the root of your project
+
+ ```bash [Terminal]
+ mkdir contracts && cd contracts
+ ```
+
+ 2. Install and initialize Foundry
+
+ ```bash [Terminal]
+ curl -L https://foundry.paradigm.xyz | bash
+ foundryup
+ forge init --no-git
+ ```
+
+ Open the project and find the `Counter.sol` contract file in the `/contracts/src` folder. You'll find the simple logic for our tally app.
+
+
+ **--no-git**
+
+ Because `contracts` is a folder in our project, we don't want to initialize a separate git repository for it, so we add the `--no-git` flag.
+
+
+
+ To deploy your smart contracts to Base, you need two key components:
+
+ 1. A node connection to interact with the Base network
+ 2. A funded private key to deploy the contract
+
+ Let's set up both of these:
+
+ - Create a `.env` file in your `contracts` directory and add the Base and Base Sepolia RPC URLs
+
+ ```bash [contracts/.env]
+ BASE_RPC_URL="https://mainnet.base.org"
+ BASE_SEPOLIA_RPC_URL="https://sepolia.base.org"
+ ```
+
+ -Load your environment variables
+
+ ```bash [Terminal]
+ source .env
+ ```
+
+
+ **Base Sepolia**
+
+ Base Sepolia is the test network for Base, which we will use for the rest of this guide. You can obtain free Base Sepolia ETH from one of the [faucets listed here](/chain/network-faucets).
+
+
+
+ A private key with testnet funds is required to deploy the contract. You can generate a fresh private key [here](https://visualkey.link/).
+
+ 1. Store your private key in Foundry's secure keystore
+
+ ```bash [Terminal]
+ cast wallet import deployer --interactive
+ ```
+
+ 2. When prompted enter your private key and a password.
+
+ Your private key is stored in `~/.foundry/keystores` which is not tracked by git.
+
+
+ Never share or commit your private key. Always keep it secure and handle with care.
+
+
+
+
+## Deploy Your Contracts
+
+Now that your environment is set up, let's deploy your contracts to Base Sepolia. The foundry project provides a deploy script that will deploy the Counter.sol contract.
+
+
+
+ 1. Use the following command to compile and deploy your contract
+
+ ```bash [Terminal]
+ forge create ./src/Counter.sol:Counter --rpc-url $BASE_SEPOLIA_RPC_URL --account deployer
+ ```
+
+ Note the format of the contract being deployed is `:`.
+
+
+ After successful deployment, the transaction hash will be printed to the console output
+
+ Copy the deployed contract address and add it to your `.env` file
+
+ ```bash
+ COUNTER_CONTRACT_ADDRESS="0x..."
+ ```
+
+
+
+ ```bash [Terminal]
+ source .env
+ ```
+
+
+ To ensure your contract was deployed successfully:
+
+ 1. Check the transaction on [Sepolia Basescan](https://sepolia.basescan.org/).
+ 2. Use the `cast` command to interact with your deployed contract from the command line
+
+ ```bash
+ cast call $COUNTER_CONTRACT_ADDRESS "number()(uint256)" --rpc-url $BASE_SEPOLIA_RPC_URL
+ ```
+
+ This will return the initial value of the Counter contract's `number` storage variable, which will be `0`.
+
+
+
+**Congratulations! You've deployed your smart contract to Base Sepolia!**
+
+Now lets connect the frontend to interact with your recently deployed contract.
+
+## Interacting with your contract
+
+To interact with the smart contract logic, we need to submit an onchain transaction. We can do this easily with the `Transaction` component. This is a simplified version of the `Transaction` component, designed to streamline the integration process. Instead of manually defining each subcomponent and prop, we can use this shorthand version which renders our suggested implementation of the component and includes the `TransactionButton` and `TransactionToast` components.
+
+
+
+ Lets add the `Transaction` component to our `page.tsx` file. Delete the existing content in the `main` tag and replace it with the snippet below.
+
+ ```tsx twoslash [page.tsx]
+ // @noErrors: 2307 - Cannot find module '@/calls'
+ import { Transaction } from '@coinbase/onchainkit/transaction';
+ import { calls } from '@/calls';
+
+
+
+
+
+
+
+ ;
+ ```
+
+
+ In the previous code snippet, you'll see we imported `calls` from the `calls.ts` file. This file provides the details needed to interact with our contract and call the `increment` function. Create a new `calls.ts` file in the same folder as your `page.tsx` file and add the following code.
+
+ ```ts twoslash [calls.ts]
+ const counterContractAddress = '0x...'; // add your contract address here
+ const counterContractAbi = [
+ {
+ type: 'function',
+ name: 'increment',
+ inputs: [],
+ outputs: [],
+ stateMutability: 'nonpayable',
+ },
+ ] as const;
+
+ export const calls = [
+ {
+ address: counterContractAddress,
+ abi: counterContractAbi,
+ functionName: 'increment',
+ args: [],
+ },
+ ];
+ ```
+
+
+ **Contract Address**
+
+ The `calls.ts` file contains the details of the contract interaction, including the contract address, which we saved in the previous step.
+
+
+
+ Now, when you connect a wallet and click on the `Transact` button and approve the transaction, it will increment the tally onchain by one.
+
+ We can verify that the onchain count took place onchain by once again using `cast` to call the `number` function on our contract.
+
+ ```bash [Terminal]
+ cast call $COUNTER_CONTRACT_ADDRESS "number()(uint256)" --rpc-url $BASE_SEPOLIA_RPC_URL
+ ```
+
+ If the transaction was successful, the tally should have incremented by one!
+
+
+
+We now have a working onchain tally app! While the example is simple, it illustrates the end to end process of building on onchain app. We:
+
+- Configured a project with frontend and onchain infrastructure
+- Deployed a smart contract to Base Sepolia
+- Interacted with the contract from the frontend
+
+## Further Improvements
+
+This is just the beginning. There are many ways we can improve upon this app. For example, we could:
+
+- Make the `increment` transaction gasless by integrating with [Paymaster](/builderkits/onchainkit/transaction/transaction#sponsor-with-paymaster-capabilities)
+- Improve the wallet connection and sign up flow with the [WalletModal](/builderkits/onchainkit/wallet/wallet-modal) component
+- Add onchain [Identity](/builderkits/onchainkit/identity/identity) so we know who added the most recent tally
diff --git a/docs/pages/terms-of-service.md b/_pages/terms-of-service.mdx
similarity index 100%
rename from docs/pages/terms-of-service.md
rename to _pages/terms-of-service.mdx
diff --git a/_pages/use-cases/accept-crypto-payments.mdx b/_pages/use-cases/accept-crypto-payments.mdx
new file mode 100644
index 00000000..48cc15eb
--- /dev/null
+++ b/_pages/use-cases/accept-crypto-payments.mdx
@@ -0,0 +1,231 @@
+---
+title: 'Accept Crypto Payments'
+description: Learn how to integrate Coinbase Commerce payments into your application using OnchainKit.
+authors:
+ - hughescoin
+---
+
+# Accept Crypto Payments with Coinbase Commerce & OnchainKit
+
+Accepting crypto payments can help you **eliminate traditional credit card fees** and **avoid costly chargebacks**, giving you a faster, more global payment experience. In this guide, you'll learn how to quickly integrate Coinbase Commerce and OnchainKit to accept crypto payments for products or services in your application.
+
+## Objectives
+
+By following this guide, you will learn how to:
+
+- Create or configure a product in **Coinbase Commerce**
+- Configure your **OnchainKit** environment
+- Implement a checkout flow for accepting crypto payments
+- Deploy and test your app to confirm the payment flow
+
+
+## Prerequisites
+
+### 1. Coinbase Commerce Account
+
+[Coinbase Commerce](https://beta.commerce.coinbase.com/sign-up) allows you to accept cryptocurrency payments globally. Sign up to get started.
+
+### 2. Coinbase Developer Platform (CDP) Account
+
+[Coinbase Developer Platform](https://www.coinbase.com/cloud) (CDP) provides the tools and APIs you need for integration.
+
+### 3. Reown (WalletConnect) Account
+
+[Reown](https://cloud.reown.com/) (formerly WalletConnect) provides a secure way to connect wallets across different devices and platforms.
+
+
+## Step-by-Step Setup
+
+
+
+ 1. **Log in** to your Coinbase Commerce account.
+ 2. Go to the [product creation page](https://beta.commerce.coinbase.com/products).
+ 3. **Add product details** (name, description, price).
+ 4. Click **Create product**.
+ 5. Once created, select **View product** and copy the **UUID** from the URL.
+
+ 
+
+ **Tip**: Store the product UUID as an environment variable in your `.env` file. This makes it easier to reference safely in your code.
+
+
+ Use the official **OnchainKit app template** to bootstrap your project:
+
+
+ ```bash [Bun]
+ git clone https://github.com/coinbase/onchainkit-app-template.git
+ cd onchainkit-app-template
+ bun i
+ ```
+
+
+ ```bash [npm]
+ git clone https://github.com/coinbase/onchainkit-app-template.git
+ cd onchainkit-app-template
+ npm install
+ ```
+
+
+ ```bash [Yarn]
+ git clone https://github.com/coinbase/onchainkit-app-template.git
+ cd onchainkit-app-template
+ yarn
+ ```
+
+
+
+ In the project folder, open (or create) your `.env` file and add:
+
+ ```bash
+ NEXT_PUBLIC_WC_PROJECT_ID=
+ NEXT_TELEMETRY_DISABLED=1
+ NEXT_PUBLIC_ONCHAINKIT_API_KEY=
+ NEXT_PUBLIC_PRODUCT_ID=
+ ```
+
+ > **Note**:
+ > - `NEXT_PUBLIC_PRODUCT_ID` should be set to the **UUID** from your Coinbase Commerce product.
+ > - `NEXT_PUBLIC_ONCHAINKIT_API_KEY` should be your **CDP** API key.
+ > - `NEXT_PUBLIC_WC_PROJECT_ID` is your Reown (WalletConnect) project ID.
+
+
+
+ Open your Wagmi configuration file (e.g., `src/app/wagmi.ts` or similar) and **after** your `useMemo()` hook, add:
+
+ ```diff
+ // other Wagmi config
+ + coinbaseWallet.preference = 'smartWalletOnly';
+ ```
+
+ This ensures Coinbase Wallet only connects to **smart wallets**.
+
+ In `src/app/components/OnchainProviders.tsx`, set up **OnchainKitProvider** to use your **CDP** API key and **Base** as the chain:
+
+ ```typescript
+ 'use client';
+ import { OnchainKitProvider } from '@coinbase/onchainkit';
+ import { RainbowKitProvider } from '@rainbow-me/rainbowkit';
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+ import type { ReactNode } from 'react';
+ import { base } from 'viem/chains';
+ import { WagmiProvider } from 'wagmi';
+ import { useWagmiConfig } from '../wagmi';
+
+ type Props = { children: ReactNode };
+ const queryClient = new QueryClient();
+
+ function OnchainProviders({ children }: Props) {
+ const wagmiConfig = useWagmiConfig();
+ return (
+
+
+
+
+ {children}
+
+
+
+
+ );
+ }
+
+ export default OnchainProviders;
+ ```
+
+ Finally, update your `Config.ts` (or similar config file) to read from environment variables and match your hosted URL:
+
+ ```typescript
+ export const NEXT_PUBLIC_URL =
+ process.env.NODE_ENV === 'development'
+ ? 'http://localhost:3000'
+ : 'https://based-jerseys.vercel.app';
+
+ export const NEXT_PUBLIC_CDP_API_KEY =
+ process.env.NEXT_PUBLIC_ONCHAINKIT_API_KEY;
+
+ export const NEXT_PUBLIC_WC_PROJECT_ID =
+ process.env.NEXT_PUBLIC_WC_PROJECT_ID;
+ ```
+
+
+
+ 1. **Open** `src/app/page.tsx` (or similar entry page).
+ 2. **Import** the necessary components:
+
+ ```typescript
+ import { Checkout, CheckoutButton, CheckoutStatus } from '@coinbase/onchainkit/checkout';
+ import Image from 'next/image';
+
+ const productId = process.env.NEXT_PUBLIC_PRODUCT_ID;
+ ```
+
+ 3. **Add an image** of your product or service in the `public` folder (e.g., `/public/based-jersey-front.jpeg`).
+ 4. **Display** that image and conditionally render the checkout UI only when a wallet is connected:
+
+ ```jsx
+
+
+
+
+
+
+
+ {address ? (
+
+
+
+
+ ) : (
+
+ )}
+
+
+ ```
+
+
+ Use **conditional rendering** to avoid errors when no wallet address is detected.
+
+
+
+
+ 1. **Run** the development server:
+
+
+ ```bash [Bun]
+ bun run dev
+ ```
+
+ ```bash [npm]
+ npm run dev
+ ```
+
+ ```bash [Yarn]
+ yarn dev
+ ```
+
+
+
+ 2. **Visit** `http://localhost:3000` to confirm that the payment button works for your product or service.
+ 3. **Deploy** with your preferred hosting provider (e.g., Vercel).
+
+ 
+
+
+
+## Conclusion
+
+Congratulations! You've successfully **integrated Coinbase Commerce** and **OnchainKit** into your application, enabling crypto payments. By providing this option, you can:
+
+- Eliminate traditional payment fees and chargebacks
+- Expand your audience to crypto users worldwide
+- Easily scale your offerings for more products and services
+
+**Happy building** and enjoy the benefits of a global, decentralized payment system on Base!
+
+
+[Passkeys]: https://www.coinbase.com/blog/introducing-passkeys-a-safer-and-easier-way-to-sign-in-to-coinbase
+[Reown]: https://cloud.reown.com/
+[product creation page]: https://beta.commerce.coinbase.com/products
diff --git a/_pages/use-cases/ai-instructions/eliza.mdx b/_pages/use-cases/ai-instructions/eliza.mdx
new file mode 100644
index 00000000..601bda5c
--- /dev/null
+++ b/_pages/use-cases/ai-instructions/eliza.mdx
@@ -0,0 +1,23 @@
+---
+title: "Edit .env with your own values"
+---
+
+
+
+## Eliza Framework Setup
+
+The fastest way to get started with Eliza is by using the `create-agentkit-app` CLI:
+
+
+
+```bash [Terminal]
+npx create-agentkit-app my-agent
+cd my-agent
+cp .env.example .env
+pnpm install
+pnpm start
+```
+
+
+For additional support, check out the [video tutorial](https://www.youtube.com/live/DlRR1focAiw).
+
diff --git a/_pages/use-cases/ai-instructions/langchain-local.mdx b/_pages/use-cases/ai-instructions/langchain-local.mdx
new file mode 100644
index 00000000..da44003c
--- /dev/null
+++ b/_pages/use-cases/ai-instructions/langchain-local.mdx
@@ -0,0 +1,65 @@
+---
+title: "Edit .env with your credentials"
+---
+
+
+## LangChain Local Environment Setup
+
+### TypeScript
+
+
+
+ ```bash [Terminal]
+ node --version # Should be 18+
+ npm --version # Should be 9.7.2+
+ ```
+
+
+ ```bash [Terminal]
+ git clone https://github.com/coinbase/agentkit.git
+ cd agentkit
+ npm install
+ npm run build
+ cd typescript/examples/langchain-cdp-chatbot
+ ```
+
+
+ ```bash [Terminal]
+ cp .env.local .env
+ ```
+
+
+ ```bash [Terminal]
+ npm run start
+ ```
+
+
+
+### Python
+
+
+
+ ```bash [Terminal]
+ python --version # Should be 3.10+
+ poetry --version # Verify Poetry installation
+ ```
+
+
+ ```bash [Terminal]
+ git clone https://github.com/coinbase/agentkit.git
+ cd agentkit/python/examples/cdp-langchain-chatbot
+ ```
+
+
+ ```bash [Terminal]
+ cp .env.local .env
+ # Edit .env with your credentials
+ ```
+
+
+ ```bash [Terminal]
+ poetry install
+ poetry run python main.py
+ ```
+
+
diff --git a/_pages/use-cases/ai-instructions/langchain-replit.mdx b/_pages/use-cases/ai-instructions/langchain-replit.mdx
new file mode 100644
index 00000000..320e3ee4
--- /dev/null
+++ b/_pages/use-cases/ai-instructions/langchain-replit.mdx
@@ -0,0 +1,30 @@
+## LangChain Replit Setup
+
+
+
+ 1. Fork the template from our [NodeJS](https://replit.com/@lincolnmurr/AgentKitjs-Quickstart-010?v=1) or [Python](https://replit.com/@lincolnmurr/AgentKitpy-01?v=1) Replit templates.
+ 2. Modify your forked project as needed.
+
+
+ 1. Click on "Tools" in the left sidebar and select "Secrets".
+ 2. Add the following secrets:
+
+ ```bash
+ CDP_API_KEY_NAME=your_cdp_key_name
+ CDP_API_KEY_PRIVATE_KEY=your_cdp_private_key
+ OPENAI_API_KEY=your_openai_key # Or XAI_API_KEY if using NodeJS
+ NETWORK_ID="base-sepolia" # Optional, defaults to base-sepolia
+ MNEMONIC_PHRASE=your_mnemonic_phrase # Optional
+ ```
+
+
+
+ 1. Click the "Run" button to start the chatbot.
+
+
+ **Security of wallets on Replit**
+
+ Every agent comes with an associated wallet. Wallet data is read from wallet_data.txt, and if that file does not exist, this repl will create a new wallet and persist it in a new file. Please note that this contains your wallet's private key and should not be used in production environments. Refer to the [CDP docs](https://docs.cdp.coinbase.com/wallet-api/docs/wallets#securing-a-wallet) on how to secure your wallets.
+
+
+
diff --git a/docs/pages/use-cases/decentralize-social-app.mdx b/_pages/use-cases/decentralize-social-app.mdx
similarity index 83%
rename from docs/pages/use-cases/decentralize-social-app.mdx
rename to _pages/use-cases/decentralize-social-app.mdx
index 82710780..b7030967 100644
--- a/docs/pages/use-cases/decentralize-social-app.mdx
+++ b/_pages/use-cases/decentralize-social-app.mdx
@@ -36,33 +36,31 @@ Onchain profiles are built with Basenames and ENS, services which wrap wallet ad
## Integrating ``
-:::steps
-
-### Install and Configure OnchainKit
-
-Creating a new OnchainKit app is the easiest way to get started.
-
-```bash [Terminal]
-npm create onchain@latest
-```
-
-Or you can integrate OnchainKit into an existing app by following the [installation guide](/builderkits/onchainkit/getting-started/#manual-installation).
-
-### Add the IdentityCard component
-
-```tsx twoslash [App.tsx]
-// @errors: 2305
-import { IdentityCard } from '@coinbase/onchainkit/identity'; // [!code focus]
-import { base } from 'viem/chains';
-
- // [!code focus]
-```
-
-:::
+
+
+ Creating a new OnchainKit app is the easiest way to get started.
+
+ ```bash [Terminal]
+ npm create onchain@latest
+ ```
+
+ Or you can integrate OnchainKit into an existing app by following the [installation guide](/builderkits/onchainkit/getting-started/#manual-installation).
+
+
+
+ ```tsx twoslash [App.tsx]
+ // @errors: 2305
+ import { IdentityCard } from '@coinbase/onchainkit/identity'; // [!code focus]
+ import { base } from 'viem/chains';
+
+ // [!code focus]
+ ```
+
+
Just like that, you've added onchain identity into your app! Once a user connects a wallet with a Basename or ENS name, the IdentityCard component will display the user's profile information like you see below.
@@ -75,9 +73,12 @@ Just like that, you've added onchain identity into your app! Once a user connect
/>
-:::tip[Setting the address]
+
+**Setting the address**
+
In the above example, we hardcoded the address. In a real app, you'll dynamically set the address based on the user's connected wallet. [Use OnchainKit's `` component to get the user's address](/builderkits/onchainkit/wallet/wallet).
-:::
+
+
The IdentityCard component comes with helpful defaults, such as a plain avatar image, for users who don't have a Basename or ENS name.
diff --git a/docs/pages/use-cases/defi-your-app.mdx b/_pages/use-cases/defi-your-app.mdx
similarity index 96%
rename from docs/pages/use-cases/defi-your-app.mdx
rename to _pages/use-cases/defi-your-app.mdx
index 16fa6788..357c2689 100644
--- a/docs/pages/use-cases/defi-your-app.mdx
+++ b/_pages/use-cases/defi-your-app.mdx
@@ -3,6 +3,7 @@ title: Defi your app
description: Add common financial features like token swaps and yield generating strategies to your app with pre-built React components from OnchainKit.q
---
+import { Danger } from "/snippets/danger.mdx";
import { Avatar, Name } from '@coinbase/onchainkit/identity';
import { Swap, SwapAmountInput, SwapButton, SwapDefault, SwapMessage, SwapToggleButton, SwapToast } from '@coinbase/onchainkit/swap';
import { EarnMain, EarnDeposit, RearrangedEarnDeposit, PredefinedInputDeposit } from '@/components/EarnComponents';
@@ -33,16 +34,15 @@ The `Swap` component lets users exchange one token for another directly in your
Lets add the `Swap` component to your app.
-:::steps
-### Install and Configure OnchainKit
- Create a new OnchainKit app
-
- ```bash [Terminal]
- npm create onchain@latest
- ```
-
-### Import and Render the Swap Component
+
+
+ Create a new OnchainKit app
+ ```bash [Terminal]
+ npm create onchain@latest
+ ```
+
+
```typescript [App.tsx]
import { SwapDefault } from '@coinbase/onchainkit/swap'; // [!code focus]
import type { Token } from '@coinbase/onchainkit/token';
@@ -72,7 +72,8 @@ Lets add the `Swap` component to your app.
to={[usdc]} // [!code focus]
/> // [!code focus]
```
-:::
+
+
You should now see the following swap component in your app:
@@ -113,9 +114,12 @@ To learn more about how to customize the Swap component, check out the [Swap doc
The `Earn` component enables users to deposit assets into yield-generating vaults and withdraw them later—all within your app. The `Earn` component currently supports Morpho vaults on Base.
-:::note[Get a vault address]
+
+**Get a vault address**
+
You can get a vault address from Morpho's [Vaults page](https://app.morpho.org/base/earn). You will use this address when setting up the `Earn` component.
-:::
+
+
```tsx twoslash
// @noErrors: 2307
@@ -134,8 +138,7 @@ Similar to the Swap component, the Earn component is highly customizable. Lets c
- `useEarnContext` to access the component's context values, `EarnDeposit` and `EarnDetails`
- `DepositButton` to render custom deposit buttons
-:::code-group
-
+
```tsx twoslash [index.tsx]
// @noErrors: 2307
import { Earn, useEarnContext } from '@coinbase/onchainkit/earn';
@@ -183,7 +186,7 @@ function CustomDepositButtons() {
);
}
```
-:::
+
@@ -197,9 +200,10 @@ The `Fund` component (via ``) offers a complete fiat onramp experien
- Automatic exchange rate updates
- Smart handling of payment method restrictions (based on country and subdivision)
-::::tip
+
To use the `FundCard` component, you'll need to provide a Client API Key in `OnchainKitProvider`. You can get one following our [Getting Started](/builderkits/onchainkit/installation/nextjs#get-your-client-api-key) steps.
-:::::
+
+
```tsx [App.tsx]
import { FundCard } from '@coinbase/onchainkit/fund';
@@ -239,9 +243,10 @@ The `Buy` components provide a comprehensive interface for users to purchase [To
The `Buy` component supports token swaps from USDC and ETH by default with the option to provide an additional token of choice using the `fromToken` prop. Users are able to purchase tokens using their Coinbase account, Apple Pay, or debit card.
-:::info
+
This component requires a `projectId` to be set in the `OnchainKitProvider`. You can find your `projectId` on [Coinbase Developer Platform](https://portal.cdp.coinbase.com/products/onchainkit).
-:::
+
+
```tsx twoslash
import { Buy } from '@coinbase/onchainkit/buy'; // [!code focus]
@@ -275,11 +280,12 @@ export default function BuyComponents() { // [!code focus]
-:::danger
+
**Note: This interface is for demonstration purposes only.**
Swap and Onramp flows will execute and work out of the box when you implement the component in your own app.
-:::
+
+
By combining Swap, Earn, Fund, and Buy with these additional tools, you can quickly build a robust in-app DeFi experience with minimal development overhead. This lets you focus on building your unique value proposition.
diff --git a/docs/pages/use-cases/go-gasless.mdx b/_pages/use-cases/go-gasless.mdx
similarity index 98%
rename from docs/pages/use-cases/go-gasless.mdx
rename to _pages/use-cases/go-gasless.mdx
index 49e8ca36..cc510669 100644
--- a/docs/pages/use-cases/go-gasless.mdx
+++ b/_pages/use-cases/go-gasless.mdx
@@ -4,6 +4,8 @@ slug: /gasless-transaction-on-base-using-a-paymaster
description: Learn how to leverage the Base Paymaster for seamless, gasless transactions on the Coinbase Cloud Developer Platform.
---
+import { Danger } from "/snippets/danger.mdx";
+
# Gasless Transactions on Base using Base Paymaster
Base transaction fees are typically less than a penny, but the concept of gas can still be confusing for new users and lead to poor user experience when users don't have gas funds in their wallet. You can abstract this away and improve your UX by using the **Base Paymaster**. The Paymaster allows you to:
@@ -12,9 +14,10 @@ Base transaction fees are typically less than a penny, but the concept of gas ca
- Create custom gasless experiences
- Sponsor up to $15k monthly on mainnet (unlimited on testnet)
-:::tip
+
If you need an increase in your sponsorship limit, please [reach out on Discord][Discord]!
-:::
+
+
## Objectives
@@ -36,10 +39,11 @@ This tutorial assumes you have:
3. **Foundry**
Foundry is a development environment, testing framework, and smart contract toolkit for Ethereum. You’ll need it installed locally for generating key pairs and interacting with smart contracts.
-:::tip
+
**Testnet vs. Mainnet**
If you prefer not to spend real funds, you can switch to **Base Sepolia** (testnet). The steps below are conceptually the same. Just select _Base Sepolia_ in the Coinbase Developer Platform instead of _Base Mainnet_, and use a contract deployed on Base testnet for your allowlisted methods.
-:::
+
+
## Set Up a Base Paymaster & Bundler
@@ -70,10 +74,11 @@ In this section, you will configure a Paymaster to sponsor payments on behalf of

-:::info
+
**Use your own contract**
We use a [simple NFT contract][simple NFT contract] on Base mainnet as an example. Feel free to substitute your own.
-:::
+
+
### Global & Per User Limits
@@ -89,10 +94,11 @@ For example, you might set:
This means **each user** can only have $0.05 in sponsored gas and **1** user operation before the cycle resets.
-:::info
+
**Limit Cycles**
These reset based on the selected cadence (daily, weekly, monthly).
-:::
+
+
Next, **set the Global Limit**. For example, set this to `$0.07` so that once the entire paymaster has sponsored \$0.07 worth of gas (across all users), no more sponsorship occurs unless you raise the limit.
@@ -151,15 +157,21 @@ Now let’s verify that these policies work. We’ll:
Create a `.env` file in the `sponsored_transactions` directory. In the `.env`, you'll add the rpcURL for your paymaster and the private keys for your accounts:
-:::note[Find your Paymaster & Bundler endpoint]
+
+**Find your Paymaster & Bundler endpoint**
+
The Paymaster & Bundler endpoint is the URL for your Coinbase Developer Platform (CDP) Paymaster.
This was saved in the previous section and follows this format: `https://api.developer.coinbase.com/rpc/v1/base/`
Navigate to the [Paymaster Tool] and select the `Configuration` tab at the top of the screen to obtain your RPC URL.
-:::
+
+
+
+
+**Secure your endpoints**
-:::danger[Secure your endpoints]
You will create a constant for our Paymaster & Bundler endpoint obtained from cdp.portal.coinbase.com. The most secure way to do this is by using a proxy. For the purposes of this demo, hardcode it into our `index.js` file. For product, we highly recommend using a [proxy service].
-:::
+
+
```bash
PAYMASTER_RPC_URL=https://api.developer.coinbase.com/rpc/v1/base/
@@ -167,9 +179,10 @@ PRIVATE_KEY_1=0x01c9720c1dfa3c9...
PRIVATE_KEY_2=0xbcd6fbc1dfa3c9...
```
-:::danger
+
Never commit `.env` files to a public repo!
-:::
+
+
## Example `index.js`
diff --git a/docs/pages/use-cases/launch-ai-agents.mdx b/_pages/use-cases/launch-ai-agents.mdx
similarity index 100%
rename from docs/pages/use-cases/launch-ai-agents.mdx
rename to _pages/use-cases/launch-ai-agents.mdx
diff --git a/docs/pages/use-cases/onboard-any-user.mdx b/_pages/use-cases/onboard-any-user.mdx
similarity index 58%
rename from docs/pages/use-cases/onboard-any-user.mdx
rename to _pages/use-cases/onboard-any-user.mdx
index 494d1a93..ea645c86 100644
--- a/docs/pages/use-cases/onboard-any-user.mdx
+++ b/_pages/use-cases/onboard-any-user.mdx
@@ -22,86 +22,81 @@ The component offers:
Lets add the `WalletModal` component to your app.
-:::steps
-
-### Create a new OnchainKit app
-
-```bash [Terminal]
-npm create onchain@latest
-```
-
-### Configure the `OnchainKitProvider` with modal settings:
-
-```tsx [providers.tsx]
-
- {children}
-
-```
-
-### Add the `` component
-
-```tsx [App.tsx]
-
-
-
-
-
-
-
-
+
+
+ ```bash [Terminal]
+ npm create onchain@latest
+ ```
+
+
+ ```tsx [providers.tsx]
+
+ {children}
+
+ ```
+
+
+ ```tsx [App.tsx]
+
+
+
-
-
-
-
-
-
-```
-
-### Wrap with Wallet Modal Context
-
-Ensure that the Wallet Modal is globally accessible by wrapping your key UI components:
-
-```tsx
-
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+ ```
+
+
+ Ensure that the Wallet Modal is globally accessible by wrapping your key UI components:
+
+ ```tsx
+
+
+
+
+
-
-
-
-
-
-
-
-
-```
-
-:::
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+
@@ -137,11 +132,12 @@ You now have an interface to streamline user onboarding! The `WalletModal` compo
In addition to providing a secure and feature-rich wallet experience, Smart Wallets provide a streamlined onboarding experience through account creation with Passkeys. This allows anyone to securely create a new wallet and begin transacting without ever leaving your app.
-:::info[More on Smart Wallets]
+
+**More on Smart Wallets**
Smart Wallet has advanced features such as sponsored transactions, spend permissions, and Magic Spend. [Learn more about Smart Wallet here](/identity/smart-wallet/quickstart/).
+
-:::
## Conclusion
diff --git a/docs/pages/wallet-app/mini-apps.mdx b/_pages/wallet-app/mini-apps.mdx
similarity index 99%
rename from docs/pages/wallet-app/mini-apps.mdx
rename to _pages/wallet-app/mini-apps.mdx
index 8f90571b..afa937fa 100644
--- a/docs/pages/wallet-app/mini-apps.mdx
+++ b/_pages/wallet-app/mini-apps.mdx
@@ -1,4 +1,7 @@
-# Mini Apps
+---
+title: "Mini Apps"
+---
+
We're so excited that mini apps are coming to Coinbase Wallet! The purpose of this guide is to go over how to build or update your mini app so it works as well as possible in Coinbase Wallet.
@@ -33,9 +36,10 @@ Something important to note is that because of how the current mini app spec is
Currently, using Sign In with Farcaster inside of Coinbase Wallet is **not recommended as the primary method of authentication**. This is because, for Farcaster accounts that were created in Warpcast (which many current accounts were), using Sign In with Farcaster will require deeplinking the user to Warpcast and then back to Coinbase Wallet. While this flow still works inside of Coinbase Wallet, we recommend either wallet auth or creating an auth strategy around the context data (eg. a custom JWT with context data) for a more optimal UX.
-:::info
+
Note: The Sign In with Farcaster flow will no longer require a deeplink to Warpcast when the [auth addresses FIP](https://github.com/farcasterxyz/protocol/discussions/225) lands, which will allow a set of delegated wallets to take actions on behalf of a Farcaster account's custody wallet.
-:::
+
+
## Deeplinks and SDK Actions
diff --git a/api/submitFeedback.ts b/api/submitFeedback.ts
deleted file mode 100644
index 26b15af9..00000000
--- a/api/submitFeedback.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import { google } from '@googleapis/sheets';
-import type { VercelRequest, VercelResponse } from '@vercel/node';
-
-// Initialize Google Sheets client
-const getGoogleSheetsClient = () => {
- try {
- const credentials = JSON.parse(
- Buffer.from(process.env.GOOGLE_SERVICE_ACCOUNT_KEY || '', 'base64').toString(),
- );
-
- const auth = new google.auth.GoogleAuth({
- credentials,
- scopes: ['https://www.googleapis.com/auth/spreadsheets'],
- });
-
- return google.sheets({ version: 'v4', auth });
- } catch (error) {
- console.error('Failed to initialize Google Sheets client:', error);
- throw new Error('Failed to initialize Google Sheets client');
- }
-};
-
-type FeedbackPayload = {
- likeOrDislike: boolean;
- options: string[];
- comment: string;
- url: string;
- ipAddress: string;
- timestamp: number;
-};
-
-export default async function handler(req: VercelRequest, res: VercelResponse) {
- if (req.method !== 'POST') {
- return res.status(405).json({ error: 'Method not allowed' });
- }
-
- try {
- const { likeOrDislike, options, comment, url, ipAddress, timestamp } =
- req.body as FeedbackPayload;
-
- const sheets = getGoogleSheetsClient();
- const spreadsheetId = process.env.GOOGLE_SHEETS_ID;
-
- if (!spreadsheetId) {
- throw new Error('GOOGLE_SHEETS_ID environment variable is not set');
- }
-
- // Format the row data
- const rowData = [
- new Date(timestamp).toISOString(),
- url,
- ipAddress,
- likeOrDislike ? 'Like' : 'Dislike',
- options.join(', '),
- comment,
- ];
-
- // Append the row to the sheet
- await sheets.spreadsheets.values.append({
- spreadsheetId,
- range: 'Sheet1!A:F', // Adjust range based on your sheet's structure
- valueInputOption: 'USER_ENTERED',
- requestBody: {
- values: [rowData],
- },
- });
-
- return res.status(200).json({ success: true });
- } catch (error) {
- console.error('Error submitting feedback:', error);
- return res.status(500).json({ error: 'Failed to submit feedback' });
- }
-}
diff --git a/contexts/Theme.tsx b/contexts/Theme.tsx
deleted file mode 100644
index 7ef33ff8..00000000
--- a/contexts/Theme.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import {
- type ReactNode,
- createContext,
- useCallback,
- useContext,
- useEffect,
- useMemo,
- useState,
-} from 'react';
-
-type Theme = 'light' | 'dark';
-type ThemeContextProps = {
- theme: Theme;
- toggleTheme: () => void;
-};
-
-export const ThemeContext = createContext({
- theme: 'dark',
- toggleTheme: () => {},
-});
-
-export function useTheme() {
- const context = useContext(ThemeContext);
- if (context === undefined) {
- throw new Error('useTheme must be used within a ThemeProvider');
- }
- return context;
-}
-
-export default function ThemeProvider({ children }: { children: ReactNode }) {
- const [theme, setTheme] = useState('dark');
-
- const toggleTheme = useCallback(() => {
- setTheme((prev) => (prev === 'light' ? 'dark' : 'light'));
- }, []);
-
- useEffect(() => {
- const rootElement = document.documentElement;
- const observer = new MutationObserver(() => {
- if (rootElement.classList.contains('dark')) {
- setTheme('dark');
- } else {
- setTheme('light');
- }
- });
-
- observer.observe(rootElement, {
- attributes: true,
- attributeFilter: ['class'],
- });
-
- if (rootElement.classList.contains('dark')) {
- setTheme('dark');
- }
-
- return () => observer.disconnect();
- }, []);
-
- const values = useMemo(() => ({ theme, toggleTheme }), [theme, toggleTheme]);
-
- return {children};
-}
diff --git a/docs.json b/docs.json
new file mode 100644
index 00000000..439d31c7
--- /dev/null
+++ b/docs.json
@@ -0,0 +1,402 @@
+{
+ "$schema": "https://mintlify.com/docs.json",
+ "theme": "mint",
+ "name": "Base Documentation",
+ "colors": {
+ "primary": "#578BFA",
+ "light": "#578BFA",
+ "dark": "#578BFA"
+ },
+ "favicon": "/logo/favicon.svg",
+ "contextual": {
+ "options": [
+ "copy",
+ "chatgpt",
+ "claude"
+ ]
+ },
+ "api": {
+ "playground": {
+ "display": "simple"
+ },
+ "examples": {
+ "languages": [
+ "javascript"
+ ]
+ }
+ },
+ "navigation": {
+ "tabs": [
+ {
+ "tab": "Learn",
+ "groups": [
+ {
+ "group": "Building Onchain",
+ "pages": [
+ "learn/welcome"
+ ]
+ },
+ {
+ "group": "Onchain Concepts",
+ "pages": [
+ "learn/onchain-concepts/core-concepts",
+ "learn/onchain-concepts/understanding-the-onchain-tech-stack",
+ {
+ "group": "Web2 vs Building Onchain",
+ "pages": [
+ "learn/onchain-concepts/building-onchain-wallets",
+ "learn/onchain-concepts/building-onchain-identity",
+ "learn/onchain-concepts/building-onchain-gas",
+ "learn/onchain-concepts/building-onchain-nodes",
+ "learn/onchain-concepts/building-onchain-frontend-development",
+ "learn/onchain-concepts/building-onchain-onramps",
+ "learn/onchain-concepts/building-onchain-social-networks",
+ "learn/onchain-concepts/building-onchain-ai"
+ ]
+ },
+ "learn/onchain-concepts/development-flow",
+ "learn/onchain-concepts/continue-building-onchain"
+ ]
+ },
+ {
+ "group": "Ethereum 101",
+ "pages": [
+ "learn/introduction-to-ethereum",
+ "learn/ethereum-dev-overview",
+ "learn/ethereum-applications",
+ "learn/gas-use-in-eth-transactions",
+ "learn/evm-diagram",
+ "learn/guide-to-base"
+ ]
+ },
+ {
+ "group": "Onchain App Development",
+ "pages": [
+ "learn/onchain-app-development/deploy-with-fleek",
+ "learn/onchain-app-development/account-abstraction",
+ "learn/cross-chain-development",
+ "learn/client-side-development",
+ {
+ "group": "Account Abstraction",
+ "pages": [
+ "learn/onchain-app-development/account-abstraction/account-abstraction-on-base-using-biconomy",
+ "learn/onchain-app-development/account-abstraction/account-abstraction-on-base-using-particle-network",
+ "learn/onchain-app-development/account-abstraction/account-abstraction-on-base-using-privy-and-the-base-paymaster",
+ "learn/onchain-app-development/account-abstraction/gasless-transactions-with-paymaster"
+ ]
+ },
+ {
+ "group": "Client-Side Development",
+ "pages": [
+ "learn/onchain-app-development/client-side-development/introduction-to-providers",
+ "learn/onchain-app-development/client-side-development/viem",
+ "learn/onchain-app-development/client-side-development/web3"
+ ]
+ },
+ {
+ "group": "Cross-Chain",
+ "pages": [
+ "learn/onchain-app-development/cross-chain/bridge-tokens-with-layerzero",
+ "learn/onchain-app-development/cross-chain/send-messages-and-tokens-from-base-chainlink"
+ ]
+ },
+ {
+ "group": "Finance",
+ "pages": [
+ "learn/onchain-app-development/finance/build-a-smart-wallet-funding-app",
+ "learn/onchain-app-development/finance/access-real-world-data-chainlink",
+ "learn/onchain-app-development/finance/access-real-time-asset-data-pyth-price-feeds"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Smart Contract Development",
+ "pages": [
+ {
+ "group": "Introduction to Solidity",
+ "pages": [
+ "learn/introduction-to-solidity/introduction-to-solidity-overview",
+ "learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid",
+ {
+ "group": "Introduction to Solidity",
+ "pages": [
+ "learn/introduction-to-solidity/introduction-to-solidity-vid",
+ "learn/introduction-to-solidity/solidity-overview",
+ "learn/introduction-to-solidity/introduction-to-remix-vid",
+ "learn/introduction-to-solidity/introduction-to-remix",
+ "learn/introduction-to-solidity/deployment-in-remix-vid",
+ "learn/introduction-to-solidity/deployment-in-remix"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Contracts and Basic Functions",
+ "pages": [
+ "learn/contracts-and-basic-functions/intro-to-contracts-vid",
+ "learn/contracts-and-basic-functions/hello-world-step-by-step",
+ "learn/contracts-and-basic-functions/basic-types",
+ "learn/contracts-and-basic-functions/basic-functions-exercise"
+ ]
+ },
+ {
+ "group": "Deploying to a Testnet",
+ "pages": [
+ "learn/deployment-to-testnet/overview-of-test-networks-vid",
+ "learn/deployment-to-testnet/test-networks",
+ "learn/deployment-to-testnet/deployment-to-base-sepolia-sbs",
+ "learn/deployment-to-testnet/contract-verification-sbs",
+ "learn/deployment-to-testnet/deployment-to-testnet-exercise"
+ ]
+ },
+ {
+ "group": "Control Structures",
+ "pages": [
+ "learn/control-structures/standard-control-structures-vid",
+ "learn/control-structures/loops-vid",
+ "learn/control-structures/require-revert-error-vid",
+ "learn/control-structures/control-structures",
+ "learn/control-structures/control-structures-exercise"
+ ]
+ },
+ {
+ "group": "Storage in Solidity",
+ "pages": [
+ "learn/storage/simple-storage-video",
+ "learn/storage/simple-storage-sbs",
+ "learn/storage/how-storage-works-video",
+ "learn/storage/how-storage-works",
+ "learn/storage/storage-exercise"
+ ]
+ },
+ {
+ "group": "Arrays in Solidity",
+ "pages": [
+ "learn/arrays/arrays-in-solidity-vid",
+ "learn/arrays/writing-arrays-in-solidity-vid",
+ "learn/arrays/arrays-in-solidity",
+ "learn/arrays/filtering-an-array-sbs",
+ "learn/arrays/fixed-size-arrays-vid",
+ "learn/arrays/array-storage-layout-vid",
+ "learn/arrays/arrays-exercise"
+ ]
+ },
+ {
+ "group": "The Mapping Type",
+ "pages": [
+ "learn/mappings/mappings-vid",
+ "learn/mappings/using-msg-sender-vid",
+ "learn/mappings/mappings-sbs",
+ "learn/mappings/how-mappings-are-stored-vid",
+ "learn/mappings/mappings-exercise"
+ ]
+ },
+ {
+ "group": "Advanced Functions",
+ "pages": [
+ "learn/advanced-functions/function-visibility-vid",
+ "learn/advanced-functions/function-visibility",
+ "learn/advanced-functions/function-modifiers-vid",
+ "learn/advanced-functions/function-modifiers"
+ ]
+ },
+ {
+ "group": "Structs",
+ "pages": [
+ "learn/structs/structs-vid",
+ "learn/structs/structs-sbs",
+ "learn/structs/structs-exercise"
+ ]
+ },
+ {
+ "group": "Inheritance",
+ "pages": [
+ "learn/inheritance/inheritance-vid",
+ "learn/inheritance/inheritance-sbs",
+ "learn/inheritance/multiple-inheritance-vid",
+ "learn/inheritance/multiple-inheritance",
+ "learn/inheritance/abstract-contracts-vid",
+ "learn/inheritance/abstract-contracts-sbs",
+ "learn/inheritance/inheritance-exercise"
+ ]
+ },
+ {
+ "group": "Imports",
+ "pages": [
+ "learn/imports/imports-vid",
+ "learn/imports/imports-sbs",
+ "learn/imports/imports-exercise"
+ ]
+ },
+ {
+ "group": "Errors",
+ "pages": [
+ "learn/error-triage/error-triage-vid",
+ "learn/error-triage/error-triage",
+ "learn/error-triage/error-triage-exercise"
+ ]
+ },
+ {
+ "group": "The new Keyword",
+ "pages": [
+ "learn/new-keyword/creating-a-new-contract-vid",
+ "learn/new-keyword/new-keyword-sbs",
+ "learn/new-keyword/new-keyword-exercise"
+ ]
+ },
+ {
+ "group": "Contract to Contract Interactions",
+ "pages": [
+ "learn/interfaces/intro-to-interfaces-vid",
+ "learn/interfaces/calling-another-contract-vid",
+ "learn/interfaces/testing-the-interface-vid",
+ "learn/interfaces/contract-to-contract-interaction"
+ ]
+ },
+ {
+ "group": "Events",
+ "pages": [
+ "learn/events/hardhat-events-sbs"
+ ]
+ },
+ {
+ "group": "Address and Payable",
+ "pages": [
+ "learn/address-and-payable/address-and-payable"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Development with Foundry",
+ "pages": [
+ "learn/foundry/introduction-to-foundry",
+ "learn/foundry/testing",
+ "learn/foundry/setup-with-base",
+ "learn/foundry/deploy-with-foundry",
+ "learn/foundry/testing-smart-contracts",
+ "learn/foundry/verify-contract-with-basescan",
+ "learn/foundry/generate-random-numbers-contracts"
+ ]
+ },
+ {
+ "group": "Development with Hardhat",
+ "pages": [
+ {
+ "group": "Hardhat Setup and Overview",
+ "pages": [
+ "learn/hardhat/overview",
+ "learn/hardhat/creating-project",
+ "learn/hardhat/setup"
+ ]
+ },
+ {
+ "group": "Testing with Typescript",
+ "pages": [
+ "learn/hardhat/testing",
+ "learn/hardhat/writing-tests",
+ "learn/hardhat/contract-abi-testing",
+ "learn/hardhat/testing-guide"
+ ]
+ },
+ {
+ "group": "Etherscan",
+ "pages": [
+ "learn/hardhat/etherscan-guide",
+ "learn/hardhat/etherscan-video"
+ ]
+ },
+ {
+ "group": "Deploying Smart Contracts",
+ "pages": [
+ "learn/hardhat/installing-deploy",
+ "learn/hardhat/setup-deploy-script",
+ "learn/hardhat/testing-deployment",
+ "learn/hardhat/network-configuration",
+ "learn/hardhat/deployment",
+ "learn/hardhat/deployment-guide"
+ ]
+ },
+ {
+ "group": "Verifying Smart Contracts",
+ "pages": [
+ "learn/hardhat/verify-video",
+ "learn/hardhat/verify-guide"
+ ]
+ },
+ {
+ "group": "Mainnet Forking",
+ "pages": [
+ "learn/hardhat/fork-video",
+ "learn/hardhat/fork-guide"
+ ]
+ },
+ {
+ "group": "Hardhat Tools and Guides",
+ "pages": [
+ "learn/hardhat/deploy-with-hardhat",
+ "learn/hardhat/debugging-smart-contracts",
+ "learn/hardhat/optimizing-gas-usage",
+ "learn/hardhat/reducing-contract-size",
+ "learn/hardhat/analyzing-test-coverage"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Token Development",
+ "pages": [
+ {
+ "group": "Introduction to Tokens",
+ "pages": [
+ "learn/intro-to-tokens/intro-to-tokens-vid",
+ "learn/intro-to-tokens/misconceptions-about-tokens-vid",
+ "learn/intro-to-tokens/tokens-overview"
+ ]
+ },
+ {
+ "group": "Minimal Tokens",
+ "pages": [
+ "learn/minimal-tokens/creating-a-minimal-token-vid",
+ "learn/minimal-tokens/transferring-a-minimal-token-vid",
+ "learn/minimal-tokens/minimal-token-sbs",
+ "learn/minimal-tokens/minimal-tokens-exercise"
+ ]
+ },
+ {
+ "group": "ERC-20 Tokens",
+ "pages": [
+ "learn/erc-20-token/analyzing-erc-20-vid",
+ "learn/erc-20-token/erc-20-standard",
+ "learn/erc-20-token/openzeppelin-erc-20-vid",
+ "learn/erc-20-token/erc-20-testing-vid",
+ "learn/erc-20-token/erc-20-token-sbs",
+ "learn/erc-20-token/erc-20-exercise"
+ ]
+ },
+ {
+ "group": "ERC-721 Tokens",
+ "pages": [
+ "learn/erc-721-token/erc-721-standard-video",
+ "learn/erc-721-token/erc-721-standard",
+ "learn/erc-721-token/erc-721-on-opensea-vid",
+ "learn/erc-721-token/openzeppelin-erc-721-vid",
+ "learn/erc-721-token/implementing-an-erc-721-vid",
+ "learn/erc-721-token/erc-721-sbs",
+ "learn/erc-721-token/erc-721-exercise"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Exercise Contracts",
+ "pages": [
+ "learn/exercise-contracts"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/docs/_docs.json b/docs/_docs.json
new file mode 100644
index 00000000..8ab1fe7a
--- /dev/null
+++ b/docs/_docs.json
@@ -0,0 +1,550 @@
+{
+ "$schema": "https://mintlify.com/docs.json",
+ "theme": "mint",
+ "name": "Base Documentation",
+ "colors": {
+ "primary": "#578BFA",
+ "light": "#578BFA",
+ "dark": "#578BFA"
+ },
+ "favicon": "/favicon.svg",
+ "contextual": {
+ "options": ["copy", "chatgpt", "claude"]
+ },
+ "navigation": {
+ "tabs": [
+ {
+ "tab": "Get Started",
+ "groups": [
+ {
+ "group": "Introduction",
+ "pages": ["get-started/base"]
+ },
+ {
+ "group": "Browse by",
+ "pages": ["get-started/products", "get-started/use-cases"]
+ },
+ {
+ "group": "Quickstart",
+ "pages": [
+ "get-started/build-app",
+ "get-started/launch-token",
+ "get-started/deploy-chain",
+ "get-started/deploy-smart-contracts",
+ "get-started/get-funded"
+ ]
+ },
+ {
+ "group": "Build with AI",
+ "pages": ["get-started/ai-prompting", "get-started/prompt-library"]
+ }
+ ],
+ "global": {
+ "anchors": [
+ {
+ "anchor": "Status",
+ "href": "https://status.base.org/",
+ "icon": "signal-bars"
+ },
+ {
+ "anchor": "Faucet",
+ "href": "https://test-184b3b57.mintlify.app/base-chain/tools/network-faucets",
+ "icon": "gas-pump"
+ },
+ {
+ "anchor": "Bridge",
+ "href": "https://test-184b3b57.mintlify.app/base-chain/quickstart/bridge-token",
+ "icon": "coin"
+ }
+ ]
+ }
+ },
+ {
+ "tab": "Base Chain",
+ "groups": [
+ {
+ "group": "General",
+ "pages": [
+ "base-chain/general/network-fees",
+ "base-chain/general/differences-ethereum-base",
+ "base-chain/general/base-contracts"
+ ]
+ },
+ {
+ "group": "Quickstart",
+ "pages": [
+ "base-chain/quickstart/use-base",
+ "base-chain/quickstart/deploy-on-base",
+ "base-chain/quickstart/run-base-node",
+ "base-chain/quickstart/bridge-token"
+ ]
+ },
+ {
+ "group": "Network Information",
+ "pages": [
+ "base-chain/network-information/diffs-ethereum-base",
+ "base-chain/network-information/base-contracts"
+ ]
+ },
+ {
+ "group": "Flashblocks",
+ "pages": [
+ "base-chain/flashblocks/apps",
+ "base-chain/flashblocks/node-providers"
+ ]
+ },
+ {
+ "group": "Node Operators",
+ "pages": [
+ "base-chain/node-operators/performance-tuning",
+ "base-chain/node-operators/snapshots",
+ "base-chain/node-operators/troubleshooting"
+ ]
+ },
+ {
+ "group": "Tools",
+ "pages": [
+ "base-chain/tools/base-products",
+ "base-chain/tools/onchain-registry-api",
+ "base-chain/tools/node-providers",
+ "base-chain/tools/block-explorers",
+ "base-chain/tools/network-faucets",
+ "base-chain/tools/oracles",
+ "base-chain/tools/data-indexers",
+ "base-chain/tools/cross-chain",
+ "base-chain/tools/account-abstraction",
+ "base-chain/tools/onramps"
+ ]
+ },
+ {
+ "group": "Security",
+ "pages": [
+ "base-chain/security/security-council",
+ "base-chain/security/avoid-malicious-flags",
+ "base-chain/security/report-vulnerability"
+ ]
+ }
+ ],
+ "global": {
+ "anchors": [
+ {
+ "anchor": "GitHub",
+ "href": "https://github.com/base",
+ "icon": "github"
+ },
+ {
+ "anchor": "Status",
+ "href": "https://status.base.org/",
+ "icon": "signal-bars"
+ },
+ {
+ "anchor": "Chain Stats",
+ "href": "https://www.base.org/stats",
+ "icon": "chart-line"
+ },
+ {
+ "anchor": "Explorer",
+ "href": "https://basescan.com/",
+ "icon": "magnifying-glass"
+ },
+ {
+ "anchor": "Support",
+ "href": "https://discord.com/invite/base",
+ "icon": "discord"
+ }
+ ]
+ }
+ },
+ {
+ "tab": "Smart Wallet",
+ "groups": [
+ {
+ "group": "Get started",
+ "pages": [
+ "smart-wallet/overview",
+ "smart-wallet/quickstart",
+ "smart-wallet/recommend-libraries",
+ "smart-wallet/base-gasless-campaign"
+ ]
+ },
+ {
+ "group": "Features",
+ "pages": [
+ "smart-wallet/features/single-sign-on",
+ "smart-wallet/features/networks",
+ "smart-wallet/features/passkeys",
+ "smart-wallet/features/recovery",
+ "smart-wallet/features/magicspend",
+ {
+ "group": "Optional Features",
+ "pages": [
+ "smart-wallet/features/gas-free-transactions",
+ "smart-wallet/features/spend-permissions",
+ "smart-wallet/features/batch-transactions",
+ "smart-wallet/features/custom-gas-tokens",
+ "smart-wallet/features/sub-accounts"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Usage",
+ "pages": [
+ "smart-wallet/usage/signature-verification",
+ "smart-wallet/usage/popups",
+ "smart-wallet/usage/simulations",
+ "smart-wallet/usage/gas-usage",
+ "smart-wallet/usage/self-calls"
+ ]
+ },
+ {
+ "group": "SDK",
+ "pages": [
+ "smart-wallet/sdk/install",
+ "smart-wallet/sdk/setup",
+ "smart-wallet/sdk/make-web3-provider",
+ "smart-wallet/sdk/upgrading-from-3x",
+ "smart-wallet/sdk/coinbase-wallet-provider"
+ ]
+ },
+ {
+ "group": "Guides",
+ "pages": [
+ "smart-wallet/guides/update-existing-app",
+ "smart-wallet/guides/signing-and-verifying",
+ "smart-wallet/guides/sign-in-with-ethereum",
+ "smart-wallet/guides/magicspend",
+ "smart-wallet/guides/batch-transactions",
+ "smart-wallet/guides/paymasters",
+ "smart-wallet/guides/erc20-paymasters",
+ {
+ "group": "Sub Accounts",
+ "pages": [
+ "smart-wallet/guides/sub-accounts/overview",
+ "smart-wallet/guides/sub-accounts/setup",
+ "smart-wallet/guides/sub-accounts/creating",
+ "smart-wallet/guides/sub-accounts/using"
+ ]
+ },
+ {
+ "group": "Spend Permissions",
+ "pages": [
+ "smart-wallet/guides/spend-permissions/overview",
+ "smart-wallet/guides/spend-permissions/quickstart",
+ "smart-wallet/guides/spend-permissions/api-reference"
+ ]
+ }
+ ]
+ }
+ ],
+ "global": {
+ "anchors": [
+ {
+ "anchor": "GitHub",
+ "href": "https://github.com/coinbase/onchainkit",
+ "icon": "github"
+ },
+ {
+ "anchor": "Support",
+ "href": "https://discord.com/invite/cdp",
+ "icon": "discord"
+ }
+ ]
+ }
+ },
+ {
+ "tab": "OnchainKit",
+ "groups": [
+ {
+ "group": "Get Started",
+ "pages": [
+ "onchainkit/quickstart",
+ "onchainkit/templates",
+ {
+ "group": "Installation",
+ "pages": ["onchainkit/nextjs", "onchainkit/vite"]
+ },
+ "onchainkit/troubleshoot",
+ "onchainkit/telemetry"
+ ]
+ },
+ {
+ "group": "Guides",
+ "pages": [
+ "onchainkit/guides/build-with-ai",
+ "onchainkit/guides/lifecycle-status",
+ "onchainkit/guides/reach-more-users-with-minikit",
+ "onchainkit/guides/tailwind-css-integration",
+ "onchainkit/guides/theme-customization",
+ "onchainkit/guides/use-basenames"
+ ]
+ },
+ {
+ "group": "Components",
+ "pages": [
+ "onchainkit/components/bridge",
+ "onchainkit/components/buy",
+ "onchainkit/components/checkout",
+ "onchainkit/components/earn",
+ "onchainkit/components/fund",
+ "onchainkit/components/identity",
+ "onchainkit/components/mint",
+ "onchainkit/components/swap",
+ "onchainkit/components/token",
+ "onchainkit/components/transaction",
+ "onchainkit/components/wallet"
+ ]
+ },
+ {
+ "group": "API",
+ "openapi": {
+ "source": "docs/openapi/onchainkit.yaml",
+ "directory": "api-reference"
+ }
+ },
+ {
+ "group": "Utilities",
+ "pages": ["onchainkit/utilities/is-base"]
+ },
+ {
+ "group": "Contribute",
+ "pages": ["onchainkit/contribute/report-a-bug"]
+ }
+ ],
+ "global": {
+ "anchors": [
+ {
+ "anchor": "GitHub",
+ "href": "https://github.com/coinbase/onchainkit",
+ "icon": "github"
+ },
+ {
+ "anchor": "Playground",
+ "href": "https://onchainkit.xyz/playground",
+ "icon": "gamepad"
+ },
+ {
+ "anchor": "Support",
+ "href": "https://discord.com/invite/cdp",
+ "icon": "discord"
+ }
+ ]
+ }
+ },
+ {
+ "tab": "Cookbook",
+ "groups": [
+ {
+ "group": "Use Cases",
+ "pages": [
+ "cookbook/onboard-any-user",
+ "cookbook/accept-crypto-payments",
+ "cookbook/launch-ai-agents",
+ "cookbook/launch-tokens",
+ "cookbook/deploy-a-chain",
+ "cookbook/decentralize-your-social-app",
+ "cookbook/defi-your-app",
+ "cookbook/go-gasless"
+ ]
+ },
+ {
+ "group": "Build with AI",
+ "pages": ["cookbook/ai-prompting", "cookbook/base-builder-mcp"]
+ }
+ ]
+ },
+ {
+ "tab": "Showcase",
+ "pages": ["showcase"]
+ },
+ {
+ "tab": "Learn",
+ "groups": [
+ {
+ "group": "Building Onchain",
+ "pages": [
+ "learn/welcome",
+ {
+ "group": "Onchain Concepts",
+ "pages": [
+ "learn/onchain-concepts/the-onchain-tech-stack",
+ "learn/onchain-concepts/unique-aspects-of-building-onchain",
+ "learn/onchain-concepts/onchain-development-flow",
+ "learn/onchain-concepts/offchain-to-onchain"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Ethereum 101",
+ "pages": [
+ "learn/introduction-to-ethereum",
+ "learn/ethereum-dev-overview",
+ "learn/ethereum-applications",
+ "learn/gas-use-in-eth-transactions",
+ "learn/evm-diagram",
+ "learn/guide-to-base"
+ ]
+ },
+ {
+ "group": "Onchain App Development",
+ "pages": [
+ "learn/deploy-with-fleek",
+ "learn/account-abstraction",
+ "learn/cross-chain-development",
+ "learn/client-side-development"
+ ]
+ },
+ {
+ "group": "Smart Contract Development",
+ "pages": [
+ "learn/solidity/introduction",
+ "learn/solidity/anatomy",
+ {
+ "group": "Introduction to Solidity",
+ "pages": [
+ "learn/solidity/video-tutorial",
+ "learn/solidity/overview",
+ "learn/solidity/introduction-to-remix",
+ "learn/solidity/remix-guide",
+ "learn/solidity/deployment-in-remix",
+ "learn/solidity/step-by-step"
+ ]
+ },
+ {
+ "group": "Contracts and Basic Functions",
+ "pages": [
+ "learn/solidity/introduction-to-contracts",
+ "learn/solidity/hello-world",
+ "learn/solidity/basic-types",
+ "learn/solidity/exercise-basics"
+ ]
+ },
+ {
+ "group": "Deploying to a Testnet",
+ "pages": [
+ "learn/solidity/test-networks-overview",
+ "learn/solidity/test-networks",
+ "learn/solidity/deploy-to-sepolia",
+ "learn/solidity/contract-verification",
+ "learn/solidity/exercise-deployment"
+ ]
+ },
+ {
+ "group": "Control Structures",
+ "pages": [
+ "learn/solidity/standard-control-structures",
+ "learn/solidity/loops",
+ "learn/solidity/require-revert-error",
+ "learn/solidity/control-overview",
+ "learn/solidity/exercise-control"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Development with Foundry",
+ "pages": [
+ "learn/foundry/introduction-to-foundry",
+ "learn/foundry/testing"
+ ]
+ },
+ {
+ "group": "Development with Hardhat",
+ "pages": [
+ {
+ "group": "Hardhat Setup and Overview",
+ "pages": [
+ "learn/hardhat/overview",
+ "learn/hardhat/creating-project",
+ "learn/hardhat/setup"
+ ]
+ },
+ {
+ "group": "Testing with Typescript",
+ "pages": [
+ "learn/hardhat/testing",
+ "learn/hardhat/writing-tests",
+ "learn/hardhat/contract-abi-testing",
+ "learn/hardhat/testing-guide"
+ ]
+ },
+ {
+ "group": "Etherscan",
+ "pages": [
+ "learn/hardhat/etherscan-guide",
+ "learn/hardhat/etherscan-video"
+ ]
+ },
+ {
+ "group": "Deploying Smart Contracts",
+ "pages": [
+ "learn/hardhat/installing-deploy",
+ "learn/hardhat/setup-deploy-script",
+ "learn/hardhat/testing-deployment",
+ "learn/hardhat/network-configuration",
+ "learn/hardhat/deployment",
+ "learn/hardhat/deployment-guide"
+ ]
+ },
+ {
+ "group": "Verifying Smart Contracts",
+ "pages": [
+ "learn/hardhat/verify-video",
+ "learn/hardhat/verify-guide"
+ ]
+ },
+ {
+ "group": "Mainnet Forking",
+ "pages": [
+ "learn/hardhat/fork-video",
+ "learn/hardhat/fork-guide"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Token Development",
+ "pages": []
+ },
+ {
+ "group": "Exercise Contracts",
+ "pages": ["learn/exercise-contracts"]
+ }
+ ]
+ }
+ ]
+ },
+ "logo": {
+ "light": "/logo/light.svg",
+ "dark": "/logo/dark.svg"
+ },
+ "navbar": {
+ "links": [
+ {
+ "label": "Blog",
+ "href": "https://blog.base.dev/"
+ },
+ {
+ "label": "GitHub",
+ "href": "https://github.com/base"
+ },
+ {
+ "label": "Support",
+ "href": "https://discord.com/invite/base"
+ }
+ ],
+ "primary": {
+ "type": "button",
+ "label": "Base.org",
+ "href": "https://base.org"
+ }
+ },
+ "footer": {
+ "socials": {
+ "x": "https://x.com/mintlify",
+ "github": "https://github.com/mintlify",
+ "linkedin": "https://linkedin.com/company/mintlify"
+ }
+ }
+}
diff --git a/docs/base-chain/flashblocks/apps.mdx b/docs/base-chain/flashblocks/apps.mdx
new file mode 100644
index 00000000..ac866eb2
--- /dev/null
+++ b/docs/base-chain/flashblocks/apps.mdx
@@ -0,0 +1,195 @@
+---
+title: Flashblocks
+sidebarTitle: Apps
+description: Experience lightning-fast transaction confirmations on Base by using Flashblocks. Preconfirmations happen in just 200 milliseconds—designed for real-time apps, games, and seamless UX.
+---
+
+## Overview
+
+Flashblocks enable up to 200 millisecond transaction confirmations on Base by leveraging preconfirmations, ultra-fast signals that arrive before the next block is sealed. Built for developers who demand instant UX, it's ideal for high-frequency apps, games, and real-time interactions where waiting even a few seconds is too long. By integrating directly within Base's infrastructure, Flashblocks enables, seamless, ultrafast and snappy user experiences without compromising security.
+
+## Integrating Flashblocks
+
+Flashblocks is enabled for developers on Base Sepolia with full support for mainnet coming very soon. There are two ways you can integrate with Flashblocks data. You can either use the WebSocket API to stream real-time block updates, or use the RPC API to query the Flashblocks-aware RPC endpoint.
+
+### WebSocket API
+
+Use our API to stream realtime block updates over a WebSocket.
+
+You can connect to the websocket endpoint with any WebSocket library of CLI tool. The endpoint is available at wss://sepolia.flashblocks.base.org/ws.
+
+Two recommended tools for connecting to the WebSocket endpoint are [Websocat](https://github.com/vi/websocat) and the [Javascript Websocket Client](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applicationsjk).
+
+#### Websocat Example
+
+Firstly install websocat, [following these instructions](https://github.com/vi/websocat?tab=readme-ov-file#installation).
+
+From your terminal, you can then connect to the websocket stream by running:
+```
+websocat wss://sepolia.flashblocks.base.org/ws
+```
+
+In your terminal, you'll see a stream of all the Flashblocks being sent over the websocket connection.
+
+#### Interpreting the data
+
+To minimize the amount of data sent to clients, each Flashblock only includes the diff data from the previous block. The initial Flashblock (when index is zero) includes the block properties (e.g. number, gas limit) and the subsequent Flashblocks only include the diff data (e.g. transactions that are present in that Flashblock).
+
+**Example Initial Response**
+```
+{
+ "payload_id": "0x03997352d799c31a",
+ "index": 0,
+ "base": {
+ "parent_hash": "0x9edc29b8b0a1e31d28616e40c16132ad0d58faa8bb952595b557526bdb9a960a",
+ "fee_recipient": "0x4200000000000000000000000000000000000011",
+ "block_number": "0x158a0e9",
+ "gas_limit": "0x3938700",
+ "timestamp": "0x67bf8332",
+ "base_fee_per_gas": "0xfa"
+ // ... other base fields ...
+ },
+ "diff": {
+ "state_root": "0x208fd63edc0681161105f27d03daf9f8c726d8c94e584a3c0696c98291c24333",
+ "block_hash": "0x5c330e55a190f82ea486b61e5b12e27dfb4fb3cecfc5746886ef38ca1281bce8",
+ "gas_used": "0xab3f",
+ "transactions": [
+ "0x7ef8f8a0b4afc0b7ce10e150801bbaf08ac33fecb0f38311793abccb022120d321c6d276..."
+ ],
+ "withdrawals": []
+ // ... other diff fields ...
+ },
+ "metadata": {
+ "block_number": 22585577,
+ "new_account_balances": {
+ "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": "0x0",
+ // ... other balances ...
+ },
+ "receipts": {
+ "0x07d7f06b06fea714c1d1d446efa2790c6970aa74ee006186a32b5b7dd8ca2d82": {
+ "Deposit": {
+ "status": "0x1",
+ "depositNonce": "0x158a0ea"
+ // ... other receipt fields ...
+ }
+ }
+ }
+ }
+}
+```
+
+**Example Diff Response**
+```
+{
+ "payload_id": "0x03e303378749418d",
+ "index": 4,
+ "diff": {
+ "state_root": "0x7a8f45038665072f382730e689f4a1561835c9987fca8942fa95872fb9367eaa",
+ "block_hash": "0x9b32f7a14cbd1efc8c2c5cad5eb718ec9e0c5da92c3ba7080f8d4c49d660c332",
+ "gas_used": "0x1234f",
+ "transactions": [
+ "0x7ef8f8a0b4afc0b7ce10e150801bbaf08ac33fecb0f38311793abccb022120d321c6d276..."
+ ],
+ "withdrawals": []
+ // ... other diff fields ...
+ },
+ "metadata": {
+ "block_number": 22585577,
+ "new_account_balances": {
+ "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": "0x0",
+ "0x4200000000000000000000000000000000000015": "0x1234"
+ // ... other balances ...
+ },
+ "receipts": {
+ "0x07d7f06b06fea714c1d1d446efa2790c6970aa74ee006186a32b5b7dd8ca2d82": {
+ "status": "0x1",
+ "gasUsed": "0x1234f",
+ "logs": []
+ // ... other receipt fields ...
+ }
+ }
+ }
+}
+```
+
+### RPC API
+
+You can also utilize our Flashblock aware RPC endpoint at `https://sepolia-preconf.base.org`.
+
+In addition to these flashblock-specific methods, all standard Ethereum JSON-RPC methods are supported as usual.
+
+#### eth_getBlockByNumber
+
+Use the `pending` tag to retrieve the latest Flashblock:
+```
+curl https://sepolia-preconf.base.org -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["pending",true],"id":1}'
+```
+
+**Example Response**
+```
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": {
+ "number": "0x1234",
+ "hash": "0x...",
+ "transactions": [...]
+ }
+}
+```
+
+#### eth_getTransactionReceipt
+
+Use the existing receipt RPC to get preconfirmed receipts:
+```
+curl https://sepolia-preconf.base.org -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x..."],"id":1}'
+```
+
+**Example Response**
+```
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": {
+ "transactionHash": "0x...",
+ "blockNumber": "0x1234",
+ "status": "0x1"
+ }
+}
+```
+
+#### eth_getBalance
+
+Use the `pending` tag to get the address balance in the latest Flashblock:
+```
+curl https://sepolia-preconf.base.org -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x...","pending"],"id":1}'
+```
+
+**Example Response**
+```
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": "0x0234"
+}
+```
+
+#### eth_getTransactionCount
+
+Use the `pending` tag to get the address nonce in the latest Flashblock:
+```
+curl https://sepolia-preconf.base.org -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x...","pending"],"id":1}'
+```
+
+**Example Response**
+```
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": "0x1b" // 27 transactions
+}
+```
+
+## Support
+
+For feedback, support or questions about Flashblocks, please don't hesitate to contact us in the `#developer-chat` channel in the [Base Discord](https://base.org/discord).
diff --git a/docs/base-chain/flashblocks/node-providers.mdx b/docs/base-chain/flashblocks/node-providers.mdx
new file mode 100644
index 00000000..699e5c46
--- /dev/null
+++ b/docs/base-chain/flashblocks/node-providers.mdx
@@ -0,0 +1,48 @@
+---
+title: How to host Flashblocks-aware RPC nodes
+sidebarTitle: Node Providers
+---
+
+## Quick Start
+
+1. **Prerequisites**:
+ - Docker and Docker Compose
+ - Minimum hardware requirements (see [node README](https://github.com/base/node?tab=readme-ov-file#hardware-requirements))
+ - Access to a Flashblocks websocket endpoint, we provide public endpoints in the env files in the repo
+
+2. **Set Up Environment**:
+
+ ```sh
+ # Clone the repository
+ git clone https://github.com/base/node.git
+ cd node
+ ```
+
+3. **Start the Node with Flashblocks Support**:
+
+ ```sh
+ NODE_TYPE=base CLIENT=reth docker-compose up
+ ```
+
+## Configuration Options
+
+- Node Type: Use `NODE_TYPE=base` to enable base reth node withFlashblocks functionality
+- Network: Use `NETWORK_ENV=.env.mainnet` for mainnet or `NETWORK_ENV=.env.sepolia` for testnet
+
+## Verifying Flashblocks Functionality
+
+Test that your node is properly supporting Flashblocks by querying a pending block:
+
+```sh
+curl -X POST \
+ --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["pending", false],"id":1}' \
+ http://localhost:8545
+```
+
+## Available RPC Methods
+
+Flashblocks-aware nodes provide all standard Ethereum JSON-RPC methods plus specialized Flashblocks endpoints. For more details, see the [Flashblocks RPC API documentation](/base-chain/flashblocks/apps#rpc-api).
+
+## Further Resources
+
+For detailed information about node setup, including hardware requirements and additional configuration options, refer to the [Reth node README](https://github.com/base/node/tree/main/reth#readme).
\ No newline at end of file
diff --git a/docs/base-chain/network-information/base-contracts.mdx b/docs/base-chain/network-information/base-contracts.mdx
new file mode 100644
index 00000000..a8938937
--- /dev/null
+++ b/docs/base-chain/network-information/base-contracts.mdx
@@ -0,0 +1,131 @@
+---
+sidebarTitle: Base Contracts
+title: Contract Addresses
+description: A comprehensive list of L2 contract addresses for Base Mainnet and Base Testnet, including links to their respective blockchain explorers.
+---
+
+## L2 Contract Addresses
+
+### Base Mainnet
+
+| Name | Address |
+| :---------------------------- | :-------------------------------------------------------------------------------------------------------------------- |
+| WETH9 | [0x4200000000000000000000000000000000000006](https://basescan.org/address/0x4200000000000000000000000000000000000006) |
+| L2CrossDomainMessenger | [0x4200000000000000000000000000000000000007](https://basescan.org/address/0x4200000000000000000000000000000000000007) |
+| L2StandardBridge | [0x4200000000000000000000000000000000000010](https://basescan.org/address/0x4200000000000000000000000000000000000010) |
+| SequencerFeeVault | [0x4200000000000000000000000000000000000011](https://basescan.org/address/0x4200000000000000000000000000000000000011) |
+| OptimismMintableERC20Factory | [0xF10122D428B4bc8A9d050D06a2037259b4c4B83B](https://basescan.org/address/0xF10122D428B4bc8A9d050D06a2037259b4c4B83B) |
+| GasPriceOracle | [0x420000000000000000000000000000000000000F](https://basescan.org/address/0x420000000000000000000000000000000000000F) |
+| L1Block | [0x4200000000000000000000000000000000000015](https://basescan.org/address/0x4200000000000000000000000000000000000015) |
+| L2ToL1MessagePasser | [0x4200000000000000000000000000000000000016](https://basescan.org/address/0x4200000000000000000000000000000000000016) |
+| L2ERC721Bridge | [0x4200000000000000000000000000000000000014](https://basescan.org/address/0x4200000000000000000000000000000000000014) |
+| OptimismMintableERC721Factory | [0x4200000000000000000000000000000000000017](https://basescan.org/address/0x4200000000000000000000000000000000000017) |
+| ProxyAdmin | [0x4200000000000000000000000000000000000018](https://basescan.org/address/0x4200000000000000000000000000000000000018) |
+| BaseFeeVault | [0x4200000000000000000000000000000000000019](https://basescan.org/address/0x4200000000000000000000000000000000000019) |
+| L1FeeVault | [0x420000000000000000000000000000000000001a](https://basescan.org/address/0x420000000000000000000000000000000000001a) |
+| EAS | [0x4200000000000000000000000000000000000021](https://basescan.org/address/0x4200000000000000000000000000000000000021) |
+| EASSchemaRegistry | [0x4200000000000000000000000000000000000020](https://basescan.org/address/0x4200000000000000000000000000000000000020) |
+| LegacyERC20ETH | [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://basescan.org/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000) |
+
+### Base Testnet (Sepolia)
+
+| Name | Address |
+| :---------------------------- | :---------------------------------------------------------------------------------------------------------------------------- |
+| WETH9 | [0x4200000000000000000000000000000000000006](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000006) |
+| L2CrossDomainMessenger | [0x4200000000000000000000000000000000000007](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000007) |
+| L2StandardBridge | [0x4200000000000000000000000000000000000010](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000010) |
+| SequencerFeeVault | [0x4200000000000000000000000000000000000011](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000011) |
+| OptimismMintableERC20Factory | [0x4200000000000000000000000000000000000012](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000012) |
+| GasPriceOracle | [0x420000000000000000000000000000000000000F](https://sepolia.basescan.org/address/0x420000000000000000000000000000000000000F) |
+| L1Block | [0x4200000000000000000000000000000000000015](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000015) |
+| L2ToL1MessagePasser | [0x4200000000000000000000000000000000000016](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000016) |
+| L2ERC721Bridge | [0x4200000000000000000000000000000000000014](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000014) |
+| OptimismMintableERC721Factory | [0x4200000000000000000000000000000000000017](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000017) |
+| ProxyAdmin | [0x4200000000000000000000000000000000000018](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000018) |
+| BaseFeeVault | [0x4200000000000000000000000000000000000019](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000019) |
+| L1FeeVault | [0x420000000000000000000000000000000000001a](https://sepolia.basescan.org/address/0x420000000000000000000000000000000000001a) |
+| EAS | [0x4200000000000000000000000000000000000021](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000021) |
+| EASSchemaRegistry | [0x4200000000000000000000000000000000000020](https://sepolia.basescan.org/address/0x4200000000000000000000000000000000000020) |
+| LegacyERC20ETH | [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://sepolia.basescan.org/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000) |
+
+\*_L2 contract addresses are the same on both mainnet and testnet._
+
+## L1 Contract Addresses
+
+### Ethereum Mainnet
+
+| Name | Address |
+| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- |
+| AddressManager | [0x8EfB6B5c4767B09Dc9AA6Af4eAA89F749522BaE2](https://etherscan.io/address/0x8EfB6B5c4767B09Dc9AA6Af4eAA89F749522BaE2) |
+| AnchorStateRegistryProxy | [0x496286e5eE7758de84Dd17e6d2d97afC2ACE4cc7](https://etherscan.io/address/0x496286e5eE7758de84Dd17e6d2d97afC2ACE4cc7) |
+| DelayedWETHProxy (FDG) | [0xa2f2aC6F5aF72e494A227d79Db20473Cf7A1FFE8](https://etherscan.io/address/0xa2f2aC6F5aF72e494A227d79Db20473Cf7A1FFE8) |
+| DelayedWETHProxy (PDG) | [0x3E8a0B63f57e975c268d610ece93da5f78c01321](https://etherscan.io/address/0x3E8a0B63f57e975c268d610ece93da5f78c01321) |
+| DisputeGameFactoryProxy | [0x43edB88C4B80fDD2AdFF2412A7BebF9dF42cB40e](https://etherscan.io/address/0x43edB88C4B80fDD2AdFF2412A7BebF9dF42cB40e) |
+| FaultDisputeGame | [0xE17d670043c3cDd705a3223B3D89A228A1f07F0f](https://etherscan.io/address/0xE17d670043c3cDd705a3223B3D89A228A1f07F0f) |
+| L1CrossDomainMessenger | [0x866E82a600A1414e583f7F13623F1aC5d58b0Afa](https://etherscan.io/address/0x866E82a600A1414e583f7F13623F1aC5d58b0Afa) |
+| L1ERC721Bridge | [0x608d94945A64503E642E6370Ec598e519a2C1E53](https://etherscan.io/address/0x608d94945A64503E642E6370Ec598e519a2C1E53) |
+| L1StandardBridge | [0x3154Cf16ccdb4C6d922629664174b904d80F2C35](https://etherscan.io/address/0x3154Cf16ccdb4C6d922629664174b904d80F2C35) |
+| MIPS | [0xF027F4A985560fb13324e943edf55ad6F1d15Dc1](https://etherscan.io/address/0xF027F4A985560fb13324e943edf55ad6F1d15Dc1) |
+| OptimismMintableERC20Factory | [0x05cc379EBD9B30BbA19C6fA282AB29218EC61D84](https://etherscan.io/address/0x05cc379EBD9B30BbA19C6fA282AB29218EC61D84) |
+| OptimismPortal | [0x49048044D57e1C92A77f79988d21Fa8fAF74E97e](https://etherscan.io/address/0x49048044D57e1C92A77f79988d21Fa8fAF74E97e) |
+| PermissionedDisputeGame | [0xE749aA49c3eDAF1DCb997eA3DAC23dff72bcb826](https://etherscan.io/address/0xE749aA49c3eDAF1DCb997eA3DAC23dff72bcb826) |
+| PreimageOracle | [0x1fb8cdFc6831fc866Ed9C51aF8817Da5c287aDD3](https://etherscan.io/address/0x1fb8cdFc6831fc866Ed9C51aF8817Da5c287aDD3) |
+| ProxyAdmin | [0x0475cBCAebd9CE8AfA5025828d5b98DFb67E059E](https://etherscan.io/address/0x0475cBCAebd9CE8AfA5025828d5b98DFb67E059E) |
+| SystemConfig | [0x73a79Fab69143498Ed3712e519A88a918e1f4072](https://etherscan.io/address/0x73a79Fab69143498Ed3712e519A88a918e1f4072) |
+| SystemDictator | [0x1fE3fdd1F0193Dd657C0a9AAC37314D6B479E557](https://etherscan.io/address/0x1fE3fdd1F0193Dd657C0a9AAC37314D6B479E557) |
+
+**Unneeded contract addresses**
+
+Certain contracts are mandatory according to the [OP Stack SDK](https://stack.optimism.io/docs/build/sdk/#unneeded-contract-addresses), despite not being utilized. For such contracts, you can simply assign the zero address:
+
+- `StateCommitmentChain`
+- `CanonicalTransactionChain`
+- `BondManager`
+
+### Ethereum Testnet (Sepolia)
+
+| Name | Address |
+| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------- |
+| AddressManager | [0x709c2B8ef4A9feFc629A8a2C1AF424Dc5BD6ad1B](https://sepolia.etherscan.io/address/0x709c2B8ef4A9feFc629A8a2C1AF424Dc5BD6ad1B) |
+| AnchorStateRegistryProxy | [0x0729957c92A1F50590A84cb2D65D761093f3f8eB](https://sepolia.etherscan.io/address/0x0729957c92A1F50590A84cb2D65D761093f3f8eB) |
+| DelayedWETHProxy (FDG) | [0x489c2E5ebe0037bDb2DC039C5770757b8E54eA1F](https://sepolia.etherscan.io/address/0x489c2E5ebe0037bDb2DC039C5770757b8E54eA1F) |
+| DelayedWETHProxy (PDG) | [0x27A6128F707de3d99F89Bf09c35a4e0753E1B808](https://sepolia.etherscan.io/address/0x27A6128F707de3d99F89Bf09c35a4e0753E1B808) |
+| DisputeGameFactoryProxy | [0xd6E6dBf4F7EA0ac412fD8b65ED297e64BB7a06E1](https://sepolia.etherscan.io/address/0xd6E6dBf4F7EA0ac412fD8b65ED297e64BB7a06E1) |
+| FaultDisputeGame | [0xcfce7dd673fbbbffd16ab936b7245a2f2db31c9a](https://sepolia.etherscan.io/address/0xcfce7dd673fbbbffd16ab936b7245a2f2db31c9a) |
+| L1CrossDomainMessenger | [0xC34855F4De64F1840e5686e64278da901e261f20](https://sepolia.etherscan.io/address/0xC34855F4De64F1840e5686e64278da901e261f20) |
+| L1ERC721Bridge | [0x21eFD066e581FA55Ef105170Cc04d74386a09190](https://sepolia.etherscan.io/address/0x21eFD066e581FA55Ef105170Cc04d74386a09190) |
+| L1StandardBridge | [0xfd0Bf71F60660E2f608ed56e1659C450eB113120](https://sepolia.etherscan.io/address/0xfd0Bf71F60660E2f608ed56e1659C450eB113120) |
+| L2OutputOracle | [0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254](https://sepolia.etherscan.io/address/0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254) |
+| MIPS | [0xF027F4A985560fb13324e943edf55ad6F1d15Dc1](https://sepolia.etherscan.io/address/0xF027F4A985560fb13324e943edf55ad6F1d15Dc1) |
+| OptimismMintableERC20Factory | [0xb1efB9650aD6d0CC1ed3Ac4a0B7f1D5732696D37](https://sepolia.etherscan.io/address/0xb1efB9650aD6d0CC1ed3Ac4a0B7f1D5732696D37) |
+| OptimismPortal | [0x49f53e41452C74589E85cA1677426Ba426459e85](https://sepolia.etherscan.io/address/0x49f53e41452C74589E85cA1677426Ba426459e85) |
+| PermissionedDisputeGame | [0xf0102ffe22649a5421d53acc96e309660960cf44](https://sepolia.etherscan.io/address/0xf0102ffe22649a5421d53acc96e309660960cf44) |
+| PreimageOracle | [0x1fb8cdFc6831fc866Ed9C51aF8817Da5c287aDD3](https://sepolia.etherscan.io/address/0x1fb8cdFc6831fc866Ed9C51aF8817Da5c287aDD3) |
+| ProxyAdmin | [0x0389E59Aa0a41E4A413Ae70f0008e76CAA34b1F3](https://sepolia.etherscan.io/address/0x0389E59Aa0a41E4A413Ae70f0008e76CAA34b1F3) |
+| SystemConfig | [0xf272670eb55e895584501d564AfEB048bEd26194](https://sepolia.etherscan.io/address/0xf272670eb55e895584501d564AfEB048bEd26194) |
+
+## Base Admin Addresses
+
+### Base Mainnet
+
+| Admin Role | Address | Type of Key |
+| :------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------- |
+| Batch Sender | [0x5050f69a9786f081509234f1a7f4684b5e5b76c9](https://etherscan.io/address/0x5050f69a9786f081509234f1a7f4684b5e5b76c9) | EOA managed by Coinbase Technologies |
+| Batch Inbox | [0xff00000000000000000000000000000000008453](https://etherscan.io/address/0xff00000000000000000000000000000000008453) | EOA (with no known private key) |
+| Output Proposer | [0x642229f238fb9de03374be34b0ed8d9de80752c5](https://etherscan.io/address/0x642229f238fb9de03374be34b0ed8d9de80752c5) | EOA managed by Coinbase Technologies |
+| Proxy Admin Owner (L1) | [0x7bB41C3008B3f03FE483B28b8DB90e19Cf07595c](https://etherscan.io/address/0x7bB41C3008B3f03FE483B28b8DB90e19Cf07595c) | Gnosis Safe |
+| Challenger | [0x8Ca1E12404d16373Aef756179B185F27b2994F3a](https://etherscan.io/address/0x8Ca1E12404d16373Aef756179B185F27b2994F3a) | EOA managed by Coinbase Technologies |
+| System config owner | [0x14536667Cd30e52C0b458BaACcB9faDA7046E056](https://etherscan.io/address/0x14536667Cd30e52C0b458BaACcB9faDA7046E056) | Gnosis Safe |
+| Guardian | [0x09f7150D8c019BeF34450d6920f6B3608ceFdAf2](https://etherscan.io/address/0x09f7150D8c019BeF34450d6920f6B3608ceFdAf2) | Gnosis Safe |
+
+### Base Testnet (Sepolia)
+
+| Admin Role | Address | Type of Key |
+| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------- |
+| Batch Sender | [0x6CDEbe940BC0F26850285cacA097C11c33103E47](https://sepolia.etherscan.io/address/0x6CDEbe940BC0F26850285cacA097C11c33103E47) | EOA managed by Coinbase Technologies |
+| Batch Inbox | [0xff00000000000000000000000000000000084532](https://sepolia.etherscan.io/address/0xff00000000000000000000000000000000084532) | EOA (with no known private key) |
+| Output Proposer | [0x037637067c1DbE6d2430616d8f54Cb774Daa5999](https://sepolia.etherscan.io/address/0x037637067c1DbE6d2430616d8f54Cb774Daa5999) | EOA managed by Coinbase Technologies |
+| Proxy Admin Owner (L1) | [0x0fe884546476dDd290eC46318785046ef68a0BA9](https://sepolia.etherscan.io/address/0x0fe884546476dDd290eC46318785046ef68a0BA9) | Gnosis Safe |
+| Challenger | [0x8b8c52B04A38f10515C52670fcb23f3C4C44474F](https://sepolia.etherscan.io/address/0x8b8c52B04A38f10515C52670fcb23f3C4C44474F) | EOA managed by Coinbase Technologies |
+| System config owner | [0x0fe884546476dDd290eC46318785046ef68a0BA9](https://sepolia.etherscan.io/address/0x0fe884546476dDd290eC46318785046ef68a0BA9) | Gnosis Safe |
+| Guardian | [0xA9FF930151130fd19DA1F03E5077AFB7C78F8503](https://sepolia.etherscan.io/address/0xA9FF930151130fd19DA1F03E5077AFB7C78F8503) | EOA managed by Coinbase Technologies |
diff --git a/docs/base-chain/network-information/diffs-ethereum-base.mdx b/docs/base-chain/network-information/diffs-ethereum-base.mdx
new file mode 100644
index 00000000..7dd308d1
--- /dev/null
+++ b/docs/base-chain/network-information/diffs-ethereum-base.mdx
@@ -0,0 +1,16 @@
+---
+title: "Differences between Ethereum and Base"
+sidebarTitle: 'Differences: Ethereum & Base'
+---
+
+Base is built on the [Bedrock](https://stack.optimism.io/docs/releases/bedrock/explainer/) release of the [OP Stack](https://stack.optimism.io/), which is designed from the ground up to be as close to Ethereum as possible. Because of this, there are very few differences when it comes to building on Base and Ethereum.
+
+However, there are still some minor discrepancies between the behavior of Base and Ethereum that you should be aware of when building apps on top of Base.
+
+These minor differences include:
+
+- [Opcodes](https://stack.optimism.io/docs/releases/bedrock/differences/#opcode-differences)
+- [Blocks](https://stack.optimism.io/docs/releases/bedrock/differences/#blocks)
+- [Network specifications](https://stack.optimism.io/docs/releases/bedrock/differences/#network-specifications)
+- [Transaction costs](https://stack.optimism.io/docs/releases/bedrock/differences/#transaction-costs)
+
diff --git a/docs/base-chain/network-information/ecosystem-contracts.mdx b/docs/base-chain/network-information/ecosystem-contracts.mdx
new file mode 100644
index 00000000..752e42b0
--- /dev/null
+++ b/docs/base-chain/network-information/ecosystem-contracts.mdx
@@ -0,0 +1,81 @@
+---
+title: 'Ecosystem Contracts'
+---
+
+This page lists contract addresses for onchain apps that we have deployed.
+
+## Base Mainnet
+
+### Multicall3
+
+| Contract | Address |
+| :--------- | :-------------------------------------------------------------------------------------------------------------------- |
+| Multicall3 | [0xcA11bde05977b3631167028862bE2a173976CA11](https://basescan.org/address/0xcA11bde05977b3631167028862bE2a173976CA11) |
+
+### Uniswap v3
+
+| Contract | Address |
+| :----------------------------------- | :-------------------------------------------------------------------------------------------------------------------- |
+| `Permit2` | [0x000000000022D473030F116dDEE9F6B43aC78BA3](https://basescan.org/address/0x000000000022D473030F116dDEE9F6B43aC78BA3) |
+| `universal router` | [0x198EF79F1F515F02dFE9e3115eD9fC07183f02fC](https://basescan.org/address/0x198EF79F1F515F02dFE9e3115eD9fC07183f02fC) |
+| `v3CoreFactory` | [0x33128a8fC17869897dcE68Ed026d694621f6FDfD](https://basescan.org/address/0x33128a8fC17869897dcE68Ed026d694621f6FDfD) |
+| `multicall` | [0x091e99cb1C49331a94dD62755D168E941AbD0693](https://basescan.org/address/0x091e99cb1C49331a94dD62755D168E941AbD0693) |
+| `proxyAdmin` | [0x3334d83e224aF5ef9C2E7DDA7c7C98Efd9621fA9](https://basescan.org/address/0x3334d83e224aF5ef9C2E7DDA7c7C98Efd9621fA9) |
+| `tickLens` | [0x0CdeE061c75D43c82520eD998C23ac2991c9ac6d](https://basescan.org/address/0x0CdeE061c75D43c82520eD998C23ac2991c9ac6d) |
+| `nftDescriptor` | [0xF9d1077fd35670d4ACbD27af82652a8d84577d9F](https://basescan.org/address/0xF9d1077fd35670d4ACbD27af82652a8d84577d9F) |
+| `nonfungibleTokenPositionDescriptor` | [0x4f225937EDc33EFD6109c4ceF7b560B2D6401009](https://basescan.org/address/0x4f225937EDc33EFD6109c4ceF7b560B2D6401009) |
+| `descriptorProxy` | [0x4615C383F85D0a2BbED973d83ccecf5CB7121463](https://basescan.org/address/0x4615C383F85D0a2BbED973d83ccecf5CB7121463) |
+| `nonfungibleTokenPositionManager` | [0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1](https://basescan.org/address/0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1) |
+| `v3Migrator` | [0x23cF10b1ee3AdfCA73B0eF17C07F7577e7ACd2d7](https://basescan.org/address/0x23cF10b1ee3AdfCA73B0eF17C07F7577e7ACd2d7) |
+| `v3Staker` | [0x42bE4D6527829FeFA1493e1fb9F3676d2425C3C1](https://basescan.org/address/0x42bE4D6527829FeFA1493e1fb9F3676d2425C3C1) |
+| `quoterV2` | [0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a](https://basescan.org/address/0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a) |
+| `swapRouter` | [0x2626664c2603336E57B271c5C0b26F421741e481](https://basescan.org/address/0x2626664c2603336E57B271c5C0b26F421741e481) |
+
+### Uniswap v2
+
+| Contract | Address |
+| :-------- | :-------------------------------------------------------------------------------------------------------------------- |
+| `Factory` | [0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6](https://basescan.org/address/0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6) |
+| `Router` | [0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24](https://basescan.org/address/0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24) |
+
+## Base Testnet (Sepolia)
+
+### Multicall3
+
+| Contract | Address |
+| :--------- | :---------------------------------------------------------------------------------------------------------------------------- |
+| Multicall3 | [0xcA11bde05977b3631167028862bE2a173976CA11](https://sepolia.basescan.org/address/0xcA11bde05977b3631167028862bE2a173976CA11) |
+
+### Uniswap v3
+
+| Contract | Address |
+| :----------------------------------- | :---------------------------------------------------------------------------------------------------------------------------- |
+| `Permit2` | [0x000000000022d473030f116ddee9f6b43ac78ba3](https://sepolia.basescan.org/address/0x000000000022d473030f116ddee9f6b43ac78ba3) |
+| `universal router` | [0x050E797f3625EC8785265e1d9BDd4799b97528A1](https://sepolia.basescan.org/address/0x050E797f3625EC8785265e1d9BDd4799b97528A1) |
+| `v3CoreFactory` | [0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24](https://sepolia.basescan.org/address/0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24) |
+| `multicall` | [0xd867e273eAbD6c853fCd0Ca0bFB6a3aE6491d2C1](https://sepolia.basescan.org/address/0xd867e273eAbD6c853fCd0Ca0bFB6a3aE6491d2C1) |
+| `proxyAdmin` | [0xD7303474Baca835743B54D73799688990f24a79D](https://sepolia.basescan.org/address/0xD7303474Baca835743B54D73799688990f24a79D) |
+| `tickLens` | [0xedf6066a2b290C185783862C7F4776A2C8077AD1](https://sepolia.basescan.org/address/0xedf6066a2b290C185783862C7F4776A2C8077AD1) |
+| `nftDescriptor` | [0x4e0caFF1Df1cCd7CF782FDdeD77f020699B57f1a](https://sepolia.basescan.org/address/0x4e0caFF1Df1cCd7CF782FDdeD77f020699B57f1a) |
+| `nonfungibleTokenPositionDescriptor` | [0xd7c6e867591608D32Fe476d0DbDc95d0cf584c8F](https://sepolia.basescan.org/address/0xd7c6e867591608D32Fe476d0DbDc95d0cf584c8F) |
+| `nonfungibleTokenPositionManager` | [0x27F971cb582BF9E50F397e4d29a5C7A34f11faA2](https://sepolia.basescan.org/address/0x27F971cb582BF9E50F397e4d29a5C7A34f11faA2) |
+| `v3Migrator` | [0xCbf8b7f80800bd4888Fbc7bf1713B80FE4E23E10](https://sepolia.basescan.org/address/0xCbf8b7f80800bd4888Fbc7bf1713B80FE4E23E10) |
+| `v3Staker` | [0x62725F55f50bdE240aCa3e740D47298CAc8d57D5](https://sepolia.basescan.org/address/0x62725F55f50bdE240aCa3e740D47298CAc8d57D5) |
+| `quoterV2` | [0xC5290058841028F1614F3A6F0F5816cAd0df5E27](https://sepolia.basescan.org/address/0xC5290058841028F1614F3A6F0F5816cAd0df5E27) |
+| `swapRouter` | [0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4](https://sepolia.basescan.org/address/0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4) |
+
+#### Testnet interfaces
+
+:::info
+
+Two community projects, [BaseX](https://basex-test.vercel.app/swap?currencyA=ETH¤cyB=0x036CbD53842c5426634e7929541eC2318f3dCF7e&focus=source) and [DapDap](https://testnet.base.dapdap.net/uniswap/swap), provide testnet interfaces for Uniswap contracts if you prefer to interact in the browser instead of with the contracts directly.
+
+:::
+
+### Uniswap v2
+
+| Contract | Address |
+| :-------- | :---------------------------------------------------------------------------------------------------------------------------- |
+| `Factory` | [0x7Ae58f10f7849cA6F5fB71b7f45CB416c9204b1e](https://sepolia.basescan.org/address/0x7Ae58f10f7849cA6F5fB71b7f45CB416c9204b1e) |
+| `Router` | [0x1689E7B1F10000AE47eBfE339a4f69dECd19F602](https://sepolia.basescan.org/address/0x1689E7B1F10000AE47eBfE339a4f69dECd19F602) |
+
diff --git a/docs/base-chain/network-information/network-fees.mdx b/docs/base-chain/network-information/network-fees.mdx
new file mode 100644
index 00000000..f735b60d
--- /dev/null
+++ b/docs/base-chain/network-information/network-fees.mdx
@@ -0,0 +1,28 @@
+---
+title: Network Fees
+description: Documentation about network fees on Base. This page covers details of the two-component cost system involving L2 execution fees and L1 security fees, and offers insights on fee variations and cost-saving strategies.
+---
+
+# Fees
+
+## How do network fees on Base work?
+
+Every Base transaction consists of two costs: an L2 (execution) fee and an L1
+(security) fee. The L2 fee is the cost to execute your transaction on the L2,
+and the L1 fee is the estimated cost to publish the transaction on the L1.
+Typically the L1 security fee is higher than the L2 execution fee.
+
+The L1 fee will vary depending on the amount of transactions on the L1. If the
+timing of your transaction is flexible, you can save costs by submitting
+transactions during periods of lower gas on the L1 (for example, over the
+weekend)
+
+Similarly, the L2 fee can increase and decrease depending on how many
+transactions are being submitted to the L2. This adjustment mechanism has the
+same implementation as the L1; you can read more about it
+[here](https://help.coinbase.com/en/coinbase/getting-started/crypto-education/eip-1559).
+
+For additional details about fee calculation on Base, please refer to the
+[op-stack developer
+documentation](https://docs.optimism.io/stack/transactions/fees).
+
diff --git a/docs/base-chain/node-operators/performance-tuning.mdx b/docs/base-chain/node-operators/performance-tuning.mdx
new file mode 100644
index 00000000..3bb251e4
--- /dev/null
+++ b/docs/base-chain/node-operators/performance-tuning.mdx
@@ -0,0 +1,103 @@
+---
+title: Node Performance
+sidebarTitle: Performance Tuning
+---
+
+This guide provides recommendations for hardware, client software, and configuration settings to optimize the performance of your Base node.
+
+## Hardware
+
+Running a performant Base node requires adequate hardware. We recommend the following minimum specifications:
+
+1. A modern multi-core CPU with good single-core performance.
+2. At least 32 GB RAM (64 GB recommended).
+3. A locally attached NVMe SSD drive. RAID 0 configurations can improve performance.
+4. Sufficient storage capacity calculated as:
+
+ ```
+ (2 \* [current chain size](https://base.org/stats) + [snapshot size](https://basechaindata.vercel.app) + 20% buffer)
+ ```
+
+ This accounts for chain data growth and snapshot restoration space.
+
+
+If utilizing Amazon Elastic Block Store (EBS), io2 Block Express volumes are recommended to ensure sufficient disk read speeds, preventing latency issues during initial sync. However, **locally attached NVMe SSDs are strongly recommended over networked storage for optimal performance.**
+
+
+### Production Hardware Examples
+
+The following are the hardware specifications used for Base production nodes:
+
+- **Geth Full Node:**
+ - Instance: AWS `i4i.12xlarge`
+ - Storage: RAID 0 of all local NVMe drives (`/dev/nvme*`)
+ - Filesystem: ext4
+
+- **Reth Archive Node:**
+ - Instance: AWS `i4ie.6xlarge`
+ - Storage: RAID 0 of all local NVMe drives (`/dev/nvme*`)
+ - Filesystem: ext4
+
+## Initial Sync
+
+Using a recent [snapshot](/base-chain/node-operators/snapshots.mdx) can significantly reduce the time required for the initial node synchronization process.
+
+## Client Software
+
+The [Base Node](https://github.com/base/node) repository contains the current stable configurations and instructions for running different client implementations.
+
+### Supported Clients
+
+Reth is currently the most performant client for running Base nodes. Future optimizations will primarily focus on Reth. You can read more about the migration to Reth [here](https://blog.base.dev/scaling-base-with-reth).
+
+| Type | Supported Clients |
+| ------- | -------------------------------------------------------------------------------------------------- |
+| Full | [Reth](https://github.com/base/node/tree/main/reth), [Geth](https://github.com/base/node/tree/main/geth) |
+| Archive | [Reth](https://github.com/base/node/tree/main/reth) |
+
+### Geth Performance Tuning
+
+#### Geth Cache Settings
+
+For Geth nodes, tuning cache allocation via environment variables can improve performance. These settings are used in the standard Docker configuration:
+
+```bash
+# .env.mainnet / .env.sepolia
+GETH_CACHE="20480" # Total P2P cache memory allowance (MB) (default: 1024)
+GETH_CACHE_DATABASE="20" # Percentage of cache memory allowance for database IO (default: 75)
+GETH_CACHE_GC="12" # Percentage of cache memory allowance for garbage collection (default: 25)
+GETH_CACHE_SNAPSHOT="24" # Percentage of cache memory allowance for snapshot caching (default: 10)
+GETH_CACHE_TRIE="44" # Percentage of cache memory allowance for trie caching (default: 25)
+```
+
+#### Geth LevelDB Tuning
+
+For teams running Geth with LevelDB, the following patch allows setting LevelDB initialization parameters via environment variables:
+
+[https://github.com/0x00101010/goleveldb/commit/55ef3429673fb70d389d052a15a4423e13d8b43c](https://github.com/0x00101010/goleveldb/commit/55ef3429673fb70d389d052a15a4423e13d8b43c)
+
+This patch can be applied using a `replace` directive in `go.mod` when building `op-geth`. Here’s how to modify your Dockerfile:
+
+```dockerfile
+RUN git clone $REPO --branch $VERSION --single-branch . && \
+ git switch -c branch-$VERSION $COMMIT && \
+ bash -c '[ "$(git rev-parse HEAD)" = "$COMMIT" ]'
+
+RUN echo '' >> go.mod && \
+ echo 'replace github.com/syndtr/goleveldb => github.com/0x00101010/goleveldb v1.0.4-param-customization' >> go.mod && \
+ go mod tidy
+
+# Continue building op-geth
+COPY op-geth/ ./
+RUN go run build/ci.go install -static ./cmd/geth
+```
+
+Recommended LevelDB environment variable values with this patch:
+
+```bash
+# Recommended LevelDB Settings
+LDB_BLOCK_SIZE="524288" # 512 KiB block size (matches common RAID 0 chunk sizes)
+LDB_COMPACTION_TABLE_SIZE="8388608" # 8 MiB compaction table size (default: 2 MiB)
+LDB_COMPACTION_TOTAL_SIZE="41943040" # 40 MiB total compaction size (default: 8 MiB)
+LDB_DEBUG_OPTIONS="1" # Emit LevelDB debug logs
+```
diff --git a/docs/base-chain/node-operators/run-a-base-node.mdx b/docs/base-chain/node-operators/run-a-base-node.mdx
new file mode 100644
index 00000000..1f7d9bfe
--- /dev/null
+++ b/docs/base-chain/node-operators/run-a-base-node.mdx
@@ -0,0 +1,113 @@
+---
+title: 'Getting Started'
+description: A tutorial that teaches how to set up and run a Base Node.
+---
+
+This tutorial will walk you through setting up your own [Base Node](https://github.com/base-org/node).
+
+## Objectives
+
+By the end of this tutorial you should be able to:
+
+- Deploy and sync a Base node
+
+## Prerequisites
+
+
+Running a node is time consuming, resource expensive, and potentially costly. If you don't already know why you want to run your own node, you probably don't need to.
+
+If you're just getting started and need an RPC URL, you can use our free endpoints:
+
+- **Mainnet**: `https://mainnet.base.org`
+- **Testnet (Sepolia)**: `https://sepolia.base.org`
+
+**Note:** Our RPCs are rate-limited, they are not suitable for production apps.
+
+If you're looking to harden your app and avoid rate-limiting for your users, please check out one of our [partners](/base-chain/tools/node-providers).
+
+
+
+### Hardware requirements
+
+We recommend you have this configuration to run a node:
+
+- 8-Core CPU
+- at least 16 GB RAM
+- a locally attached NVMe SSD drive
+- adequate storage capacity to accommodate both the snapshot restoration process (if restoring from snapshot) and chain data, ensuring a minimum of (2 \* current_chain_size) + snapshot_size + 20%\_buffer
+
+
+If utilizing Amazon Elastic Block Store (EBS), ensure timing buffered disk reads are fast enough in order to avoid latency issues alongside the rate of new blocks added to Base during the initial synchronization process; `io2 block express` is recommended.
+
+
+
+### Docker
+
+This tutorial assumes you are familiar with [Docker](https://www.docker.com/) and have it running on your machine.
+
+### L1 RPC URL
+
+You'll need your own L1 RPC URL. This can be one that you run yourself, or via a third-party provider, such as our [partners].
+
+## Running a Node
+
+1. Clone the [repo](https://github.com/base-org/node).
+2. Ensure you have an Ethereum L1 full node RPC available (not Base), and set `OP_NODE_L1_ETH_RPC` & `OP_NODE_L1_BEACON` (in the `.env.*` file if using `docker-compose`). If running your own L1 node, it needs to be synced before Base will be able to fully sync.
+3. Uncomment the line relevant to your network (`.env.sepolia`, or `.env.mainnet`) under the 2 `env_file` keys in `docker-compose.yml`.
+4. Run `docker compose up`. Confirm you get a response from:
+
+```bash [Terminal]
+curl -d '{"id":0,"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false]}' \
+ -H "Content-Type: application/json" http://localhost:8545
+```
+
+
+Syncing your node may take **days** and will consume a vast amount of your requests quota. Be sure to monitor usage and up your plan if needed.
+
+
+
+### Snapshots
+
+
+Geth Archive Nodes are no longer supported. For Archive functionality, use Reth, which provides significantly better performance in Base’s high-throughput environment.
+
+
+
+If you're a prospective or current Base Node operator and would like to restore from a snapshot to save time on the initial sync, it's possible to always get the latest available snapshot of the Base chain on mainnet and/or testnet by using the following CLI commands. The snapshots are updated every week.
+
+#### Restoring from snapshot
+
+In the home directory of your Base Node, create a folder named `geth-data` or `reth-data`. If you already have this folder, remove it to clear the existing state and then recreate it. Next, run the following code and wait for the operation to complete.
+
+| Network | Client | Snapshot Type | Command |
+| ------- | ------ | ------------- | --------------------------------------------------------------------------------------------------------------------- |
+| Testnet | Geth | Full | `wget https://sepolia-full-snapshots.base.org/$(curl https://sepolia-full-snapshots.base.org/latest)` |
+| Testnet | Reth | Archive | `wget https://sepolia-reth-archive-snapshots.base.org/$(curl https://sepolia-reth-archive-snapshots.base.org/latest)` |
+| Mainnet | Geth | Full | `wget https://mainnet-full-snapshots.base.org/$(curl https://mainnet-full-snapshots.base.org/latest)` |
+| Mainnet | Reth | Archive | `wget https://mainnet-reth-archive-snapshots.base.org/$(curl https://mainnet-reth-archive-snapshots.base.org/latest)` |
+
+You'll then need to untar the downloaded snapshot and place the `geth` subfolder inside of it in the `geth-data` folder you created (unless you changed the location of your data directory).
+
+Return to the root of your Base node folder and start your node.
+
+```bash [Terminal]
+cd ..
+docker compose up --build
+```
+
+Your node should begin syncing from the last block in the snapshot.
+
+Check the latest block to make sure you're syncing from the snapshot and that it restored correctly. If so, you can remove the snapshot archive that you downloaded.
+
+### Syncing
+
+You can monitor the progress of your sync with:
+
+```bash [Terminal]
+echo Latest synced block behind by: $((($(date +%s)-$( \
+ curl -d '{"id":0,"jsonrpc":"2.0","method":"optimism_syncStatus"}' \
+ -H "Content-Type: application/json" http://localhost:7545 | \
+ jq -r .result.unsafe_l2.timestamp))/60)) minutes
+```
+
+You'll also know that the sync hasn't completed if you get `Error: nonce has already been used` if you try to deploy using your node.
diff --git a/docs/base-chain/node-operators/snapshots.mdx b/docs/base-chain/node-operators/snapshots.mdx
new file mode 100644
index 00000000..c172c10a
--- /dev/null
+++ b/docs/base-chain/node-operators/snapshots.mdx
@@ -0,0 +1,78 @@
+---
+title: Node Snapshots
+sidebarTitle: Snapshots
+---
+
+Using a snapshot significantly reduces the initial time required to sync a Base node. Snapshots are updated regularly.
+
+
+Geth Archive Nodes are no longer supported via snapshots due to performance limitations. For Archive functionality, please use Reth.
+
+
+If you're a prospective or current Base node operator, you can restore from a snapshot to speed up your initial sync. Follow the steps below carefully.
+
+## Restoring from Snapshot
+
+These steps assume you are in the cloned `node` directory (the one containing `docker-compose.yml`).
+
+1. **Prepare Data Directory**:
+ - **Before running Docker for the first time**, create the data directory on your host machine that will be mapped into the Docker container. This directory must match the `volumes` mapping in the `docker-compose.yml` file for the client you intend to use.
+ - For Geth:
+ ```bash
+ mkdir ./geth-data
+ ```
+ - For Reth:
+ ```bash
+ mkdir ./reth-data
+ ```
+ - If you have previously run the node and have an existing data directory, **stop the node** (`docker compose down`), remove the _contents_ of the existing directory (e.g. `rm -rf ./geth-data/*`), and proceed.
+
+2. **Download Snapshot**: Choose the appropriate snapshot for your network and client from the table below. Use `wget` (or similar) to download it into the `node` directory.
+
+ | Network | Client | Snapshot Type | Download Command (`wget …`) |
+ | -------- | ------ | ------------- | ----------------------------------------------------------------------------------------------------------------- |
+ | Testnet | Geth | Full | `wget https://sepolia-full-snapshots.base.org/$(curl https://sepolia-full-snapshots.base.org/latest)` |
+ | Testnet | Reth | Archive | `wget https://sepolia-reth-archive-snapshots.base.org/$(curl https://sepolia-reth-archive-snapshots.base.org/latest)` |
+ | Mainnet | Geth | Full | `wget https://mainnet-full-snapshots.base.org/$(curl https://mainnet-full-snapshots.base.org/latest)` |
+ | Mainnet | Reth | Archive | `wget https://mainnet-reth-archive-snapshots.base.org/$(curl https://mainnet-reth-archive-snapshots.base.org/latest)` |
+
+
+ Ensure you have enough free disk space to download the snapshot archive (`.tar.gz` file) _and_ extract its contents. The extracted data will be significantly larger than the archive.
+
+
+3. **Extract Snapshot**: Untar the downloaded snapshot archive. Replace `` with the actual downloaded filename:
+
+ ```bash
+ tar -xzvf
+ ```
+
+4. **Move Data**: The extraction process will likely create a directory (e.g., `geth` or `reth`).
+
+ * Move the *contents* of that directory into the data directory you created in Step 1.
+
+ * Example (if archive extracted to a geth folder):
+
+ ```bash
+ # For Geth
+ mv ./geth/* ./geth-data/
+ rm -rf ./geth # Clean up empty extracted folder
+ ```
+
+ * Example (if archive extracted to a reth folder - **verify actual folder name**):
+
+ ```bash
+ # For Reth
+ mv ./reth/* ./reth-data/
+ rm -rf ./reth # Clean up empty extracted folder
+ ```
+
+ * The goal is to have the chain data directories (e.g., `chaindata`, `nodes`, `segments`, etc.) directly inside `./geth-data` or `./reth-data`, not nested within another subfolder.
+
+5. **Start the Node**: Now that the snapshot data is in place, start the node using the appropriate command (see the [Running a Base Node](/base-chain/quickstart/run-base-node#setting-up-and-running-the-node) guide):
+
+ ```bash
+ # Example for Mainnet Geth
+ docker compose up --build -d
+ ```
+
+6. **Verify and Clean Up**: Monitor the node logs (`docker compose logs -f `) or use the [sync monitoring](/base-chain/quickstart/run-base-node#monitoring-sync-progress) command to ensure the node starts syncing from the snapshot's block height. Once confirmed, you can safely delete the downloaded snapshot archive (`.tar.gz` file) to free up disk space.
diff --git a/docs/base-chain/node-operators/troubleshooting.mdx b/docs/base-chain/node-operators/troubleshooting.mdx
new file mode 100644
index 00000000..dfd59c32
--- /dev/null
+++ b/docs/base-chain/node-operators/troubleshooting.mdx
@@ -0,0 +1,130 @@
+---
+sidebarTitle: Troubleshooting
+title: Node Troubleshooting
+---
+
+This guide covers common issues encountered when setting up and running a Base node using the official [Base Node Docker setup](https://github.com/base/node) and provides steps to diagnose and resolve them.
+
+## General Troubleshooting Steps
+
+Before diving into specific issues, here are some general steps that often help:
+
+1. **Check Container Logs**: This is usually the most informative step. Use `docker compose logs -f ` to view the real-time logs for a specific container.
+ - L2 Client (Geth): `docker compose logs -f op-geth`
+ - L2 Client (Reth): `docker compose logs -f op-reth`
+ - Rollup Node: `docker compose logs -f op-node`. Look for errors, warnings, or repeated messages.
+
+2. **Check Container Status**: Ensure the relevant Docker containers are running: `docker compose ps`. If a container is restarting frequently or exited, check its logs.
+
+3. **Check Resource Usage**: Monitor your server’s CPU, RAM, disk I/O, and network usage. Performance issues are often linked to insufficient resources. Tools like `htop`, `iostat`, and `iftop` can be helpful.
+
+4. **Verify RPC Endpoints**: Use `curl` to check if the L2 client’s RPC endpoint is responding (see [Running a Base Node > Verify Node is Running](/base-chain/quickstart/run-base-node.mdx#verify-node-is-running)). Also, verify your L1 endpoints are correct and accessible from the node server.
+
+5. **Check L1 Node**: Ensure your configured L1 node (Execution and Consensus) is fully synced, healthy, and accessible. Issues with the L1 node will prevent the L2 node from syncing correctly.
+
+---
+
+## Common Issues and Solutions
+
+### Setup & Configuration Issues
+
+- **Issue**: Docker command fails (`docker compose up ...`)
+ - **Check**: Is Docker and Docker Compose installed and the Docker daemon running?
+ - **Check**: Are you in the correct directory (the cloned `node` directory containing `docker-compose.yml`)?
+ - **Check**: Syntax errors in the command (e.g., misspelled `NETWORK_ENV` or `CLIENT`).
+
+- **Issue**: Container fails to start, logs show errors related to `.env` files or environment variables.
+ - **Check**: Did you correctly configure the L1 endpoints (`OP_NODE_L1_ETH_RPC`, `OP_NODE_L1_BEACON`) in the correct `.env` file (`.env.mainnet` or `.env.sepolia`)?
+ - **Check**: Is the `OP_NODE_L1_BEACON_ARCHIVER` endpoint set if required by your configuration or L1 node?
+ - **Check**: Is `OP_NODE_L1_RPC_KIND` set correctly for your L1 provider?
+ - **Check**: (Reth) Are `RETH_CHAIN` and `RETH_SEQUENCER_HTTP` correctly set in the `.env` file?
+
+- **Issue**: Errors related to JWT secret or authentication between `op-node` and L2 client.
+ - **Check**: Ensure you haven't manually modified the `OP_NODE_L2_ENGINE_AUTH` variable or the JWT file path (`$OP_NODE_L2_ENGINE_AUTH`) unless you know what you're doing. The `docker-compose` setup usually handles this automatically.
+
+- **Issue**: Permission errors related to data volumes (`./geth-data`, `./reth-data`).
+ - **Check**: Ensure the user running `docker compose` has write permissions to the directory where the `node` repository was cloned. Docker needs to be able to write to `./geth-data` or `./reth-data`. Sometimes running Docker commands with `sudo` can cause permission issues later; try running as a non-root user added to the `docker` group.
+
+### Syncing Problems
+
+- **Issue**: Node doesn't start syncing or appears stuck (block height not increasing).
+ - **Check**: `op-node` logs. Look for errors connecting to L1 endpoints or the L2 client.
+ - **Check**: L2 client (`op-geth`/`op-reth`) logs. Look for errors connecting to `op-node` via the Engine API (port `8551`) or P2P issues.
+ - **Check**: L1 node health and sync status. Is the L1 node accessible and fully synced?
+ - **Check**: System time. Ensure the server’s clock is accurately synchronized (use `ntp` or `chrony`). Significant time drift can cause P2P issues.
+
+- **Issue**: Syncing is extremely slow.
+ - **Check**: Hardware specifications. Are you meeting the recommended specs (especially RAM and **NVMe SSD**) outlined in the [Node Performance](/base-chain/node-operators/performance-tuning) guide? Disk I/O is often the bottleneck.
+ - **Check**: L1 node performance. Is your L1 RPC endpoint responsive? A slow L1 node will slow down L2 sync.
+ - **Check**: Network connection quality and bandwidth.
+ - **Check**: `op-node` and L2 client logs for any performance warnings or errors.
+
+- **Issue**: `optimism_syncStatus` (port `7545` on `op-node`) shows a large time difference or errors.
+ - **Action**: Check the logs for both `op-node` and the L2 client (`op-geth`/`op-reth`) around the time the status was checked to identify the root cause (e.g., L1 connection issues, L2 client issues).
+
+- **Issue**: `Error: nonce has already been used` when trying to send transactions.
+ - **Cause**: The node is not yet fully synced to the head of the chain.
+ - **Action**: Wait for the node to fully sync. Monitor progress using `optimism_syncStatus` or logs.
+
+### Performance Issues
+
+- **Issue**: High CPU, RAM, or Disk I/O usage.
+ - **Check**: Hardware specifications against recommendations in the [Node Performance](/base-chain/node-operators/performance-tuning). Upgrade if necessary. Local NVMe SSDs are critical.
+ - **Check**: (Geth) Review Geth cache settings and LevelDB tuning options mentioned in [Node Performance – Geth Performance Tuning](/base-chain/node-operators/performance-tuning#geth-performance-tuning) and [Advanced Configuration](/base-chain/quickstart/run-base-node#geth-configuration-via-environment-variables).
+ - **Check**: Review client logs for specific errors or bottlenecks.
+ - **Action**: Consider using Reth if running Geth, as it’s generally more performant for Base.
+
+### Snapshot Restoration Problems
+
+Refer to the [Snapshots](/base-chain/node-operators/snapshots) guide for the correct procedure.
+
+- **Issue**: `wget` command fails or snapshot download is corrupted.
+ - **Check**: Network connectivity.
+ - **Check**: Available disk space.
+ - **Action**: Retry the download. Verify the download URL is correct.
+
+- **Issue**: `tar` extraction fails.
+ - **Check**: Downloaded file integrity (is it corrupted?).
+ - **Check**: Available disk space (extraction requires much more space than the download).
+ - **Check**: `tar` command syntax.
+
+- **Issue**: Node fails to start after restoring snapshot; logs show database errors or missing files.
+ - **Check**: Did you stop the node (`docker compose down`) _before_ modifying the data directory?
+ - **Check**: Did you remove the _contents_ of the old data directory (`./geth-data/*` or `./reth-data/*`) before extracting/moving the snapshot data?
+ - **Check**: Was the snapshot data moved correctly? The chain data needs to be directly inside `./geth-data` or `./reth-data`, not in a nested subfolder (e.g., `./geth-data/geth/...`). Verify the folder structure.
+
+- **Issue**: Ran out of disk space during download or extraction.
+ - **Action**: Free up disk space or provision a larger volume. Remember the storage formula:
+ ```
+ (2 * chain_size + snapshot_size + 20% buffer)
+ ```
+
+### Networking / Connectivity Issues
+
+- **Issue**: RPC/WS connection refused (e.g., `curl` to `localhost:8545` fails).
+ - **Check**: Is the L2 client container (`op-geth`/`op-reth`) running (`docker compose ps`)?
+ - **Check**: Are you using the correct port (`8545` for HTTP, `8546` for WS by default)?
+ - **Check**: L2 client logs. Did it fail to start the RPC server?
+ - **Check**: Are the `--http.addr` and `--ws.addr` flags set to `0.0.0.0` in the client config/entrypoint to allow external connections (within the Docker network)?
+
+- **Issue**: Node has low peer count.
+ - **Check**: P2P port (default `30303`) accessibility. Is it blocked by a firewall on the host or network?
+ - **Check**: Node logs for P2P errors.
+ - **Action**: If behind NAT, configure the `--nat=extip:` flag via `ADDITIONAL_ARGS` in the `.env` file (see [Advanced Configuration](/base-chain/quickstart/run-base-node#improving-peer-connectivity)).
+
+- **Issue**: Port conflicts reported in logs or `docker compose up` fails.
+ - **Check**: Are other services running on the host using the default ports (`8545`, `8546`, `8551`, `6060`, `7545`, `30303`)? Use
+ ```bash
+ sudo lsof -i -P -n | grep LISTEN
+ sudo netstat -tulpn | grep LISTEN
+ ```
+ - **Action**: Stop the conflicting service or change the ports used by the Base node containers by modifying the `ports` section in `docker-compose.yml` and updating the relevant environment variables (`$RPC_PORT`, `$WS_PORT`, etc.) in the `.env` file if necessary.
+
+---
+
+## Getting Further Help
+
+If you’ve followed this guide and are still encountering issues, seek help from the community:
+
+- **Discord**: Join the [Base Discord](https://discord.gg/buildonbase) and post in the `🛠|node-operators` channel, providing details about your setup, the issue, and relevant logs.
+- **GitHub**: Check the [Base Node repository issues](https://github.com/base-org/node/issues) or open a new one if you suspect a bug.
diff --git a/docs/base-chain/quickstart/bridge-token.mdx b/docs/base-chain/quickstart/bridge-token.mdx
new file mode 100644
index 00000000..60b5d27c
--- /dev/null
+++ b/docs/base-chain/quickstart/bridge-token.mdx
@@ -0,0 +1,27 @@
+---
+title: "Bridging an L1 token to Base"
+sidebarTitle: 'Bridge Tokens to Base'
+description: How to submit ERC-20 tokens for bridging between Ethereum and Base as a token issuer.
+---
+
+This page is intended for token issuers who already have an ERC-20 contract deployed on Ethereum and would like to submit their token for bridging between Ethereum and Base. Base uses the [Superchain token list](https://github.com/ethereum-optimism/ethereum-optimism.github.io) as a reference for tokens that have been deployed on Base.
+
+**_Disclaimer: Base does not endorse any of the tokens that are listed in the Github repository and has conducted only preliminary checks, which include automated checks listed_** [**_here_**](https://github.com/ethereum-optimism/ethereum-optimism.github.io)**_._**
+
+## Adding your token to the list
+
+The steps below explain how to get your token on the Base Token List.
+
+### Step 1: Deploy your token on Base
+
+Select your preferred bridging framework and use it to deploy an ERC-20 for your token on Base. We recommend you use the framework provided by Base's [standard bridge](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/bridges.md) contracts, and furthermore deploy your token using the [OptimismMintableERC20Factory](https://docs.optimism.io/app-developers/tutorials/bridging/standard-bridge-standard-token). You can find the list of contracts addresses [here](/base-chain/network-information/base-contracts).
+
+Deploying your token on Base in this manner provides us with guarantees that will smooth the approval process. If you choose a different bridging framework, its interface must be compatible with that of the standard bridge, otherwise it may be difficult for us to support.
+
+### Step 2: Submit details for your token
+
+Follow the instructions in the [Github repository](https://github.com/ethereum-optimism/ethereum-optimism.github.io) and submit a PR containing the required details for your token. You must specify in your token's data.json file a section for ‘base-sepolia' and/or ‘base’. The change you need to submit is particularly simple if your token has already been added to the Superchain token list. For example, [this PR](https://github.com/ethereum-optimism/ethereum-optimism.github.io/commit/27ab9b2d3388f7feba3a152e0a0748c73d732a68) shows the change required for cbETH, which was already on Optimism's token list and relies on the Base standard bridge.
+
+### Step 3: Await final approval
+
+Reviews are regularly conducted by the Base team and you should receive a reply within 24-72 hours (depending on if the PR is opened on a weekday, weekend or holiday).
diff --git a/docs/base-chain/quickstart/connecting-to-base.mdx b/docs/base-chain/quickstart/connecting-to-base.mdx
new file mode 100644
index 00000000..304e186a
--- /dev/null
+++ b/docs/base-chain/quickstart/connecting-to-base.mdx
@@ -0,0 +1,35 @@
+---
+title: 'Connecting to Base'
+description: Documentation about Base Mainnet and Base Testnet. This page covers network information for the Base network, including network names, descriptions, RPC endpoints, chain IDs, currency symbols, and block explorers.
+---
+
+## Base Mainnet
+
+| Name | Value |
+| :-------------- | :------------------------------------------------------------------------------------------------------ |
+| Network Name | Base Mainnet |
+| Description | The public mainnet for Base. |
+| RPC Endpoint | [https://mainnet.base.org](https://mainnet.base.org) _Rate limited and not for production systems._ |
+| Chain ID | 8453 |
+| Currency Symbol | ETH |
+| Block Explorer | [https://base.blockscout.com/](https://base.blockscout.com/) |
+
+## Base Testnet (Sepolia)
+
+| Name | Value |
+| :-------------- | :------------------------------------------------------------------------------------------------------ |
+| Network Name | Base Sepolia |
+| Description | A public testnet for Base. |
+| RPC Endpoint | [https://sepolia.base.org](https://sepolia.base.org) _Rate limited and not for production systems._ |
+| Chain ID | 84532 |
+| Currency Symbol | ETH |
+| Block Explorer | [https://sepolia-explorer.base.org](https://sepolia-explorer.base.org) |
+
+
+L1 & L2 protocol and network-related smart contract deployments can be found on the [Base Contracts](/base-chain/network-information/base-contracts) page.
+
+
+
+
+For production systems, we recommend using a node from one of our [node partners](/base-chain/tools/node-providers), or [running your own Base node](/base-chain/quickstart/run-base-node).
+
diff --git a/docs/base-chain/quickstart/deploy-on-base.mdx b/docs/base-chain/quickstart/deploy-on-base.mdx
new file mode 100644
index 00000000..7c525e78
--- /dev/null
+++ b/docs/base-chain/quickstart/deploy-on-base.mdx
@@ -0,0 +1,143 @@
+---
+title: 'Deploy on Base'
+---
+
+Welcome to the Base deployment quickstart guide! This comprehensive walkthrough will help you set up your environment and deploy smart contracts on Base. Whether you're a seasoned developer or just starting out, this guide has got you covered.
+
+## What You'll Achieve
+
+By the end of this quickstart, you'll be able to:
+
+- Set up your development environment to deploy on Base
+- Deploy your smart contracts to Base
+- Connect your frontend to your smart contracts
+
+
+**Why Base?**
+
+Base is a fast, low-cost, builder-friendly Ethereum L2 built to bring the next billion users onchain. By following this guide, you'll join a vibrant ecosystem of developers, creators, and innovators who are building a global onchain economy.
+
+
+
+## Set Up Your Development Environment
+
+1. Create a new project directory
+
+```bash
+mkdir my-base-project && cd my-base-project
+```
+
+2. Install Foundry, a powerful framework for smart contract development
+
+```bash
+curl -L https://foundry.paradigm.xyz | bash
+foundryup
+```
+
+This installs Foundry and updates it to the latest version.
+
+3. Initialize a new Solidity project
+
+```bash
+forge init
+```
+
+Your Foundry project is now ready. You'll find an example contract in the `src` directory, which you can replace with your own contracts. For the purposes of this guide, we'll use the Counter contract provided in `/src/Counter.sol`
+
+
+Foundry provides a suite of tools for Ethereum application development, including Forge (for testing), Cast (for interacting with the chain), and Anvil (for setting up a local node). You can learn more about Foundry [here](https://book.getfoundry.sh/).
+
+
+
+## Configure Foundry with Base
+
+To deploy your smart contracts to Base, you need two key components:
+
+1. A node connection to interact with the Base network
+2. A funded private key to deploy the contract
+
+Let's set up both of these:
+
+### 1. Set up your node connection
+
+1. Create a `.env` file in your project's root directory
+2. Add the Base network RPC URL to your `.env` file
+
+```bash
+BASE_RPC_URL="https://mainnet.base.org"
+BASE_SEPOLIA_RPC_URL="https://sepolia.base.org"
+```
+
+3. Load your environment variables
+
+```bash
+source .env
+```
+
+
+Base Sepolia is the test network for Base, which we will use for the rest of this guide. You can obtain free Base Sepolia ETH from one of the [faucets listed here](/base-chain/tools/network-faucets).
+
+
+
+### 2. Secure your private key
+
+1. Store your private key in Foundry's secure keystore
+
+```bash
+cast wallet import deployer --interactive
+```
+
+2. When prompted enter your private key and a password.
+
+Your private key is stored in `~/.foundry/keystores` which is not tracked by git.
+
+
+Never share or commit your private key. Always keep it secure and handle with care.
+
+
+
+## Deploy Your Contracts
+
+Now that your environment is set up, let's deploy your contracts to Base Sepolia.
+
+1. Use the following command to compile and deploy your contract
+
+```bash
+forge create ./src/Counter.sol:Counter --rpc-url $BASE_SEPOLIA_RPC_URL --account deployer
+```
+
+Note the format of the contract being deployed is `:`.
+
+2. After successful deployment, the transaction hash will be printed to the console output
+
+3. Copy the deployed contract address and add it to your `.env` file
+
+```bash
+COUNTER_CONTRACT_ADDRESS="0x..."
+```
+
+4. Load the new environment variable
+
+```bash
+source .env
+```
+
+### Verify Your Deployment
+
+To ensure your contract was deployed successfully:
+
+1. Check the transaction on [Sepolia Basescan](https://sepolia.basescan.org/).
+2. Use the `cast` command to interact with your deployed contract from the command line
+
+```bash
+cast call $COUNTER_CONTRACT_ADDRESS "number()(uint256)" --rpc-url $BASE_SEPOLIA_RPC_URL
+```
+This will return the initial value of the Counter contract's `number` storage variable, which will be `0`.
+
+**Congratulations! You've deployed your smart contracts to Base Sepolia!**
+
+## Next Steps
+
+- Use [Onchainkit](https://onchainkit.com) to connect your frontend to your contracts! Onchainkit is a library of ready-to-use React components and Typescript utilities.
+- Learn more about interacting with your contracts in the command line using Foundry from our [Foundry tutorial](/cookbook/smart-contract-development/foundry/deploy-with-foundry).
+
diff --git a/docs/base-chain/quickstart/why-base.mdx b/docs/base-chain/quickstart/why-base.mdx
new file mode 100644
index 00000000..47867775
--- /dev/null
+++ b/docs/base-chain/quickstart/why-base.mdx
@@ -0,0 +1,79 @@
+---
+title: 'Why Base?'
+---
+
+## TL;DR
+
+- **Cheap, fast, and open platform:** Base is a globally available platform that provides 1-second and <1-cent transactions to anyone in the world.
+- **Access to high-quality tooling:** Builders have access to tools to build incredible onchain experiences for AI, social, media, and entertainment.
+- **A place to earn:** Base has delivered grants to more than 1,000 builders, with plans to continue supporting more.
+- **Reach more users:** Base is committed to helping developers grow their user base by distributing their apps through official Base channels.
+
+
+## A platform for building innovative apps
+
+Base is a global onchain economy of people, builders, and businesses creating the next generation of the open internet. It enables builders to:
+
+- Focus on solving real user problems
+- Scale apps globally by default
+- Onboard users with a click
+- Accept payments from anyone, easily
+
+It’s fast, cheap, and permissionless, meaning anyone can build and use applications on Base.
+
+Base has become the hub for innovative use cases in media, entertainment, social, and even artificial intelligence. [Clanker], an autonomous AI agent on Base, generated more than $13 million in revenue within three months of its inception. As a cultivator of innovation, Base enables developers to focus on improving their products while retaining more of the upside they generate.
+
+Traditional app distribution models often require developers to sacrifice 30% of their revenue to app marketplaces. These platforms may incentivize predatory practices—selling user data or requiring personal information—and can restrict or deny access at their discretion. For instance, someone in Nairobi might be unable to use many U.S.-based fintech services.
+
+In contrast, decentralized finance (DeFi) apps—an onchain development sector—like [Moonwell] allow people anywhere in the world to access financial services directly from their phones. This means someone in Nairobi has the same level of access as someone in the U.S., opening opportunities that were previously inaccessible.
+
+
+
+## Expansive developer tools
+
+Developers choose Base for its:
+
+- Always-on global payment rail operating at internet speed
+- Low transaction costs (often less than a cent)
+- Robust developer tooling
+
+But there’s more: Base apps can be launched in hours, not days or weeks, thanks to an extensive suite of tools—many of which are open source. We’re reviving the spirit of innovation where two builders in a garage can create a massively successful business.
+
+Some of the tooling that makes this possible:
+
+- **Smart Wallets:** Onboard your users quickly and securely. Users never have to worry about seed phrases again.
+- **Coinbase Developer Platform:** Access specialized developer services for onchain development, such as free node software, sponsored transactions, and other tools to help you fine-tune your application.
+- **OnchainKit:** A React component library (TypeScript) to help you build apps faster.
+- **Basenames:** More than just human-readable text to replace an address—Basenames are the front page to a builder’s onchain profile.
+- **Verifications:** Enable unique experiences for users with verified credentials.
+
+
+
+## Builder support
+
+More apps mean more compelling reasons for everyone to get onchain. Base is committed to expanding its developer and user community by creating opportunities for apps to go viral. To support this, Base actively distributes apps through its official channels, including Wallet, X, and Warpcast.
+
+Beyond growth, Base is also a place to earn. Since its launch, we have dedicated a portion of our revenue to the Optimism Collective, supporting initiatives like [Retroactive Public Goods Funding (RetroPGF)] and other ecosystem projects.
+
+We have also distributed builder grants to more than 1,000 builders. Here are a few ways you can earn on Base:
+
+- **[Builder Grants]:** Small, retroactive grants up to 2 ETH
+- **[/base-builds]:** Weekly grants by rounds to Warpcast builders
+- **[Optimism RPGF]:** Projects built on Base are eligible for Optimism RPGF
+- Other community-driven collaborations through based.management, [Bountycaster], and [Talent Protocol]
+
+Base offers builders access to a high-growth, high-signal community across multiple social platforms, including a Discord server with over 400,000 members, X, and Warpcast. We actively amplify impactful projects on these platforms, helping the community discover new innovations. We believe the developers behind these applications are the key to unlocking an onchain future for everyone.
+
+
+
+[Basenames]: https://www.base.org/names
+[planned]: https://ethereum.org/en/roadmap/
+[Solidity]: https://soliditylang.org/
+[Bountycaster]: https://www.bountycaster.xyz/
+[Builder Grants]: https://docs.google.com/forms/d/e/1FAIpQLSeiSAod4PAbXlvvDGtHWu-GqzGpvHYfaTQR2f77AawD7GYc4Q/viewform
+[/base-builds]: https://warpcast.com/base/0xb3f1428b?utm_source=dotorg&urm_medium=builderkit
+[Optimism RPGF]: https://round3.optimism.io/projects?after=undefined&display=grid&sort=mostAwarded&search=&seed=1738341430276&categories=
+[Talent Protocol]: https://www.talentprotocol.com/
+[Moonwell]: https://moonwell.fi/discover
+[Clanker]: https://www.clanker.world/
+[Retroactive Public Goods Funding (RetroPGF)]: https://round3.optimism.io/projects?after=undefined&display=grid&sort=mostAwarded&search=&seed=1738341430276&categories=
diff --git a/docs/base-chain/security/avoid-malicious-flags.mdx b/docs/base-chain/security/avoid-malicious-flags.mdx
new file mode 100644
index 00000000..fd00ccc2
--- /dev/null
+++ b/docs/base-chain/security/avoid-malicious-flags.mdx
@@ -0,0 +1,33 @@
+---
+sidebarTitle: 'Avoid Malicious Flags'
+title: How to avoid getting your app flagged as malicious
+description: The Base bug bounty program and procedures for reporting vulnerabilities.
+---
+
+Ensuring that your app is perceived as trustworthy and not flagged as malicious requires attention to best practices. Here’s a quick guide on how to build a secure and compliant app from day one.
+
+## 1. Verify and reduce the risk of your smart contract
+
+- **Verify Smart Contract**: Ensure that the source code of your contracts is verified and publicly available on [block explorers](/base-chain/tools/block-explorers). For example, this can be done on [Etherscan](https://basescan.org/verifyContract) and [Basescan](https://basescan.org/verifyContract) under “Verify Contract”.
+- **Limit Exposure of User Funds**: Design your contracts to minimize the exposure of user funds. Use efficient design to reduce any unnecessary risk. For example, request the minimum amount needed to fulfill the transaction.
+
+## 2. Submit a verification request
+
+After verifying your smart contract, consider [submitting a verification request](https://report.blockaid.io/). This step helps ensure that your app is recognized as safe and verified by trusted sources in the ecosystem.
+
+## 3. Follow app best practices
+
+- **Accessibility Across Regions**: Avoid geo-blocking or access restrictions that prevent certain regions or countries from accessing your app. Depending on legal or compliance reasons, this may be necessary which you can indicate in your verification request submission.
+- **Consistent Behavior**: Avoid rapid or unexplained changes in UI that can make users feel uncertain about the app’s reliability.
+- **Transparent Onchain Interactions**: Make sure your app’s onchain interactions are clear and match the UI actions. For example, a “Mint” button should clearly emit a mint transaction.
+- **Standard Sign-in Methods**: Provide all standard connection methods for users to sign in, such as WalletConnect / Coinbase Wallet SDK or popular browser extension wallets.
+- **Audit Your Contracts**: Have your contracts audited by a reputable firm. Publish the audit report and provide a reference link so users can easily find it. Audits show that you’ve taken extra steps to secure your smart contracts.
+
+By following these recommendations, you’ll significantly reduce the chances of your app being flagged as malicious and foster a secure and trustworthy environment for your users.
+
+---
+
+**Still having trouble?**
+Coinbase Wallet may report false positives when flagging apps. To avoid false positives, please make sure you have completed the recommended actions above. If your app is still flagged as suspicious or malicious, [report it to Blockaid](https://report.blockaid.io/mistake).
+
+---
diff --git a/docs/base-chain/security/bug-bounty.mdx b/docs/base-chain/security/bug-bounty.mdx
new file mode 100644
index 00000000..7cb267c7
--- /dev/null
+++ b/docs/base-chain/security/bug-bounty.mdx
@@ -0,0 +1,3 @@
+---
+title: 'Bug Bounty'
+---
diff --git a/docs/base-chain/security/report-vulnerability.mdx b/docs/base-chain/security/report-vulnerability.mdx
new file mode 100644
index 00000000..26f81a0c
--- /dev/null
+++ b/docs/base-chain/security/report-vulnerability.mdx
@@ -0,0 +1,19 @@
+---
+sidebarTitle: 'Report a Vulnerability'
+title: Reporting Vulnerabilities
+description: The Base procedures for reporting vulnerabilities.
+---
+
+All potential vulnerability reports can be submitted via the [HackerOne](https://hackerone.com/coinbase) platform.
+
+The HackerOne platform allows us to have a centralized and single reporting source for us to deliver optimized SLAs and results. All reports submitted to the platform are triaged around the clock by our team of Coinbase engineers with domain knowledge, assuring the best quality of review.
+
+## Bug bounty program
+
+In line with our strategy of being the safest way for users to access crypto:
+
+- Coinbase will be extending our [best-in-industry](https://www.coinbase.com/blog/celebrating-10-years-of-our-bug-bounty-program) million-dollar [HackerOne bug bounty program](https://hackerone.com/coinbase?type=team) to cover the Base network, the Base bridge contracts, and Base infrastructure.
+- Coinbase will be working in tandem with OP Labs to harden the security guarantees of Bedrock and accelerate the timeline for decentralized fault-proofs on the [OP Stack](https://stack.optimism.io/).
+- Coinbase's bug bounty program will run alongside Optimism's existing [Immunefi Bedrock bounty program](https://immunefi.com/bounty/optimism/) to support the open source [Bedrock](https://stack.optimism.io/docs/releases/bedrock/) OP Stack framework.
+
+For more information on reporting vulnerabilities and our HackerOne bug bounty program, view our [security program policies](https://hackerone.com/coinbase?view_policy=true).
diff --git a/docs/base-chain/security/security-council.mdx b/docs/base-chain/security/security-council.mdx
new file mode 100644
index 00000000..f1fee274
--- /dev/null
+++ b/docs/base-chain/security/security-council.mdx
@@ -0,0 +1,141 @@
+---
+title: Security Council for Base
+description: This page outlines the purpose, goals, structure, and responsibilities of the Security Council for Base.
+---
+
+This page outlines the purpose, goals, structure, and responsibilities of the
+Security Council for Base. The Council is composed of individuals and
+organizations who hold signing keys and help manage upgrades to keep the Base
+network secure.
+
+## Purpose
+
+Base’s mission is to build a global onchain economy that increases innovation,
+creativity, and freedom. We believe this is only possible on a decentralized
+platform. This is why Base is (1) built on Ethereum, the most secure and
+decentralized L1, (2) built on the open and permissionless OP Stack, and (3)
+upholds key [Neutrality Principles](https://www.coinbase.com/blog/coinbases-neutrality-principles-for-base).
+
+As part of our ongoing commitment to decentralization, Base launched
+[permissionless fault proofs](https://base.mirror.xyz/eOsedW4tm8MU5OhdGK107A9wsn-aU7MAb8f3edgX5Tk) in
+October 2024, [decentralized control of contract upgrades](https://base.mirror.xyz/tWDMlGp48fF0MeADcLQruUBq1Qxkou4O5x3ax8Rm3jA) via a Security Council
+in April 2025, and has now reached Stage 1 Decentralization.
+
+In reaching **Stage 1**, Base provides stronger security guarantees and fewer
+trust assumptions. Builders benefit from infrastructure certainty (no unexpected
+rule changes), and there’s no single point of failure—everyone can participate
+in verifying and securing the network.
+
+## Structure
+
+**Composition and quorum**
+
+Stage 1 Decentralization requirements say that the group which approves Base
+Chain contract upgrades must contain:
+
+- at least 8 participants
+- a ≥75% quorum
+- a quorum-blocking group outside the main rollup operator (Base)
+
+In addition to the current signing entities (Optimism and Coinbase), the
+Security Council adds 10 independent entities and individuals from
+geographically diverse regions. To satisfy the ≥75% quorum, 9 out of the 12
+entities (the 10 entities in the Security Council, Optimism, and Coinbase) are
+required to approve Base upgrades. Base upgrades cannot take effect until a
+quorum of these entities sign and approve the upgrade. This composition
+satisfies all requirements.
+
+**Member Selection criteria**
+
+- Representation across diverse geographic regions and international territories
+- Strong alignment with [Base’s mission and values](https://base.mirror.xyz/jjQnUq_UNTQOk7psnGBFOsShi7FlrRp8xevQUipG_Gk)
+- Diverse organizations - each member represents a separate entity
+- Proven track record in the Base and Ethereum ecosystem - in good standing in upholding professional and ethical standards in the community
+- Technical competency and good security practices - has completed screening processes, including background checks, and have shown ability to securely store and use sensitive key materials
+
+**Current Roster**
+
+This is a living list that will stay up to date with membership. As of April 2025, the Security Council currently contains members from the following entities and individuals, based in the listed geographical jurisdictions.
+
+- [Entity] Aerodrome – signer based in Japan
+ - [Aerodrome](https://aerodrome.finance/) is a decentralized exchange on Base where users can swap, earn rewards and actively participate in the onchain economy.
+ - `0xa5959a39cA67b9fb473E4A3A898C611EEAc9CB73`
+- [Entity] Moonwell – signer based in Brazil
+ - [Moonwell](https://moonwell.fi/) is a decentralized lending and borrowing platform built on Base.
+ - `0x21C7D1e6A81Daca071bA94839ab74C39A25f851F`
+- [Entity] Blackbird – signer based in USA
+ - [Blackbird](https://www.blackbird.xyz/) is a loyalty and payments platform built specifically for the restaurant industry, powered by Base.
+ - `0xA5657B88A0130a626fcDd6aAA59522373438CdFE`
+- [Entity] ChainSafe – signer based in Canada
+ - [ChainSafe](https://chainsafe.io/) is a blockchain R&D firm focused on decentralized infrastructure.
+ - `0x1C56A6d2A6Af643cea4E62e72B75B9bDe8d62e2B`
+- [Entity] Talent Protocol – signer based in Portugal
+ - [Talent Protocol](https://app.talentprotocol.com/) brings professional reputation onchain to help Base builders showcase their skills and get the recognition they deserve.
+ - `0x5ff5C78ff194acc24C22DAaDdE4D639ebF18ACC6`
+- [Entity] Moshicam – signer based in USA
+ - [Moshicam](https://moshi.cam/) is a community-based photo editing app built on Base.
+ - `0xa8ee754FD1d069fb4B5d652730A0ca5e07a3fb06`
+- [Individual] Seneca – based in USA
+ - Seneca is the co-founder of [Rounds](https://rounds.wtf/), a social platform which has [powered](https://x.com/jessepollak/status/1781069700652523725) grant distribution to Base builders.
+ - `0x82C80F34C4b5c153dB76122a11AaD2F77C99E766`
+- [Individual] Juan Suarez – based in USA
+ - Juan is an active member of the Base ecosystem and has advised a number of key Base projects. He is a former member of the Coinbase Legal Team.
+ - `0x99DB5BbA0db16e9aD05e3ff53310683CC3C971D2`
+- [Individual] Toady Hawk – based in Canada
+ - [Toady Hawk](https://warpcast.com/toadyhawk.eth) is the founder of [Zero Rights Media](https://warpcast.com/zerorightsmedia), an open source onchain media org on Base (producers of ZEROPOD), and [The Yellow Collective](https://warpcast.com/basedandyellow), an onchain culture club for artists and creators on Base.
+ - `0x0E8A99738a50D523871739c6d676554b0E34252f`
+- [Individual] Roberto Bayardo – based in USA
+ - [Roberto Bayardo](https://warpcast.com/bayardo.eth) is an engineer at Commonware, building a framework for high-performance blockchains. He is a former core Base contributor.
+ - `0x18e982274f8C5B548D5aAc7aBef44D61504e1b3E`
+
+Individuals representing each entity are not published to protect personal privacy and to enhance security.
+
+**Member Terms**
+
+The Security Council for Base operates on a staggered “cohort” model:
+
+- Cohort 1: 6-month term beginning April 2025
+- Cohort 2: 9-month term beginning April 2025
+
+## Roles & Responsibilities
+
+**Review and approve changes**
+
+- Council members are notified about proposed upgrades, and they must verify, approve, and sign these upgrades.
+- Council members must verify, approve and sign role changes (in case of key rotations for lost devices, member rotations, etc.). Any key rotations will not disrupt quorum or security.
+
+**Maintain availability and lines of communication**
+
+- Be accessible and reachable for scheduled signings, coordination calls, and emergencies.
+- Collaborate with other members to resolve urgent issues.
+
+**Preserve key security**
+
+- Generate and store key materials securely.
+- Keys should only be used for activities which directly relate to the Security Council member role (upgrades and ownership changes).
+- Report suspected loss of access or compromise immediately.
+- Undergo onchain safety and security training at the beginning of each term.
+- At regular intervals, participate in a liveness check by signing a message, to confirm ongoing control of the key.
+
+**Act in good faith**
+
+- Avoid conflicts of interest and disclose potential conflicts.
+- Participate in removing or replacing dysfunctional signers without compromising security.
+
+## The future
+
+The Security Council for Base is a critical step toward a more decentralized,
+resilient, and secure future for the Base network. By distributing key
+responsibilities across trusted, independent participants and implementing fault
+proofs, we’ve reduced reliance on any single entity while strengthening
+guarantees for users, builders, and the broader ecosystem.
+
+This is just the beginning. As Base continues to evolve, the role of the
+Security Council will be progressively minimized, paving the way for even more
+trustless infrastructure beyond Stage 1—Stage 2—and even greater community
+control.
+
+Our mission remains the same: to build a global onchain economy that empowers
+innovation, creativity, and freedom—on a foundation that everyone can rely on.
+
+Base is for everyone.
diff --git a/docs/base-chain/tools/account-abstraction.mdx b/docs/base-chain/tools/account-abstraction.mdx
new file mode 100644
index 00000000..4ef628c5
--- /dev/null
+++ b/docs/base-chain/tools/account-abstraction.mdx
@@ -0,0 +1,53 @@
+---
+title: Account Abstraction
+description: Documentation for Account Abstraction toolkits and solutions for apps built on Base.
+---
+
+## Alchemy Account Kit
+
+[Account Kit](https://www.alchemy.com/account-kit) is a complete solution for account abstraction. Using Account Kit, you can create a smart contract wallet for every user that leverages account abstraction to simplify every step of your app's onboarding experience. It also offers Gas Manager and Bundler APIs for sponsoring gas and batching transactions.
+
+## Biconomy
+
+[Biconomy](https://www.biconomy.io) is an Account Abstraction toolkit that enables you to provide the simplest UX for your dapp or wallet. It offers modular smart accounts, as well as paymasters and bundlers as a service for sponsoring gas and executing transactions at scale.
+
+## Coinbase Account Abstraction Kit
+
+The Coinbase Developer Platform [Account Abstraction Kit](https://www.coinbase.com/developer-platform/solutions/account-abstraction-kit) is an account abstraction toolkit for building simple onchain user experiences. Account Abstraction Kit provides a paymaster and bundler that allows you to sponsor gas fees and bundle user transactions, improving the user experience of your application.
+
+## Openfort
+
+[Openfort](https://openfort.xyz) is an infrastructure provider designed to simplify the development of games and gamified experiences across their suite of API endpoints. The platform vertically integrates the AA stack, so game developers can focus on game development without worrying about private key management, the account model or the onchain interactions with paymasters and bundlers. The Openfort platform is compatible with most EVM chains, including Base.
+
+## Pimlico
+
+[Pimlico](https://pimlico.io/) provides an infrastructure platform that makes building smart accounts simpler. If you are developing, an ERC-4337 smart account, they provide bundlers, verifying paymasters, ERC-20 paymasters, and much more.
+
+## Reown (prev. known as WalletConnect)
+
+**[Reown](https://reown.com/?utm_source=base&utm_medium=docs&utm_campaign=backlinks)** gives developers the tools to build user experiences that make digital ownership effortless, intuitive, and secure. One of Reown's offerings is the AppKit SDK.
+
+**AppKit** is a powerful, free, and fully open-source SDK for developers looking to integrate wallet connections and other Web3 functionalities into their apps on any EVM and non-EVM chain. In just a few simple steps, you can provide your users with seamless wallet access, one-click authentication, social logins, and notifications—streamlining their experience while enabling advanced features like on-ramp functionality, in-app token swaps and smart accounts. Check out the [docs](https://docs.reown.com/appkit/overview?utm_source=base&utm_medium=docs&utm_campaign=backlinks) to get started.
+
+## Safe
+
+[Safe](https://docs.safe.global/getting-started/readme) provides modular smart account infrastructure and account abstraction stack via their Safe{Core} [Account Abstraction SDK](https://docs.safe.global/safe-core-aa-sdk/safe-core-sdk), [API](https://docs.safe.global/safe-core-api/supported-networks), and [Protocol](https://docs.safe.global/safe-core-protocol/safe-core-protocol).
+
+## Stackup
+
+[Stackup](https://www.stackup.sh) provides smart account tooling for building account abstraction within your apps. They offer Paymaster and Bundler APIs for sponsoring gas and sending account abstraction transactions.
+
+## thirdweb
+[thirdweb](https://portal.thirdweb.com/typescript/v5/account-abstraction/get-started) offers the complete toolkit to leverage account abstraction technology to enable seamless user experiences for your users. This includes Account Factory contracts that let your users spin up Smart Accounts, Bundler for UserOps support, and Paymaster to enable gas sponsorships.
+
+## WalletKit
+
+[WalletKit](https://walletkit.com) is an all-in-one platform for adding smart, gasless wallets to your app. It has integrated support for ERC 4337 and comes with a paymaster and bundler included, requiring no extra setup.
+
+WalletKit also offers pre-built components for onboarding users with email and social logins, which can be integrated in under 15 minutes using their React SDK or the wagmi connector. Alternatively, build completely bespoke experiences for your users using WalletKit's Wallets API.
+
+WalletKit is compatible with most EVM chains, including Base. You can check out the [WalletKit documentation here](https://docs.walletkit.com). Start building for free on the Base testnet today.
+
+## ZeroDev
+
+[ZeroDev](https://zerodev.app) is an embedded wallet powered by account abstraction. It offers you the ability to create self-custody wallets for your users, sponsor gas, and simplify user flows by batching and automating transactions.
diff --git a/docs/base-chain/tools/base-products.mdx b/docs/base-chain/tools/base-products.mdx
new file mode 100644
index 00000000..b2420788
--- /dev/null
+++ b/docs/base-chain/tools/base-products.mdx
@@ -0,0 +1,24 @@
+---
+title: 'Base Products'
+---
+
+
+
+ Neque porro quisquam est qui dolorem ipsum quia dolor sit amet
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit
+
+
+ Ut enim ad minim veniam, quis nostrud exercitation ullamco
+
+
+ Excepteur sint occaecat cupidatat non proident
+
+
+ Excepteur sint occaecat cupidatat non proident
+
+
+ Excepteur sint occaecat cupidatat non proident
+
+
\ No newline at end of file
diff --git a/docs/base-chain/tools/block-explorers.mdx b/docs/base-chain/tools/block-explorers.mdx
new file mode 100644
index 00000000..3786139c
--- /dev/null
+++ b/docs/base-chain/tools/block-explorers.mdx
@@ -0,0 +1,59 @@
+---
+title: 'Block Explorers'
+description: Documentation for block explorers for the Base network.
+---
+
+## Arkham
+
+The Arkham [Platform](https://platform.arkhamintelligence.com/) supports Base.
+
+Arkham is a crypto intelligence platform that systematically analyzes blockchain transactions, showing users the people and companies behind blockchain activity, with a suite of advanced tools for analyzing their activity.
+
+## Blockscout
+
+A Blockscout explorer is available for [Base](https://base.blockscout.com/).
+
+Blockscout provides tools to help you debug smart contracts and transactions:
+
+- View, verify, and interact with smart contract source code.
+- View detailed transaction information
+
+A testnet explorer for [Base Sepolia](https://base-sepolia.blockscout.com/) is also available.
+
+## Etherscan
+
+An Etherscan block explorer is available for [Base](https://basescan.org).
+
+Etherscan provides tools to help you view transaction data and debug smart contracts:
+
+- Search by address, transaction hash, batch, or token
+- View, verify, and interact with smart contract source code
+- View detailed transaction information
+- View L1-to-L2 and L2-to-L1 transactions
+
+A testnet explorer for [Base Sepolia](https://sepolia.basescan.org/) is also available.
+
+## DexGuru
+
+[DexGuru](https://base.dex.guru) provides a familiar UI with data on transactions, blocks, account balances and more. Developers can use it to verify smart contracts and debug transactions with interactive traces and logs visualization.
+
+## L2scan Explorer
+
+[L2scan Explorer](https://base.l2scan.co/) is a web-based tool that allows users to analyze Base and other layer 2 networks. It provides a user-friendly interface for viewing transaction history, checking account balances, and tracking the status of network activity.
+
+## OKLink
+
+[OKLink](https://www.oklink.com/base) is a multi-chain blockchain explorer that supports Base and provides the following features for developers:
+
+- Search by address, transaction, block, or token
+- View, verify, and interact with smart contract source code
+- Access a comprehensive and real-time stream of on-chain data, including large transactions and significant fund movements
+- Address labels (i.e. project labels, contract labels, risk labels, black address labels, etc.)
+
+## Routescan
+
+[Routescan](https://routescan.io/) superchain explorer allows you to search for transactions, addresses, tokens, prices and other activities taking place across all Superchain blockchains, including Base.
+
+## Tenderly Explorer
+
+With the [Tenderly](https://tenderly.co/) developer explorer you can get unparalleled visibility into your smart contract code. You can easily view detailed transaction information, spot bugs in your code, and optimize gas spend. Supporting Base mainnet and Base Sepolia testnet, Tenderly Explorer helps you track your smart contracts while providing visibility on a granular level.
diff --git a/docs/base-chain/tools/cross-chain.mdx b/docs/base-chain/tools/cross-chain.mdx
new file mode 100644
index 00000000..371d8a94
--- /dev/null
+++ b/docs/base-chain/tools/cross-chain.mdx
@@ -0,0 +1,77 @@
+---
+title: Cross-chain
+description: Documentation for cross-chain communication and messaging on the Base network. This page covers integrating tools like LayerZero with Base for web3 transactions, cross-chain messaging, and secure blockchain communication.
+---
+
+import {HeaderNoToc} from "/snippets/headerNoToc.mdx";
+
+## Axelar
+
+[Axelar](https://axelar.network/) is an interchain platform that connects blockchains to enable universal web3 transactions. By integrating with Axelar, applications built on Base can now easily send messages and assets between the 49+ blockchains connected via Axelar.
+
+To learn more about Axelar visit our [docs](https://docs.axelar.dev/). For complete end-to-end examples demonstrating various Axelar use cases please visit the available [code examples](https://github.com/axelarnetwork/axelar-examples).
+
+
+
+- [Base Mainnet](https://docs.axelar.dev/resources/mainnet)
+- [Base Testnet](https://docs.axelar.dev/resources/testnet)
+
+#### Axelarscan
+
+To view current transactions and live stats about the Axelar network, please visit the [Axelarscan block explorer](https://axelarscan.io/)
+
+
+
+## Crossmint
+
+[Crossmint](https://crossmint.com/?utm_source=backlinks&utm_medium=docs&utm_campaign=base) allows you to create and deploy NFT Collections and enable cross-chain payments. This enables your users and customers to purchase an NFT from a collection deployed on Base using Ethereum or Solana tokens.
+
+Check out [Crossmint Docs](https://docs.crossmint.com/nft-checkout/introduction/?utm_source=backlinks&utm_medium=docs&utm_campaign=base) to learn more about NFT Checkout with Crossmint. To power cross-chain payments, click [here](https://docs.crossmint.com/nft-checkout/pay-button/select-payment-options/?utm_medium=docs&utm_source=backlinks&utm_campaign=base) to get started.
+
+
+
+- [Base Mainnet](https://www.crossmint.com/products/nft-checkout/?utm_source=backlinks&utm_medium=docs&utm_campaign=base)
+- [Base Sepolia](https://www.crossmint.com/products/nft-checkout/?utm_source=backlinks&utm_medium=docs&utm_campaign=base)
+
+
+
+## Chainlink CCIP
+
+[Chainlink CCIP](https://chain.link/cross-chain) is a secure interoperability protocol that allows for securely sending messages, transferring tokens, and initiating actions across different blockchains.
+
+To get started with integrating Chainlink CCIP in your Base project, visit the Chainlink CCIP [documentation](https://docs.chain.link/ccip).
+
+
+
+- [Base Mainnet](https://docs.chain.link/ccip/supported-networks/v1_0_0/mainnet#base-mainnet)
+- [Base Sepolia](https://docs.chain.link/ccip/supported-networks/v1_2_0/testnet) (Testnet)
+
+
+
+## LayerZero
+
+[LayerZero](https://layerzero.network/) is an omnichain interoperability protocol that enables cross-chain messaging. Applications built on Base can use the LayerZero protocol to connect to 35+ supported blockchains seamlessly.
+
+To get started with integrating LayerZero, visit the LayerZero [documentation](https://docs.layerzero.network/v1/developers/evm/evm-guides/send-messages) and provided examples on [GitHub](https://github.com/LayerZero-Labs/solidity-examples).
+
+
+
+- [Base Mainnet](https://docs.layerzero.network/v2/developers/evm/technical-reference/deployed-contracts#base)
+- [Base Sepolia](https://docs.layerzero.network/v2/developers/evm/technical-reference/deployed-contracts#base-sepolia) (Testnet)
+
+
+
+## Wormhole
+
+[Wormhole](https://wormhole.com/) is a generic messaging protocol that provides secure communication between blockchains.
+
+By integrating Wormhole, a Base application can access users and liquidity on > 30 chains and > 7 different platforms.
+
+See [this quickstart](https://docs.wormhole.com/wormhole/quick-start/tutorials/hello-wormhole) to get started with integrating Wormhole in your Base project.
+
+For more information on integrating Wormhole, visit their [documentation](https://docs.wormhole.com/wormhole/) and the provided [GitHub examples](https://github.com/wormhole-foundation/wormhole-examples).
+
+
+
+- [Base Mainnet](https://docs.wormhole.com/wormhole/blockchain-environments/evm#base)
+- [Base Sepolia](https://docs.wormhole.com/wormhole/blockchain-environments/evm#base) (Testnet)
diff --git a/docs/base-chain/tools/data-indexers.mdx b/docs/base-chain/tools/data-indexers.mdx
new file mode 100644
index 00000000..c1a93ac2
--- /dev/null
+++ b/docs/base-chain/tools/data-indexers.mdx
@@ -0,0 +1,209 @@
+---
+title: Data Indexers
+description: Documentation for data indexing platforms for Base network.
+---
+
+import {HeaderNoToc} from "/snippets/headerNoToc.mdx";
+
+## Allium
+
+[Allium](https://www.allium.so/) is an Enterprise Data Platform that serves accurate, fast, and simple blockchain data. Currently serving 15 blockchains and over 100+ schemas, Allium offers near real-time Base data for infrastructure needs and enriched Base data (NFT, DEX, Decoded, Wallet360) for research and analytics.
+
+Allium supports data delivery to multiple [destinations](https://docs.allium.so/integrations/overview), including Snowflake, Bigquery, Databricks, and AWS S3.
+
+Documentation:
+
+- [Real-time](https://docs.allium.so/real-time-data/base)
+- [Batch-enriched](https://docs.allium.so/data-tables/base)
+
+To get started, contact Allium [here](https://www.allium.so/contact).
+
+## Arkham
+
+[Arkham](https://platform.arkhamintelligence.com/) is a crypto intelligence platform that systematically analyzes blockchain transactions, showing users the people and companies behind blockchain activity, with a suite of advanced tools for analyzing their activity.
+
+References:
+
+- [Platform guide](https://www.arkhamintelligence.com/guide)
+- [Whitepaper](https://www.arkhamintelligence.com/whitepaper)
+- [Codex](https://codex.arkhamintelligence.com/)
+- [Demos](https://www.youtube.com/@arkhamintel)
+
+
+
+## Covalent
+
+[Covalent](https://www.covalenthq.com/?utm_source=base&utm_medium=partner-docs) is a hosted blockchain data solution providing access to historical and current on-chain data for [100+ supported blockchains](https://www.covalenthq.com/docs/networks/?utm_source=base&utm_medium=partner-docs), including [Base](https://www.covalenthq.com/docs/networks/base/?utm_source=base&utm_medium=partner-docs).
+
+Covalent maintains a full archival copy of every supported blockchain, meaning every balance, transaction, log event, and NFT asset data is available from the genesis block. This data is available via:
+
+1. [Unified API](https://www.covalenthq.com/docs/unified-api/?utm_source=base&utm_medium=partner-docs) - Incorporate blockchain data into your app with a familiar REST API
+2. [Increment](https://www.covalenthq.com/docs/increment/?utm_source=base&utm_medium=partner-docs) - Create and embed custom charts with no-code analytics
+
+To get started, [sign up](https://www.covalenthq.com/platform/?utm_source=base&utm_medium=partner-docs) and visit the [developer documentation](https://www.covalenthq.com/docs/?utm_source=base&utm_medium=partner-docs).
+
+
+
+- [Base Mainnet](https://www.covalenthq.com/docs/networks/base/?utm_source=base&utm_medium=partner-docs)
+- [Base Sepolia](https://www.covalenthq.com/docs/networks/base/?utm_source=base&utm_medium=partner-docs) (Testnet)
+
+
+
+## DipDup
+[DipDup](https://dipdup.io) is a Python framework for building smart contract indexers. It helps developers focus on business logic instead of writing a boilerplate to store and serve data. DipDup-based indexers are selective, which means only required data is requested. This approach allows to achieve faster indexing times and decreased load on underlying APIs.
+
+To get started, visit the [documentation](https://dipdup.io/docs/supported-networks/base) or follow the [quickstart](https://dipdup.io/docs/quickstart-evm) guide.
+
+
+
+## Envio
+
+[Envio](https://envio.dev) is a full-featured data indexing solution that provides application developers with a seamless and efficient way to index and aggregate real-time and historical blockchain data for any EVM. The indexed data is easily accessible through custom GraphQL queries, providing developers with the flexibility and power to retrieve specific information.
+
+Envio [HyperSync](https://docs.envio.dev/docs/hypersync) is an indexed layer of the Base blockchain for the hyper-speed syncing of historical data (JSON-RPC bypass). What would usually take hours to sync ~100,000 events can now be done in the order of less than a minute.
+
+Designed to optimize the user experience, Envio offers automatic code generation, flexible language support, multi-chain data aggregation, and a reliable, cost-effective hosted service.
+
+To get started, visit the [documentation](https://docs.envio.dev/docs/overview) or follow the [quickstart](https://docs.envio.dev/docs/quickstart) guide.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+
+
+## GhostGraph
+
+[GhostGraph](https://ghostgraph.xyz/) makes it easy to build blazingly fast indexers (subgraphs) for smart contracts.
+
+GhostGraph is the first indexing solution that lets you write your index transformations in **Solidity**. Base dApps can query data with GraphQL using our hosted endpoints.
+
+To get started, you can [sign up for an account](https://app.ghostlogs.xyz/ghostgraph/sign-up) and follow [this quickstart](https://docs.ghostlogs.xyz/category/-getting-started-1) guide on how to create, deploy, and query a GhostGraph.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+
+
+## The Indexing Company
+
+[The Indexing Company](https://www.indexing.co/) provides indexing as a service, capable of indexing any chain (EVM and non-EVM) with an RPC endpoint and integrating off-chain data within the same infrastructure.
+
+Our services include data transformations, aggregations, and streamlined data flows, allowing teams to develop their products faster while saving on developer resources, time, and money. Our solution is ideal for teams needing advanced data engineering for modular chain setups, multi-chain products, L1/L2/L3 chains and AI.
+
+To get started contact us [here](https://www.indexing.co/get-in-touch).
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+
+
+## Moralis
+
+[Moralis](https://moralis.io/?utm_source=base-docs&utm_medium=partner-docs) offers comprehensive data APIs for crypto, offering both indexed and real-time data across 15+ chains. Moralis' APIs include portfolio and wallet balances, NFT data, token data, price data, candlestick data, net worth data, and a lot more. All of the data is enriched with things like metadata, parsed events and address labels.
+
+To get started with Moralis, you can [sign up for an account](https://moralis.io/?utm_source=base-docs&utm_medium=partner-docs), visit the Moralis [documentation](https://docs.moralis.io/?utm_source=base-docs&utm_medium=partner-docs), or check out their tutorials on [Youtube](https://www.youtube.com/c/MoralisWeb3).
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+
+
+## Nexandria
+
+[Nexandria](https://www.nexandria.com/?utm_source=base-docs&utm_medium=partner-docs) API offers access to complete historical on-chain data at blazing speeds, arbitrary granularity (as low as block-level) and at viable unit economics (think web2 level costs). Our technology lets you generate subgraphs on the fly, unlocking unique endpoints like a statement of all the balance transfers for all the tokens, or a list of all the neighbors of an address with all the historical interaction details or a portfolio balance graph covering all the tokens across arbitrary time/block ranges.
+
+References:
+
+- [API Documentation](https://docs.nexandria.com/)
+- [Sign-up](https://www.nexandria.com/api)
+
+
+
+- Base Mainnet
+
+
+
+## Shovel
+
+[Shovel](https://indexsupply.com/shovel) is an [open source](https://github.com/indexsupply/code) tool for synchronizing Ethereum data to your Postgres database. Shovel can index block data, transaction data, and decoded event data. A single Shovel can index multiple chains simultaneously. Shovel is configured via a declarative JSON config file – no custom functions to save indexed data to your database.
+
+Find out more in the [Shovel Docs](https://indexsupply.com/shovel/docs/)
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+
+
+## Subsquid
+
+[Subsquid](https://subsquid.io/) is a decentralized hyper-scalable data platform optimized for providing efficient, permissionless access to large volumes of data.
+It currently serves historical on-chain data, including event logs, transaction receipts, traces, and per-transaction state diffs.
+Subsquid offers a powerful toolkit for creating custom data extraction and processing pipelines, achieving an indexing speed of up to 150k blocks per second.
+
+To get started, visit the [documentation](https://docs.subsquid.io/) or see this [quickstart with examples](https://docs.subsquid.io/sdk/examples/) on how to easily create subgraphs via Subsquid.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+
+
+## SubQuery
+
+[SubQuery](https://subquery.network/) is a data indexer that provides developers with fast, reliable, decentralized, and customized APIs for accessing rich indexed data from over 80+ ecosystems (including Base) within their projects.
+
+SubQuery provides the ability to aggregate this data across multiple blockchains, all within a single project.
+
+Other advantages of SubQuery includes performance with multiple RPC endpoint configurations, multi-worker capabilities and a configurable caching architecture.
+
+To get started, visit the [developer documentation](https://academy.subquery.network/) or follow [this step-by-step guide](https://academy.subquery.network/quickstart/quickstart_chains/base.html) on how to index any smart contract on Base.
+
+
+
+- [Base Mainnet](https://academy.subquery.network/quickstart/quickstart_chains/base.html)
+- Base Sepolia (Testnet)
+
+
+
+## The Graph
+
+[The Graph](https://thegraph.com/) is an indexing protocol that provides an easy way to query blockchain data through APIs known as subgraphs.
+
+With The Graph, you can benefit from:
+ - **Decentralized Indexing**: Enables indexing blockchain data through multiple indexers, thus eliminating any single point of failure
+ - **GraphQL Queries**: Provides a powerful GraphQL interface for querying indexed data, making data retrieval super simple.
+ - **Customization**: Define your own logic for transforming & storing blockchain data. Reuse subgraphs published by other developers on The Graph Network.
+
+Follow this [quick-start](https://thegraph.com/docs/en/quick-start/) guide to create, deploy, and query a subgraph within 5 minutes.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+See [all supported networks](https://thegraph.com/docs/en/#supported-networks)
+
+
+## Flair
+
+[Flair](https://flair.dev) is a real-time and historical custom data indexing for any EVM chain.
+
+It offers reusable **indexing primitives** (such as fault-tolerant RPC ingestors, custom processors and aggregations, re-org aware database integrations) to make it easy to receive, transform, store and access your on-chain data.
+
+To get started, visit the [documentation](https://docs.flair.dev) or clone the [starter boilerplate](https://github.com/flair-sdk/starter-boilerplate) template and follow the instructions.
+
+
+
+- [Base Mainnet](https://docs.flair.dev/reference/manifest.yml)
+- [Base Sepolia](https://docs.flair.dev/reference/manifest.yml) (Testnet)
diff --git a/docs/base-chain/tools/network-faucets.mdx b/docs/base-chain/tools/network-faucets.mdx
new file mode 100644
index 00000000..94bc3331
--- /dev/null
+++ b/docs/base-chain/tools/network-faucets.mdx
@@ -0,0 +1,75 @@
+---
+title: 'Network Faucets'
+description: Documentation for Testnet Faucets for the Base network. Details how to obtain Base testnet ETH.
+---
+
+## Coinbase Developer Platform
+
+The [Coinbase Developer Platform Faucet](https://portal.cdp.coinbase.com/products/faucet) provides free testnet ETH on Base Sepolia - one claim per 24 hours.
+
+
+Requests to Coinbase Developer Platform's Faucet are limited to one claim per 24 hours.
+
+
+
+## thirdweb Faucet
+
+The [thirdweb Faucet](https://thirdweb.com/base-sepolia-testnet) provides free testnet ETH on Base Sepolia - one claim per 24 hours.
+
+
+The thirdweb faucet allows developers to connect their wallet through EOA or social logins and claim Base Sepolia testnet funds.
+
+
+
+## Superchain Faucet
+
+The [Superchain Faucet](https://app.optimism.io/faucet) provides testnet ETH for all OP Chains, including Base.
+
+
+The Superchain faucet allows developers to authenticate via their onchain identity. Developers that choose to authenticate via their onchain identity can claim more testnet ETH versus traditional faucets. For more information, see the [FAQ](https://app.optimism.io/faucet).
+
+
+
+## Alchemy Faucet
+
+The [Alchemy Faucet](https://basefaucet.com/) is a fast and reliable network faucet that allows users with a free Alchemy account to request testnet ETH on Base Sepolia.
+
+
+Requests to Alchemy's Base Sepolia Faucet are limited to one claim per 24 hours.
+
+
+
+## Bware Labs Faucet
+
+[Bware Labs Faucet](https://bwarelabs.com/faucets) is an easy to use faucet with no registration required. You can use Bware Labs Faucet to claim Base Sepolia testnet ETH for free - one claim per 24 hours.
+
+
+Requests to Bware Labs Faucet are limited to one claim per 24 hours.
+
+
+
+## QuickNode Faucet
+
+[QuickNode Faucet](https://faucet.quicknode.com/drip) is an easy to use Multi-Chain Faucet. You can use QuickNode Faucet to claim Base Sepolia testnet ETH for free - one drip per network every 12 hours.
+
+
+Requests to QuickNode Faucet are limited to one drip every 12 hours.
+
+
+
+## LearnWeb3 Faucet
+
+[LearnWeb3 Faucet](https://learnweb3.io/faucets/base_sepolia) is a multi-chain faucet by LearnWeb3. You can use the LearnWeb3 faucet to claim Base Sepolia testnet ETH for free - one claim every 24 hours.
+
+
+Requests to LearnWeb3 faucet are limited to one claim per 24 hours.
+
+
+
+## Ethereum Ecosystem Faucet
+
+The [Base Sepolia Faucet](https://www.ethereum-ecosystem.com/faucets/base-sepolia) is a free & easy to use testnet faucet for Base Sepolia with very generous drips that doesn't require users to log in. It's run by [Ethereum Ecosystem](https://www.ethereum-ecosystem.com).
+
+
+Each wallet is restricted to receiving 0.5 ETH from this faucet every 24 hours.
+
diff --git a/docs/base-chain/tools/node-providers.mdx b/docs/base-chain/tools/node-providers.mdx
new file mode 100644
index 00000000..86e65f29
--- /dev/null
+++ b/docs/base-chain/tools/node-providers.mdx
@@ -0,0 +1,197 @@
+---
+title: 'Node Providers'
+description: Documentation for Node Providers for the Base network. Including details on their services, supported networks, and pricing plans.
+---
+
+import {HeaderNoToc} from "/snippets/headerNoToc.mdx";
+
+## Coinbase Developer Platform (CDP)
+
+[CDP](https://portal.cdp.coinbase.com/) provides an RPC endpoint that runs on the same node infrastructure that powers Coinbase's retail exchange, meaning you get the rock solid reliability of our retail exchange as a developer. CDP gives you a free, rate limited RPC endpoint to begin building on Base.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## 1RPC
+
+[1RPC](https://1rpc.io/) is the first and only on-chain attested privacy preserving RPC that eradicates metadata exposure and leakage when interacting with blockchains. 1RPC offers free and [paid plans](https://www.1rpc.io/#pricing) with additional features and increased request limits.
+
+
+
+- Base Mainnet
+
+## Alchemy
+
+[Alchemy](https://www.alchemy.com/base) is a popular API provider and developer platform. Its robust, free tier offers access to enhanced features like SDKs, [JSON-RPC APIs](https://docs.alchemy.com/reference/base-api-quickstart), and hosted mainnet and testnet nodes for Base.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## All That Node
+
+[All That Node](https://www.allthatnode.com/base.dsrv) is a comprehensive multi-chain development suite, designed to support multiple networks from a single platform. They offer free and [paid plans](https://www.allthatnode.com/pricing.dsrv) with additional features and increased request limits.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## Ankr
+
+[Ankr](https://www.ankr.com/rpc/base/) provides private and public RPC endpoints for Base, powered by a globally distributed and decentralized network of nodes. They offer free and [paid plans](https://www.ankr.com/rpc/pricing/) with increased request limits.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## Blast
+
+[Blast](https://blastapi.io/public-api/base) provides fast and reliable decentralized blockchain APIs by partnering with third-party Node Providers. Blast offers users the ability to generate their own [dedicated RPC endpoint for Base](https://blastapi.io/login).
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## Blockdaemon
+
+[Blockdaemon](https://www.blockdaemon.com/protocols/base/) offers access to hosted Base nodes with a free plan at $0/month via the Ubiquity Data API Suite. Extra costs may be incurred depending on usage.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## BlockPI
+
+[BlockPI](https://blockpi.io/) is a high-quality, robust, and efficient RPC service network that provides access to Base nodes with [free and paid plans](https://docs.blockpi.io/documentations/pricing).
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## Chainstack
+
+[Chainstack](https://chainstack.com/build-better-with-base/) allows developers to run high-performing Base nodes and APIs in minutes. They offer elastic Base RPC nodes that provide personal, geographically diverse, and protected API endpoints, as well as archive nodes to query the entire history of the Base Mainnet. Get started with their [free and paid pricing plans](https://chainstack.com/pricing/).
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## DRPC
+
+[DRPC](https://drpc.org/) offers access to a distributed network of independent third-party partners and public nodes for Base. They provide a free tier that allows for an unlimited amount of requests over public nodes, or a paid tier which provides access to all providers, as well as other additional features.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## GetBlock
+
+[GetBlock](https://getblock.io/nodes/base/) is a Blockchain-as-a-Service (BaaS) platform that provides instant API access to full nodes for Base. They offer free, pay per use, and unlimited pricing plans.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## NodeReal
+
+[NodeReal](https://nodereal.io/) is a blockchain infrastructure and services provider that provides instant and easy-access to Base node APIs.
+
+
+
+- Base Mainnet
+
+## Nodies DLB
+
+[Nodies DLB](https://nodies.app) provides highly performant RPC Services for Base, as well as all other OP-stacked chains. They offer free public endpoints, Pay-As-You-Go, and enterprise pricing plans.
+
+
+
+- Base Mainnet
+- Base Testnet (Available on request)
+
+## NOWNodes
+
+[NOWNodes](https://nownodes.io/nodes/basechain-base) is a Web3 development tool that provides shared and dedicated no rate-limit access to Base RPC full nodes.
+
+
+
+- Base Mainnet
+
+## OnFinality
+
+[OnFinality](https://onfinality.io) provides high performance archive access to Base Mainnet and Base Sepolia, with a generous free tier and high rate limits, as well as Trace and Debug APIs, available to [paid plans](https://onfinality.io/pricing).
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## QuickNode
+
+[QuickNode](https://www.quicknode.com/chains/base) offers access to hosted Base nodes as part of their free Discover Plan. You can configure add-ons, like "Trace Mode" and "Archive Mode" for an additional cost by upgrading to one of their paid plans.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## RockX
+
+[RockX](https://access.rockx.com) offers a global blockchain node network and developer tools for onchain innovation. Start with our free [Base RPC](https://access.rockx.com/product/base-blockchain-api-for-web3-builders) to access institutional-grade solutions.
+
+
+
+- Base Mainnet
+
+## Stackup
+
+[Stackup](https://www.stackup.sh/) is a leading ERC-4337 infrastructure platform. You can access hosted Base nodes with built-in [account abstraction tools](https://docs.stackup.sh/docs) like bundlers and paymasters.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## SubQuery
+
+[SubQuery](https://subquery.network/rpc) is a globally distributed, decentralized network of RPC nodes, offering generous free public endpoints and higher access through Flex Plans
+
+
+
+- Base Mainnet
+
+## Tenderly Web3 Gateway
+
+[Tenderly Web3 Gateway](https://tenderly.co/web3-gateway) provides a fast and reliable hosted node solution with a built-in suite of developer tooling and infrastructure building blocks covering your whole development lifecycle. Develop, test, deploy, and monitor your onchain app on the Base network with both [free and paid plans](https://tenderly.co/pricing).
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## Unifra
+
+[Unifra](https://base.unifra.io/) is a Web3 developer platform that provides tools, APIs, and node infrastructure, and provides access to Base nodes that are nodes are reliable, scalable, and easy to use.
+
+
+
+- Base Mainnet
+
+## Validation Cloud
+
+[Validation Cloud](https://app.validationcloud.io/) is the world’s fastest node provider according to Compare Nodes. With 50 million compute units available for use without a credit card and a scale tier that never has rate limits, Validation Cloud is built to support your most rigorous and low-latency workloads.
+
+
+
+- Base Mainnet
diff --git a/docs/base-chain/tools/onchain-registry-api.mdx b/docs/base-chain/tools/onchain-registry-api.mdx
new file mode 100644
index 00000000..09abc735
--- /dev/null
+++ b/docs/base-chain/tools/onchain-registry-api.mdx
@@ -0,0 +1,157 @@
+---
+title: Onchain Registry API
+description: Documentation for the Onchain Registry API.
+---
+
+
+The base url for our API endpoints is [https://base.org/api/registry/](https://base.org/api/registry/). The use of Onchain Registry API is governed by the license terms outlined in our [Terms & Conditions](#terms--conditions).
+
+
+
+## Instructions
+
+1. Users of this API can use the `/entries` and `/featured` endpoints to display Onchain Registry entries on their own surfaces
+2. If your team would like to use referral codes to point your users to entries, we recommend appending your referral code to the link provided in the `target_url` field
+3. If your team would like to filter entries based on where they are hosted or by creator, we recommend implementing logic based on the `target_url` and `creator_name` fields
+
+## Endpoints
+
+### GET /entries
+
+This endpoint will display all Onchain Registry entries subject to any query parameters set below
+
+#### Query Parameters
+
+| Name | Type | Description |
+| :------- | :----- | :------------------------------------------------------------------------------------------------------------- |
+| page | number | The page number (default 1) |
+| limit | number | The number of entries per page (default 10) |
+| category | array | The category or categories of the entries of interest (Options: Games, Social, Creators, Finance, Media) |
+| curation | string | The entry's level of curation (Options: Featured, Curated, Community) |
+
+#### Response
+
+```json [JSON]
+{
+ "data": [
+ {
+ "id": "7AsRdN8uf601fCkH1e084F",
+ "category": "Creators",
+ "content": {
+ "title": "Based Project",
+ "short_description": "Short description of this based project with max char count of 30",
+ "full_description": "Full description of this based project with max char count of 200",
+ "image_url": "https://base.org/image.png",
+ "target_url": "https://base.org/target-page",
+ "cta_text": "Mint",
+ "function_signature": "mint(uint256)",
+ "contract_address": "0x1FC10ef15E041C5D3C54042e52EB0C54CB9b710c",
+ "token_id": "2",
+ "token_amount": "0.01",
+ "featured": true,
+ "creator_name": "Base",
+ "creator_image_url": "https://base.org/creator-image.png",
+ "curation": "featured",
+ "start_ts": "2024-06-25T04:00:00Z",
+ "expiration_ts": "2024-07-29T00:00:00Z"
+ },
+ "updated_at": null,
+ "created_at": "2024-07-10T18:20:42.000Z"
+ },
+ {
+ "id": "8fRbdN8uf601fCkH1e084F",
+ "category": "Games",
+ "content": {
+ "title": "Based Project II",
+ "short_description": "Short description of this second based project with max char count of 30",
+ "full_description": "Full description of this second based project with max char count of 200",
+ "image_url": "https://base.org/image2.png",
+ "target_url": "https://base.org/second-target-page",
+ "cta_text": "Mint",
+ "function_signature": "mint(uint256)",
+ "contract_address": "0x1FC10ef15E041C5D3C54042e52EB0C54CB9b710c",
+ "token_id": "1",
+ "token_amount": "0.005",
+ "featured": false,
+ "creator_name": "Base",
+ "creator_image_url": "https://base.org/creator-image2.png",
+ "curation": "community",
+ "start_ts": "2024-06-25T04:00:00Z",
+ "expiration_ts": "2024-07-29T00:00:00Z"
+ },
+ "updated_at": "2024-07-11T18:20:42.000Z",
+ "created_at": "2024-07-10T18:20:42.000Z"
+ }
+ ],
+ "pagination": {
+ "total_records": 2,
+ "current_page": 1,
+ "total_pages": 1,
+ "limit": 10
+ }
+}
+```
+
+### GET /featured
+
+This endpoint will display a single Onchain Registry entry that is being actively featured
+
+#### Response
+
+```json [JSON]
+{
+ "data": {
+ "id": "7AsRdN8uf601fCkH1e084F",
+ "category": "Creators",
+ "content": {
+ "title": "Based Project",
+ "short_description": "Short description of this based project with max char count of 30",
+ "full_description": "Full description of this based project with max char count of 200",
+ "image_url": "https://base.org/image.png",
+ "target_url": "https://base.org/target-page",
+ "cta_text": "Mint",
+ "function_signature": "mint(uint256)",
+ "contract_address": "0x1FC10ef15E041C5D3C54042e52EB0C54CB9b710c",
+ "token_id": "2",
+ "token_amount": "0.01",
+ "featured": true,
+ "creator_name": "Base",
+ "creator_image_url": "https://base.org/creator-image.png",
+ "curation": "featured",
+ "start_ts": "2024-06-25T04:00:00Z",
+ "expiration_ts": "2024-07-29T00:00:00Z"
+ },
+ "updated_at": null,
+ "created_at": "2024-07-10T18:20:42.000Z"
+ }
+}
+```
+
+## Entry Schema
+
+| Name | Type | Description |
+| :----------------- | :--------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| id | string | Unique entry ID |
+| category | string | The category of the entry (Options: Games, Social, Creators, Finance, Media) |
+| title | string | The title of the entry |
+| short_description | string | Short version of the entry description (max 30 char) |
+| full_description | string | Full version of the entry description (max 200 char) |
+| image_url | string | URL of the entry's featured image |
+| target_url | string | URL for the entry's desired user action |
+| cta_text | string | This is the type of user action for the entry (Options: Play, Mint, Buy, Trade, Explore) |
+| function_signature | string | The function signature associated with the desired user action on the entry's contract |
+| contract_address | string | The contract address associated with the entry |
+| token_id | string | The token ID if this is an ERC-1155 |
+| token_amount | string | The price of the entry's desired user action |
+| featured | boolean | A true or false based on whether the entry is actively featured |
+| creator_name | string | The name of the entry's creator |
+| creator_image_url | string | The logo of the entry's creator |
+| curation | string | The entry's level of curation
Options:
Featured - one entry per day with top placement
Curated - community entries being
Community - all other community entries
|
+| start_ts | string | The UTC timestamp that the entry is open to users |
+| expiration_ts | string | The UTC timestamp that the entry is no longer open to users |
+| updated_at | string \|\| null | The UTC timestamp that the entry was last updated (null if the entry has not been updated since creation) |
+| created_at | string | The UTC timestamp that the entry was created |
+
+## Terms & Conditions
+
+We grant third parties a non-exclusive, worldwide, royalty-free license to use the Onchain Registry API solely for the purpose of integrating it into their applications or services. This license does not extend to any data or content accessed through the Onchain API, which remains the sole responsibility of the third party. By using the Onchain Registry API, third parties agree to comply with our license terms and any applicable laws and regulations as set forth in Coinbase Developer Platform Terms of Service. We make no warranties regarding the Onchain Registry API, and users accept all risks associated with its use. The Onchain App Registry API is an Early Access Product per Section 18 of the [Coinbase Developer Platform Terms of Service](https://www.coinbase.com/legal/developer-platform/terms-of-service) and the Coinbase [Prohibited Use Policy](https://www.coinbase.com/legal/prohibited_use), and all terms and conditions therein govern your use of the Onchain Registry API.
diff --git a/docs/base-chain/tools/onramps.mdx b/docs/base-chain/tools/onramps.mdx
new file mode 100644
index 00000000..0ca03ec3
--- /dev/null
+++ b/docs/base-chain/tools/onramps.mdx
@@ -0,0 +1,28 @@
+---
+title: Onramps
+description: Documentation for fiat-to-crypto onramps for the Base network.
+---
+
+## Coinbase Onramp
+
+[Coinbase Onramp](https://www.coinbase.com/developer-platform/products/onramp) is a fiat-to-crypto onramp that allows users to buy or transfer crypto directly from self-custody wallets and apps. Coinbase Onramp supports 60+ fiat currencies with regulatory compliance and licensing, as well as 100+ cryptocurrencies, including ETH on Base. [Get started here](https://docs.cdp.coinbase.com/onramp/docs/getting-started/) to use the Coinbase Developer Platform.
+
+## MoonPay
+
+[MoonPay](https://www.moonpay.com/business/onramps) is a crypto onramp that provides global coverage, seamless revenue sharing, and zero risk of fraud or chargebacks. MoonPay supports 30+ fiat currencies and 110+ cryptocurrencies, including ETH on Base.
+
+## Onramp
+
+[Onramp](https://onramp.money/) is a fiat-to-crypto payment gateway, which helps users seamlessly convert fiat currency to the desired cryptocurrency. Onramp currently supports 300+ cryptocurrencies and 20+ blockchain networks, including ETH on Base.
+
+## Ramp
+
+[Ramp](https://ramp.network/) is an onramp and offramp that empowers users to buy & sell crypto inside your app. Ramp supports 40+ fiat currencies and 90+ crypto assets, including ETH on Base.
+
+## Transak
+
+[Transak](https://transak.com/) is a developer integration toolkit to let users buy/sell crypto in any app, website or web plugin. It is available across 170 cryptocurrencies on 75+ blockchains, including ETH on Base.
+
+## Alchemy Pay
+
+[Alchemy Pay](https://ramp.alchemypay.org/) (ACH) is a payment solutions provider that seamlessly connects fiat and crypto economies for global consumers, merchants, developers, and institutions.
diff --git a/docs/base-chain/tools/oracles.mdx b/docs/base-chain/tools/oracles.mdx
new file mode 100644
index 00000000..ec696f67
--- /dev/null
+++ b/docs/base-chain/tools/oracles.mdx
@@ -0,0 +1,141 @@
+---
+title: Oracles
+description: Documentation for various blockchain oracles for Base. Including support for price feeds and verifiable random functions (VRF).
+---
+
+import {HeaderNoToc} from "/snippets/headerNoToc.mdx";
+
+
+## API3
+
+The API3 Market provides access to 200+ price feeds on [Base Mainnet](https://market.api3.org/base) and [Base Testnet](https://market.api3.org/base-sepolia-testnet). The price feeds operate as a native push oracle and can be activated instantly via the Market UI.
+
+The price feeds are delivered by an aggregate of [first-party oracles](https://docs.api3.org/explore/airnode/why-first-party-oracles.html) using signed data and support [OEV recapture](https://docs.api3.org/explore/introduction/oracle-extractable-value.html).
+
+Unlike traditional data feeds, reading [API3 price feeds](https://docs.api3.org/guides/dapis/) enables dApps to auction off the right to update the price feeds to searcher bots which facilitates more efficient liquidation processes for users and LPs of DeFi money markets. The OEV recaptured is returned to the dApp.
+
+Apart from data feeds, API3 also provides [Quantum Random Number Generation](https://docs.api3.org/explore/qrng/) on Base Mainnet and Testnet. QRNG is a free-to-use service that provides quantum randomness onchain. It is powered by [Airnode](https://docs.api3.org/reference/airnode/latest/understand/), the first-party oracle that is directly operated by the [QRNG API providers](https://docs.api3.org/reference/qrng/providers.html). Read more about QRNG [here](https://docs.api3.org/reference/qrng).
+
+Check out these guides to learn more:
+
+- [dAPIs](https://docs.api3.org/guides/dapis/subscribing-to-dapis/): First-party aggregated data feeds sourced directly from the data providers.
+- [Airnode](https://docs.api3.org/guides/airnode/calling-an-airnode/): The first-party serverless Oracle solution to bring any REST API onchain.
+- [QRNG](https://docs.api3.org/guides/qrng/): Quantum Random Number Generator for verifiable quantum RNG onchain.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## Chainlink
+
+[Chainlink](https://chain.link/) provides a number of [price feeds](https://docs.chain.link/data-feeds/price-feeds/addresses/?network=base) for Base.
+
+See [this guide](https://docs.chain.link/docs/get-the-latest-price/) to learn how to use the Chainlink feeds.
+
+
+To use Chainlink datafeeds, you may need [LINK](https://docs.chain.link/resources/link-token-contracts?parent=dataFeeds) token.
+
+
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## Chronicle
+
+[Chronicle](https://chroniclelabs.org/) provides a number of [Oracles](https://chroniclelabs.org/dashboard) for Base.
+
+See [this guide](https://docs.chroniclelabs.org/Builders/tutorials/Remix) to learn how to use the Chronicle Oracles.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## DIA
+
+[DIA](https://www.diadata.org/) provides 2000+ [price feeds](https://www.diadata.org/app/price/) for Base.
+See [this guide](https://docs.diadata.org/introduction/intro-to-dia-oracles/request-an-oracle) to learn how to use the DIA feeds.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## Gelato
+
+Gelato VRF (Verifiable Random Function) provides a unique system offering trustable randomness on Base.
+
+See this guide to learn how to get started with [Gelato VRF](https://docs.gelato.network/web3-services/vrf/quick-start).
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
+
+## ORA
+
+[ORA](https://ora.io) provides an [Onchain AI Oracle](https://docs.ora.io/doc/oao-onchain-ai-oracle/introduction) for Base.
+
+See [this guide](https://docs.ora.io/doc/oao-onchain-ai-oracle/develop-guide/tutorials/interaction-with-oao-tutorial) to learn how to use ORA Onchain AI Oracle.
+
+
+
+- Base Mainnet
+
+## Pyth
+
+The [Pyth Network](https://pyth.network/) is one of the largest first-party Oracle network, delivering real-time data across [a vast number of chains](https://docs.pyth.network/price-feeds/contract-addresses). Pyth introduces an innovative low-latency [pull oracle design](https://docs.pyth.network/documentation/pythnet-price-feeds/on-demand), where users can pull price updates onchain when needed, enabling everyone in the onchain environment to access that data point most efficiently. Pyth network updates the prices every **400ms**, making Pyth one of the fastest onchain oracles.
+
+### Pyth Price Feeds Features:
+
+- 400ms latency
+- Efficient and cost-effective Oracle
+- [First-party](https://pyth.network/publishers) data sourced directly from financial institutions
+- [Price feeds ranging from Crypto, Stock, FX, Metals](https://pyth.network/developers/price-feed-ids)
+- [Available on all major chains](https://docs.pyth.network/price-feeds/contract-addresses)
+
+ for Base (Pyth Price Feeds):
+- Base Mainnet: [`0x8250f4aF4B972684F7b336503E2D6dFeDeB1487a`](https://basescan.org/address/0x8250f4aF4B972684F7b336503E2D6dFeDeB1487a)
+- Base Sepolia: [`0xA2aa501b19aff244D90cc15a4Cf739D2725B5729`](https://base-sepolia.blockscout.com/address/0xA2aa501b19aff244D90cc15a4Cf739D2725B5729)
+
+### Pyth Entropy
+Pyth Entropy allows developers to quickly and easily generate secure **random numbers** onchain.
+
+Check [how to generate random numbers in EVM contracts](https://docs.pyth.network/entropy/generate-random-numbers/evm) for a detailed walkthrough.
+
+ for Base (Pyth Entropy):
+- Base Mainnet: [`0x6E7D74FA7d5c90FEF9F0512987605a6d546181Bb`](https://basescan.org/address/0x6E7D74FA7d5c90FEF9F0512987605a6d546181Bb)
+- Base Sepolia: [`0x41c9e39574F40Ad34c79f1C99B66A45eFB830d4c`](https://base-sepolia.blockscout.com/address/0x41c9e39574F40Ad34c79f1C99B66A45eFB830d4c)
+
+Check out the following links to get started with Pyth.
+
+- [Pyth Price Feed EVM Integration Guide](https://docs.pyth.network/price-feeds/use-real-time-data/evm)
+- [Pyth Docs](https://docs.pyth.network/home)
+- [Pyth Price Feed API Reference](https://api-reference.pyth.network/price-feeds/evm/getPrice)
+- [Pyth Examples](https://github.com/pyth-network/pyth-examples)
+- [Website](https://pyth.network/)
+- [Twitter](https://x.com/PythNetwork)
+
+## RedStone
+
+[RedStone](https://redstone.finance/) provides 1200+ [price feeds](https://app.redstone.finance/) for Base.
+
+See [this guide](https://docs.redstone.finance/) to learn how to use the RedStone feeds.
+
+
+
+- Base Mainnet
+
+## Supra
+
+[Supra](https://supraoracles.com) provides VRF and decentralized oracle price feeds that can be used for onchain and offchain use-cases such as spot and perpetual DEXes, lending protocols, and payments protocols. Supra’s oracle chain and consensus algorithm makes it one of the fastest-to-finality oracle providers, with layer-1 security guarantees. The pull oracle has a sub-second response time. Aside from speed and security, Supra’s rotating node architecture gathers data from 40+ data sources and applies a robust calculation methodology to get the most accurate value. The node provenance on the data dashboard also provides a fully transparent historical audit trail. Supra’s Distributed Oracle Agreement (DORA) paper was accepted into ICDCS 2023, the oldest distributed systems conference.
+
+Visit the Supra [documentation](https://supraoracles.com/docs/) to learn more about integrating Supra's oracle and VRF into your Base project.
+
+
+
+- Base Mainnet
+- Base Sepolia (Testnet)
diff --git a/docs/base-chain/tools/tokens-in-wallet.mdx b/docs/base-chain/tools/tokens-in-wallet.mdx
new file mode 100644
index 00000000..a69268ea
--- /dev/null
+++ b/docs/base-chain/tools/tokens-in-wallet.mdx
@@ -0,0 +1,129 @@
+---
+title: Tokens in Coinbase Wallet
+---
+# How to ensure ERC-20 tokens show in Coinbase Wallet as a token issuer
+
+This page is intended for developers that will or have recently deployed ERC-20 token contracts on Base Mainnet and would like their token details to display as quickly as possible on Coinbase Wallet.
+
+Coinbase Wallet makes any ERC-20 token instantly available for swapping seconds from when the contract is deployed.
+
+Follow the instructions below to ensure your token logo, asset name, and other metadata also appear on Coinbase Wallet.
+
+:::info[Disclaimer]
+Base does not endorse any specific token that is deployed on mainnet and made available for swapping.
+:::
+
+---
+
+## Adding your token to the list
+
+The steps below explain how to have your token display quickly on Coinbase Wallet. These instructions work not only for Base, but for any EVM chain supported by Coinbase Wallet (Optimism, Arbitrum, Polygon, Avalanche, Fantom, BNB).
+
+### Step 1: Deploy your ERC-20 Token on Base Mainnet
+
+Write and deploy a compliant ERC-20 token smart contract. Test it and then deploy on Base Mainnet. If you’re not a developer, you can use available token launcher tools in the Base ecosystem.
+
+### Step 2: Prepare your metadata and asset images
+
+Prepare a high-resolution image of your token’s logo. Ensure it is clear, identifiable, and representative of your token.
+
+### Step 3: List your cryptocurrency on a listing aggregator
+
+You can list for free on CoinGecko following these [instructions](https://support.coingecko.com/hc/en-us/articles/7291312302617-How-to-list-new-cryptocurrencies-on-CoinGecko)
+
+You can pay to be listed on CoinMarketCap following these [instructions](https://support.coinmarketcap.com/hc/en-us/articles/360043659351-Listings-Criteria).
+
+Remember, once your ERC-20 contract is deployed, your asset will immediately be available for native swapping in Coinbase Wallet.
+
+However, you’ll still need to list your token on Birdeye, CoinGecko, or CoinMarketCap for the asset’s logo and other metadata to flow into Coinbase Wallet and be seen by users. **It can take 24-48 hours for metadata changes to update.**
+
+## Why does my token display in the “Newer tokens” section in the swap flow?
+
+Tokens that are newly launched and haven’t had significant trading volume appear in the **newer token** section. Once your token reaches a market cap of at least $1M it will no longer be displayed in this section.
+
+:::info[Disclaimer]
+New assets with low liquidity may result in failed swaps or may result in a user receiving less of the destination token due to slippage. An important responsibility of the token creator is to communicate to the community these risks.
+:::
+
+## How can I update my token logo or description?
+
+ERC20 metadata can be updated quickly and easily by navigating to the asset’s page on the Coinbase Wallet desktop site ([wallet.coinbase.com](https://wallet.coinbase.com)). Note that any changes you make there will be reflected on Coinbase Wallet only (desktop and mobile).
+
+**Step 1:** Search for your token on wallet.coinbase.com
+
+**Step 2:** Scroll to the bottom and click “Update here”
+
+**Step 3:** Select your logo image or enter the description you want to show
+
+**Step 4:** Choose the address you want to submit with and click submit
+
+**Step 5:** Submissions will be reviewed within 5 business days. To expedite approval, we recommend taking the following steps:
+
+1. Make a post from your official X or Warpcast account documenting the change. The Coinbase Wallet team may reach out to you if they have questions.
+
+3. Submit the change with the same deployed address that the token contract was deployed with.
+
+If the above guidance doesn’t resolve your issue, please submit more information using this [Deform](https://app.deform.cc/form/a331da5a-447b-43e8-b636-ea3b925e115a/).
+
+# Sharing your token
+
+## Custom trading links
+
+By sharing a unique link to your token’s asset page, your community can easily and safely get your token.
+
+**How to get your custom link:**
+
+**Step 1:** Grab your custom link for your token by navigating to the asset page on Coinbase Wallet
+
+**Step 2:** Click the share button
+
+![][image1]
+
+![][image2]
+
+**Step 4:** Share it with your community – either by posting it as an official link on your social accounts or as a CTA on your website.
+
+## Trending Swaps on Base
+
+The Trending Swaps on Base module reflects the top tokens traded through the Coinbase Wallet mobile app, browser extension, and website app over the past 24 hours.
+
+By encouraging your community to use Coinbase Wallet, your token can be appear on Trending Swaps and reach a wider audience.
+
+## Send via text
+
+With send via text, you can send crypto as easily as sending a text. The crypto you want to send will be retrievable using a claim link, and the link can be shared over text, Twitter, Farcaster, Telegram – anywhere.
+
+Recipients will be prompted to make a Coinbase Wallet to claim the crypto. Whether you're onboarding people to crypto or looking to easily reward your community, send via text has you covered.
+
+**How to send crypto via text:**
+
+**Step 1:** Go to the **Send** flow in Coinbase Wallet
+
+**Step 2:** Enter the amount you want to send
+
+![][image3]
+
+**Step 3:** Click “Send via text” in the upper right hand corner
+
+**Step 4:** Enter the amount and type of crypto you wish to send, and click “Create”Copy the link
+
+![][image4]
+
+**Step 5:** Copy the link and Share it on any platform.
+
+* Clicking the link will prompt the recipient to open Coinbase Wallet or download Coinbase Wallet to claim the crypto
+* If the crypto isn’t claimed within 14 weeks, it will be returned to your wallet.
+
+Send via text currently supports the top 100 tokens on Base. We’re in the process of adding support for all tokens on Base.
+
+---
+
+If you’re encountering an issue with token support on Coinbase Wallet, submit [this form](https://app.deform.cc/form/a331da5a-447b-43e8-b636-ea3b925e115a/?page_number=0) and we’ll aim to resolve your issue within 5 business days.
+
+[image1]:
+
+[image2]:
+
+[image3]:
+
+[image4]:
diff --git a/docs/components/App.tsx b/docs/components/App.tsx
deleted file mode 100644
index 503f939d..00000000
--- a/docs/components/App.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-'use client';
-
-import { OnchainKitProvider } from '@coinbase/onchainkit';
-import '@coinbase/onchainkit/styles.css';
-import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
-import type { ReactNode } from 'react';
-import { http, WagmiProvider, createConfig } from 'wagmi';
-import { base, baseSepolia } from 'wagmi/chains';
-import { coinbaseWallet } from 'wagmi/connectors';
-import { useTheme } from '../contexts/Theme.tsx';
-import { defineChain } from 'viem';
-
-const queryClient = new QueryClient();
-
-export const SANDBOX_CHAIN = defineChain({
- id: 8453200058,
- name: 'Sandbox Network',
- nativeCurrency: {
- name: 'Ethereum',
- symbol: 'ETH',
- decimals: 18,
- },
- rpcUrls: {
- default: {
- http: ['https://sandbox-rpc-testnet.appchain.base.org'],
- },
- },
-});
-
-const wagmiConfig = createConfig({
- chains: [base, baseSepolia, SANDBOX_CHAIN],
- connectors: [
- coinbaseWallet({
- appName: 'OnchainKit',
- }),
- ],
- ssr: true,
- transports: {
- [base.id]: http(),
- [baseSepolia.id]: http(),
- [SANDBOX_CHAIN.id]: http(),
- },
-});
-
-export default function App({ children }: { children: ReactNode }) {
- const isServer = typeof window === 'undefined';
- if (isServer) {
- return null;
- }
-
- const viteCdpApiKey = import.meta.env.VITE_CDP_API_KEY;
- const viteProjectId = import.meta.env.VITE_CDP_PROJECT_ID;
- const { theme } = useTheme();
-
- return (
-
-
-
-
{children}
-
-
-
- );
-}
diff --git a/docs/config/guides.ts b/docs/config/guides.ts
deleted file mode 100644
index af4bb35b..00000000
--- a/docs/config/guides.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-export const topGuides = [
- {
- title: 'Build an E-commerce App',
- path: '/guides/use-case-guides/commerce/build-an-ecommerce-app'
- },
- {
- title: 'Add an In-App Onramp ',
- path: '/guides/use-case-guides/finance/build-a-smart-wallet-funding-app'
- },
- {
- title: 'Run a Base Node',
- path: '/docs/chain/run-a-base-node'
- }
-] as const
-
-export type Guide = typeof topGuides[number]
\ No newline at end of file
diff --git a/docs/constants.ts b/docs/constants.ts
deleted file mode 100644
index a9d39e81..00000000
--- a/docs/constants.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const isDevelopment = import.meta.env.MODE === 'development';
diff --git a/docs/contexts/AppProviders.tsx b/docs/contexts/AppProviders.tsx
deleted file mode 100644
index a4f70a28..00000000
--- a/docs/contexts/AppProviders.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { lazy, Suspense } from 'react';
-
-const CookieBannerWrapper = lazy(async () => import('./CookieBannerWrapper'));
-
-export function AppProviders({ children }: { children: React.ReactNode }) {
- return (
- <>
- {children}
-
-
-
- >
- );
-}
diff --git a/docs/contexts/CookieBannerWrapper.tsx b/docs/contexts/CookieBannerWrapper.tsx
deleted file mode 100644
index 62885ff4..00000000
--- a/docs/contexts/CookieBannerWrapper.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import { CookieManagerProvider } from '@/components/CookieManager/CookieManagerProvider.tsx';
-import ClientAnalyticsScript from '@/components/ClientAnalyticsScript/ClientAnalyticsScript.tsx';
-import { isDevelopment } from '@/constants.ts';
-/*
- * CJS import
- * This import structure for CookieBanner is necessary because in prod, direct
- * destructuring from @coinbase/cookie-banner fails.
- * However in dev, the import fails because the pkg is not found.
- * This structure allows the import to work in prod, and disables the banner in dev.
- */
-import pkg from '@coinbase/cookie-banner';
-const { CookieBanner } = isDevelopment ? {} : pkg;
-
-export const cookieBannerTheme = {
- colors: {
- primary: '#1652F0',
- positive: '#05B169',
- negative: '#DF5F67',
- warning: '#F4C622',
- background: '#FFFFFF',
- backgroundMuted: '#EEF0F3',
- onBackground: '#050F1A',
- onBackgroundMuted: '#0A0B0D',
- onPrimary: '#FFFFFF',
- overlay: 'rgba(17,52,83,0.6)',
- },
- border: {
- border: '1px solid #D8D8D8',
- borderRadius: '4px',
- },
- fontSize: {
- sm: '14px',
- md: '16px',
- },
- fontWeight: {
- regular: '400',
- bold: '500',
- },
- size: {
- xs: '8px',
- sm: '16px',
- md: '24px',
- lg: '32px',
- },
- breakpoints: {
- phone: 560,
- desktop: 992,
- tablet: 768,
- },
- zIndex: {
- hidden: 0,
- normal: 1,
- elevated: 2,
- high: 2,
- extraHigh: 3,
- backdrop: 999,
- overlay: 1000,
- top: 1001,
- },
-};
-
-export default function CookieBannerWrapper() {
- if (isDevelopment || typeof window === 'undefined') return null;
-
- return (
-
-
-
-
- );
-}
diff --git a/docs/cookbook/accept-crypto-payments.mdx b/docs/cookbook/accept-crypto-payments.mdx
new file mode 100644
index 00000000..dd293311
--- /dev/null
+++ b/docs/cookbook/accept-crypto-payments.mdx
@@ -0,0 +1,394 @@
+---
+title: 'Accept Crypto Payments with Coinbase Commerce & OnchainKit'
+sidebarTitle: 'Accept Crypto Payments'
+description: 'Learn how to integrate Coinbase Commerce payments into your application using OnchainKit to eliminate traditional fees and expand your global reach.'
+---
+
+Accepting crypto payments can help you **eliminate traditional credit card fees** and **avoid costly chargebacks**, giving you a faster, more global payment experience. In this guide, you'll learn how to quickly integrate Coinbase Commerce and OnchainKit to accept crypto payments for products or services in your application.
+
+## What You'll Build
+
+By the end of this guide, you'll have a fully functional checkout flow that:
+
+- Displays your product with an attractive interface
+- Connects users' wallets securely
+- Processes crypto payments through Coinbase Commerce
+- Provides real-time payment status updates
+
+
+
+ Remove traditional credit card processing fees and chargebacks
+
+
+ Accept payments from crypto users worldwide, 24/7
+
+
+ Receive payments instantly with blockchain confirmation
+
+
+ Get started in minutes with OnchainKit components
+
+
+
+## Prerequisites
+
+Before you begin, ensure you have the following accounts and tools set up:
+
+
+
+ [Sign up for Coinbase Commerce](https://beta.commerce.coinbase.com/sign-up) to accept cryptocurrency payments globally.
+
+
+ You'll need this to create products and manage payments.
+
+
+
+
+ [Create a CDP account](https://www.coinbase.com/cloud) to access OnchainKit APIs and services.
+
+
+ CDP provides the infrastructure for seamless crypto integrations.
+
+
+
+
+ [Set up Reown](https://cloud.reown.com/) (formerly WalletConnect) for secure wallet connections across devices and platforms.
+
+
+
+## Implementation Guide
+
+
+
+
+ First, you'll create a product in Coinbase Commerce that represents what you're selling.
+
+ 1. **Log in** to your [Coinbase Commerce dashboard](https://beta.commerce.coinbase.com/)
+ 2. Navigate to the [product creation page](https://beta.commerce.coinbase.com/products)
+ 3. **Fill in your product details**:
+ - Product name (clear and descriptive)
+ - Description (what customers are buying)
+ - Price (in your preferred currency)
+ 4. Click **Create product**
+ 5. Once created, select **View product** and copy the **UUID** from the URL
+
+
+ 
+
+
+
+ Save the product UUID immediately - you'll need it as an environment variable. The UUID appears in the product URL after creation.
+
+
+
+
+
+ Clone the official OnchainKit app template to get started quickly with best practices already configured.
+
+
+ ```bash Bun
+ git clone https://github.com/coinbase/onchainkit-app-template.git
+ cd onchainkit-app-template
+ bun install
+ ```
+
+ ```bash npm
+ git clone https://github.com/coinbase/onchainkit-app-template.git
+ cd onchainkit-app-template
+ npm install
+ ```
+
+ ```bash Yarn
+ git clone https://github.com/coinbase/onchainkit-app-template.git
+ cd onchainkit-app-template
+ yarn install
+ ```
+
+
+
+ Verify the installation completed successfully by running `ls` to see the project files.
+
+
+
+
+
+ Create your environment configuration with the required API keys and identifiers.
+
+ In your project root, create or update your `.env.local` file:
+
+ ```bash .env.local
+ # Coinbase Commerce Product ID (from Step 1)
+ NEXT_PUBLIC_PRODUCT_ID=your_product_uuid_here
+
+ # Coinbase Developer Platform API Key
+ NEXT_PUBLIC_ONCHAINKIT_API_KEY=your_cdp_api_key_here
+
+ # Reown (WalletConnect) Project ID
+ NEXT_PUBLIC_WC_PROJECT_ID=your_walletconnect_project_id_here
+
+ # Disable Next.js telemetry (optional)
+ NEXT_TELEMETRY_DISABLED=1
+ ```
+
+
+ Never commit API keys to version control. Add `.env.local` to your `.gitignore` file.
+
+
+
+ Use descriptive variable names and keep them organized with comments for team members.
+
+
+
+
+
+ Set up Wagmi to prioritize smart wallets for better user experience.
+
+ Update your Wagmi configuration file (typically `src/app/wagmi.ts`):
+
+ ```typescript src/app/wagmi.ts
+ // ... existing Wagmi configuration
+
+ // After your useMemo() hook, add:
+ coinbaseWallet.preference = 'smartWalletOnly';
+ ```
+
+
+ This configuration ensures users connect with smart wallets, which provide enhanced security and better UX.
+
+
+
+
+
+ Configure the OnchainKit provider to connect with Base network and your CDP API key.
+
+ Update `src/app/components/OnchainProviders.tsx`:
+
+ ```typescript src/app/components/OnchainProviders.tsx
+ 'use client';
+ import { OnchainKitProvider } from '@coinbase/onchainkit';
+ import { RainbowKitProvider } from '@rainbow-me/rainbowkit';
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+ import type { ReactNode } from 'react';
+ import { base } from 'viem/chains';
+ import { WagmiProvider } from 'wagmi';
+ import { useWagmiConfig } from '../wagmi';
+
+ type Props = { children: ReactNode };
+ const queryClient = new QueryClient();
+
+ function OnchainProviders({ children }: Props) {
+ const wagmiConfig = useWagmiConfig();
+
+ return (
+
+
+
+
+ {children}
+
+
+
+
+ );
+ }
+
+ export default OnchainProviders;
+ ```
+
+ Update your configuration file to handle environment variables properly:
+
+ ```typescript Config.ts
+ export const NEXT_PUBLIC_URL =
+ process.env.NODE_ENV === 'development'
+ ? 'http://localhost:3000'
+ : 'https://your-app-domain.vercel.app'; // Replace with your actual domain
+
+ export const NEXT_PUBLIC_CDP_API_KEY =
+ process.env.NEXT_PUBLIC_ONCHAINKIT_API_KEY;
+
+ export const NEXT_PUBLIC_WC_PROJECT_ID =
+ process.env.NEXT_PUBLIC_WC_PROJECT_ID;
+ ```
+
+
+ Using environment variables makes your app more secure and easier to deploy across different environments.
+
+
+
+
+
+ Create an attractive payment interface that showcases your product and handles the checkout flow.
+
+ Update your main page (`src/app/page.tsx`):
+
+ ```typescript src/app/page.tsx
+ import { Checkout, CheckoutButton, CheckoutStatus } from '@coinbase/onchainkit/checkout';
+ import Image from 'next/image';
+
+ const productId = process.env.NEXT_PUBLIC_PRODUCT_ID;
+
+ export default function PaymentPage() {
+ return (
+
+
+
+ );
+ }
+ ```
+
+
+ Make sure to add your product image to the `public` folder and update the image path accordingly.
+
+
+
+ The conditional rendering prevents errors when no wallet is connected, providing a smooth user experience.
+
+
+
+
+
+ Test your payment flow locally before deploying to production.
+
+ **Local Testing:**
+
+
+ ```bash Bun
+ bun run dev
+ ```
+
+ ```bash npm
+ npm run dev
+ ```
+
+ ```bash Yarn
+ yarn dev
+ ```
+
+
+ 1. **Visit** `http://localhost:3000`
+ 2. **Connect your wallet** using the wallet connection button
+ 3. **Test the checkout flow** with a small amount
+ 4. **Verify payment status** updates correctly
+
+
+ 
+
+
+ **Production Deployment:**
+
+ 1. **Update your configuration** with production URLs
+ 2. **Deploy to your preferred platform** (Vercel, Netlify, etc.)
+ 3. **Test the live application** with real transactions
+ 4. **Monitor payment confirmations** in your Coinbase Commerce dashboard
+
+
+ Start with testnet transactions to ensure everything works before going live with mainnet.
+
+
+
+
+## Troubleshooting
+
+
+
+ **Common solutions:**
+ - Ensure your WalletConnect project ID is correctly configured
+ - Check that your wallet extension is updated to the latest version
+ - Try connecting with a different wallet provider
+ - Clear your browser cache and cookies
+
+
+
+ **Check these items:**
+ - Verify your product ID matches exactly with Coinbase Commerce
+ - Ensure your CDP API key has the necessary permissions
+ - Confirm the user has sufficient funds for the transaction
+ - Check network connectivity and blockchain status
+
+
+
+ **Configuration checklist:**
+ - All required environment variables are set in `.env.local`
+ - No extra spaces or quotes around variable values
+ - File is in the project root directory
+ - Restart your development server after making changes
+
+
+
+## Next Steps
+
+Now that you have crypto payments working, consider these enhancements:
+
+
+
+ Scale your setup to handle multiple products and services
+
+
+ Set up payment confirmation webhooks for automated processing
+
+
+ Track payment metrics and customer behavior
+
+
+ Accept payments on multiple blockchain networks
+
+
+
+## Conclusion
+
+Congratulations! You've successfully integrated Coinbase Commerce and OnchainKit into your application. Your users can now make crypto payments, giving you access to:
+
+✅ **Zero traditional payment fees and chargebacks**
+✅ **Global customer reach with 24/7 payment processing**
+✅ **Instant settlement with blockchain confirmation**
+✅ **Enhanced security through smart wallet integration**
+
+**Ready to scale?** Consider expanding to multiple products, implementing automated fulfillment, or adding analytics to track your crypto payment performance.
+
+
+Your application now supports the future of global payments. Happy building on Base!
+
diff --git a/docs/cookbook/ai-prompting.mdx b/docs/cookbook/ai-prompting.mdx
new file mode 100644
index 00000000..4b3e5fcc
--- /dev/null
+++ b/docs/cookbook/ai-prompting.mdx
@@ -0,0 +1,10 @@
+---
+sidebarTitle: AI-powered IDEs
+title: Use AI-powered IDEs
+description: How to use AI-powered IDEs to generate code for OnchainKit.
+---
+
+import AiPowered from "/snippets/ai-powered.mdx";
+
+
+
diff --git a/docs/cookbook/base-builder-mcp.mdx b/docs/cookbook/base-builder-mcp.mdx
new file mode 100644
index 00000000..c243c3f6
--- /dev/null
+++ b/docs/cookbook/base-builder-mcp.mdx
@@ -0,0 +1,10 @@
+---
+sidebarTitle: 'Prompt Library'
+title: Developer's Guide to Effective AI Prompting
+description: Learn practical AI prompting techniques to enhance your coding workflow and get better results from AI coding assistants.
+---
+
+
+import AiPrompt from "/snippets/prompt-library.mdx";
+
+
\ No newline at end of file
diff --git a/docs/cookbook/defi-your-app.mdx b/docs/cookbook/defi-your-app.mdx
new file mode 100644
index 00000000..e538b8cf
--- /dev/null
+++ b/docs/cookbook/defi-your-app.mdx
@@ -0,0 +1,326 @@
+---
+title: Defi Your App
+description: Add common financial features like token swaps and yield generating strategies to your app with pre-built React components from OnchainKit.q
+---
+
+import { Danger } from "/snippets/danger.mdx";
+
+When businesses and individuals make financial transactions, it often includes swapping assets and then storing eligible assets in a yield generating strategy. This guide will show you how to quickly add these features to your app with pre-built React components from OnchainKit.
+
+## Ready-to-use components
+- [``](/onchainkit/swap/swap): Swap assets directly within your app.
+- [``](/onchainkit/earn/earn): Generate yield directly within your app.
+- [``](/onchainkit/fund/fund-card): Fund their wallets with fiat (via USDC, Apple Pay, or debit card) without leaving your app.
+- [``](/onchainkit/buy/buy): Purchase tokens directly within your app.
+
+
+By embedding the `Swap` and `Earn` components, your users don't need to leave your app to execute these common actions. For users who lack onchain funds, the `Fund` and `Buy` components offer an integrated fiat-to-crypto onramp.
+
+
+## Swap Component Integration
+
+The `Swap` component lets users exchange one token for another directly in your application. It fetches live quotes, builds transactions, and executes swaps—abstracting the underlying complexity.
+
+Lets add the `Swap` component to your app.
+
+
+
+ Create a new OnchainKit app
+
+ ```bash Terminal
+ npm create onchain@latest
+ ```
+
+
+ ```typescript App.tsx
+ import { SwapDefault } from '@coinbase/onchainkit/swap'; // [!code focus]
+ import type { Token } from '@coinbase/onchainkit/token';
+
+ const eth: Token = {
+ name: 'ETH',
+ address: '',
+ symbol: 'ETH',
+ decimals: 18,
+ image:
+ 'https://wallet-api-production.s3.amazonaws.com/uploads/tokens/eth_288.png',
+ chainId: 8453,
+ };
+
+ const usdc: Token = {
+ name: 'USDC',
+ address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
+ symbol: 'USDC',
+ decimals: 6,
+ image:
+ 'https://d3r81g40ycuhqg.cloudfront.net/wallet/wais/44/2b/442b80bd16af0c0d9b22e03a16753823fe826e5bfd457292b55fa0ba8c1ba213-ZWUzYjJmZGUtMDYxNy00NDcyLTg0NjQtMWI4OGEwYjBiODE2',
+ chainId: 8453,
+ };
+
+ // [!code focus]
+ ```
+
+
+
+You should now see the following swap component in your app:
+
+
+
+{/*
+
+ {({ address, swappableTokens }) => {
+ if (address) {
+ return (
+
+ )
+ }
+ return <>
+
+
+
+
+
+
+ >;
+ }}
+
+ */}
+
+The Swap component uses **Uniswap V3** as the default router, but you can also use the **0x Aggregator** by setting the `experimental.useAggregator` prop to `true`.
+
+
+
+### Swap Settings
+The Swap component comes preconfigured but is highly customizable. Just a couple of the settings you can customize:
+- Swap settings
+- bidirectional or unidirectional swaps
+- Gasless swaps with paymasters
+
+To learn more about how to customize the Swap component, check out the [Swap docs](/onchainkit/swap/swap).
+
+
+## Earn Component Integration
+
+The `Earn` component enables users to deposit assets into yield-generating vaults and withdraw them later—all within your app. The `Earn` component currently supports Morpho vaults on Base.
+
+
+**Get a vault address**
+
+You can get a vault address from Morpho's [Vaults page](https://app.morpho.org/base/earn). You will use this address when setting up the `Earn` component.
+
+
+
+```tsx twoslash
+// @noErrors: 2307
+import { Earn } from '@coinbase/onchainkit/earn'; // [!code focus]
+
+ // [!code focus]
+```
+
+Just like that, you've added a yield-generating vault to your app.
+
+
+
+{/* */}
+
+### Advanced Customizations
+Similar to the Swap component, the Earn component is highly customizable. Lets customize our component to include custom deposit buttons for a streamlined user experience.
+
+- `useEarnContext` to access the component's context values, `EarnDeposit` and `EarnDetails`
+- `DepositButton` to render custom deposit buttons
+
+
+```tsx index.tsx
+// @noErrors: 2307
+import { Earn, useEarnContext } from '@coinbase/onchainkit/earn';
+import { CustomDepositButtons } from '@/custom-deposit-buttons';
+
+
+
+
+
+```
+
+```tsx custom-deposit-buttons.tsx
+import {EarnDetails,
+ EarnDeposit,
+ useEarnContext,
+ DepositButton} from '@coinbase/onchainkit/earn';
+
+const predefinedAmounts = ['0.1', '1', '10'];
+
+function CustomDepositButtons() {
+ const { depositAmount, setDepositAmount } = useEarnContext();
+
+ return (
+
+
+
+
+
+ );
+}
+```
+
+
+
+
+{/* */}
+
+## Onboarding Users in DeFi
+
+In order to leverage the `` and `` components, users need to have funds in their wallet. If user's don't have funds, they'll need to onramp fiat or buy tokens in order to transact. We'll explore two out-of-the-box solutions from OnchainKit below.
+
+The `Fund` component (via ``) offers a complete fiat onramp experience, allowing users to add funds to their wallet directly in your app. It provides:
+- Amount input with fiat/crypto switching
+- Payment method selection (Coinbase, Apple Pay, Debit Card)
+- Automatic exchange rate updates
+- Smart handling of payment method restrictions (based on country and subdivision)
+
+
+To use the `FundCard` component, you'll need to provide a Client API Key in `OnchainKitProvider`. You can get one following our [Getting Started](/onchainkit/installation/nextjs#get-your-client-api-key) steps.
+
+
+
+```tsx App.tsx
+import { FundCard } from '@coinbase/onchainkit/fund';
+
+;
+```
+
+
+
+{/*
+
+ {({ address }) => {
+ if (address) {
+ return ;
+ }
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+ }}
+
+ */}
+
+To learn more about the `FundCard` component and its features, check out the [FundCard docs](/onchainkit/fund/fund-card).
+
+## The `Buy` Component
+
+The `Buy` components provide a comprehensive interface for users to purchase [Tokens](/onchainkit/token/types#token).
+
+The `Buy` component supports token swaps from USDC and ETH by default with the option to provide an additional token of choice using the `fromToken` prop. Users are able to purchase tokens using their Coinbase account, Apple Pay, or debit card.
+
+
+This component requires a `projectId` to be set in the `OnchainKitProvider`. You can find your `projectId` on [Coinbase Developer Platform](https://portal.cdp.coinbase.com/products/onchainkit).
+
+
+
+```tsx twoslash
+import { Buy } from '@coinbase/onchainkit/buy'; // [!code focus]
+import type { Token } from '@coinbase/onchainkit/token';
+
+export default function BuyComponents() { // [!code focus]
+ const degenToken: Token = {
+ name: 'DEGEN',
+ address: '0x4ed4e862860bed51a9570b96d89af5e1b0efefed',
+ symbol: 'DEGEN',
+ decimals: 18,
+ image:
+ 'https://d3r81g40ycuhqg.cloudfront.net/wallet/wais/3b/bf/3bbf118b5e6dc2f9e7fc607a6e7526647b4ba8f0bea87125f971446d57b296d2-MDNmNjY0MmEtNGFiZi00N2I0LWIwMTItMDUyMzg2ZDZhMWNm',
+ chainId: 8453,
+ };
+
+ return ( // [!code focus]
+ // [!code focus]
+ ) // [!code focus]
+} // [!code focus]
+
+```
+
+
+
+{/*
+
+ {({ address, toToken }) => {
+ return (
+
+ )
+ }}
+
+ */}
+
+
+**Note: This interface is for demonstration purposes only.**
+
+Swap and Onramp flows will execute and work out of the box when you implement the component in your own app.
+
+
+
+By combining Swap, Earn, Fund, and Buy with these additional tools, you can quickly build a robust in-app DeFi experience with minimal development overhead. This lets you focus on building your unique value proposition.
+
+
+## Next Steps
+
+If you're using these components, its likely you'll benefit from the following components:
+
+- [``](/onchainkit/transaction/transaction): Provides a high-level transaction interface for executing custom onchain transactions.
+
+
+- [``](/onchainkit/token/token-chip): Offers utilities for token selection and display, ideal for building wallet-like interfaces.
+
+
+- [``](/onchainkit/wallet/wallet-island): An advanced, draggable wallet widget that consolidates wallet management (QR code, buy options, swap, portfolio view) in one interface.
+
+
+### Go Gasless
+For the `` and `` components, you can enable gasless transactions by setting the [`isSponsored`](/onchainkit/buy/buy#sponsor-gas-with-paymaster) prop to `true`.
diff --git a/docs/cookbook/defi/access-real-time-asset-data.mdx b/docs/cookbook/defi/access-real-time-asset-data.mdx
new file mode 100644
index 00000000..dfd2b3f7
--- /dev/null
+++ b/docs/cookbook/defi/access-real-time-asset-data.mdx
@@ -0,0 +1,7 @@
+---
+sidebarTitle: 'Access Real-Time Asset Data'
+title: Access Real-Time Asset Data (Pyth)
+description: 'Guide to accessing real-time asset data using Pyth Network'
+---
+
+[Guide for integrating Pyth Network to access real-time asset price data in DeFi applications]
\ No newline at end of file
diff --git a/docs/cookbook/defi/access-real-world-data.mdx b/docs/cookbook/defi/access-real-world-data.mdx
new file mode 100644
index 00000000..2ed43ea8
--- /dev/null
+++ b/docs/cookbook/defi/access-real-world-data.mdx
@@ -0,0 +1,7 @@
+---
+title: Access Real-World Data (Chainlink)
+sidebarTitle: 'Access Real-World Data'
+description: 'Guide to accessing real-world data using Chainlink oracles'
+---
+
+[Guide for integrating Chainlink oracles to access real-world data in DeFi applications]
\ No newline at end of file
diff --git a/docs/cookbook/defi/add-in-app-funding.mdx b/docs/cookbook/defi/add-in-app-funding.mdx
new file mode 100644
index 00000000..01009f4a
--- /dev/null
+++ b/docs/cookbook/defi/add-in-app-funding.mdx
@@ -0,0 +1,7 @@
+---
+sidebarTitle: 'Add In-App Onramp'
+title: Add In-App Funding (Onramp)
+description: 'Guide to implementing in-app funding using onramps'
+---
+
+[Guide for implementing in-app funding solutions using onramps in DeFi applications]
\ No newline at end of file
diff --git a/docs/cookbook/deploy-a-chain.mdx b/docs/cookbook/deploy-a-chain.mdx
new file mode 100644
index 00000000..4f8ff591
--- /dev/null
+++ b/docs/cookbook/deploy-a-chain.mdx
@@ -0,0 +1,286 @@
+---
+title: 'Deploy an Appchain'
+keywords: ['deploy a chain', 'deploy a base chain', 'deploy a base appchain', 'deploy a base l3', 'l3']
+---
+
+Transform your high-traffic application into a dedicated blockchain with **1-second block times**, **sub-cent transactions**, and **enterprise-grade infrastructure**. Base Appchains provide dedicated blockspace for mature applications that need to scale beyond shared network limitations.
+
+
+
+Get early access to Base Appchains and transform your scaling strategy
+
+
+
+Jump to our step-by-step onboarding process
+
+
+
+## What Are Base Appchains?
+
+Base Appchains are **app-specific Layer 3 rollups** built on Base that provide dedicated blockspace for individual applications. Instead of competing with thousands of other apps for network resources, you get your own high-performance blockchain that rolls up to Base and inherits Ethereum's security.
+
+
+Layer 3 appchains roll up to Base (Layer 2), which settles on Ethereum, providing you with dedicated performance while maintaining the security guarantees of the Ethereum ecosystem.
+
+
+Think of it as the difference between **sharing a highway during rush hour** versus **having your own dedicated express lane**. With shared blockspace, your app's performance depends on network-wide activity. With an Appchain, you get consistent, predictable performance regardless of what's happening elsewhere.
+
+
+
+Compete with other apps for network resources, leading to variable performance, unpredictable costs, and user experience issues during peak times.
+
+
+
+Your own infrastructure with predictable performance, custom gas tokens, full control over throughput, and consistent user experience.
+
+
+
+## Why Choose Base Appchains?
+
+### High-Speed Performance Built for Scale
+
+Stop letting network congestion impact your user experience. Base Appchains deliver **1-second block times** and **sub-10 second withdrawals**, making them 10x faster than typical blockchain interactions.
+
+
+Gaming applications like Blocklords have processed over 80 million transactions across 1.8 million wallets using Base Appchains, achieving the scale needed for their gaming ecosystem without performance degradation.
+
+
+### Predictable, Cost-Effective Operations
+
+Replace unpredictable gas costs with **fixed monthly pricing**. Process transactions for fractions of cents while eliminating the need to sponsor gas costs for your users.
+
+
+
+Variable gas costs, expensive user onboarding, unpredictable operational expenses, and complex gas sponsorship management.
+
+
+
+Fixed monthly pricing, sub-cent transactions, predictable budgeting, and no gas sponsorship complexity.
+
+
+
+### Enterprise-Grade Infrastructure
+
+With Base Appchains, you get:
+
+
+Fully-managed sequencer and node infrastructure
+
+
+Automated maintenance and upgrades
+
+
+Real-time monitoring and performance alerts
+
+
+Dedicated block explorer for your chain
+
+
+### Seamless Base Ecosystem Integration
+
+Maintain access to Base's **users**, **liquidity**, and **developer tools** while getting dedicated performance. Your Appchain integrates seamlessly with Smart Wallet, Paymaster, OnchainKit, and other Base ecosystem tools.
+
+
+
+Enable seamless account abstraction across Base Mainnet and your Appchain with unified user experiences.
+
+
+
+Sponsor gas costs across multiple chains with unified billing and simplified user onboarding.
+
+
+
+Use the same familiar developer tools and components across the entire Base ecosystem.
+
+
+
+## Technical Architecture
+
+Base Appchains are built on the **OP Enclave framework**, providing fast withdrawals and seamless integration with Base Mainnet. This architecture enables near-instant bridging while maintaining security through innovative proving mechanisms.
+
+
+
+Built on Optimism's latest technology for **near-instant bridging** between your Appchain and Base Mainnet. Users can move funds in seconds rather than the typical 7-day withdrawal periods of traditional rollups.
+
+
+
+Uses **Amazon S3** for cost-efficient data storage while maintaining security through **AWS Nitro Enclave** verification. This approach significantly reduces costs while ensuring data integrity and availability.
+
+
+
+Control which contracts can be called on your chain, effectively managing blockspace allocation. Implement **custom gas tokens** and **permission systems** while protecting users from censorship through guaranteed deposit lanes.
+
+
+
+Unlike traditional rollups that rely on challenge periods, Base Appchains use **immediate state proving** through secure enclaves, enabling instant finality and faster user experiences.
+
+
+
+## Use Cases & Success Stories
+
+Base Appchains power applications across gaming, DeFi, and enterprise sectors that require high performance and predictable costs.
+
+
+
+Process millions of micro-transactions for in-game actions, NFT trades, and player interactions without network congestion affecting gameplay performance.
+
+**Success Story**: Super Champs chose Base Appchains for consistent throughput, comparing the experience to "gaming on iOS" - smooth, predictable, and reliable.
+
+
+
+Handle high-frequency trading, yield farming, and complex financial operations with consistent, low-cost transactions that don't fluctuate with network activity.
+
+**Success Story**: Applications processing high-volume trading data benefit from predictable costs and dedicated throughput for time-sensitive operations.
+
+
+
+Deploy compliance-ready solutions with dedicated infrastructure, custom permissions, and the ability to manage access controls while maintaining transparency.
+
+**Success Story**: Proof 8 uses blockchain technology for verifiable inventory ownership in warehouses and distilleries, where enterprise customers prioritize performance, security, and privacy.
+
+
+
+
+Base Appchains are designed for **mature projects** with significant transaction volumes. If you're just starting out or have low transaction volumes, consider building on Base Mainnet first to establish product-market fit.
+
+
+## When Should You Consider an Appchain?
+
+Base Appchains are ideal for applications that have outgrown shared blockspace limitations. Use this checklist to determine if an Appchain is right for your project:
+
+
+**High Transaction Volume**: Your app generates thousands of transactions daily and performance is affected by network congestion
+
+
+
+**Significant Gas Sponsorship**: You're spending substantial amounts sponsoring gas costs for users through Paymaster or similar solutions
+
+
+
+**Performance-Critical Operations**: User experience is negatively impacted by variable transaction times or network congestion
+
+
+
+**Custom Requirements**: You need custom gas tokens, specialized permissions, or governance mechanisms not available on shared chains
+
+
+
+**Predictable Costs**: Fixed operational costs are important for your business model and budgeting
+
+
+
+If you're considering launching your own L1 or L2 blockchain, Base Appchains offer a compelling alternative with faster time-to-market, proven infrastructure, and immediate access to Base's ecosystem.
+
+
+
+## Getting Started
+
+Base Appchains are currently in **beta with a waitlist**. We're working with select partners to refine the platform before broader availability.
+
+
+
+Complete our application form to be considered for early access to Base Appchains. We prioritize applications from mature projects with clear scaling needs.
+
+
+Join the Base Appchains beta program
+
+
+
+
+Our team will review your application and schedule a consultation to understand your specific scaling requirements, transaction patterns, and technical needs.
+
+
+During the consultation, we'll help you determine if an Appchain is the right solution and design the optimal configuration for your use case.
+
+
+
+
+Once approved, you'll receive access to both testnet and mainnet features. Start with the **$1/month testnet** to validate your architecture and integration.
+
+
+Use the testnet environment to test bridging, custom gas tokens, and permission systems before deploying to mainnet.
+
+
+
+
+Deploy to production with full enterprise support, monitoring, and maintenance included. Our team provides ongoing support for your Appchain infrastructure.
+
+
+Full technical support during launch and ongoing operations
+
+
+
+
+
+**Coming Soon**: Self-serve, one-click deployment will be available for approved projects, making it even easier to launch and manage your Appchain.
+
+
+## Frequently Asked Questions
+
+
+
+Base Appchains offer significant advantages over launching independent blockchain infrastructure:
+
+- **Faster time-to-market**: Deploy in weeks, not months or years
+- **Proven infrastructure**: Built on battle-tested Base and OP Stack technology
+- **Immediate ecosystem access**: Users and liquidity from Base Mainnet
+- **Lower operational overhead**: Fully managed infrastructure and maintenance
+- **Ethereum alignment**: Inherit security without custom validator sets or consensus mechanisms
+
+
+
+Base Appchains provide **seamless onboarding** similar to Base Mainnet applications:
+
+- Users can bridge funds between Base and your Appchain in **seconds**
+- Same wallet experience across Base ecosystem
+- Smart Wallet integration for account abstraction
+- Familiar transaction patterns and interfaces
+
+
+
+**Coinbase manages the core infrastructure** on your behalf, including:
+
+- Sequencer operation and maintenance
+- Node infrastructure and upgrades
+- Security key management
+- Monitoring and alerting systems
+
+You maintain control over **application-level configurations** like gas tokens, permissions, and governance while benefiting from enterprise-grade infrastructure management.
+
+
+
+Base Appchains use the **OP Enclave framework** for **near-instant bridging**:
+
+- Move funds between Base and your Appchain in seconds
+- No 7-day withdrawal periods like traditional rollups
+- Maintains security through cryptographic proofs
+- Seamless user experience across chains
+
+
+
+Base Appchains balance **operational efficiency** with **censorship resistance**:
+
+- Custom permissions control high-throughput operations
+- **Guaranteed deposit lanes** prevent censorship through direct Base deposits
+- Users always have recourse through the Base bridge
+- Inherits Ethereum's long-term decentralization roadmap
+
+
+
+## Ready to Scale?
+
+Base Appchains represent the next evolution in blockchain scaling, providing dedicated infrastructure without sacrificing ecosystem benefits. Whether you're processing millions of gaming transactions, handling high-frequency DeFi operations, or building enterprise solutions, Appchains deliver the performance and predictability your users expect.
+
+
+
+Apply for early access to Base Appchains beta program
+
+
+
+Discover the full ecosystem of Base developer tools and integrations
+
+
+
+
+**Next Steps**: After joining the waitlist, explore Base's developer documentation to understand how Appchains integrate with Smart Wallet, Paymaster, OnchainKit, and other ecosystem tools.
+
\ No newline at end of file
diff --git a/docs/cookbook/go-gasless.mdx b/docs/cookbook/go-gasless.mdx
new file mode 100644
index 00000000..9bd29ada
--- /dev/null
+++ b/docs/cookbook/go-gasless.mdx
@@ -0,0 +1,406 @@
+---
+sidebarTitle: Go Gasless
+title: 'Gasless Transactions on Base using a Paymaster'
+description: Learn how to leverage the Base Paymaster for seamless, gasless transactions on the Coinbase Cloud Developer Platform.
+---
+
+import { Danger } from "/snippets/danger.mdx";
+
+Base transaction fees are typically less than a penny, but the concept of gas can still be confusing for new users and lead to poor user experience when users don't have gas funds in their wallet. You can abstract this away and improve your UX by using the **Base Paymaster**. The Paymaster allows you to:
+
+- Batch multi-step transactions
+- Create custom gasless experiences
+- Sponsor up to $15k monthly on mainnet (unlimited on testnet)
+
+
+If you need an increase in your sponsorship limit, please [reach out on Discord][Discord]!
+
+
+
+## Objectives
+
+1. Configure security measures to ensure safe and reliable transactions.
+2. Manage and allocate resources for sponsored transactions.
+3. Subsidize transaction fees for users, enhancing the user experience by making transactions free.
+4. Set up and manage sponsored transactions on various schedules, including weekly, monthly, and daily cadences.
+
+## Prerequisites
+
+This tutorial assumes you have:
+
+1. **A Coinbase Cloud Developer Platform Account**
+ If not, sign up on the [CDP site]. Once you have your account, you can manage projects and utilize tools like the Paymaster.
+
+2. **Familiarity with Smart Accounts and ERC 4337**
+ Smart Accounts are the backbone of advanced transaction patterns (e.g., bundling, sponsorship). If you’re new to ERC 4337, check out external resources like the official [EIP-4337 explainer](https://eips.ethereum.org/EIPS/eip-4337) before starting.
+
+3. **Foundry**
+ Foundry is a development environment, testing framework, and smart contract toolkit for Ethereum. You’ll need it installed locally for generating key pairs and interacting with smart contracts.
+
+
+**Testnet vs. Mainnet**
+If you prefer not to spend real funds, you can switch to **Base Sepolia** (testnet). The steps below are conceptually the same. Just select _Base Sepolia_ in the Coinbase Developer Platform instead of _Base Mainnet_, and use a contract deployed on Base testnet for your allowlisted methods.
+
+
+
+## Set Up a Base Paymaster & Bundler
+
+In this section, you will configure a Paymaster to sponsor payments on behalf of a specific smart contract for a specified amount.
+
+1. **Navigate to the [Coinbase Developer Platform].**
+2. Create or select your project from the upper left corner of the screen.
+3. Click on the **Paymaster** tool from the left navigation.
+4. Go to the **Configuration** tab and copy the **RPC URL** to your clipboard — you’ll need this shortly in your code.
+
+### Screenshots
+
+- **Selecting your project**
+
+ 
+
+
+- **Navigating to the Paymaster tool**
+
+ 
+
+
+- **Configuration screen**
+
+ 
+
+
+### Allowlist a Sponsorable Contract
+
+1. From the Configuration page, ensure **Base Mainnet** (or **Base Sepolia** if you’re testing) is selected.
+2. Enable your paymaster by clicking the toggle button.
+3. Click **Add** to add an allowlisted contract.
+4. For this example, add [`0x83bd615eb93eE1336acA53e185b03B54fF4A17e8`][simple NFT contract], and add the function `mintTo(address)`.
+
+
+
+
+
+
+**Use your own contract**
+ We use a [simple NFT contract][simple NFT contract] on Base mainnet as an example. Feel free to substitute your own.
+
+
+
+### Global & Per User Limits
+
+Scroll down to the **Per User Limit** section. You can set:
+
+- **Dollar amount limit** or **number of UserOperations** per user
+- **Limit cycles** that reset daily, weekly, or monthly
+
+For example, you might set:
+
+- `max USD` to `$0.05`
+- `max UserOperation` to `1`
+
+This means **each user** can only have $0.05 in sponsored gas and **1** user operation before the cycle resets.
+
+
+**Limit Cycles**
+These reset based on the selected cadence (daily, weekly, monthly).
+
+
+
+Next, **set the Global Limit**. For example, set this to `$0.07` so that once the entire paymaster has sponsored \$0.07 worth of gas (across all users), no more sponsorship occurs unless you raise the limit.
+
+
+
+
+
+## Test Your Paymaster Policy
+
+Now let’s verify that these policies work. We’ll:
+
+1. Create two local key pairs (or use private keys you own).
+2. Generate two Smart Accounts.
+3. Attempt to sponsor multiple transactions to see your policy in action.
+
+### Installing Foundry
+
+1. Ensure you have **Rust** installed
+ ```bash
+ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+ ```
+2. Install Foundry
+ ```bash
+ curl -L https://foundry.paradigm.xyz | bash
+ foundryup
+ ```
+3. Verify it works
+ ```bash
+ cast --help
+ ```
+ If you see Foundry usage info, you’re good to go!
+
+### Create Your Project & Generate Key Pairs
+
+1. Make a new folder and install dependencies, `viem` and `permissionless`:
+ ```bash
+ mkdir sponsored_transactions
+ cd sponsored_transactions
+ npm init es6
+ npm install permissionless
+ npm install viem
+ touch index.js
+ ```
+2. Generate two key pairs with Foundry:
+ ```bash
+ cast wallet new
+ cast wallet new
+ ```
+ You’ll see something like:
+ ```bash
+ Successfully created new keypair.
+ Address: 0xD440D746...
+ Private key: 0x01c9720c1dfa3c9...
+ ```
+ **Store these private keys somewhere safe**
+
+### Project Structure With Environment Variables
+
+Create a `.env` file in the `sponsored_transactions` directory. In the `.env`, you'll add the rpcURL for your paymaster and the private keys for your accounts:
+
+
+**Find your Paymaster & Bundler endpoint**
+
+The Paymaster & Bundler endpoint is the URL for your Coinbase Developer Platform (CDP) Paymaster.
+This was saved in the previous section and follows this format: `https://api.developer.coinbase.com/rpc/v1/base/`
+Navigate to the [Paymaster Tool] and select the `Configuration` tab at the top of the screen to obtain your RPC URL.
+
+
+
+
+**Secure your endpoints**
+
+You will create a constant for our Paymaster & Bundler endpoint obtained from cdp.portal.coinbase.com. The most secure way to do this is by using a proxy. For the purposes of this demo, hardcode it into our `index.js` file. For product, we highly recommend using a [proxy service].
+
+
+
+```bash
+PAYMASTER_RPC_URL=https://api.developer.coinbase.com/rpc/v1/base/
+PRIVATE_KEY_1=0x01c9720c1dfa3c9...
+PRIVATE_KEY_2=0xbcd6fbc1dfa3c9...
+```
+
+
+Never commit `.env` files to a public repo!
+
+
+
+## Example `index.js`
+
+Below is a full example of how you might structure `index.js`.
+
+```js index.js
+// --- index.js ---
+// @noErrors
+
+// 1. Import modules and environment variables
+import 'dotenv/config';
+import { http, createPublicClient, encodeFunctionData } from 'viem';
+import { base } from 'viem/chains';
+import { createSmartAccountClient } from 'permissionless';
+import { privateKeyToSimpleSmartAccount } from 'permissionless/accounts';
+import { createPimlicoPaymasterClient } from 'permissionless/clients/pimlico';
+
+// 2. Retrieve secrets from .env
+// Highlight: environment variables for paymaster, private keys
+const rpcUrl = process.env.PAYMASTER_RPC_URL; // highlight
+const firstPrivateKey = process.env.PRIVATE_KEY_1; // highlight
+const secondPrivateKey = process.env.PRIVATE_KEY_2; // highlight
+
+// 3. Declare Base addresses (entrypoint & factory)
+const baseEntryPoint = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789';
+const baseFactoryAddress = '0x15Ba39375ee2Ab563E8873C8390be6f2E2F50232';
+
+// 4. Create a public client for Base
+const publicClient = createPublicClient({
+ chain: base,
+ transport: http(rpcUrl),
+});
+
+// 5. Setup Paymaster client
+const cloudPaymaster = createPimlicoPaymasterClient({
+ chain: base,
+ transport: http(rpcUrl),
+ entryPoint: baseEntryPoint,
+});
+
+// 6. Create Smart Accounts from the private keys
+async function initSmartAccounts() {
+ const simpleAccount = await privateKeyToSimpleSmartAccount(publicClient, {
+ privateKey: firstPrivateKey,
+ factoryAddress: baseFactoryAddress,
+ entryPoint: baseEntryPoint,
+ });
+
+ const simpleAccount2 = await privateKeyToSimpleSmartAccount(publicClient, {
+ privateKey: secondPrivateKey,
+ factoryAddress: baseFactoryAddress,
+ entryPoint: baseEntryPoint,
+ });
+
+ // 7. Create SmartAccountClient for each
+ const smartAccountClient = createSmartAccountClient({
+ account: simpleAccount,
+ chain: base,
+ bundlerTransport: http(rpcUrl),
+ middleware: {
+ sponsorUserOperation: cloudPaymaster.sponsorUserOperation,
+ },
+ });
+
+ const smartAccountClient2 = createSmartAccountClient({
+ account: simpleAccount2,
+ chain: base,
+ bundlerTransport: http(rpcUrl),
+ middleware: {
+ sponsorUserOperation: cloudPaymaster.sponsorUserOperation,
+ },
+ });
+
+ return { smartAccountClient, smartAccountClient2 };
+}
+
+// 8. ABI for the NFT contract
+const nftAbi = [
+ // ...
+ // truncated for brevity
+];
+
+// 9. Example function to send a transaction from a given SmartAccountClient
+async function sendTransaction(client, recipientAddress) {
+ try {
+ // encode the "mintTo" function call
+ const callData = encodeFunctionData({
+ abi: nftAbi,
+ functionName: 'mintTo',
+ args: [recipientAddress], // highlight: specify who gets the minted NFT
+ });
+
+ const txHash = await client.sendTransaction({
+ account: client.account,
+ to: '0x83bd615eb93eE1336acA53e185b03B54fF4A17e8', // address of the NFT contract
+ data: callData,
+ value: 0n,
+ });
+
+ console.log(`✅ Transaction successfully sponsored for ${client.account.address}`);
+ console.log(`🔍 View on BaseScan: https://basescan.org/tx/${txHash}`);
+ } catch (error) {
+ console.error('Transaction failed:', error);
+ }
+}
+
+// 10. Main flow: init accounts, send transactions
+(async () => {
+ const { smartAccountClient, smartAccountClient2 } = await initSmartAccounts();
+
+ // Send a transaction from the first account
+ await sendTransaction(smartAccountClient, smartAccountClient.account.address);
+
+ // Send a transaction from the second account
+ // For variety, let’s also mint to the second account's own address
+ await sendTransaction(smartAccountClient2, smartAccountClient2.account.address);
+})();
+```
+
+Now that the code is implemented, lets run it:
+Run this via `node index.js` from your project root.
+
+```bash
+node index.js
+```
+
+You should see a "Transaction successfully sponsored" output.
+
+To confirm that your spend policies are correctly in place, try running the script again. If your Paymaster settings are strict (e.g., limit 1 transaction per user), the second time you run the script, you may get a “request denied” error, indicating the policy is working.
+
+## Hitting Policy Limits & Troubleshooting
+
+1. **Per-User Limit**
+ If you see an error like:
+
+ ```json
+ {
+ "code": -32001,
+ "message": "request denied - rejected due to maximum per address transaction count reached"
+ }
+ ```
+
+ That means you’ve hit your **UserOperation** limit for a single account. Return to the [Coinbase Developer Platform] UI to adjust the policy.
+
+2. **Global Limit**
+ If you repeatedly run transactions and eventually see:
+ ```json
+ {
+ "code": -32001,
+ "message": "request denied - rejected due to max global usd spend limit reached"
+ }
+ ```
+ You’ve hit the **global** limit of sponsored gas. Increase it in the CDP dashboard and wait a few minutes for changes to take effect.
+
+## Verifying Token Ownership (Optional)
+
+Want to confirm the token actually minted? You can read the NFT’s `balanceOf` function:
+
+```js
+import { readContract } from 'viem'; // highlight
+
+// example function
+async function checkNftBalance(publicClient, contractAddress, abi, ownerAddress) {
+ const balance = await publicClient.readContract({
+ address: contractAddress,
+ abi,
+ functionName: 'balanceOf',
+ args: [ownerAddress],
+ });
+ console.log(`NFT balance of ${ownerAddress} is now: ${balance}`);
+}
+```
+
+## Conclusion
+
+In this tutorial, you:
+
+- Set up and **configured** a Base Paymaster on the Coinbase Developer Platform.
+- **Allowlisted** a contract and specific function (`mintTo`) for sponsorship.
+- Established **per-user** and **global** sponsorship **limits** to control costs.
+- Demonstrated the **sponsorship flow** with Smart Accounts using `permissionless`, `viem`, and Foundry-generated private keys.
+
+This approach can greatly improve your dApp’s user experience by removing gas friction. For more complex sponsorship schemes (like daily or weekly cycles), simply tweak your per-user and global limit settings in the Coinbase Developer Platform.
+
+> **Next Steps**
+>
+> - Use a [proxy service][proxy service] for better endpoint security.
+> - Deploy your own contracts and allowlist them.
+> - Experiment with bundling multiple calls into a single sponsored transaction.
+
+## References
+
+- [list of factory addresses]
+- [Discord]
+- [CDP site]
+- [Coinbase Developer Platform]
+- [UI]
+- [proxy service]
+- [Paymaster Tool]
+- [Foundry Book installation guide]
+- [simple NFT contract]
+
+[list of factory addresses]: https://docs.alchemy.com/reference/factory-addresses
+[Discord]: https://discord.com/invite/cdp
+[CDP site]: https://portal.cdp.coinbase.com/
+[Coinbase Developer Platform]: https://portal.cdp.coinbase.com/
+[UI]: https://portal.cdp.coinbase.com/products/bundler-and-paymaster
+[proxy service]: https://www.smartwallet.dev/guides/paymasters
+[Paymaster Tool]: https://portal.cdp.coinbase.com/products/bundler-and-paymaster
+[Foundry Book installation guide]: https://book.getfoundry.sh/getting-started/installation
+[simple NFT contract]: https://basescan.org/token/0x83bd615eb93ee1336aca53e185b03b54ff4a17e8
+
+**Happy Building on Base!**
diff --git a/docs/cookbook/growth/cast-actions.mdx b/docs/cookbook/growth/cast-actions.mdx
new file mode 100644
index 00000000..a477eb2d
--- /dev/null
+++ b/docs/cookbook/growth/cast-actions.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Cast Actions'
+description: 'Guide to implementing Cast Actions for growth'
+---
+
+[Guide for implementing and utilizing Cast Actions to grow your application]
\ No newline at end of file
diff --git a/docs/cookbook/growth/deploy-to-vercel.mdx b/docs/cookbook/growth/deploy-to-vercel.mdx
new file mode 100644
index 00000000..0e370596
--- /dev/null
+++ b/docs/cookbook/growth/deploy-to-vercel.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Deploy to Vercel'
+description: 'Guide to deploying your application on Vercel'
+---
+
+[Step-by-step guide for deploying your Base application to Vercel]
\ No newline at end of file
diff --git a/docs/cookbook/growth/email-campaigns.mdx b/docs/cookbook/growth/email-campaigns.mdx
new file mode 100644
index 00000000..f3027cc6
--- /dev/null
+++ b/docs/cookbook/growth/email-campaigns.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Email Campaigns'
+description: 'Set up and manage email campaigns'
+---
+
+[Guide for setting up and managing email campaigns for user engagement]
\ No newline at end of file
diff --git a/docs/cookbook/growth/gating-and-redirects.mdx b/docs/cookbook/growth/gating-and-redirects.mdx
new file mode 100644
index 00000000..10810c6f
--- /dev/null
+++ b/docs/cookbook/growth/gating-and-redirects.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Gating and Redirects'
+description: 'Implement access control and redirects'
+---
+
+[Guide for implementing content gating and smart redirects in your application]
\ No newline at end of file
diff --git a/docs/cookbook/growth/hyperframes.mdx b/docs/cookbook/growth/hyperframes.mdx
new file mode 100644
index 00000000..54a83b21
--- /dev/null
+++ b/docs/cookbook/growth/hyperframes.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Hyperframes'
+description: 'Implement Hyperframes for enhanced engagement'
+---
+
+[Guide for implementing Hyperframes to enhance user engagement and distribution]
\ No newline at end of file
diff --git a/docs/cookbook/growth/retaining-users.mdx b/docs/cookbook/growth/retaining-users.mdx
new file mode 100644
index 00000000..1a34fad4
--- /dev/null
+++ b/docs/cookbook/growth/retaining-users.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Retaining Users'
+description: 'Strategies and implementations for user retention'
+---
+
+[Guide for implementing user retention strategies in your application]
\ No newline at end of file
diff --git a/docs/cookbook/launch-ai-agents.mdx b/docs/cookbook/launch-ai-agents.mdx
new file mode 100644
index 00000000..07a1cc93
--- /dev/null
+++ b/docs/cookbook/launch-ai-agents.mdx
@@ -0,0 +1,460 @@
+---
+title: 'Launch AI Agents on Base'
+description: 'Learn how to build and deploy autonomous AI agents on Base with access to stablecoins, tokens, NFTs, and onchain actions using CDP AgentKit.'
+---
+
+import LangChainReplitInstructions from '/snippets/ai-instructions/langchain-replit.mdx';
+import LangChainLocalInstructions from '/snippets/ai-instructions/langchain-local.mdx';
+import ElizaInstructions from '/snippets/ai-instructions/eliza.mdx';
+
+AI Agents become exponentially more powerful when they're onchain! By deploying AI agents on Base, you unlock access to **stablecoins**, **tokens**, **NFTs**, and a vast ecosystem of **DeFi protocols**. This significantly increases their autonomy and the universe of tasks they can perform, from automated trading to complex multi-step financial operations.
+
+## What You'll Build
+
+By the end of this guide, you'll have deployed a fully functional AI agent that can:
+
+- **Execute onchain transactions** autonomously
+- **Interact with DeFi protocols** for trading and liquidity
+- **Manage digital assets** including tokens and NFTs
+- **Respond to market conditions** with intelligent automation
+
+
+
+ Agents can execute transactions, trade tokens, and interact with smart contracts
+
+
+ Access to DEXs, lending protocols, and yield farming opportunities
+
+
+ Manage portfolios, NFT collections, and cross-chain assets
+
+
+ Real-time market analysis and automated trading strategies
+
+
+
+## Prerequisites
+
+Before launching your AI agent, ensure you have the following setup:
+
+
+
+ Choose your preferred development environment and ensure you have the necessary tools installed.
+
+ **For Local Development:**
+ - Node.js 18+ or Python 3.10+
+ - Git for repository management
+ - Code editor (VS Code recommended)
+
+ **For Replit (Browser-based):**
+ - Replit account for cloud development
+ - No local installation required
+
+
+ Replit is perfect for quick prototyping, while local development gives you more control and flexibility.
+
+
+
+
+ Gather the required API keys for your AI agent:
+
+ - **Coinbase Developer Platform (CDP) API Key**: [Get your CDP credentials](https://www.coinbase.com/cloud)
+ - **OpenAI API Key**: [Create an OpenAI account](https://platform.openai.com/api-keys) for AI capabilities
+ - **Base Network Access**: Your agent will operate on Base Sepolia testnet initially
+
+
+ Store all API keys securely and never commit them to version control. Use environment variables for all sensitive credentials.
+
+
+
+
+ Choose the framework that best fits your needs:
+
+ - **LangChain**: Full-featured framework with extensive integrations
+ - **Eliza**: Lightweight, fast setup for simple agents
+
+
+ Each framework has different strengths. LangChain offers more customization, while Eliza provides rapid deployment.
+
+
+
+
+## Choose Your Agent Framework
+
+Select the framework and environment that best matches your development preferences and project requirements:
+
+
+
+ **LangChain** provides a comprehensive framework for building sophisticated AI agents with extensive tooling and integrations.
+
+
+ **Best for:** Complex agents requiring custom tools, advanced reasoning, and extensive integrations with external services.
+
+
+ ### Development Environment
+
+
+
+ Perfect for getting started quickly without local setup requirements.
+
+
+
+
+ **Replit Advantages:**
+ - No local environment setup required
+ - Built-in collaboration features
+ - Automatic deployment and hosting
+ - Great for learning and prototyping
+
+
+
+
+ Recommended for production applications and advanced customization.
+
+
+
+
+ **Local Development Advantages:**
+ - Full control over your environment
+ - Better performance for intensive operations
+ - Easier integration with existing toolchains
+ - Enhanced security for production applications
+
+
+
+
+ ### Advanced LangChain Features
+
+ Once your basic agent is running, you can enhance it with:
+
+
+
+ ```python
+ # Example: Custom DeFi interaction tool
+ from cdp_langchain.tools import CdpTool
+
+ class CustomDeFiTool(CdpTool):
+ def __init__(self):
+ super().__init__(
+ name="defi_analyzer",
+ description="Analyze DeFi opportunities on Base"
+ )
+ ```
+
+
+
+ ```python
+ # Add memory to your agent
+ from langchain.memory import ConversationBufferWindowMemory
+
+ memory = ConversationBufferWindowMemory(
+ k=10, # Remember last 10 interactions
+ return_messages=True
+ )
+ ```
+
+
+
+ ```python
+ # Coordinate multiple specialized agents
+ trading_agent = create_trading_agent()
+ portfolio_agent = create_portfolio_agent()
+
+ # Orchestrate agents for complex strategies
+ coordinator = AgentCoordinator([trading_agent, portfolio_agent])
+ ```
+
+
+
+
+
+ **Eliza** offers the fastest path to deploying AI agents with minimal configuration and maximum speed.
+
+
+ **Best for:** Quick deployments, simple autonomous agents, and rapid prototyping with immediate results.
+
+
+
+
+ ### Eliza Framework Benefits
+
+
+
+ Get your agent running in under 5 minutes with the CLI tool
+
+
+ Pre-configured templates for common agent patterns
+
+
+ Native support for popular onchain actions and APIs
+
+
+ Access to pre-built agent templates from the community
+
+
+
+ ### Extending Your Eliza Agent
+
+
+
+ Extend your agent's capabilities by adding custom onchain actions:
+
+ ```typescript
+ // Add to your agent's action registry
+ export const customActions = [
+ {
+ name: "YIELD_FARM",
+ description: "Automatically farm yield on Base protocols",
+ handler: async (params) => {
+ // Your yield farming logic
+ }
+ }
+ ];
+ ```
+
+
+
+ Implement automated trading strategies:
+
+ ```typescript
+ export const tradingConfig = {
+ strategies: ["DCA", "MOMENTUM", "ARBITRAGE"],
+ riskLevel: "MODERATE",
+ maxSlippage: 0.01
+ };
+ ```
+
+
+
+ Add monitoring and alerts for your agent:
+
+ ```typescript
+ export const monitoringConfig = {
+ alerts: {
+ lowBalance: true,
+ failedTx: true,
+ profitTarget: 0.05
+ }
+ };
+ ```
+
+
+
+
+
+## Testing Your AI Agent
+
+Before deploying to mainnet, thoroughly test your agent's capabilities:
+
+
+
+ **Test all functions on Base Sepolia testnet:**
+
+ 1. **Wallet Operations**: Create wallets, check balances, transfer tokens
+ 2. **DeFi Interactions**: Test swaps, liquidity provision, lending
+ 3. **NFT Operations**: Mint, transfer, and trade NFTs
+ 4. **Error Handling**: Ensure graceful handling of failed transactions
+
+
+ Your agent should handle all basic operations without errors before proceeding.
+
+
+
+
+ **Evaluate agent performance under various conditions:**
+
+ - Response time to market changes
+ - Transaction success rates
+ - Gas optimization effectiveness
+ - Resource utilization
+
+
+ Monitor your agent's performance metrics to identify optimization opportunities.
+
+
+
+
+ **Verify security measures are in place:**
+
+ - API keys are properly secured
+ - Wallet private keys are encrypted
+ - Rate limiting is implemented
+ - Transaction limits are configured
+
+
+ Never deploy to mainnet without proper security auditing. Consider professional security reviews for high-value operations.
+
+
+
+
+## Deployment and Monitoring
+
+
+
+ **Deploy your agent to a production environment:**
+
+
+
+ ```bash
+ # Deploy to cloud provider
+ npm run build
+ npm run deploy:production
+
+ # Set production environment variables
+ export CDP_API_KEY_NAME="your_production_key"
+ export NETWORK_ID="base-mainnet"
+ ```
+
+
+
+ ```bash
+ # Set up production server
+ pm2 start ecosystem.config.js
+ pm2 startup
+ pm2 save
+
+ # Configure monitoring
+ pm2 install pm2-logrotate
+ ```
+
+
+
+
+ Ensure your deployment includes proper logging, monitoring, and backup systems.
+
+
+
+
+ **Set up comprehensive monitoring:**
+
+ - **Transaction Monitoring**: Track success rates and gas usage
+ - **Performance Metrics**: Monitor response times and throughput
+ - **Financial Tracking**: Watch portfolio performance and P&L
+ - **System Health**: Monitor server resources and uptime
+
+
+ Use tools like Grafana, DataDog, or custom dashboards to visualize your agent's performance.
+
+
+
+
+## Troubleshooting
+
+
+
+ **Common solutions:**
+ - Check API key validity and permissions
+ - Verify network connectivity to Base RPC endpoints
+ - Ensure sufficient gas funds in agent wallet
+ - Review agent logs for error messages
+ - Confirm OpenAI API quota and rate limits
+
+
+
+ **Debug transaction issues:**
+ - Verify sufficient token balance for operations
+ - Check gas price settings and network congestion
+ - Confirm smart contract addresses are correct
+ - Review transaction simulation results
+ - Validate slippage tolerance settings
+
+
+
+ **Optimize agent performance:**
+ - Implement request batching for multiple operations
+ - Use connection pooling for database operations
+ - Cache frequently accessed data
+ - Optimize trading frequency to reduce gas costs
+ - Review and tune AI model parameters
+
+
+
+ **Enhance security measures:**
+ - Rotate API keys regularly
+ - Implement transaction signing verification
+ - Set up multi-signature requirements for large transactions
+ - Enable wallet spending limits
+ - Monitor for unusual activity patterns
+
+
+
+## Advanced Use Cases
+
+Explore advanced patterns for sophisticated AI agents:
+
+
+
+ Build agents that identify and execute arbitrage opportunities across DEXs
+
+
+ Create agents that rebalance portfolios based on market conditions
+
+
+ Deploy agents that automatically find and compound the best yields
+
+
+ Develop agents that analyze and trade NFTs based on market trends
+
+
+
+## Next Steps
+
+Expand your AI agent's capabilities:
+
+
+
+ Connect your agent to more DeFi protocols:
+ - **Uniswap** for advanced trading strategies
+ - **Aave** for lending and borrowing
+ - **Compound** for yield generation
+ - **1inch** for optimal trade routing
+
+
+
+ Build sophisticated trading and management strategies:
+ - Dollar-cost averaging (DCA) algorithms
+ - Mean reversion trading
+ - Momentum-based strategies
+ - Risk-adjusted portfolio rebalancing
+
+
+
+ Extend your agent across multiple chains:
+ - **Ethereum** for additional DeFi access
+ - **Polygon** for low-cost operations
+ - **Arbitrum** for advanced trading
+ - Cross-chain bridging automation
+
+
+
+## Resources and Community
+
+
+
+ Complete documentation for building agents with CDP
+
+
+ Connect with other developers building AI agents on Base
+
+
+ Access source code, examples, and contribute to the project
+
+
+ Watch step-by-step tutorials for agent development
+
+
+
+## Conclusion
+
+Congratulations! You've successfully launched an AI agent on Base with full onchain capabilities. Your agent can now:
+
+✅ **Execute autonomous transactions** with real-world financial impact
+✅ **Interact with DeFi protocols** for advanced financial operations
+✅ **Manage digital assets** including tokens and NFTs
+✅ **Respond intelligently** to market conditions and opportunities
+
+**Ready for production?** Consider implementing advanced monitoring, security audits, and gradual scaling as your agent proves its effectiveness in live markets.
+
+
+Your AI agent is now part of the onchain economy, ready to operate 24/7 in the world of decentralized finance. Happy building on Base!
+
diff --git a/docs/cookbook/launch-tokens.mdx b/docs/cookbook/launch-tokens.mdx
new file mode 100644
index 00000000..aa3402cd
--- /dev/null
+++ b/docs/cookbook/launch-tokens.mdx
@@ -0,0 +1,423 @@
+---
+title: 'Launch a Token'
+---
+
+
+Launching a token on Base can be accomplished through multiple approaches, from no-code platforms to custom smart contract development. This guide helps you choose the right method and provides implementation details for both approaches.
+
+
+
+ Use existing platforms like Zora, Clanker, or Flaunch for quick deployment
+
+
+ Build custom ERC-20 tokens with Foundry for maximum control
+
+
+ Decision framework to help you pick the right method
+
+
+ Security, community building, and post-launch guidance
+
+
+
+
+**For most users:** Use existing token launch platforms like Zora, Clanker, or Flaunch. These tools handle the technical complexity while providing unique features for different use cases.
+
+**For developers:** Build custom ERC-20 tokens using Foundry and OpenZeppelin's battle-tested contracts for maximum control and customization.
+
+
+## Choosing Your Launch Approach
+
+### Platform-Based Launch (Recommended for Most Users)
+
+Choose a platform when you want:
+- Quick deployment without coding
+- Built-in community features
+- Automated liquidity management
+- Social integration capabilities
+
+### Custom Development (For Developers)
+
+Build your own smart contract when you need:
+- Custom tokenomics or functionality
+- Full control over contract behavior
+- Integration with existing systems
+- Advanced security requirements
+
+## Token Launch Platforms on Base
+
+### Zora
+**Best for:** Content creators and social tokens
+
+Zora transforms every post into a tradeable ERC-20 token with automatic Uniswap integration. Each post becomes a "coin" with 1 billion supply, creators receive 10 million tokens, and earn 1% of all trading fees.
+
+**Key Features:**
+- Social-first token creation
+- Automatic liquidity pools
+- Revenue sharing for creators
+- Built-in trading interface
+
+[Get started with Zora →](https://zora.co)
+
+### Clanker
+**Best for:** Quick memecoin launches via social media
+
+Clanker is an AI-driven token deployment tool that operates through Farcaster. Users can create ERC-20 tokens on Base by simply tagging @clanker with their token concept.
+
+**Key Features:**
+- AI-powered automation
+- Social media integration via Farcaster
+- Instant deployment
+- Community-driven discovery
+
+[Get started with Clanker →](https://warpcast.com) or visit [clanker.world](https://clanker.world)
+
+### Flaunch
+**Best for:** Advanced memecoin projects with sophisticated tokenomics
+
+Flaunch leverages Uniswap V4 to enable programmable revenue splits, automated buybacks, and Progressive Bid Walls for price support. Creators can customize fee distributions and treasury management.
+
+**Key Features:**
+- Programmable revenue sharing
+- Automated buyback mechanisms
+- Progressive Bid Wall technology
+- Treasury management tools
+
+[Get started with Flaunch →](https://flaunch.gg)
+
+## Technical Implementation with Foundry
+
+For developers who want full control over their token implementation, here's how to create and deploy a custom ERC-20 token on Base using Foundry.
+
+
+Before launching a custom developed token to production, always conduct security reviews by expert smart contract developers.
+
+
+### Prerequisites
+
+
+
+ Install Foundry on your system:
+ ```bash Terminal
+ curl -L https://foundry.paradigm.xyz | bash
+ foundryup
+ ```
+ For detailed installation instructions, see the [Foundry documentation](https://book.getfoundry.sh/getting-started/installation).
+
+
+ Obtain Base Sepolia ETH for testing from the [Base Faucet](https://docs.base.org/docs/tools/network-faucets)
+
+
+ Configure your wallet and development tools for Base testnet deployment
+
+
+
+### Project Setup
+
+Initialize a new Foundry project and clean up template files:
+
+```bash Terminal
+# Create new project
+forge init my-token-project
+cd my-token-project
+
+# Remove template files we don't need
+rm src/Counter.sol script/Counter.s.sol test/Counter.t.sol
+```
+
+Install OpenZeppelin contracts for secure, audited ERC-20 implementation:
+
+```bash Terminal
+# Install OpenZeppelin contracts library
+forge install OpenZeppelin/openzeppelin-contracts
+```
+
+### Smart Contract Development
+
+Create your token contract using OpenZeppelin's ERC-20 implementation:
+
+```solidity src/MyToken.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
+
+/**
+ * @title MyToken
+ * @dev ERC-20 token with minting capabilities and supply cap
+ */
+contract MyToken is ERC20, Ownable {
+ // Maximum number of tokens that can ever exist
+ uint256 public constant MAX_SUPPLY = 1_000_000_000 * 10**18; // 1 billion tokens
+
+ constructor(
+ string memory name,
+ string memory symbol,
+ uint256 initialSupply,
+ address initialOwner
+ ) ERC20(name, symbol) Ownable(initialOwner) {
+ require(initialSupply <= MAX_SUPPLY, "Initial supply exceeds max supply");
+ // Mint initial supply to the contract deployer
+ _mint(initialOwner, initialSupply);
+ }
+
+ /**
+ * @dev Mint new tokens (only contract owner can call this)
+ * @param to Address to mint tokens to
+ * @param amount Amount of tokens to mint
+ */
+ function mint(address to, uint256 amount) public onlyOwner {
+ require(totalSupply() + amount <= MAX_SUPPLY, "Minting would exceed max supply");
+ _mint(to, amount);
+ }
+
+ /**
+ * @dev Burn tokens from caller's balance
+ * @param amount Amount of tokens to burn
+ */
+ function burn(uint256 amount) public {
+ _burn(msg.sender, amount);
+ }
+}
+```
+
+### Deployment Script
+
+Create a deployment script following Foundry best practices:
+
+```solidity script/DeployToken.s.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import {Script, console} from "forge-std/Script.sol";
+import {MyToken} from "../src/MyToken.sol";
+
+contract DeployToken is Script {
+ function run() external {
+ // Load deployer's private key from environment variables
+ uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
+ address deployerAddress = vm.addr(deployerPrivateKey);
+
+ // Token configuration parameters
+ string memory name = "My Token";
+ string memory symbol = "MTK";
+ uint256 initialSupply = 100_000_000 * 10**18; // 100 million tokens
+
+ // Start broadcasting transactions
+ vm.startBroadcast(deployerPrivateKey);
+
+ // Deploy the token contract
+ MyToken token = new MyToken(
+ name,
+ symbol,
+ initialSupply,
+ deployerAddress
+ );
+
+ // Stop broadcasting transactions
+ vm.stopBroadcast();
+
+ // Log deployment information
+ console.log("Token deployed to:", address(token));
+ console.log("Token name:", token.name());
+ console.log("Token symbol:", token.symbol());
+ console.log("Initial supply:", token.totalSupply());
+ console.log("Deployer balance:", token.balanceOf(deployerAddress));
+ }
+}
+```
+
+### Environment Configuration
+
+Create a `.env` file with your configuration:
+
+```bash .env
+PRIVATE_KEY=your_private_key_here
+BASE_SEPOLIA_RPC_URL=https://sepolia.base.org
+BASE_MAINNET_RPC_URL=https://mainnet.base.org
+BASESCAN_API_KEY=your_basescan_api_key_here
+```
+
+Update `foundry.toml` for Base network configuration:
+
+```toml foundry.toml
+[profile.default]
+src = "src"
+out = "out"
+libs = ["lib"]
+remappings = ["@openzeppelin/=lib/openzeppelin-contracts/"]
+
+[rpc_endpoints]
+base_sepolia = "${BASE_SEPOLIA_RPC_URL}"
+base_mainnet = "${BASE_MAINNET_RPC_URL}"
+
+[etherscan]
+base_sepolia = { key = "${BASESCAN_API_KEY}", url = "https://api-sepolia.basescan.org/api" }
+base = { key = "${BASESCAN_API_KEY}", url = "https://api.basescan.org/api" }
+```
+
+### Testing
+
+Create comprehensive tests for your token:
+
+```solidity test/MyToken.t.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import {Test, console} from "forge-std/Test.sol";
+import {MyToken} from "../src/MyToken.sol";
+
+contract MyTokenTest is Test {
+ MyToken public token;
+ address public owner = address(0x1);
+ address public user = address(0x2);
+
+ uint256 constant INITIAL_SUPPLY = 100_000_000 * 10**18;
+
+ function setUp() public {
+ // Deploy token contract before each test
+ vm.prank(owner);
+ token = new MyToken("Test Token", "TEST", INITIAL_SUPPLY, owner);
+ }
+
+ function testInitialState() public {
+ // Verify token was deployed with correct parameters
+ assertEq(token.name(), "Test Token");
+ assertEq(token.symbol(), "TEST");
+ assertEq(token.totalSupply(), INITIAL_SUPPLY);
+ assertEq(token.balanceOf(owner), INITIAL_SUPPLY);
+ }
+
+ function testMinting() public {
+ uint256 mintAmount = 1000 * 10**18;
+
+ // Only owner should be able to mint
+ vm.prank(owner);
+ token.mint(user, mintAmount);
+
+ assertEq(token.balanceOf(user), mintAmount);
+ assertEq(token.totalSupply(), INITIAL_SUPPLY + mintAmount);
+ }
+
+ function testBurning() public {
+ uint256 burnAmount = 1000 * 10**18;
+
+ // Owner burns their own tokens
+ vm.prank(owner);
+ token.burn(burnAmount);
+
+ assertEq(token.balanceOf(owner), INITIAL_SUPPLY - burnAmount);
+ assertEq(token.totalSupply(), INITIAL_SUPPLY - burnAmount);
+ }
+
+ function testFailMintExceedsMaxSupply() public {
+ // This test should fail when trying to mint more than max supply
+ uint256 excessiveAmount = token.MAX_SUPPLY() + 1;
+
+ vm.prank(owner);
+ token.mint(user, excessiveAmount);
+ }
+
+ function testFailUnauthorizedMinting() public {
+ // This test should fail when non-owner tries to mint
+ vm.prank(user);
+ token.mint(user, 1000 * 10**18);
+ }
+}
+```
+
+Run your tests:
+
+```bash Terminal
+# Run all tests with verbose output
+forge test -vv
+```
+
+### Deployment and Verification
+
+Deploy to Base Sepolia testnet:
+
+```bash Terminal
+# Load environment variables
+source .env
+
+# Deploy to Base Sepolia with automatic verification
+forge script script/DeployToken.s.sol:DeployToken \
+ --rpc-url base_sepolia \
+ --broadcast \
+ --verify
+```
+
+
+The `--verify` flag automatically verifies your contract on BaseScan, making it easier for users to interact with your token.
+
+
+
+To deploy to Base Mainnet, simply change `base_sepolia` to `base_mainnet` in your deployment command. Ensure you have sufficient ETH on Base Mainnet for deployment and gas fees.
+
+
+## Post-Launch Considerations
+
+Once your token is deployed, here are the key next steps to consider:
+
+### Token Distribution and Economics
+
+Carefully consider your token's supply and distribution settings. Think through how tokens will be distributed to your community, team, and ecosystem participants. Consider factors like vesting schedules, allocation percentages, and long-term incentive alignment.
+
+### Community and Social Presence
+
+Establish a community and social presence around your token and project. This includes creating documentation, setting up social media accounts, engaging with the Base ecosystem, and building relationships with other projects and developers.
+
+### Liquidity and Trading
+
+Add liquidity to decentralized exchanges like Uniswap to enable trading. Note that token launchers will typically handle this for you automatically, but for custom deployments, you'll need to create trading pairs and provide initial liquidity.
+
+### Continued Development
+
+For comprehensive guidance on growing your project on Base, including marketing strategies, ecosystem integration, and growth tactics, visit the [Base Launch Playbook](https://www.launchonbase.xyz/).
+
+
+Remember to always prioritize security, transparency, and community value when developing and launching tokens. Consider conducting security audits and following best practices for token distribution.
+
+
+## Resources
+
+
+
+ Complete guide to getting started on Base
+
+
+ Technical specifications and network information
+
+
+ Comprehensive guide to using Foundry
+
+
+ Security-focused smart contract library
+
+
+ Explore transactions and contracts on Base
+
+
+ Get testnet ETH for development
+
+
+
+### Community
+
+
+
+ Join the Base community
+
+
+ Follow Base updates
+
+
+ Contribute to Base development
+
+
+
+---
+
+Whether you choose a platform-based approach for speed and convenience, or custom development for maximum control, Base provides a robust foundation for token launches. Start with the approach that best fits your technical expertise and project requirements, and leverage Base's growing ecosystem to build successful token projects.
\ No newline at end of file
diff --git a/docs/cookbook/nfts/complex-onchain-nfts.mdx b/docs/cookbook/nfts/complex-onchain-nfts.mdx
new file mode 100644
index 00000000..87e582e1
--- /dev/null
+++ b/docs/cookbook/nfts/complex-onchain-nfts.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Complex Onchain NFTs'
+description: 'Create advanced onchain NFTs'
+---
+
+[Guide for creating complex onchain NFTs with advanced features]
\ No newline at end of file
diff --git a/docs/cookbook/nfts/dynamic-nfts.mdx b/docs/cookbook/nfts/dynamic-nfts.mdx
new file mode 100644
index 00000000..ae65005a
--- /dev/null
+++ b/docs/cookbook/nfts/dynamic-nfts.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Dynamic NFTs'
+description: 'Create NFTs with dynamic properties'
+---
+
+[Guide for creating dynamic NFTs that can change over time]
\ No newline at end of file
diff --git a/docs/cookbook/nfts/nft-minting-zora.mdx b/docs/cookbook/nfts/nft-minting-zora.mdx
new file mode 100644
index 00000000..6d35f221
--- /dev/null
+++ b/docs/cookbook/nfts/nft-minting-zora.mdx
@@ -0,0 +1,6 @@
+---
+title: 'NFT Minting with Zora'
+description: 'Guide to minting NFTs using Zora protocol'
+---
+
+[Guide for minting NFTs using the Zora protocol on Base]
\ No newline at end of file
diff --git a/docs/cookbook/nfts/signature-mint.mdx b/docs/cookbook/nfts/signature-mint.mdx
new file mode 100644
index 00000000..c293c7ed
--- /dev/null
+++ b/docs/cookbook/nfts/signature-mint.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Signature Mint'
+description: 'Implement signature-based NFT minting'
+---
+
+[Guide for implementing signature-based NFT minting]
\ No newline at end of file
diff --git a/docs/cookbook/nfts/simple-onchain-nfts.mdx b/docs/cookbook/nfts/simple-onchain-nfts.mdx
new file mode 100644
index 00000000..252a6b4f
--- /dev/null
+++ b/docs/cookbook/nfts/simple-onchain-nfts.mdx
@@ -0,0 +1,619 @@
+---
+title: Simple Onchain NFTs
+sidebarTitle: Simple NFTs
+description: 'Create basic NFT collections with metadata stored fully onchain for permanence and decentralization'
+---
+
+Build NFT collections where all metadata lives onchain for true decentralization and permanence. This approach ensures your NFTs remain accessible forever, regardless of external hosting or IPFS availability.
+
+
+
+ Understand the advantages of storing metadata onchain
+
+
+ Deploy your onchain NFT contract
+
+
+ Structure your onchain metadata properly
+
+
+ Create a user-friendly minting experience
+
+
+
+## Why Onchain Metadata?
+
+Traditional NFTs store metadata on centralized servers or IPFS, creating potential points of failure. Onchain metadata ensures true permanence and decentralization.
+
+
+**Onchain vs Offchain Comparison**
+
+- **Onchain**: Metadata stored in smart contract, permanent, higher gas costs
+- **Offchain**: Metadata on IPFS/servers, lower gas costs, potential availability issues
+- **Hybrid**: Critical data onchain, detailed media offchain
+
+
+### Benefits of Onchain NFTs
+
+
+**Permanent Access**: Metadata exists as long as the blockchain exists
+
+
+**True Decentralization**: No reliance on external hosting services
+
+
+**Composability**: Other contracts can easily read and use metadata
+
+
+**Transparency**: All data is publicly verifiable onchain
+
+
+## Prerequisites
+
+Before building your onchain NFT collection:
+
+
+Understanding of Solidity and smart contract development
+
+
+Foundry or Hardhat development environment
+
+
+Base testnet ETH for deployment testing
+
+
+Basic knowledge of JSON and Base64 encoding
+
+
+## Smart Contract Implementation
+
+### Basic Onchain NFT Contract
+
+Here's a foundational contract that stores all metadata onchain:
+
+```solidity contracts/SimpleOnchainNFT.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
+import "@openzeppelin/contracts/utils/Strings.sol";
+import "@openzeppelin/contracts/utils/Base64.sol";
+
+contract SimpleOnchainNFT is ERC721, Ownable {
+ using Strings for uint256;
+
+ uint256 private _tokenIdCounter;
+ mapping(uint256 => NFTMetadata) private _tokenMetadata;
+
+ struct NFTMetadata {
+ string name;
+ string description;
+ string image; // Can be SVG data or onchain-generated art
+ string[] attributes;
+ }
+
+ event NFTMinted(address indexed to, uint256 indexed tokenId, string name);
+
+ constructor(address initialOwner)
+ ERC721("Simple Onchain NFT", "SONFT")
+ Ownable(initialOwner)
+ {}
+
+ function mint(
+ address to,
+ string memory name,
+ string memory description,
+ string memory image,
+ string[] memory attributes
+ ) public onlyOwner {
+ uint256 tokenId = _tokenIdCounter++;
+
+ _tokenMetadata[tokenId] = NFTMetadata({
+ name: name,
+ description: description,
+ image: image,
+ attributes: attributes
+ });
+
+ _safeMint(to, tokenId);
+ emit NFTMinted(to, tokenId, name);
+ }
+
+ function tokenURI(uint256 tokenId)
+ public
+ view
+ override
+ returns (string memory)
+ {
+ require(_exists(tokenId), "Token does not exist");
+
+ NFTMetadata memory metadata = _tokenMetadata[tokenId];
+
+ // Build JSON metadata
+ bytes memory json = abi.encodePacked(
+ '{"name":"', metadata.name,
+ '","description":"', metadata.description,
+ '","image":"', metadata.image,
+ '","attributes":[', _buildAttributes(metadata.attributes),
+ ']}'
+ );
+
+ // Encode as base64 data URI
+ return string(
+ abi.encodePacked(
+ "data:application/json;base64,",
+ Base64.encode(json)
+ )
+ );
+ }
+
+ function _buildAttributes(string[] memory attributes)
+ private
+ pure
+ returns (string memory)
+ {
+ if (attributes.length == 0) return "";
+
+ bytes memory result;
+ for (uint256 i = 0; i < attributes.length; i += 2) {
+ if (i > 0) result = abi.encodePacked(result, ",");
+
+ if (i + 1 < attributes.length) {
+ result = abi.encodePacked(
+ result,
+ '{"trait_type":"', attributes[i],
+ '","value":"', attributes[i + 1], '"}'
+ );
+ }
+ }
+ return string(result);
+ }
+
+ function getMetadata(uint256 tokenId)
+ public
+ view
+ returns (NFTMetadata memory)
+ {
+ require(_exists(tokenId), "Token does not exist");
+ return _tokenMetadata[tokenId];
+ }
+
+ function totalSupply() public view returns (uint256) {
+ return _tokenIdCounter;
+ }
+}
+```
+
+### Generative Art Contract
+
+For purely generative onchain art:
+
+```solidity contracts/GenerativeOnchainNFT.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
+import "@openzeppelin/contracts/utils/Strings.sol";
+import "@openzeppelin/contracts/utils/Base64.sol";
+
+contract GenerativeOnchainNFT is ERC721, Ownable {
+ using Strings for uint256;
+
+ uint256 private _tokenIdCounter;
+ uint256 public constant MAX_SUPPLY = 1000;
+ uint256 public constant MINT_PRICE = 0.01 ether;
+
+ // Colors for generative art
+ string[] private colors = ["red", "blue", "green", "purple", "orange", "yellow"];
+ string[] private shapes = ["circle", "square", "triangle", "diamond"];
+
+ constructor(address initialOwner)
+ ERC721("Generative Onchain Art", "GOA")
+ Ownable(initialOwner)
+ {}
+
+ function mint() public payable {
+ require(_tokenIdCounter < MAX_SUPPLY, "Max supply reached");
+ require(msg.value >= MINT_PRICE, "Insufficient payment");
+
+ uint256 tokenId = _tokenIdCounter++;
+ _safeMint(msg.sender, tokenId);
+ }
+
+ function tokenURI(uint256 tokenId)
+ public
+ view
+ override
+ returns (string memory)
+ {
+ require(_exists(tokenId), "Token does not exist");
+
+ // Generate deterministic traits based on tokenId
+ uint256 seed = uint256(keccak256(abi.encodePacked(tokenId, block.timestamp)));
+
+ string memory color = colors[seed % colors.length];
+ string memory shape = shapes[(seed >> 8) % shapes.length];
+ uint256 size = (seed % 100) + 50; // Size between 50-149
+
+ // Generate SVG
+ string memory svg = generateSVG(tokenId, color, shape, size);
+
+ // Build metadata JSON
+ bytes memory json = abi.encodePacked(
+ '{"name":"Generative Art #', tokenId.toString(),
+ '","description":"Fully onchain generative art",',
+ '"image":"data:image/svg+xml;base64,', Base64.encode(bytes(svg)),
+ '","attributes":[',
+ '{"trait_type":"Color","value":"', color, '"},',
+ '{"trait_type":"Shape","value":"', shape, '"},',
+ '{"trait_type":"Size","value":', size.toString(), '}',
+ ']}'
+ );
+
+ return string(
+ abi.encodePacked(
+ "data:application/json;base64,",
+ Base64.encode(json)
+ )
+ );
+ }
+
+ function generateSVG(
+ uint256 tokenId,
+ string memory color,
+ string memory shape,
+ uint256 size
+ ) private pure returns (string memory) {
+ string memory shapeElement;
+
+ if (keccak256(bytes(shape)) == keccak256(bytes("circle"))) {
+ shapeElement = string(
+ abi.encodePacked(
+ ''
+ )
+ );
+ } else if (keccak256(bytes(shape)) == keccak256(bytes("square"))) {
+ uint256 x = 150 - (size / 2);
+ uint256 y = 150 - (size / 2);
+ shapeElement = string(
+ abi.encodePacked(
+ ''
+ )
+ );
+ }
+ // Add more shapes as needed
+
+ return string(
+ abi.encodePacked(
+ ''
+ )
+ );
+ }
+
+ function withdraw() external onlyOwner {
+ payable(owner()).transfer(address(this).balance);
+ }
+}
+```
+
+## Metadata Structure
+
+### Standard JSON Metadata
+
+Follow the OpenSea metadata standard for compatibility:
+
+```json metadata-example.json
+{
+ "name": "Simple Onchain NFT #1",
+ "description": "A beautiful NFT with metadata stored entirely onchain",
+ "image": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIi...",
+ "attributes": [
+ {
+ "trait_type": "Color",
+ "value": "Blue"
+ },
+ {
+ "trait_type": "Rarity",
+ "value": "Common"
+ },
+ {
+ "trait_type": "Size",
+ "value": "Large"
+ }
+ ]
+}
+```
+
+### SVG Image Generation
+
+Create dynamic SVG images in your smart contract:
+
+```solidity utils/SVGGenerator.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+library SVGGenerator {
+ function generateBackground(string memory color)
+ internal
+ pure
+ returns (string memory)
+ {
+ return string(
+ abi.encodePacked(
+ ''
+ )
+ );
+ }
+
+ function generateText(
+ string memory text,
+ uint256 x,
+ uint256 y,
+ string memory color
+ ) internal pure returns (string memory) {
+ return string(
+ abi.encodePacked(
+ '',
+ text,
+ ''
+ )
+ );
+ }
+
+ function wrapSVG(string memory content)
+ internal
+ pure
+ returns (string memory)
+ {
+ return string(
+ abi.encodePacked(
+ ''
+ )
+ );
+ }
+}
+```
+
+## Building Mint Interface
+
+### Next.js Minting App
+
+Create a user-friendly interface for minting:
+
+```typescript app/mint/page.tsx
+'use client'
+
+import { useState } from 'react'
+import { useAccount, useWriteContract, useWaitForTransactionReceipt } from 'wagmi'
+import { parseEther } from 'viem'
+
+const CONTRACT_ADDRESS = '0x...' // Your deployed contract address
+const ABI = [...] // Your contract ABI
+
+export default function MintPage() {
+ const { address, isConnected } = useAccount()
+ const [isLoading, setIsLoading] = useState(false)
+
+ const { writeContract, data: hash } = useWriteContract()
+
+ const { isLoading: isConfirming, isSuccess } = useWaitForTransactionReceipt({
+ hash,
+ })
+
+ const handleMint = async () => {
+ if (!isConnected) return
+
+ setIsLoading(true)
+
+ try {
+ writeContract({
+ abi: ABI,
+ address: CONTRACT_ADDRESS,
+ functionName: 'mint',
+ value: parseEther('0.01'),
+ })
+ } catch (error) {
+ console.error('Mint failed:', error)
+ } finally {
+ setIsLoading(false)
+ }
+ }
+
+ return (
+
+
Mint Onchain NFT
+
+
+
+
Collection Details
+
+ Generative Onchain Art - Each NFT is unique and generated entirely onchain
+
+ )
+}
+```
+
+## Best Practices
+
+### Gas Optimization
+
+
+**Optimize Storage**
+
+Store only essential data onchain. Use efficient data structures and consider gas costs when designing your metadata schema.
+
+
+1. **Pack Data Efficiently**: Use structs and pack data to minimize storage slots
+2. **Lazy Generation**: Generate images and metadata on-demand in `tokenURI()`
+3. **Batch Operations**: Allow batch minting to reduce per-NFT costs
+4. **Optimize SVG**: Keep SVG code minimal and efficient
+
+### Security Considerations
+
+
+**Immutable Data**
+
+Remember that onchain data is permanent and immutable. Thoroughly test your generation logic before deployment.
+
+
+1. **Access Controls**: Implement proper access controls for minting functions
+2. **Input Validation**: Validate all inputs to prevent malformed metadata
+3. **Reentrancy Protection**: Use OpenZeppelin's ReentrancyGuard for payable functions
+4. **Audit Code**: Have your contracts audited before mainnet deployment
+
+## Deployment
+
+### Deploy to Base
+
+```bash Terminal
+# Using Foundry
+forge create --rpc-url https://mainnet.base.org \
+ --private-key $PRIVATE_KEY \
+ --verify \
+ contracts/SimpleOnchainNFT.sol:SimpleOnchainNFT \
+ --constructor-args $OWNER_ADDRESS
+```
+
+### Verify Contract
+
+```bash Terminal
+forge verify-contract \
+ --chain base \
+ --compiler-version v0.8.19 \
+ $CONTRACT_ADDRESS \
+ contracts/SimpleOnchainNFT.sol:SimpleOnchainNFT
+```
+
+## Resources
+
+
+
+ Secure smart contract building blocks
+
+
+ Onchain Base64 encoding utilities
+
+
+ Learn SVG for onchain graphics
+
+
+ NFT metadata standards
+
+
+
+---
+
+Onchain NFTs provide true digital ownership and permanence that can't be achieved with traditional hosted metadata. While they require more careful planning and higher gas costs, they offer unmatched durability and composability for your digital assets.
\ No newline at end of file
diff --git a/docs/cookbook/nfts/thirdweb-unreal-nft-items.mdx b/docs/cookbook/nfts/thirdweb-unreal-nft-items.mdx
new file mode 100644
index 00000000..07124250
--- /dev/null
+++ b/docs/cookbook/nfts/thirdweb-unreal-nft-items.mdx
@@ -0,0 +1,6 @@
+---
+title: 'ThirdWeb Unreal NFT Items'
+description: 'Create NFT items using ThirdWeb and Unreal Engine'
+---
+
+[Guide for creating NFT items using ThirdWeb and Unreal Engine]
\ No newline at end of file
diff --git a/docs/cookbook/onboard-any-user.mdx b/docs/cookbook/onboard-any-user.mdx
new file mode 100644
index 00000000..01b28960
--- /dev/null
+++ b/docs/cookbook/onboard-any-user.mdx
@@ -0,0 +1,143 @@
+---
+title: Onboard Any User
+sidebarTitle: Onboard User
+description: Learn how to seamlessly integrate the WalletModal component from OnchainKit to rapidly onboard new users with a smart wallet experience.
+---
+
+In onchain apps, the wallet is at the center of your user model. Onboarding requires users to connect an existing wallet or sign up for a new wallet. The [``](/onchainkit/wallet/wallet-modal) component provides a drag-and-drop solution to handle wallet onboarding seamlessly to eliminate friction and churn.
+
+## How It Works
+
+The component offers:
+
+- Smooth onboarding for new users with guided Smart Wallet creation
+- Quick connection for existing wallets
+- Consistent handling of connection states with a responsive UI
+
+Lets add the `WalletModal` component to your app.
+
+
+
+ ```bash Terminal
+ npm create onchain@latest
+ ```
+
+
+ ```tsx providers.tsx
+
+ {children}
+
+ ```
+
+
+ ```tsx App.tsx
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+
+ Ensure that the Wallet Modal is globally accessible by wrapping your key UI components:
+
+ ```tsx
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+
+
+
+{/*
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ */}
+
+You now have an interface to streamline user onboarding! The `WalletModal` component handles:
+
+- Smart wallet creation for new signups
+- Quick connection for existing wallets
+- Wallet connection states
+- Error handling
+- Mobile/desktop responsive behavior
+- Theme customization
+- Terms/privacy policy display
+
+## Why Smart Wallet for new signups?
+
+In addition to providing a secure and feature-rich wallet experience, Smart Wallets provide a streamlined onboarding experience through account creation with Passkeys. This allows anyone to securely create a new wallet and begin transacting without ever leaving your app.
+
+
+**More on Smart Wallets**
+
+Smart Wallet has advanced features such as sponsored transactions, spend permissions, and Magic Spend. [Learn more about Smart Wallet here](/smart-wallet/quickstart).
+
+
+
+## Conclusion
+
+By integrating ``, you offer a robust and user-friendly wallet onboarding experience. First-time users benefit from a seamless Smart Wallet creation flow, while returning users can quickly connect their wallets to get started with your onchain app.
diff --git a/docs/cookbook/onchain-social.mdx b/docs/cookbook/onchain-social.mdx
new file mode 100644
index 00000000..c89364e1
--- /dev/null
+++ b/docs/cookbook/onchain-social.mdx
@@ -0,0 +1,374 @@
+---
+title: Onchain Social
+---
+
+In this guide, you'll discover the world of onchain social applications and learn how to build interactive Mini Apps that live directly inside social feeds, creating seamless user experiences without traditional platform limitations.
+
+## What Is Onchain Social?
+
+Traditional social media follows a familiar but limiting pattern: users sign in with email addresses, scroll through centralized feeds, and click links that redirect them away from the conversation. While this model works, it has fundamental limitations that onchain social aims to solve.
+
+
+
+ Platform-owned identity and content with limited user control
+
+
+ User-owned identity, programmable feeds, and embedded applications
+
+
+
+### The Onchain Social Paradigm
+
+Onchain social represents a fundamental shift in how we think about digital identity and social interactions:
+
+**Traditional Model Problems:**
+- Your identity, content, and interactions are owned by the platform
+- Building requires working on top of platforms, never inside them
+- Users must leave conversations to access new experiences
+- Developers are limited by platform APIs and restrictions
+
+**Onchain Social Solutions:**
+- **Portable Identity**: Your Farcaster ID (FID) belongs to you, not locked to any single platform
+- **Embedded Experiences**: Rich, interactive apps run natively inside posts and conversations
+- **Developer Freedom**: Build as first-class citizens within the social graph
+- **User Ownership**: Control your data, content, and social connections
+
+
+This isn't about replacing existing platforms—it's about removing the walls between users, developers, and the experiences they create together.
+
+
+## What You'll Build
+
+By the end of this guide, you'll have created a fully functional Mini App with these capabilities:
+
+
+
+ Polls, games, and collaborative tools that run inside social feeds
+
+
+ Apps that know who opened them and adapt accordingly
+
+
+ Direct access to wallets, DeFi protocols, and blockchain transactions
+
+
+ User-owned identity through Farcaster without separate logins
+
+
+
+## Mini Apps: The Interface for Onchain Social
+
+Mini Apps are lightweight, expressive web applications that live directly inside social feeds. They launch instantly without installation and provide rich, interactive experiences that respond to your onchain identity.
+
+**What makes Mini Apps special:**
+- **Embedded experiences** that don't redirect users away from conversations
+- **Social context awareness** - they know who opened them and from where
+- **Onchain identity integration** with automatic personalization
+- **Native feel** within social platforms
+
+**Use cases include:**
+- Interactive polls and real-time voting
+- Social games and entertainment
+- E-commerce with instant checkout
+- DeFi interfaces and portfolio management
+- NFT showcases and trading
+- Collaborative decision-making tools
+
+
+Mini Apps offer developers direct access to social distribution - you're building inside the conversation, not trying to pull users away from it.
+
+
+## Build Your First Mini App
+
+
+
+ The fastest way to build a Mini App is with MiniKit, which handles authentication, social context, and onchain integrations automatically.
+
+ **Create a new Mini App:**
+ ```bash
+ npx create-onchain --mini
+ cd your-mini-app-name
+ npm install
+ ```
+
+ **Start the development server:**
+ ```bash
+ npm run dev
+ ```
+
+
+ Your Mini App should now be running at `http://localhost:3000` with a fully functional social interface.
+
+
+ **What you get out of the box:**
+ - Complete frontend and backend scaffold
+ - Built-in support for Farcaster identity and notifications
+ - Native integrations with Base blockchain and OnchainKit
+ - Responsive design optimized for mobile social feeds
+ - Development tools for testing and debugging
+
+
+ The MiniKit scaffold includes example components and pages to help you understand the architecture quickly.
+
+
+
+
+ Mini Apps have access to rich social context that traditional web apps lack. This context makes personalization effortless and enables intelligent interactions.
+
+ **Access user and social context:**
+ ```tsx
+ import { useMiniKit } from "@coinbase/onchainkit/minikit";
+
+ export default function App() {
+ const { context } = useMiniKit();
+
+ // Verified user information (always available)
+ const userFid = context?.user?.fid;
+
+ // Additional user data (when available)
+ const username = context?.user?.username;
+ const displayName = context?.user?.displayName;
+ const pfpUrl = context?.user?.pfpUrl;
+
+ // Client information
+ const isAdded = context?.client?.added; // Whether user has added this Mini App
+ const location = context?.location; // Where the Mini App was launched from
+
+ return (
+
+
Welcome{displayName ? `, ${displayName}` : ''}!
+
Your FID: {userFid}
+ {username &&
Username: @{username}
}
+ {isAdded &&
✅ You've added this Mini App
}
+ {location &&
Launched from: {location}
}
+
+ );
+ }
+ ```
+
+ **Verified context properties:**
+ - **User identity**: FID (always available), username, display name, profile image URL
+ - **Client status**: Whether the user has added your Mini App to their favorites
+ - **Launch context**: General location information about where the Mini App was opened
+ - **Safe area insets**: For proper mobile layout within Farcaster clients
+
+
+ Always handle cases where context might be undefined, especially during development and testing.
+
+
+
+
+ Create engaging social experiences that leverage the Mini App's embedded nature:
+
+ **Example: Social Voting App**
+ ```tsx
+ import { useState, useEffect } from 'react';
+ import { useMiniKit } from "@coinbase/onchainkit/minikit";
+
+ export default function VotingApp() {
+ const { context } = useMiniKit();
+ const [votes, setVotes] = useState({ option1: 0, option2: 0 });
+ const [userVote, setUserVote] = useState(null);
+
+ const handleVote = async (option) => {
+ if (userVote) return; // Prevent double voting
+
+ // Submit vote to your backend
+ const response = await fetch('/api/vote', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ fid: context?.user?.fid,
+ option,
+ location: context?.location
+ })
+ });
+
+ if (response.ok) {
+ setUserVote(option);
+ // Update vote counts
+ setVotes(prev => ({
+ ...prev,
+ [option]: prev[option] + 1
+ }));
+ }
+ };
+
+ return (
+
+
What's your preference?
+
+
+
+
+
+
+
+ {userVote && (
+
Thanks for voting! Your choice: {userVote}
+ )}
+
+ );
+ }
+ ```
+
+
+ Use the user's FID to prevent duplicate votes and create personalized experiences without requiring separate authentication.
+
+
+
+
+ Enhance your Mini App with blockchain functionality using OnchainKit:
+
+ ```tsx
+ import {
+ Transaction,
+ TransactionButton,
+ TransactionStatus
+ } from '@coinbase/onchainkit/transaction';
+
+ export default function OnchainMiniApp() {
+ const { context } = useMiniKit();
+
+ const handleTransaction = async () => {
+ // Create transaction based on social context
+ const txData = {
+ to: '0x...',
+ value: '1000000000000000000', // 1 ETH
+ data: '0x...'
+ };
+
+ return txData;
+ };
+
+ return (
+
+ );
+ }
+ ```
+
+
+ Your Mini App can now trigger blockchain transactions directly from social interactions.
+
+
+
+
+ Deploy your Mini App to make it accessible within social feeds:
+
+ **Deploy to Vercel (recommended):**
+ ```bash
+ npm install -g vercel
+ vercel --prod
+ ```
+
+ **Test your Mini App:**
+ 1. **Local testing**: Use the MiniKit development tools
+ 2. **Frame testing**: Test as a Farcaster Frame
+ 3. **Social testing**: Deploy and test in actual social contexts
+ 4. **Performance testing**: Ensure fast loading in mobile environments
+
+
+ Always test your Mini App in actual social contexts before broad deployment, as the social environment can affect performance and user experience.
+
+
+
+
+## Convert Existing Apps to Mini Apps
+
+Transform your existing Next.js application into a Mini App without major restructuring. The process is straightforward and doesn't require rebuilding your entire application.
+
+
+Follow our comprehensive guide for integrating MiniKit into existing applications with step-by-step instructions, environment setup, and testing procedures.
+
+
+**Key integration steps:**
+- Install MiniKit as part of OnchainKit
+- Wrap your app with `MiniKitProvider`
+- Add social context integration to existing components
+- Configure environment variables and deployment
+
+
+For new projects, use the [MiniKit CLI](/builderkits/minikit/quickstart) for automatic setup with all features pre-configured.
+
+
+## Advanced MiniKit Features
+
+Once you have your basic Mini App running, explore advanced capabilities:
+
+
+
+ Send push notifications to users who have added your Mini App
+
+
+ Implement Farcaster authentication for secure, persistent sessions
+
+
+ Navigate users to Farcaster profiles and build social connections
+
+
+ Allow users to save your Mini App for easy access
+
+
+
+## Best Practices & Troubleshooting
+
+Building successful Mini Apps requires understanding social-specific patterns and common pitfalls:
+
+
+
+ Design patterns and best practices for building social Mini Apps
+
+
+ Common issues and solutions when developing Mini Apps
+
+
+ Optimize loading times and user experience for mobile social environments
+
+
+ Specific guidance for optimizing Mini Apps in Coinbase Wallet
+
+
+
+## Resources and Community
+
+
+
+ Complete documentation for building Mini Apps with MiniKit
+
+
+ Get started with MiniKit in under 10 minutes
+
+
+ Learn about the underlying Farcaster social protocol
+
+
+ Connect with other developers building onchain social apps
+
+
+
+
diff --git a/docs/cookbook/payments/build-ecommerce-app.mdx b/docs/cookbook/payments/build-ecommerce-app.mdx
new file mode 100644
index 00000000..eb365cd2
--- /dev/null
+++ b/docs/cookbook/payments/build-ecommerce-app.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Build an E-commerce App'
+description: 'Learn how to build an e-commerce application on Base'
+---
+
+[Guide for building an e-commerce application on Base]
\ No newline at end of file
diff --git a/docs/cookbook/payments/deploy-shopify-storefront.mdx b/docs/cookbook/payments/deploy-shopify-storefront.mdx
new file mode 100644
index 00000000..405118a1
--- /dev/null
+++ b/docs/cookbook/payments/deploy-shopify-storefront.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Deploy a Shopify Storefront'
+description: 'Guide to deploying a Shopify storefront on Base'
+---
+
+[Instructions for deploying a Shopify storefront on Base]
\ No newline at end of file
diff --git a/docs/cookbook/payments/transaction-guide.mdx b/docs/cookbook/payments/transaction-guide.mdx
new file mode 100644
index 00000000..885e2e80
--- /dev/null
+++ b/docs/cookbook/payments/transaction-guide.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Transaction Guide'
+description: 'Comprehensive guide for handling transactions'
+---
+
+[Guide for handling transactions in payment applications]
\ No newline at end of file
diff --git a/docs/cookbook/social/convert-farcaster-frame.mdx b/docs/cookbook/social/convert-farcaster-frame.mdx
new file mode 100644
index 00000000..c4b7659e
--- /dev/null
+++ b/docs/cookbook/social/convert-farcaster-frame.mdx
@@ -0,0 +1,436 @@
+---
+title: Convert Farcaster Frame to Open Frame
+sidebarTitle: Convert to Open Frame
+description: 'Step-by-step guide for converting Farcaster Frames to Open Frames for broader platform support'
+---
+
+Expand your Frame's reach beyond Farcaster by converting it to an Open Frame. Open Frames are supported across multiple platforms including X (Twitter), making your interactive content accessible to a much wider audience.
+
+
+
+ Learn about the Open Frame standard and its benefits
+
+
+ Step-by-step conversion guide
+
+
+ Deploy your Frame across multiple platforms
+
+
+ Tips for optimal cross-platform compatibility
+
+
+
+## Understanding Open Frames
+
+Open Frames extend the Farcaster Frame standard to work across multiple platforms. They maintain the same interactive capabilities while adding broader platform compatibility.
+
+
+**Open Frame Benefits**
+
+- **Wider Reach**: Deploy to X (Twitter), Lens Protocol, and other platforms
+- **Standardized Format**: Use a single codebase for multiple platforms
+- **Future-Proof**: Built on open standards for broader adoption
+- **Enhanced Discovery**: Tap into larger social networks
+
+
+### Key Differences
+
+| Feature | Farcaster Frames | Open Frames |
+|---------|------------------|-------------|
+| Platform Support | Farcaster only | Multiple platforms |
+| Metadata Format | Farcaster-specific | Open Graph + extensions |
+| Button Actions | Limited to Farcaster | Cross-platform compatible |
+| Image Handling | Farcaster standards | Universal image formats |
+
+## Prerequisites
+
+Before converting your Frame, ensure you have:
+
+
+A working Farcaster Frame
+
+
+Understanding of Open Graph meta tags
+
+
+Access to Frame deployment infrastructure
+
+
+Test accounts on target platforms
+
+
+## Conversion Steps
+
+### Step 1: Update Meta Tags
+
+Convert your Farcaster-specific meta tags to Open Frame format:
+
+```html Before (Farcaster Frame)
+
+
+
+
+```
+
+```html After (Open Frame)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Step 2: Update Frame Handler
+
+Modify your Frame handler to support multiple platforms:
+
+```typescript api/frame/route.ts
+import { NextRequest, NextResponse } from 'next/server'
+
+export async function POST(req: NextRequest) {
+ const body = await req.json()
+
+ // Detect the platform
+ const platform = detectPlatform(body)
+
+ // Handle different platform formats
+ switch (platform) {
+ case 'farcaster':
+ return handleFarcasterFrame(body)
+ case 'xmtp':
+ return handleXMTPFrame(body)
+ case 'lens':
+ return handleLensFrame(body)
+ default:
+ return handleGenericFrame(body)
+ }
+}
+
+function detectPlatform(body: any): string {
+ // Check for platform-specific identifiers
+ if (body.untrustedData?.fid) return 'farcaster'
+ if (body.clientProtocol?.includes('xmtp')) return 'xmtp'
+ if (body.clientProtocol?.includes('lens')) return 'lens'
+ return 'generic'
+}
+
+function handleFarcasterFrame(body: any) {
+ const { buttonIndex, fid, castId } = body.untrustedData
+
+ // Your existing Farcaster logic
+ return NextResponse.json({
+ image: "https://example.com/response.jpg",
+ buttons: [
+ { label: "Next", action: "post" }
+ ]
+ })
+}
+
+function handleGenericFrame(body: any) {
+ // Generic handling for other platforms
+ return NextResponse.json({
+ image: "https://example.com/response.jpg",
+ buttons: [
+ { label: "Continue", action: "post" }
+ ]
+ })
+}
+```
+
+### Step 3: Add Platform Detection
+
+Create a utility to handle platform-specific logic:
+
+```typescript utils/platform.ts
+export interface FrameRequest {
+ platform: 'farcaster' | 'xmtp' | 'lens' | 'generic'
+ user?: {
+ id: string
+ username?: string
+ address?: string
+ }
+ interaction: {
+ buttonIndex: number
+ inputText?: string
+ state?: string
+ }
+}
+
+export function parseFrameRequest(body: any): FrameRequest {
+ // Farcaster format
+ if (body.untrustedData?.fid) {
+ return {
+ platform: 'farcaster',
+ user: {
+ id: body.untrustedData.fid.toString(),
+ address: body.untrustedData.address,
+ },
+ interaction: {
+ buttonIndex: body.untrustedData.buttonIndex,
+ inputText: body.untrustedData.inputText,
+ state: body.untrustedData.state,
+ }
+ }
+ }
+
+ // Generic format for other platforms
+ return {
+ platform: 'generic',
+ user: {
+ id: body.user?.id || 'anonymous',
+ },
+ interaction: {
+ buttonIndex: body.buttonIndex || 1,
+ inputText: body.inputText,
+ state: body.state,
+ }
+ }
+}
+```
+
+### Step 4: Update Response Format
+
+Ensure your responses work across platforms:
+
+```typescript utils/frameResponse.ts
+export interface FrameResponse {
+ image: string
+ imageAspectRatio?: '1.91:1' | '1:1'
+ buttons?: Array<{
+ label: string
+ action?: 'post' | 'post_redirect' | 'link' | 'mint'
+ target?: string
+ }>
+ input?: {
+ text: string
+ }
+ state?: string
+}
+
+export function createFrameResponse(response: FrameResponse) {
+ const html = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${response.buttons?.map((button, index) => `
+
+
+ ${button.action ? `` : ''}
+ ${button.action ? `` : ''}
+ ${button.target ? `` : ''}
+ ${button.target ? `` : ''}
+ `).join('') || ''}
+
+ ${response.input ? `
+
+
+ ` : ''}
+
+ ${response.state ? `
+
+
+ ` : ''}
+
+
+
+
+
+ `
+
+ return new Response(html, {
+ headers: { 'Content-Type': 'text/html' },
+ })
+}
+```
+
+## Platform Support
+
+### X (Twitter) Integration
+
+To make your Open Frame work on X:
+
+1. **Ensure proper Open Graph tags** are present
+2. **Test with X's card validator**: Use the Card Validator to verify your meta tags
+3. **Handle X-specific user interactions**: X may pass different user data
+
+```typescript utils/xIntegration.ts
+export function handleXFrame(body: any) {
+ // X-specific handling
+ return {
+ platform: 'x',
+ user: {
+ id: body.user?.id || 'x_user',
+ username: body.user?.username,
+ },
+ interaction: {
+ buttonIndex: body.buttonIndex || 1,
+ }
+ }
+}
+```
+
+### Lens Protocol Support
+
+For Lens Protocol integration:
+
+```typescript utils/lensIntegration.ts
+export function handleLensFrame(body: any) {
+ return {
+ platform: 'lens',
+ user: {
+ id: body.profileId,
+ address: body.address,
+ },
+ interaction: {
+ buttonIndex: body.buttonIndex,
+ state: body.state,
+ }
+ }
+}
+```
+
+## Best Practices
+
+### Cross-Platform Compatibility
+
+
+**Universal Design**
+
+Design your Frame content and interactions to work across all platforms. Avoid platform-specific features in your core experience.
+
+
+1. **Consistent Branding**: Use the same visual elements across platforms
+2. **Universal Button Labels**: Use clear, platform-agnostic button text
+3. **Responsive Images**: Ensure images work at different aspect ratios
+4. **Graceful Degradation**: Handle missing platform features gracefully
+
+### Testing Strategy
+
+
+
+Ensure your original Farcaster Frame still works perfectly.
+
+
+
+Use validation tools to check your Open Graph and Open Frame meta tags.
+
+
+
+Test your Frame on each target platform with real user accounts.
+
+
+
+Track engagement across platforms to optimize performance.
+
+
+
+### Performance Optimization
+
+```typescript utils/optimization.ts
+// Cache images across platforms
+export function getCachedImage(imageKey: string) {
+ // Implement caching logic
+ return `https://cdn.example.com/frames/${imageKey}.jpg`
+}
+
+// Optimize for different platform requirements
+export function optimizeImageForPlatform(
+ baseImage: string,
+ platform: string
+): string {
+ switch (platform) {
+ case 'farcaster':
+ return `${baseImage}?w=1200&h=630` // 1.91:1 aspect ratio
+ case 'x':
+ return `${baseImage}?w=1200&h=675` // X card format
+ default:
+ return baseImage
+ }
+}
+```
+
+## Deployment
+
+### Environment Configuration
+
+```bash .env
+# Platform-specific configurations
+FARCASTER_HUB_URL=https://neynar.com/v1/farcaster
+XMTP_ENV=production
+LENS_API_URL=https://api.lens.dev
+
+# Image optimization
+IMAGE_CDN_URL=https://cdn.example.com
+```
+
+### Monitoring and Analytics
+
+Track Frame performance across platforms:
+
+```typescript utils/analytics.ts
+export function trackFrameInteraction(
+ platform: string,
+ action: string,
+ userId?: string
+) {
+ // Send analytics to your preferred service
+ analytics.track('frame_interaction', {
+ platform,
+ action,
+ userId,
+ timestamp: new Date().toISOString(),
+ })
+}
+```
+
+## Resources
+
+
+
+ Official Open Frames specification
+
+
+ Tools for testing your Frames
+
+
+ Platform-specific Frame documentation
+
+
+ Cross-platform optimization tips
+
+
+
+---
+
+Converting your Farcaster Frame to an Open Frame significantly expands your reach while maintaining the interactive experience users love. Start with backward compatibility and gradually optimize for each platform's unique features and audience.
\ No newline at end of file
diff --git a/docs/cookbook/social/farcaster-nft-minting-guide.mdx b/docs/cookbook/social/farcaster-nft-minting-guide.mdx
new file mode 100644
index 00000000..c8180900
--- /dev/null
+++ b/docs/cookbook/social/farcaster-nft-minting-guide.mdx
@@ -0,0 +1,419 @@
+---
+title: Farcaster NFT Minting Guide
+sidebarTitle: Farcaster NFT Minting
+description: 'Comprehensive guide to NFT minting with Farcaster integration'
+---
+
+Build engaging NFT minting experiences by integrating Farcaster Frames with Base smart contracts. This guide shows you how to create seamless social-first minting flows that leverage Farcaster's social graph.
+
+
+
+ Configure Farcaster Frames for your NFT collection
+
+
+ Deploy and integrate your NFT contract with Frame actions
+
+
+ Add social proof and community features to your mint
+
+
+ Security and user experience considerations
+
+
+
+## Overview
+
+Farcaster Frames provide a powerful way to embed interactive NFT minting experiences directly in social feeds. Users can mint NFTs without leaving their Farcaster client, creating frictionless onboarding and viral distribution.
+
+
+**What are Farcaster Frames?**
+
+Frames are interactive components that can be embedded in Farcaster casts (posts). They support buttons, images, and actions that can trigger onchain transactions directly from the social feed.
+
+
+## Prerequisites
+
+Before starting, ensure you have:
+
+
+A deployed NFT contract on Base (or Base Sepolia for testing)
+
+
+Basic understanding of Farcaster and Frame development
+
+
+Next.js development environment set up
+
+
+Farcaster account for testing
+
+
+## Setting Up Farcaster Frames
+
+### Project Structure
+
+Create a new Frame project or add Frame functionality to your existing Next.js app:
+
+```bash Terminal
+npx create-next-app@latest farcaster-nft-mint
+cd farcaster-nft-mint
+npm install frog hono @coinbase/onchainkit
+```
+
+### Frame Metadata
+
+Create your Frame with proper metadata for NFT minting:
+
+```typescript app/frame/route.tsx
+import { Button, Frog } from 'frog'
+import { handle } from 'frog/next'
+import { neynar } from 'frog/hubs'
+
+const app = new Frog({
+ title: 'Base NFT Mint',
+ hub: neynar({ apiKey: process.env.NEYNAR_API_KEY! }),
+ assetsPath: '/',
+ basePath: '/frame',
+})
+
+app.frame('/', (c) => {
+ return c.res({
+ image: (
+
+
+ Mint Your Base NFT
+
+
+ Limited Edition • 1000 Supply
+
+
+ ),
+ intents: [
+ ,
+ Learn More,
+ ],
+ })
+})
+
+export const GET = handle(app)
+export const POST = handle(app)
+```
+
+## Smart Contract Integration
+
+### NFT Contract Setup
+
+Use OpenZeppelin's ERC-721 contracts for a secure foundation:
+
+```solidity contracts/BaseNFT.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
+import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
+
+contract BaseNFT is ERC721, Ownable, ReentrancyGuard {
+ uint256 public constant MAX_SUPPLY = 1000;
+ uint256 public constant MINT_PRICE = 0.001 ether;
+ uint256 public totalSupply;
+
+ mapping(address => bool) public hasMinted;
+
+ event NFTMinted(address indexed to, uint256 tokenId);
+
+ constructor(address initialOwner)
+ ERC721("Base Social NFT", "BSN")
+ Ownable(initialOwner)
+ {}
+
+ function mint() external payable nonReentrant {
+ require(totalSupply < MAX_SUPPLY, "Max supply reached");
+ require(msg.value >= MINT_PRICE, "Insufficient payment");
+ require(!hasMinted[msg.sender], "Already minted");
+
+ uint256 tokenId = totalSupply + 1;
+ totalSupply++;
+ hasMinted[msg.sender] = true;
+
+ _safeMint(msg.sender, tokenId);
+
+ emit NFTMinted(msg.sender, tokenId);
+ }
+
+ function withdraw() external onlyOwner {
+ payable(owner()).transfer(address(this).balance);
+ }
+}
+```
+
+### Frame Action Handler
+
+Create the mint action handler that integrates with your smart contract:
+
+```typescript app/frame/mint/route.tsx
+import { Button, Frog, parseEther } from 'frog'
+import { handle } from 'frog/next'
+
+app.frame('/mint', async (c) => {
+ const { buttonValue, frameData } = c
+
+ // Get user's Farcaster ID and ETH address
+ const fid = frameData?.fid
+ const address = frameData?.address
+
+ if (!address) {
+ return c.res({
+ image: (
+
+ ),
+ intents: [
+
+ Mint NFT (0.001 ETH)
+ ,
+ ,
+ ],
+ })
+
+ } catch (error) {
+ console.error('Mint error:', error)
+ return c.error({ message: 'Failed to process mint' })
+ }
+})
+```
+
+### Transaction Handler
+
+Handle the actual NFT minting transaction:
+
+```typescript app/frame/mint-tx/route.tsx
+import { Frog, parseEther } from 'frog'
+import { erc721Abi } from 'viem'
+
+app.transaction('/mint-tx', (c) => {
+ return c.contract({
+ abi: [
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ }
+ ],
+ chainId: 'eip155:8453', // Base mainnet
+ functionName: 'mint',
+ to: process.env.NFT_CONTRACT_ADDRESS as `0x${string}`,
+ value: parseEther('0.001'),
+ })
+})
+```
+
+## Social Integration
+
+### Add Social Proof
+
+Display minting activity and social proof in your Frame:
+
+```typescript utils/social.ts
+export async function getMintingActivity() {
+ // Fetch recent mints from your contract
+ const recentMints = await publicClient.getLogs({
+ address: NFT_CONTRACT_ADDRESS,
+ event: parseAbiItem('event NFTMinted(address indexed to, uint256 tokenId)'),
+ fromBlock: 'earliest',
+ })
+
+ return recentMints.slice(-5) // Last 5 mints
+}
+
+export async function getFarcasterProfile(fid: number) {
+ // Use Neynar API to get user profile
+ const response = await fetch(`https://api.neynar.com/v2/farcaster/user/bulk?fids=${fid}`, {
+ headers: {
+ 'api_key': process.env.NEYNAR_API_KEY!,
+ },
+ })
+
+ return response.json()
+}
+```
+
+### Display Community Activity
+
+```typescript app/frame/activity/route.tsx
+app.frame('/activity', async (c) => {
+ const recentMints = await getMintingActivity()
+
+ return c.res({
+ image: (
+
+
Recent Mints
+ {recentMints.map((mint, index) => (
+
+ #{mint.tokenId} minted by {mint.to.slice(0, 6)}...
+
+ ))}
+
+ ),
+ intents: [
+ ,
+ ],
+ })
+})
+```
+
+## Best Practices
+
+### Security Considerations
+
+
+**Smart Contract Security**
+
+Always audit your NFT contracts before mainnet deployment. Use OpenZeppelin's battle-tested contracts and follow security best practices.
+
+
+1. **Rate Limiting**: Implement proper rate limiting to prevent spam
+2. **Input Validation**: Validate all Frame inputs and user data
+3. **Error Handling**: Provide clear error messages for failed transactions
+4. **Access Controls**: Use proper access controls for admin functions
+
+### User Experience
+
+
+**Seamless Experience**
+
+Keep the minting flow simple - ideally just 1-2 clicks from seeing the Frame to completing the mint.
+
+
+1. **Clear Imagery**: Use high-quality images that represent your NFT collection
+2. **Progress Indicators**: Show users their progress through the minting flow
+3. **Error Recovery**: Provide clear paths for users to retry failed transactions
+4. **Social Sharing**: Encourage users to share their successful mints
+
+### Gas Optimization
+
+Consider using Base's low fees and fast confirmation times:
+
+```typescript utils/gasOptimization.ts
+// Use efficient batch minting for multiple NFTs
+export async function batchMint(recipients: string[], amounts: number[]) {
+ return await contract.write.batchMint(recipients, amounts)
+}
+
+// Consider using ERC-721A for efficient batch minting
+// if your collection supports it
+```
+
+## Testing Your Frame
+
+### Local Development
+
+1. **Frame Validator**: Use the [Frame Validator](https://warpcast.com/~/developers/frames) to test your Frame
+2. **Local Testing**: Test with ngrok or similar tools to expose your localhost
+3. **Testnet First**: Deploy to Base Sepolia before mainnet
+
+### Production Deployment
+
+
+
+Deploy your NFT contract to Base mainnet using Foundry or Hardhat.
+
+
+
+Set up your production environment variables:
+
+```bash .env.production
+NFT_CONTRACT_ADDRESS=0x...
+NEYNAR_API_KEY=your_api_key
+BASE_RPC_URL=https://mainnet.base.org
+```
+
+
+
+Deploy your Frame app to Vercel or your preferred hosting platform.
+
+
+
+Test the complete flow from Frame display to successful NFT mint.
+
+
+
+## Resources
+
+
+
+ Official documentation for building Farcaster Frames
+
+
+ Farcaster data and infrastructure
+
+
+ Secure smart contract templates
+
+
+ Deploy contracts on Base
+
+
+
+---
+
+Building NFT minting experiences with Farcaster Frames creates viral, social-first onboarding that can dramatically increase your collection's reach and engagement. Start with a simple implementation and iterate based on user feedback and community response.
\ No newline at end of file
diff --git a/docs/cookbook/social/farcaster-no-code-nft-minting.mdx b/docs/cookbook/social/farcaster-no-code-nft-minting.mdx
new file mode 100644
index 00000000..9ddbfbef
--- /dev/null
+++ b/docs/cookbook/social/farcaster-no-code-nft-minting.mdx
@@ -0,0 +1,6 @@
+---
+title: Farcaster No-Code NFT Minting
+description: 'Create NFT minting experiences without code using Farcaster'
+---
+
+[Guide for creating no-code NFT minting experiences using Farcaster]
\ No newline at end of file
diff --git a/docs/custom.css b/docs/custom.css
new file mode 100644
index 00000000..e11340b9
--- /dev/null
+++ b/docs/custom.css
@@ -0,0 +1,34 @@
+/* Danger admonition coloring */
+
+.danger-admonition {
+ border: 1px solid rgba(239, 68, 68, 0.2);
+ background-color: rgba(254, 242, 242, 0.5);
+}
+
+.dark\:danger-admonition:is(.dark *) {
+ border-color: rgba(239, 68, 68, 0.3);
+ background-color: rgba(239, 68, 68, 0.1);
+}
+
+.base_header_img {
+ margin: auto;
+}
+
+.homepage_wrapper {
+ width: 75%;
+ max-width: 1376px;
+ margin: auto;
+ margin-bottom: 50px;
+}
+
+.home_header {
+ padding-bottom: 0 !important;
+}
+
+.home_header h1 {
+ margin-bottom: 24px;
+}
+
+.home_header div p {
+ margin-top: 10px;
+}
diff --git a/docs/docs.json b/docs/docs.json
new file mode 100644
index 00000000..9fba3077
--- /dev/null
+++ b/docs/docs.json
@@ -0,0 +1,1028 @@
+{
+ "$schema": "https://mintlify.com/docs.json",
+ "theme": "mint",
+ "name": "Base Documentation",
+ "colors": {
+ "primary": "#578BFA",
+ "light": "#578BFA",
+ "dark": "#578BFA"
+ },
+ "favicon": "/logo/favicon.svg",
+ "contextual": {
+ "options": [
+ "copy",
+ "chatgpt",
+ "claude"
+ ]
+ },
+ "api": {
+ "playground": {
+ "display": "simple"
+ },
+ "examples": {
+ "languages": [
+ "javascript"
+ ]
+ }
+ },
+ "navigation": {
+ "tabs": [
+ {
+ "tab": "Get Started",
+ "groups": [
+ {
+ "group": "Introduction",
+ "pages": [
+ "get-started/base"
+ ]
+ },
+ {
+ "group": "Browse by",
+ "pages": [
+ "get-started/products",
+ "get-started/use-cases"
+ ]
+ },
+ {
+ "group": "Quickstart",
+ "pages": [
+ "get-started/build-app",
+ "get-started/launch-token",
+ "get-started/deploy-chain",
+ "get-started/deploy-smart-contracts",
+ "get-started/get-funded"
+ ]
+ },
+ {
+ "group": "Build with AI",
+ "pages": [
+ "get-started/ai-prompting",
+ "get-started/prompt-library"
+ ]
+ }
+ ],
+ "global": {
+ "anchors": [
+ {
+ "anchor": "Status",
+ "href": "https://status.base.org/",
+ "icon": "signal-bars"
+ },
+ {
+ "anchor": "Faucet",
+ "href": "https://test-184b3b57.mintlify.app/base-chain/tools/network-faucets",
+ "icon": "gas-pump"
+ },
+ {
+ "anchor": "Bridge",
+ "href": "https://test-184b3b57.mintlify.app/base-chain/quickstart/bridge-token",
+ "icon": "coin"
+ }
+ ]
+ }
+ },
+ {
+ "tab": "Base Chain",
+ "groups": [
+ {
+ "group": "Quickstart",
+ "pages": [
+
+ "base-chain/quickstart/why-base",
+ "base-chain/quickstart/deploy-on-base",
+ "base-chain/quickstart/connecting-to-base",
+ "base-chain/quickstart/bridge-token"
+ ]
+ },
+ {
+ "group": "Network Information",
+ "pages": [
+ "base-chain/network-information/base-contracts",
+ "base-chain/network-information/network-fees",
+ "base-chain/network-information/ecosystem-contracts",
+ "base-chain/network-information/diffs-ethereum-base"
+ ]
+ },
+ {
+ "group": "Flashblocks",
+ "pages": [
+ "base-chain/flashblocks/apps",
+ "base-chain/flashblocks/node-providers"
+ ]
+ },
+ {
+ "group": "Node Operators",
+ "pages": [
+ "base-chain/node-operators/run-a-base-node",
+ "base-chain/node-operators/performance-tuning",
+ "base-chain/node-operators/snapshots",
+ "base-chain/node-operators/troubleshooting"
+ ]
+ },
+ {
+ "group": "Tools",
+ "pages": [
+ "base-chain/tools/base-products",
+ "base-chain/tools/onchain-registry-api",
+ "base-chain/tools/node-providers",
+ "base-chain/tools/block-explorers",
+ "base-chain/tools/network-faucets",
+ "base-chain/tools/oracles",
+ "base-chain/tools/data-indexers",
+ "base-chain/tools/cross-chain",
+ "base-chain/tools/account-abstraction",
+ "base-chain/tools/onramps",
+ "base-chain/tools/tokens-in-wallet"
+ ]
+ },
+ {
+ "group": "Security",
+ "pages": [
+ "base-chain/security/security-council",
+ "base-chain/security/avoid-malicious-flags",
+ "base-chain/security/report-vulnerability"
+ ]
+ }
+ ],
+ "global": {
+ "anchors": [
+ {
+ "anchor": "GitHub",
+ "href": "https://github.com/base",
+ "icon": "github"
+ },
+ {
+ "anchor": "Status",
+ "href": "https://status.base.org/",
+ "icon": "signal-bars"
+ },
+ {
+ "anchor": "Chain Stats",
+ "href": "https://www.base.org/stats",
+ "icon": "chart-line"
+ },
+ {
+ "anchor": "Explorer",
+ "href": "https://basescan.com/",
+ "icon": "magnifying-glass"
+ },
+ {
+ "anchor": "Support",
+ "href": "https://discord.com/invite/base",
+ "icon": "discord"
+ }
+ ]
+ }
+ },
+ {
+ "tab": "Smart Wallet",
+ "groups": [
+ {
+ "group": "Quickstart",
+ "pages": [
+ "smart-wallet/quickstart",
+ "smart-wallet/quickstart/quick-demo",
+ "smart-wallet/quickstart/nextjs-project",
+ "smart-wallet/quickstart/react-native-project",
+ "smart-wallet/quickstart/ai-tools-available-for-devs"
+ ]
+ },
+ {
+ "group": "Concepts",
+ "pages": [
+ "smart-wallet/concepts/what-is-smart-wallet",
+ {
+ "group": "Features",
+ "pages": [
+ {
+ "group": "Built-in Features",
+ "pages": [
+ "smart-wallet/concepts/features/built-in/single-sign-on",
+ "smart-wallet/concepts/features/built-in/networks",
+ "smart-wallet/concepts/features/built-in/passkeys",
+ "smart-wallet/concepts/features/built-in/recovery-keys",
+ "smart-wallet/concepts/features/built-in/MagicSpend"
+ ]
+ },
+ {
+ "group": "Optional Features",
+ "pages": [
+ "smart-wallet/concepts/features/optional/gas-free-transactions",
+ "smart-wallet/concepts/features/optional/spend-limits",
+ "smart-wallet/concepts/features/optional/batch-operations",
+ "smart-wallet/concepts/features/optional/custom-gas-tokens",
+ "smart-wallet/concepts/features/optional/sub-accounts"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Usage Details",
+ "pages": [
+ "smart-wallet/concepts/usage-details/signature-verification",
+ "smart-wallet/concepts/usage-details/popups",
+ "smart-wallet/concepts/usage-details/gas-usage",
+ "smart-wallet/concepts/usage-details/unsupported-calls"
+ ]
+ },
+ "smart-wallet/concepts/base-gasless-campaign"
+ ]
+ },
+ {
+ "group": "Guides",
+ "pages": [
+ "smart-wallet/guides/siwe",
+ "smart-wallet/guides/signing-and-verifying-messages",
+ "smart-wallet/guides/magic-spend",
+ "smart-wallet/guides/batch-transactions",
+ "smart-wallet/guides/paymasters",
+ "smart-wallet/guides/erc20-paymasters",
+ {
+ "group": "Sub Accounts",
+ "pages": [
+ "smart-wallet/guides/sub-accounts",
+ "smart-wallet/guides/sub-accounts/setup",
+ "smart-wallet/guides/sub-accounts/using-sub-accounts"
+ ]
+ },
+ "smart-wallet/guides/spend-limits"
+ ]
+ },
+ {
+ "group": "Examples",
+ "pages": [
+ "smart-wallet/examples/coin-a-joke-app"
+ ]
+ },
+ {
+ "group": "Technical Reference",
+ "pages": [
+ {
+ "group": "Coinbase Wallet SDK",
+ "pages": [
+ "smart-wallet/technical-reference/sdk",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_accounts",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_blockNumber",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_chainId",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_coinbase",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_estimateGas",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_feeHistory",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_gasPrice",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBalance",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByHash",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockByNumber",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByHash",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getBlockTransactionCountByNumber",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getCode",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getLogs",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getProof",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getStorageAt",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockHashAndIndex",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByBlockNumberAndIndex",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionByHash",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionCount",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getTransactionReceipt",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockHash",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_getUncleCountByBlockNumber",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_requestAccounts",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendRawTransaction",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_sendTransaction",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/eth_signTypedData_v4",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/personal_sign",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addEthereumChain",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_addSubAccount",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_connect",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_switchEthereumChain",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/wallet_watchAsset",
+ "smart-wallet/technical-reference/sdk/CoinbaseWalletProvider/web3_clientVersion"
+ ]
+ },
+ {
+ "group": "Spend Limits",
+ "pages": [
+ "smart-wallet/technical-reference/spend-permissions/spendpermissionmanager",
+ "smart-wallet/technical-reference/spend-permissions/coinbase-fetchpermissions"
+ ]
+ },
+ "smart-wallet/technical-reference/sdk/sub-account-reference"
+ ]
+ },
+ {
+ "group": "Contribute",
+ "pages": [
+ "smart-wallet/contribute/contribute-to-smart-wallet-docs",
+ "smart-wallet/contribute/security-and-bug-bounty"
+ ]
+ }
+ ],
+ "global": {
+ "anchors": [
+ {
+ "anchor": "GitHub",
+ "href": "https://github.com/coinbase/onchainkit",
+ "icon": "github"
+ },
+ {
+ "anchor": "Support",
+ "href": "https://discord.com/invite/cdp",
+ "icon": "discord"
+ }
+ ]
+ }
+ },
+ {
+ "tab": "OnchainKit",
+ "groups": [
+ {
+ "group": "Introduction",
+ "pages": [
+ "onchainkit/getting-started",
+ "onchainkit/guides/telemetry",
+ "onchainkit/guides/troubleshooting"
+ ]
+ },
+ {
+ "group": "Installation",
+ "pages": [
+ "onchainkit/installation/nextjs",
+ "onchainkit/installation/vite",
+ "onchainkit/installation/remix",
+ "onchainkit/installation/astro"
+ ]
+ },
+ {
+ "group": "Config",
+ "pages": [
+ "onchainkit/config/onchainkit-provider",
+ "onchainkit/config/supplemental-providers"
+ ]
+ },
+ {
+ "group": "Guides",
+ "pages": [
+ "onchainkit/guides/lifecycle-status",
+ "onchainkit/guides/tailwind",
+ "onchainkit/guides/themes",
+ "onchainkit/guides/use-basename-in-onchain-app",
+ "onchainkit/guides/using-ai-powered-ides",
+ "onchainkit/guides/ai-prompting-guide"
+ ]
+ },
+ {
+ "group": "Templates",
+ "pages": [
+ "onchainkit/templates/onchain-nft-app",
+ "onchainkit/templates/onchain-commerce-app",
+ "onchainkit/templates/onchain-social-profile"
+ ]
+ },
+ {
+ "group": "Components",
+ "pages": [
+ {
+ "group": "Appchain",
+ "pages": [
+ "onchainkit/appchain/bridge"
+ ]
+ },
+ {
+ "group": "Buy",
+ "pages": [
+ "onchainkit/buy/buy"
+ ]
+ },
+ {
+ "group": "Checkout",
+ "pages": [
+ "onchainkit/checkout/checkout"
+ ]
+ },
+ {
+ "group": "Earn",
+ "pages": [
+ "onchainkit/earn/earn"
+ ]
+ },
+ {
+ "group": "Fund",
+ "pages": [
+ "onchainkit/fund/fund-button",
+ "onchainkit/fund/fund-card"
+ ]
+ },
+ {
+ "group": "Identity",
+ "pages": [
+ "onchainkit/identity/identity",
+ "onchainkit/identity/address",
+ "onchainkit/identity/avatar",
+ "onchainkit/identity/badge",
+ "onchainkit/identity/identity-card",
+ "onchainkit/identity/name",
+ "onchainkit/identity/socials"
+ ]
+ },
+ {
+ "group": "Mint",
+ "pages": [
+ "onchainkit/mint/nft-card",
+ "onchainkit/mint/nft-mint-card"
+ ]
+ },
+ "onchainkit/signature/signature",
+ {
+ "group": "Swap",
+ "pages": [
+ "onchainkit/swap/swap",
+ "onchainkit/swap/swap-settings"
+ ]
+ },
+ {
+ "group": "Token",
+ "pages": [
+ "onchainkit/token/token-chip",
+ "onchainkit/token/token-image",
+ "onchainkit/token/token-row",
+ "onchainkit/token/token-search",
+ "onchainkit/token/token-select-dropdown"
+ ]
+ },
+ "onchainkit/transaction/transaction",
+ {
+ "group": "Wallet",
+ "pages": [
+ "onchainkit/wallet/wallet",
+ "onchainkit/wallet/wallet-dropdown-basename",
+ "onchainkit/wallet/wallet-dropdown-disconnect",
+ "onchainkit/wallet/wallet-dropdown-fund-link",
+ "onchainkit/wallet/wallet-dropdown-link",
+ "onchainkit/wallet/wallet-island",
+ "onchainkit/wallet/wallet-modal"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "API",
+ "pages": [
+ {
+ "group": "Mint",
+ "pages": [
+ "onchainkit/api/get-token-details",
+ "onchainkit/api/get-mint-details",
+ "onchainkit/api/build-mint-transaction"
+ ]
+ },
+ {
+ "group": "Swap",
+ "pages": [
+ "onchainkit/api/build-swap-transaction",
+ "onchainkit/api/get-swap-quote"
+ ]
+ },
+ {
+ "group": "Token",
+ "pages": [
+ "onchainkit/api/get-tokens"
+ ]
+ },
+ {
+ "group": "Wallet",
+ "pages": [
+ "onchainkit/api/get-portfolios"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Utilities",
+ "pages": [
+ {
+ "group": "Config",
+ "pages": [
+ "onchainkit/config/is-base",
+ "onchainkit/config/is-ethereum"
+ ]
+ },
+ {
+ "group": "Earn",
+ "pages": [
+ "onchainkit/api/build-deposit-to-morpho-tx",
+ "onchainkit/api/build-withdraw-from-morpho-tx",
+ "onchainkit/hooks/use-build-deposit-to-morpho-tx",
+ "onchainkit/hooks/use-build-withdraw-from-morpho-tx",
+ "onchainkit/hooks/use-earn-context"
+ ]
+ },
+ {
+ "group": "Fund",
+ "pages": [
+ "onchainkit/fund/get-onramp-buy-url",
+ "onchainkit/fund/fetch-onramp-config",
+ "onchainkit/fund/fetch-onramp-quote",
+ "onchainkit/fund/fetch-onramp-options",
+ "onchainkit/fund/fetch-onramp-transaction-status",
+ "onchainkit/fund/setup-onramp-event-listeners"
+ ]
+ },
+ {
+ "group": "Identity",
+ "pages": [
+ "onchainkit/identity/get-address",
+ "onchainkit/identity/get-attestations",
+ "onchainkit/identity/get-avatar",
+ "onchainkit/identity/get-avatars",
+ "onchainkit/identity/get-name",
+ "onchainkit/identity/get-names",
+ "onchainkit/identity/use-address",
+ "onchainkit/identity/use-avatar",
+ "onchainkit/identity/use-avatars",
+ "onchainkit/identity/use-name",
+ "onchainkit/identity/use-names"
+ ]
+ },
+ {
+ "group": "Mint",
+ "pages": [
+ "onchainkit/hooks/use-token-details",
+ "onchainkit/hooks/use-mint-details"
+ ]
+ },
+ {
+ "group": "Token",
+ "pages": [
+ "onchainkit/token/format-amount"
+ ]
+ },
+ {
+ "group": "Wallet",
+ "pages": [
+ "onchainkit/wallet/is-valid-aa-entrypoint",
+ "onchainkit/wallet/is-wallet-a-coinbase-smart-wallet"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Types",
+ "pages": [
+ "onchainkit/api/types",
+ "onchainkit/appchain/types",
+ "onchainkit/checkout/types",
+ "onchainkit/config/types",
+ "onchainkit/earn/types",
+ "onchainkit/fund/types",
+ "onchainkit/identity/types",
+ "onchainkit/mint/types",
+ "onchainkit/signature/types",
+ "onchainkit/swap/types",
+ "onchainkit/token/types",
+ "onchainkit/transaction/types",
+ "onchainkit/wallet/types"
+ ]
+ },
+ {
+ "group": "Contribution",
+ "pages": [
+ "onchainkit/guides/contribution",
+ "onchainkit/guides/reporting-bug"
+ ]
+ }
+ ],
+ "global": {
+ "anchors": [
+ {
+ "anchor": "GitHub",
+ "href": "https://github.com/coinbase/onchainkit",
+ "icon": "github"
+ },
+ {
+ "anchor": "Playground",
+ "href": "https://onchainkit.xyz/playground",
+ "icon": "gamepad"
+ },
+ {
+ "anchor": "Support",
+ "href": "https://discord.com/invite/cdp",
+ "icon": "discord"
+ }
+ ]
+ }
+ },
+ {
+ "tab": "Wallet App",
+ "groups": [
+ {
+ "group": "Introduction",
+ "pages": [
+ "wallet-app/introduction/getting-started",
+ "wallet-app/introduction/mini-apps",
+ "wallet-app/introduction/beta-faq"
+ ]
+ },
+ {
+ "group": "Build with MiniKit",
+ "pages": [
+
+ "wallet-app/build-with-minikit/overview",
+ "wallet-app/build-with-minikit/quickstart",
+ "wallet-app/build-with-minikit/existing-app-integration",
+ "wallet-app/build-with-minikit/debugging"
+ ]
+ },
+ {
+ "group": "Guides",
+ "pages": [
+ "wallet-app/guides/thinking-social"
+ ]
+ }
+ ]
+ },
+ {
+ "tab": "Cookbook",
+ "groups": [
+ {
+ "group": "Use Cases",
+ "pages": [
+ "cookbook/onboard-any-user",
+ "cookbook/accept-crypto-payments",
+ "cookbook/launch-ai-agents",
+ "cookbook/launch-tokens",
+ "cookbook/deploy-a-chain",
+ "cookbook/onchain-social",
+ "cookbook/defi-your-app",
+ "cookbook/go-gasless"
+ ]
+ },
+ {
+ "group": "Build with AI",
+ "pages": [
+ "cookbook/ai-prompting",
+ "cookbook/base-builder-mcp"
+ ]
+ }
+ ]
+ },
+ {
+ "tab": "Showcase",
+ "pages": [
+ "showcase"
+ ]
+ },
+ {
+ "tab": "Learn",
+ "groups": [
+ {
+ "group": "Building Onchain",
+ "pages": [
+ "learn/welcome"
+ ]
+ },
+ {
+ "group": "Onchain Concepts",
+ "pages": [
+ "learn/onchain-concepts/core-concepts",
+ "learn/onchain-concepts/understanding-the-onchain-tech-stack",
+ {
+ "group": "Web2 vs Building Onchain",
+ "pages": [
+ "learn/onchain-concepts/building-onchain-wallets",
+ "learn/onchain-concepts/building-onchain-identity",
+ "learn/onchain-concepts/building-onchain-gas",
+ "learn/onchain-concepts/building-onchain-nodes",
+ "learn/onchain-concepts/building-onchain-frontend-development",
+ "learn/onchain-concepts/building-onchain-onramps",
+ "learn/onchain-concepts/building-onchain-social-networks",
+ "learn/onchain-concepts/building-onchain-ai"
+ ]
+ },
+ "learn/onchain-concepts/development-flow"
+ ]
+ },
+ {
+ "group": "Ethereum 101",
+ "pages": [
+ "learn/introduction-to-ethereum",
+ "learn/ethereum-dev-overview",
+ "learn/ethereum-applications",
+ "learn/gas-use-in-eth-transactions",
+ "learn/evm-diagram",
+ "learn/guide-to-base"
+ ]
+ },
+ {
+ "group": "Onchain App Development",
+ "pages": [
+ "learn/deploy-with-fleek",
+ "learn/account-abstraction",
+ "learn/cross-chain-development",
+ "learn/client-side-development"
+ ]
+ },
+ {
+ "group": "Smart Contract Development",
+ "pages": [
+ {
+ "group": "Introduction to Solidity",
+ "pages": [
+ "learn/introduction-to-solidity/introduction-to-solidity-overview",
+ "learn/introduction-to-solidity/anatomy-of-a-smart-contract-vid",
+ {
+ "group": "Introduction to Solidity",
+ "pages": [
+ "learn/introduction-to-solidity/introduction-to-solidity-vid",
+ "learn/introduction-to-solidity/solidity-overview",
+ "learn/introduction-to-solidity/introduction-to-remix-vid",
+ "learn/introduction-to-solidity/introduction-to-remix",
+ "learn/introduction-to-solidity/deployment-in-remix-vid",
+ "learn/introduction-to-solidity/deployment-in-remix"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Contracts and Basic Functions",
+ "pages": [
+ "learn/contracts-and-basic-functions/intro-to-contracts-vid",
+ "learn/contracts-and-basic-functions/hello-world-step-by-step",
+ "learn/contracts-and-basic-functions/basic-types",
+ "learn/contracts-and-basic-functions/basic-functions-exercise"
+ ]
+ },
+ {
+ "group": "Deploying to a Testnet",
+ "pages": [
+ "learn/deployment-to-testnet/overview-of-test-networks-vid",
+ "learn/deployment-to-testnet/test-networks",
+ "learn/deployment-to-testnet/deployment-to-base-sepolia-sbs",
+ "learn/deployment-to-testnet/contract-verification-sbs",
+ "learn/deployment-to-testnet/deployment-to-testnet-exercise"
+ ]
+ },
+ {
+ "group": "Control Structures",
+ "pages": [
+ "learn/control-structures/standard-control-structures-vid",
+ "learn/control-structures/loops-vid",
+ "learn/control-structures/require-revert-error-vid",
+ "learn/control-structures/control-structures",
+ "learn/control-structures/control-structures-exercise"
+ ]
+ },
+ {
+ "group": "Storage in Solidity",
+ "pages": [
+ "learn/storage/simple-storage-video",
+ "learn/storage/simple-storage-sbs",
+ "learn/storage/how-storage-works-video",
+ "learn/storage/how-storage-works",
+ "learn/storage/storage-exercise"
+ ]
+ },
+ {
+ "group": "Arrays in Solidity",
+ "pages": [
+ "learn/arrays/arrays-in-solidity-vid",
+ "learn/arrays/writing-arrays-in-solidity-vid",
+ "learn/arrays/arrays-in-solidity",
+ "learn/arrays/filtering-an-array-sbs",
+ "learn/arrays/fixed-size-arrays-vid",
+ "learn/arrays/array-storage-layout-vid",
+ "learn/arrays/arrays-exercise"
+ ]
+ },
+ {
+ "group": "The Mapping Type",
+ "pages": [
+ "learn/mappings/mappings-vid",
+ "learn/mappings/using-msg-sender-vid",
+ "learn/mappings/mappings-sbs",
+ "learn/mappings/how-mappings-are-stored-vid",
+ "learn/mappings/mappings-exercise"
+ ]
+ },
+ {
+ "group": "Advanced Functions",
+ "pages": [
+ "learn/advanced-functions/function-visibility-vid",
+ "learn/advanced-functions/function-visibility",
+ "learn/advanced-functions/function-modifiers-vid",
+ "learn/advanced-functions/function-modifiers"
+ ]
+ },
+ {
+ "group": "Structs",
+ "pages": [
+ "learn/structs/structs-vid",
+ "learn/structs/structs-sbs",
+ "learn/structs/structs-exercise"
+ ]
+ },
+ {
+ "group": "Inheritance",
+ "pages": [
+ "learn/inheritance/inheritance-vid",
+ "learn/inheritance/inheritance-sbs",
+ "learn/inheritance/multiple-inheritance-vid",
+ "learn/inheritance/multiple-inheritance",
+ "learn/inheritance/abstract-contracts-vid",
+ "learn/inheritance/abstract-contracts-sbs",
+ "learn/inheritance/inheritance-exercise"
+ ]
+ },
+ {
+ "group": "Imports",
+ "pages": [
+ "learn/imports/imports-vid",
+ "learn/imports/imports-sbs",
+ "learn/imports/imports-exercise"
+ ]
+ },
+ {
+ "group": "Errors",
+ "pages": [
+ "learn/error-triage/error-triage-vid",
+ "learn/error-triage/error-triage",
+ "learn/error-triage/error-triage-exercise"
+ ]
+ },
+ {
+ "group": "The new Keyword",
+ "pages": [
+ "learn/new-keyword/creating-a-new-contract-vid",
+ "learn/new-keyword/new-keyword-sbs",
+ "learn/new-keyword/new-keyword-exercise"
+ ]
+ },
+ {
+ "group": "Contract to Contract Interactions",
+ "pages": [
+ "learn/interfaces/intro-to-interfaces-vid",
+ "learn/interfaces/calling-another-contract-vid",
+ "learn/interfaces/testing-the-interface-vid",
+ "learn/interfaces/contract-to-contract-interaction"
+ ]
+ },
+ {
+ "group": "Events",
+ "pages": [
+ "learn/events/hardhat-events-sbs"
+ ]
+ },
+ {
+ "group": "Address and Payable",
+ "pages": [
+ "learn/address-and-payable/address-and-payable"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Development with Foundry",
+ "pages": [
+ "learn/foundry/introduction-to-foundry",
+ "learn/foundry/testing"
+ ]
+ },
+ {
+ "group": "Development with Hardhat",
+ "pages": [
+ {
+ "group": "Hardhat Setup and Overview",
+ "pages": [
+ "learn/hardhat/overview",
+ "learn/hardhat/creating-project",
+ "learn/hardhat/setup"
+ ]
+ },
+ {
+ "group": "Testing with Typescript",
+ "pages": [
+ "learn/hardhat/testing",
+ "learn/hardhat/writing-tests",
+ "learn/hardhat/contract-abi-testing",
+ "learn/hardhat/testing-guide"
+ ]
+ },
+ {
+ "group": "Etherscan",
+ "pages": [
+ "learn/hardhat/etherscan-guide",
+ "learn/hardhat/etherscan-video"
+ ]
+ },
+ {
+ "group": "Deploying Smart Contracts",
+ "pages": [
+ "learn/hardhat/installing-deploy",
+ "learn/hardhat/setup-deploy-script",
+ "learn/hardhat/testing-deployment",
+ "learn/hardhat/network-configuration",
+ "learn/hardhat/deployment",
+ "learn/hardhat/deployment-guide"
+ ]
+ },
+ {
+ "group": "Verifying Smart Contracts",
+ "pages": [
+ "learn/hardhat/verify-video",
+ "learn/hardhat/verify-guide"
+ ]
+ },
+ {
+ "group": "Mainnet Forking",
+ "pages": [
+ "learn/hardhat/fork-video",
+ "learn/hardhat/fork-guide"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Token Development",
+ "pages": [
+ {
+ "group": "Introduction to Tokens",
+ "pages": [
+ "learn/intro-to-tokens/intro-to-tokens-vid",
+ "learn/intro-to-tokens/misconceptions-about-tokens-vid",
+ "learn/intro-to-tokens/tokens-overview"
+ ]
+ },
+ {
+ "group": "Minimal Tokens",
+ "pages": [
+ "learn/minimal-tokens/creating-a-minimal-token-vid",
+ "learn/minimal-tokens/transferring-a-minimal-token-vid",
+ "learn/minimal-tokens/minimal-token-sbs",
+ "learn/minimal-tokens/minimal-tokens-exercise"
+ ]
+ },
+ {
+ "group": "ERC-20 Tokens",
+ "pages": [
+ "learn/erc-20-token/analyzing-erc-20-vid",
+ "learn/erc-20-token/erc-20-standard",
+ "learn/erc-20-token/openzeppelin-erc-20-vid",
+ "learn/erc-20-token/erc-20-testing-vid",
+ "learn/erc-20-token/erc-20-token-sbs",
+ "learn/erc-20-token/erc-20-exercise"
+ ]
+ },
+ {
+ "group": "ERC-721 Tokens",
+ "pages": [
+ "learn/erc-721-token/erc-721-standard-video",
+ "learn/erc-721-token/erc-721-standard",
+ "learn/erc-721-token/erc-721-on-opensea-vid",
+ "learn/erc-721-token/openzeppelin-erc-721-vid",
+ "learn/erc-721-token/implementing-an-erc-721-vid",
+ "learn/erc-721-token/erc-721-sbs",
+ "learn/erc-721-token/erc-721-exercise"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Exercise Contracts",
+ "pages": [
+ "learn/exercise-contracts"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "logo": {
+ "light": "/logo/logo_light.svg",
+ "dark": "/logo/logo_dark.svg"
+ },
+ "navbar": {
+ "links": [
+ {
+ "label": "Blog",
+ "href": "https://blog.base.dev/"
+ },
+ {
+ "label": "GitHub",
+ "href": "https://github.com/base"
+ },
+ {
+ "label": "Support",
+ "href": "https://discord.com/invite/base"
+ }
+ ],
+ "primary": {
+ "type": "button",
+ "label": "Base.org",
+ "href": "https://base.org"
+ }
+ },
+ "footer": {
+ "socials": {
+ "x": "https://x.com/mintlify",
+ "github": "https://github.com/mintlify",
+ "linkedin": "https://linkedin.com/company/mintlify"
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/footer.tsx b/docs/footer.tsx
deleted file mode 100644
index e679c1af..00000000
--- a/docs/footer.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-export default function Footer() {
- return (
-
- )
-}
diff --git a/docs/get-started/ai-prompting.mdx b/docs/get-started/ai-prompting.mdx
new file mode 100644
index 00000000..6c5725ec
--- /dev/null
+++ b/docs/get-started/ai-prompting.mdx
@@ -0,0 +1,9 @@
+---
+sidebarTitle: AI-powered IDEs
+title: Use AI-powered IDEs
+description: How to use AI-powered IDEs to generate code for OnchainKit.
+---
+
+import AiPowered from "/snippets/ai-powered.mdx";
+
+
diff --git a/docs/get-started/base.mdx b/docs/get-started/base.mdx
new file mode 100644
index 00000000..b592e034
--- /dev/null
+++ b/docs/get-started/base.mdx
@@ -0,0 +1,85 @@
+---
+title: Base
+description: "The #1 Ethereum Layer 2, incubated by Coinbase"
+---
+
+Build on Base and choose the features that fits your needs — from sub-cent global payments to creator-first monetization and built-in distribution.
+
+
+
+
+
+
+## Base Offers
+
+
+
+**Payments & Financial Services:** Move value globally with sub-second, sub-cent payments and build on existing financial services for trading, yield generation, and more.
+
+
+**Creator Monetization:** Creators of all kinds are exploring new ways to monetize their work. Innovate on the frontier of creator monetiziation with the creator economy on Base.
+
+
+**Comprehensive Builder Support:** Base provides developer tools, infrastructure, and support. Plus, Base has one of the largest onchain builder communities whith which you can collaborate and grow.
+
+
+**Launch to real users:** Tap Base activations, grants, and mini-app channels that surface your project to millions.
+
+
+
+
+### Start Building
+
+
+
+ Build and deploy your app in minutes.
+
+
+ Launch a new token.
+
+
+ Deploy your own chain on Base.
+
+
+
+Explore [all products](/get-started/products) and [use cases](/get-started/use-cases).
+
+### Get Funded
+
+
+
+ Get rewarded up to 2 ETH weekly through the Builder Rewards Program.
+
+
+ Apply for fast, retroactive, Base Builder Grants (~1-5 ETH).
+
+
+ A global program for builders creating the next wave of onchain apps.
+
+
+ Apply for OP Retro Funding for your contributions to the Base ecosystem.
+
+
+
+### Reach More Users
+
+
+
+ Mini Apps run directly inside the social feed: Make your existing app a Mini App or build a new one.
+
+
+ Showcase your project to the Base community and get discovered.
+
+
+
+
+
+
diff --git a/docs/get-started/build-app.mdx b/docs/get-started/build-app.mdx
new file mode 100644
index 00000000..a2f2ab91
--- /dev/null
+++ b/docs/get-started/build-app.mdx
@@ -0,0 +1,250 @@
+---
+title: Build an App
+description: A guide to building a next.js app on Base using OnchainKit
+---
+
+Welcome to the Base quickstart guide! In this walkthrough, we'll create a simple onchain app from start to finish. Whether you're a seasoned developer or just starting out, this guide has got you covered.
+
+## What You'll Achieve
+
+By the end of this quickstart, you'll have built an onchain app by:
+
+- Configuring your development environment
+- Deploying your smart contracts to Base
+- Interacting with your deployed contracts from the frontend
+
+Our simple app will be an onchain tally app which lets you add to a total tally, stored onchain, by pressing a button.
+
+
+**Why Base?**
+
+Base is a fast, low-cost, builder-friendly Ethereum L2 built to bring the next billion users onchain. By following this guide, you'll join a vibrant ecosystem of developers, creators, and innovators who are building a global onchain economy.
+
+
+
+## Set Up Your Development Environment
+
+
+
+ OnchainKit is a library of ready-to-use React components and Typescript utilities for building onchain apps. Run the following command in your terminal and follow the prompts to bootstrap your project.
+
+ ```bash [Terminal]
+ npm create onchain@latest
+ ```
+
+ The prompots will ask you for a CDP API Key which you can get [here](https://portal.cdp.coinbase.com/projects/api-keys/client-key).
+
+ Once you've gone through the prompts, you'll have a new project directory with a basic OnchainKit app. Run the following to see it live.
+
+ ```bash [Terminal]
+ cd my-onchainkit-app
+ npm install
+ npm run dev
+ ```
+
+ You should see the following screen.
+
+
+
+
+
+ Once we've deployed our contracts, we'll add a button that lets us interact with our contracts.
+
+
+
+ The total tally will be stored onchain in a smart contract. We'll use the Foundry framework to deploy our contract to the Base Sepolia testnet.
+
+ 1. Create a new "contracts" folder in the root of your project
+
+ ```bash [Terminal]
+ mkdir contracts && cd contracts
+ ```
+
+ 2. Install and initialize Foundry
+
+ ```bash [Terminal]
+ curl -L https://foundry.paradigm.xyz | bash
+ foundryup
+ forge init --no-git
+ ```
+
+ Open the project and find the `Counter.sol` contract file in the `/contracts/src` folder. You'll find the simple logic for our tally app.
+
+
+ **--no-git**
+
+ Because `contracts` is a folder in our project, we don't want to initialize a separate git repository for it, so we add the `--no-git` flag.
+
+
+
+ To deploy your smart contracts to Base, you need two key components:
+
+ 1. A node connection to interact with the Base network
+ 2. A funded private key to deploy the contract
+
+ Let's set up both of these:
+
+ - Create a `.env` file in your `contracts` directory and add the Base and Base Sepolia RPC URLs
+
+ ```bash [contracts/.env]
+ BASE_RPC_URL="https://mainnet.base.org"
+ BASE_SEPOLIA_RPC_URL="https://sepolia.base.org"
+ ```
+
+ -Load your environment variables
+
+ ```bash [Terminal]
+ source .env
+ ```
+
+
+ **Base Sepolia**
+
+ Base Sepolia is the test network for Base, which we will use for the rest of this guide. You can obtain free Base Sepolia ETH from one of the [faucets listed here](/base-chain/tools/network-faucets).
+
+
+
+ A private key with testnet funds is required to deploy the contract. You can generate a fresh private key [here](https://visualkey.link/).
+
+ 1. Store your private key in Foundry's secure keystore
+
+ ```bash [Terminal]
+ cast wallet import deployer --interactive
+ ```
+
+ 2. When prompted enter your private key and a password.
+
+ Your private key is stored in `~/.foundry/keystores` which is not tracked by git.
+
+
+ Never share or commit your private key. Always keep it secure and handle with care.
+
+
+
+
+## Deploy Your Contracts
+
+Now that your environment is set up, let's deploy your contracts to Base Sepolia. The foundry project provides a deploy script that will deploy the Counter.sol contract.
+
+
+
+ 1. Use the following command to compile and deploy your contract
+
+ ```bash [Terminal]
+ forge create ./src/Counter.sol:Counter --rpc-url $BASE_SEPOLIA_RPC_URL --account deployer
+ ```
+
+ Note the format of the contract being deployed is `:`.
+
+
+ After successful deployment, the transaction hash will be printed to the console output
+
+ Copy the deployed contract address and add it to your `.env` file
+
+ ```bash
+ COUNTER_CONTRACT_ADDRESS="0x..."
+ ```
+
+
+
+ ```bash [Terminal]
+ source .env
+ ```
+
+
+ To ensure your contract was deployed successfully:
+
+ 1. Check the transaction on [Sepolia Basescan](https://sepolia.basescan.org/).
+ 2. Use the `cast` command to interact with your deployed contract from the command line
+
+ ```bash
+ cast call $COUNTER_CONTRACT_ADDRESS "number()(uint256)" --rpc-url $BASE_SEPOLIA_RPC_URL
+ ```
+
+ This will return the initial value of the Counter contract's `number` storage variable, which will be `0`.
+
+
+
+**Congratulations! You've deployed your smart contract to Base Sepolia!**
+
+Now lets connect the frontend to interact with your recently deployed contract.
+
+## Interacting with your contract
+
+To interact with the smart contract logic, we need to submit an onchain transaction. We can do this easily with the `Transaction` component. This is a simplified version of the `Transaction` component, designed to streamline the integration process. Instead of manually defining each subcomponent and prop, we can use this shorthand version which renders our suggested implementation of the component and includes the `TransactionButton` and `TransactionToast` components.
+
+
+
+ Lets add the `Transaction` component to our `page.tsx` file. Delete the existing content in the `main` tag and replace it with the snippet below.
+
+ ```tsx twoslash [page.tsx]
+ // @noErrors: 2307 - Cannot find module '@/calls'
+ import { Transaction } from '@coinbase/onchainkit/transaction';
+ import { calls } from '@/calls';
+
+
+
+
+
+
+
+ ;
+ ```
+
+
+ In the previous code snippet, you'll see we imported `calls` from the `calls.ts` file. This file provides the details needed to interact with our contract and call the `increment` function. Create a new `calls.ts` file in the same folder as your `page.tsx` file and add the following code.
+
+ ```ts twoslash [calls.ts]
+ const counterContractAddress = '0x...'; // add your contract address here
+ const counterContractAbi = [
+ {
+ type: 'function',
+ name: 'increment',
+ inputs: [],
+ outputs: [],
+ stateMutability: 'nonpayable',
+ },
+ ] as const;
+
+ export const calls = [
+ {
+ address: counterContractAddress,
+ abi: counterContractAbi,
+ functionName: 'increment',
+ args: [],
+ },
+ ];
+ ```
+
+
+ **Contract Address**
+
+ The `calls.ts` file contains the details of the contract interaction, including the contract address, which we saved in the previous step.
+
+
+
+ Now, when you connect a wallet and click on the `Transact` button and approve the transaction, it will increment the tally onchain by one.
+
+ We can verify that the onchain count took place onchain by once again using `cast` to call the `number` function on our contract.
+
+ ```bash [Terminal]
+ cast call $COUNTER_CONTRACT_ADDRESS "number()(uint256)" --rpc-url $BASE_SEPOLIA_RPC_URL
+ ```
+
+ If the transaction was successful, the tally should have incremented by one!
+
+
+
+We now have a working onchain tally app! While the example is simple, it illustrates the end to end process of building on onchain app. We:
+
+- Configured a project with frontend and onchain infrastructure
+- Deployed a smart contract to Base Sepolia
+- Interacted with the contract from the frontend
+
+## Further Improvements
+
+This is just the beginning. There are many ways we can improve upon this app. For example, we could:
+
+- Make the `increment` transaction gasless by integrating with [Paymaster](/onchainkit/transaction/transaction#sponsor-with-paymaster-capabilities)
+- Improve the wallet connection and sign up flow with the [WalletModal](/onchainkit/wallet/wallet-modal) component
+- Add onchain [Identity](/onchainkit/identity/identity) so we know who added the most recent tally
diff --git a/docs/get-started/concepts.mdx b/docs/get-started/concepts.mdx
new file mode 100644
index 00000000..748c81ca
--- /dev/null
+++ b/docs/get-started/concepts.mdx
@@ -0,0 +1,13 @@
+---
+title: 'Core Concepts'
+---
+
+Key concept overview:
+- Gas & Faucets
+- Blocks
+- Transactions
+- Signatures
+- Smart Contracts
+- Wallets
+- Nodes
+...
\ No newline at end of file
diff --git a/docs/get-started/deploy-chain.mdx b/docs/get-started/deploy-chain.mdx
new file mode 100644
index 00000000..4f8ff591
--- /dev/null
+++ b/docs/get-started/deploy-chain.mdx
@@ -0,0 +1,286 @@
+---
+title: 'Deploy an Appchain'
+keywords: ['deploy a chain', 'deploy a base chain', 'deploy a base appchain', 'deploy a base l3', 'l3']
+---
+
+Transform your high-traffic application into a dedicated blockchain with **1-second block times**, **sub-cent transactions**, and **enterprise-grade infrastructure**. Base Appchains provide dedicated blockspace for mature applications that need to scale beyond shared network limitations.
+
+
+
+Get early access to Base Appchains and transform your scaling strategy
+
+
+
+Jump to our step-by-step onboarding process
+
+
+
+## What Are Base Appchains?
+
+Base Appchains are **app-specific Layer 3 rollups** built on Base that provide dedicated blockspace for individual applications. Instead of competing with thousands of other apps for network resources, you get your own high-performance blockchain that rolls up to Base and inherits Ethereum's security.
+
+
+Layer 3 appchains roll up to Base (Layer 2), which settles on Ethereum, providing you with dedicated performance while maintaining the security guarantees of the Ethereum ecosystem.
+
+
+Think of it as the difference between **sharing a highway during rush hour** versus **having your own dedicated express lane**. With shared blockspace, your app's performance depends on network-wide activity. With an Appchain, you get consistent, predictable performance regardless of what's happening elsewhere.
+
+
+
+Compete with other apps for network resources, leading to variable performance, unpredictable costs, and user experience issues during peak times.
+
+
+
+Your own infrastructure with predictable performance, custom gas tokens, full control over throughput, and consistent user experience.
+
+
+
+## Why Choose Base Appchains?
+
+### High-Speed Performance Built for Scale
+
+Stop letting network congestion impact your user experience. Base Appchains deliver **1-second block times** and **sub-10 second withdrawals**, making them 10x faster than typical blockchain interactions.
+
+
+Gaming applications like Blocklords have processed over 80 million transactions across 1.8 million wallets using Base Appchains, achieving the scale needed for their gaming ecosystem without performance degradation.
+
+
+### Predictable, Cost-Effective Operations
+
+Replace unpredictable gas costs with **fixed monthly pricing**. Process transactions for fractions of cents while eliminating the need to sponsor gas costs for your users.
+
+
+
+Variable gas costs, expensive user onboarding, unpredictable operational expenses, and complex gas sponsorship management.
+
+
+
+Fixed monthly pricing, sub-cent transactions, predictable budgeting, and no gas sponsorship complexity.
+
+
+
+### Enterprise-Grade Infrastructure
+
+With Base Appchains, you get:
+
+
+Fully-managed sequencer and node infrastructure
+
+
+Automated maintenance and upgrades
+
+
+Real-time monitoring and performance alerts
+
+
+Dedicated block explorer for your chain
+
+
+### Seamless Base Ecosystem Integration
+
+Maintain access to Base's **users**, **liquidity**, and **developer tools** while getting dedicated performance. Your Appchain integrates seamlessly with Smart Wallet, Paymaster, OnchainKit, and other Base ecosystem tools.
+
+
+
+Enable seamless account abstraction across Base Mainnet and your Appchain with unified user experiences.
+
+
+
+Sponsor gas costs across multiple chains with unified billing and simplified user onboarding.
+
+
+
+Use the same familiar developer tools and components across the entire Base ecosystem.
+
+
+
+## Technical Architecture
+
+Base Appchains are built on the **OP Enclave framework**, providing fast withdrawals and seamless integration with Base Mainnet. This architecture enables near-instant bridging while maintaining security through innovative proving mechanisms.
+
+
+
+Built on Optimism's latest technology for **near-instant bridging** between your Appchain and Base Mainnet. Users can move funds in seconds rather than the typical 7-day withdrawal periods of traditional rollups.
+
+
+
+Uses **Amazon S3** for cost-efficient data storage while maintaining security through **AWS Nitro Enclave** verification. This approach significantly reduces costs while ensuring data integrity and availability.
+
+
+
+Control which contracts can be called on your chain, effectively managing blockspace allocation. Implement **custom gas tokens** and **permission systems** while protecting users from censorship through guaranteed deposit lanes.
+
+
+
+Unlike traditional rollups that rely on challenge periods, Base Appchains use **immediate state proving** through secure enclaves, enabling instant finality and faster user experiences.
+
+
+
+## Use Cases & Success Stories
+
+Base Appchains power applications across gaming, DeFi, and enterprise sectors that require high performance and predictable costs.
+
+
+
+Process millions of micro-transactions for in-game actions, NFT trades, and player interactions without network congestion affecting gameplay performance.
+
+**Success Story**: Super Champs chose Base Appchains for consistent throughput, comparing the experience to "gaming on iOS" - smooth, predictable, and reliable.
+
+
+
+Handle high-frequency trading, yield farming, and complex financial operations with consistent, low-cost transactions that don't fluctuate with network activity.
+
+**Success Story**: Applications processing high-volume trading data benefit from predictable costs and dedicated throughput for time-sensitive operations.
+
+
+
+Deploy compliance-ready solutions with dedicated infrastructure, custom permissions, and the ability to manage access controls while maintaining transparency.
+
+**Success Story**: Proof 8 uses blockchain technology for verifiable inventory ownership in warehouses and distilleries, where enterprise customers prioritize performance, security, and privacy.
+
+
+
+
+Base Appchains are designed for **mature projects** with significant transaction volumes. If you're just starting out or have low transaction volumes, consider building on Base Mainnet first to establish product-market fit.
+
+
+## When Should You Consider an Appchain?
+
+Base Appchains are ideal for applications that have outgrown shared blockspace limitations. Use this checklist to determine if an Appchain is right for your project:
+
+
+**High Transaction Volume**: Your app generates thousands of transactions daily and performance is affected by network congestion
+
+
+
+**Significant Gas Sponsorship**: You're spending substantial amounts sponsoring gas costs for users through Paymaster or similar solutions
+
+
+
+**Performance-Critical Operations**: User experience is negatively impacted by variable transaction times or network congestion
+
+
+
+**Custom Requirements**: You need custom gas tokens, specialized permissions, or governance mechanisms not available on shared chains
+
+
+
+**Predictable Costs**: Fixed operational costs are important for your business model and budgeting
+
+
+
+If you're considering launching your own L1 or L2 blockchain, Base Appchains offer a compelling alternative with faster time-to-market, proven infrastructure, and immediate access to Base's ecosystem.
+
+
+
+## Getting Started
+
+Base Appchains are currently in **beta with a waitlist**. We're working with select partners to refine the platform before broader availability.
+
+
+
+Complete our application form to be considered for early access to Base Appchains. We prioritize applications from mature projects with clear scaling needs.
+
+
+Join the Base Appchains beta program
+
+
+
+
+Our team will review your application and schedule a consultation to understand your specific scaling requirements, transaction patterns, and technical needs.
+
+
+During the consultation, we'll help you determine if an Appchain is the right solution and design the optimal configuration for your use case.
+
+
+
+
+Once approved, you'll receive access to both testnet and mainnet features. Start with the **$1/month testnet** to validate your architecture and integration.
+
+
+Use the testnet environment to test bridging, custom gas tokens, and permission systems before deploying to mainnet.
+
+
+
+
+Deploy to production with full enterprise support, monitoring, and maintenance included. Our team provides ongoing support for your Appchain infrastructure.
+
+
+Full technical support during launch and ongoing operations
+
+
+
+
+
+**Coming Soon**: Self-serve, one-click deployment will be available for approved projects, making it even easier to launch and manage your Appchain.
+
+
+## Frequently Asked Questions
+
+
+
+Base Appchains offer significant advantages over launching independent blockchain infrastructure:
+
+- **Faster time-to-market**: Deploy in weeks, not months or years
+- **Proven infrastructure**: Built on battle-tested Base and OP Stack technology
+- **Immediate ecosystem access**: Users and liquidity from Base Mainnet
+- **Lower operational overhead**: Fully managed infrastructure and maintenance
+- **Ethereum alignment**: Inherit security without custom validator sets or consensus mechanisms
+
+
+
+Base Appchains provide **seamless onboarding** similar to Base Mainnet applications:
+
+- Users can bridge funds between Base and your Appchain in **seconds**
+- Same wallet experience across Base ecosystem
+- Smart Wallet integration for account abstraction
+- Familiar transaction patterns and interfaces
+
+
+
+**Coinbase manages the core infrastructure** on your behalf, including:
+
+- Sequencer operation and maintenance
+- Node infrastructure and upgrades
+- Security key management
+- Monitoring and alerting systems
+
+You maintain control over **application-level configurations** like gas tokens, permissions, and governance while benefiting from enterprise-grade infrastructure management.
+
+
+
+Base Appchains use the **OP Enclave framework** for **near-instant bridging**:
+
+- Move funds between Base and your Appchain in seconds
+- No 7-day withdrawal periods like traditional rollups
+- Maintains security through cryptographic proofs
+- Seamless user experience across chains
+
+
+
+Base Appchains balance **operational efficiency** with **censorship resistance**:
+
+- Custom permissions control high-throughput operations
+- **Guaranteed deposit lanes** prevent censorship through direct Base deposits
+- Users always have recourse through the Base bridge
+- Inherits Ethereum's long-term decentralization roadmap
+
+
+
+## Ready to Scale?
+
+Base Appchains represent the next evolution in blockchain scaling, providing dedicated infrastructure without sacrificing ecosystem benefits. Whether you're processing millions of gaming transactions, handling high-frequency DeFi operations, or building enterprise solutions, Appchains deliver the performance and predictability your users expect.
+
+
+
+Apply for early access to Base Appchains beta program
+
+
+
+Discover the full ecosystem of Base developer tools and integrations
+
+
+
+
+**Next Steps**: After joining the waitlist, explore Base's developer documentation to understand how Appchains integrate with Smart Wallet, Paymaster, OnchainKit, and other ecosystem tools.
+
\ No newline at end of file
diff --git a/docs/get-started/deploy-smart-contracts.mdx b/docs/get-started/deploy-smart-contracts.mdx
new file mode 100644
index 00000000..a40e43d5
--- /dev/null
+++ b/docs/get-started/deploy-smart-contracts.mdx
@@ -0,0 +1,144 @@
+---
+title: 'Deploy Smart Contracts'
+description: A guide to help you get started with deploying your smart contracts on Base.
+---
+
+Welcome to the Base deployment quickstart guide! This comprehensive walkthrough will help you set up your environment and deploy smart contracts on Base. Whether you're a seasoned developer or just starting out, this guide has got you covered.
+
+## What You'll Achieve
+
+By the end of this quickstart, you'll be able to:
+
+- Set up your development environment to deploy on Base
+- Deploy your smart contracts to Base
+- Connect your frontend to your smart contracts
+
+
+**Why Base?**
+
+Base is a fast, low-cost, builder-friendly Ethereum L2 built to bring the next billion users onchain. By following this guide, you'll join a vibrant ecosystem of developers, creators, and innovators who are building a global onchain economy.
+
+
+
+## Set Up Your Development Environment
+
+1. Create a new project directory
+
+```bash
+mkdir my-base-project && cd my-base-project
+```
+
+2. Install Foundry, a powerful framework for smart contract development
+
+```bash
+curl -L https://foundry.paradigm.xyz | bash
+foundryup
+```
+
+This installs Foundry and updates it to the latest version.
+
+3. Initialize a new Solidity project
+
+```bash
+forge init
+```
+
+Your Foundry project is now ready. You'll find an example contract in the `src` directory, which you can replace with your own contracts. For the purposes of this guide, we'll use the Counter contract provided in `/src/Counter.sol`
+
+
+Foundry provides a suite of tools for Ethereum application development, including Forge (for testing), Cast (for interacting with the chain), and Anvil (for setting up a local node). You can learn more about Foundry [here](https://book.getfoundry.sh/).
+
+
+
+## Configure Foundry with Base
+
+To deploy your smart contracts to Base, you need two key components:
+
+1. A node connection to interact with the Base network
+2. A funded private key to deploy the contract
+
+Let's set up both of these:
+
+### 1. Set up your node connection
+
+1. Create a `.env` file in your project's root directory
+2. Add the Base network RPC URL to your `.env` file
+
+```bash
+BASE_RPC_URL="https://mainnet.base.org"
+BASE_SEPOLIA_RPC_URL="https://sepolia.base.org"
+```
+
+3. Load your environment variables
+
+```bash
+source .env
+```
+
+
+Base Sepolia is the test network for Base, which we will use for the rest of this guide. You can obtain free Base Sepolia ETH from one of the [faucets listed here](/base-chain/tools/network-faucets).
+
+
+
+### 2. Secure your private key
+
+1. Store your private key in Foundry's secure keystore
+
+```bash
+cast wallet import deployer --interactive
+```
+
+2. When prompted enter your private key and a password.
+
+Your private key is stored in `~/.foundry/keystores` which is not tracked by git.
+
+
+Never share or commit your private key. Always keep it secure and handle with care.
+
+
+
+## Deploy Your Contracts
+
+Now that your environment is set up, let's deploy your contracts to Base Sepolia.
+
+1. Use the following command to compile and deploy your contract
+
+```bash
+forge create ./src/Counter.sol:Counter --rpc-url $BASE_SEPOLIA_RPC_URL --account deployer
+```
+
+Note the format of the contract being deployed is `:`.
+
+2. After successful deployment, the transaction hash will be printed to the console output
+
+3. Copy the deployed contract address and add it to your `.env` file
+
+```bash
+COUNTER_CONTRACT_ADDRESS="0x..."
+```
+
+4. Load the new environment variable
+
+```bash
+source .env
+```
+
+### Verify Your Deployment
+
+To ensure your contract was deployed successfully:
+
+1. Check the transaction on [Sepolia Basescan](https://sepolia.basescan.org/).
+2. Use the `cast` command to interact with your deployed contract from the command line
+
+```bash
+cast call $COUNTER_CONTRACT_ADDRESS "number()(uint256)" --rpc-url $BASE_SEPOLIA_RPC_URL
+```
+This will return the initial value of the Counter contract's `number` storage variable, which will be `0`.
+
+**Congratulations! You've deployed your smart contracts to Base Sepolia!**
+
+## Next Steps
+
+- Use [Onchainkit](https://onchainkit.com) to connect your frontend to your contracts! Onchainkit is a library of ready-to-use React components and Typescript utilities.
+- Learn more about interacting with your contracts in the command line using Foundry from our [Foundry tutorial](/cookbook/smart-contract-development/foundry/deploy-with-foundry).
+
diff --git a/docs/get-started/get-funded.mdx b/docs/get-started/get-funded.mdx
new file mode 100644
index 00000000..19dc73b0
--- /dev/null
+++ b/docs/get-started/get-funded.mdx
@@ -0,0 +1,205 @@
+---
+title: 'Get Funded'
+description: "The Base ecosystem offers multiple funding pathways designed specifically for builders at every stage—from weekend experiments to full-scale ventures."
+---
+
+## Funding Pathways
+
+Whether you're just starting to experiment or ready to become a full-time founder, Base provides structured funding opportunities that grow with your ambitions. Each pathway is designed for different stages of your builder journey, with clear progression paths between programs.
+
+
+
+ 2 ETH in weekly rewards for prototypes and experiments through Talent Protocol.
+
+
+
+ Fast, retroactive grants ranging from 1-5 ETH. Perfect for shipped projects ready to scale.
+
+
+
+ Get rewarded for creating public goods that benefit the entire Base ecosystem.
+
+
+
+ Comprehensive founder program with mentorship, resources, and significant funding opportunities.
+
+
+
+## Before You Apply
+
+
+
+ Deploy your project to Base mainnet. Some programs will consider early prototypes and testnet deployments but being deployed on Base mainnet gives you a leg up.
+
+
+ Verify your contract is deployed and functional on Base.
+
+
+
+
+ Create clear documentation including setup instructions, project goals, and demo materials.
+
+
+ Ensure your README includes installation steps and your project has a working demo.
+
+
+
+
+ Measure relevant metrics like user adoption, transaction volume, or community engagement.
+
+
+ Even small metrics matter. Early usage data strengthens your application significantly.
+
+
+
+
+## Weekly Rewards: Start Building Today
+
+The Builder Rewards Program distributes 2 ETH weekly to active builders—perfect for experimentation and learning.
+
+[Join Builder Rewards Program](https://www.builderscore.xyz/)
+
+### How It Works
+1. Build anything on Base (prototypes welcome)
+2. Share your progress on social media
+3. Earn weekly rewards based on activity
+4. No minimum project size required
+
+
+Prototyping counts! Early-stage projects and experiments are explicitly encouraged.
+
+
+### Perfect For
+- First-time Base builders learning the ecosystem
+- Developers experimenting with new ideas
+- Weekend projects and hackathon submissions
+- Educational content creation
+
+
+Most successful Base builders started with weekly rewards while learning. Use this as your entry point to the ecosystem.
+
+
+## Builder Grants: Live on Base
+
+Need funding for your shipped project? Base Builder Grants offer retroactive funding for projects that demonstrate real value to the ecosystem.
+
+[Apply for Builder Grants](https://paragraph.com/@grants.base.eth/calling-based-builders)
+
+### What You Get
+- **Grant Range:** 1-5 ETH
+- **Application Type:** Retroactive (for shipped projects)
+
+
+
+Already have a working prototype? You're ready to apply. Builder Grants reward shipped code over perfect pitches.
+
+
+## OP Retro Funding: Long-term Impact
+
+Creating tools, infrastructure, or resources that benefit everyone? OP Retro Funding recognizes and rewards public goods contributions to the Base ecosystem.
+
+[Track Your Impact on Atlas](https://atlas.optimism.io/)
+
+### Ideal Projects
+- Open-source libraries and development frameworks
+- Community tools and ecosystem infrastructure
+- Analytics dashboards and ecosystem insights
+
+### Funding Approach
+- **Focus:** Public goods and ecosystem-wide impact
+- **Recognition:** Both funding and ecosystem acknowledgment
+
+### Application Process
+
+
+
+ Create tools, content, or infrastructure that benefits the entire Base community.
+
+
+ Ensure your project is open-source and publicly accessible.
+
+
+
+
+ Track usage metrics, community adoption, and ecosystem benefits.
+
+
+ Include testimonials from other builders who've used your tools.
+
+
+
+
+ Use the Optimism Atlas platform to track contributions and apply for funding.
+
+
+ Complete your Atlas profile with detailed project information.
+
+
+
+
+## Base Batches: The Founder Track
+
+For builders ready to become founders, Base Batches provides the most comprehensive support system in the ecosystem. This recurring initiative combines structured development, mentorship, and significant funding opportunities.
+
+[Learn More About Base Batches](https://basebatches.xyz)
+
+### Program Structure
+
+
+
+ Rapid development sprint with direct access to mentorship and technical resources from the Base team.
+
+
+ Complete your MVP and receive detailed technical feedback from Base core team members.
+
+
+
+
+ 4-week structured support to refine your product, validate your market, and develop your business model.
+
+
+ Achieve product-market fit indicators and prepare comprehensive pitch materials.
+
+
+
+
+ Present to top-tier investors including Coinbase Ventures and other leading crypto VCs.
+
+
+ Secure follow-on funding commitments from investor network.
+
+
+
+
+### What Each Cohort Receives
+- **Direct mentorship** from Base team members and industry experts
+- **Access to exclusive resources** including technical infrastructure and partnerships
+- **Investor introductions** to Coinbase Ventures and leading crypto funds
+- **Deep ecosystem integration** with Base protocol and community
+
+
+Base Batches #001 is currently in progress. The next Base Batches will be announced in the second half of 2025.
+
+
+## Get Started Today
+
+Building something on Base? The ecosystem is ready to support you at every stage of your journey.
+
+
+The best builders in Base started exactly where you are now. Most successful applicants begin with smaller programs and progress to larger opportunities.
+
+
+### Your Next Steps
+
+1. **Choose your starting point** based on your current project stage
+2. **Join the Base community** on Discord and social media
+3. **Start building** and documenting your progress
+4. **Apply to your selected program** with confidence
+
+
+Don't wait for the "perfect" project. The Base ecosystem values builders at all stages. Start where you are and grow with the community's support.
+
+
+Remember: Whether you're tinkering with a weekend project or building the next breakthrough application, there's a funding path designed for your journey. The Base ecosystem has invested millions in builders who started with nothing more than an idea and the determination to build.
+
+**Take the first step today.**
\ No newline at end of file
diff --git a/docs/get-started/launch-token.mdx b/docs/get-started/launch-token.mdx
new file mode 100644
index 00000000..aa3402cd
--- /dev/null
+++ b/docs/get-started/launch-token.mdx
@@ -0,0 +1,423 @@
+---
+title: 'Launch a Token'
+---
+
+
+Launching a token on Base can be accomplished through multiple approaches, from no-code platforms to custom smart contract development. This guide helps you choose the right method and provides implementation details for both approaches.
+
+
+
+ Use existing platforms like Zora, Clanker, or Flaunch for quick deployment
+
+
+ Build custom ERC-20 tokens with Foundry for maximum control
+
+
+ Decision framework to help you pick the right method
+
+
+ Security, community building, and post-launch guidance
+
+
+
+
+**For most users:** Use existing token launch platforms like Zora, Clanker, or Flaunch. These tools handle the technical complexity while providing unique features for different use cases.
+
+**For developers:** Build custom ERC-20 tokens using Foundry and OpenZeppelin's battle-tested contracts for maximum control and customization.
+
+
+## Choosing Your Launch Approach
+
+### Platform-Based Launch (Recommended for Most Users)
+
+Choose a platform when you want:
+- Quick deployment without coding
+- Built-in community features
+- Automated liquidity management
+- Social integration capabilities
+
+### Custom Development (For Developers)
+
+Build your own smart contract when you need:
+- Custom tokenomics or functionality
+- Full control over contract behavior
+- Integration with existing systems
+- Advanced security requirements
+
+## Token Launch Platforms on Base
+
+### Zora
+**Best for:** Content creators and social tokens
+
+Zora transforms every post into a tradeable ERC-20 token with automatic Uniswap integration. Each post becomes a "coin" with 1 billion supply, creators receive 10 million tokens, and earn 1% of all trading fees.
+
+**Key Features:**
+- Social-first token creation
+- Automatic liquidity pools
+- Revenue sharing for creators
+- Built-in trading interface
+
+[Get started with Zora →](https://zora.co)
+
+### Clanker
+**Best for:** Quick memecoin launches via social media
+
+Clanker is an AI-driven token deployment tool that operates through Farcaster. Users can create ERC-20 tokens on Base by simply tagging @clanker with their token concept.
+
+**Key Features:**
+- AI-powered automation
+- Social media integration via Farcaster
+- Instant deployment
+- Community-driven discovery
+
+[Get started with Clanker →](https://warpcast.com) or visit [clanker.world](https://clanker.world)
+
+### Flaunch
+**Best for:** Advanced memecoin projects with sophisticated tokenomics
+
+Flaunch leverages Uniswap V4 to enable programmable revenue splits, automated buybacks, and Progressive Bid Walls for price support. Creators can customize fee distributions and treasury management.
+
+**Key Features:**
+- Programmable revenue sharing
+- Automated buyback mechanisms
+- Progressive Bid Wall technology
+- Treasury management tools
+
+[Get started with Flaunch →](https://flaunch.gg)
+
+## Technical Implementation with Foundry
+
+For developers who want full control over their token implementation, here's how to create and deploy a custom ERC-20 token on Base using Foundry.
+
+
+Before launching a custom developed token to production, always conduct security reviews by expert smart contract developers.
+
+
+### Prerequisites
+
+
+
+ Install Foundry on your system:
+ ```bash Terminal
+ curl -L https://foundry.paradigm.xyz | bash
+ foundryup
+ ```
+ For detailed installation instructions, see the [Foundry documentation](https://book.getfoundry.sh/getting-started/installation).
+
+
+ Obtain Base Sepolia ETH for testing from the [Base Faucet](https://docs.base.org/docs/tools/network-faucets)
+
+
+ Configure your wallet and development tools for Base testnet deployment
+
+
+
+### Project Setup
+
+Initialize a new Foundry project and clean up template files:
+
+```bash Terminal
+# Create new project
+forge init my-token-project
+cd my-token-project
+
+# Remove template files we don't need
+rm src/Counter.sol script/Counter.s.sol test/Counter.t.sol
+```
+
+Install OpenZeppelin contracts for secure, audited ERC-20 implementation:
+
+```bash Terminal
+# Install OpenZeppelin contracts library
+forge install OpenZeppelin/openzeppelin-contracts
+```
+
+### Smart Contract Development
+
+Create your token contract using OpenZeppelin's ERC-20 implementation:
+
+```solidity src/MyToken.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+import "@openzeppelin/contracts/access/Ownable.sol";
+
+/**
+ * @title MyToken
+ * @dev ERC-20 token with minting capabilities and supply cap
+ */
+contract MyToken is ERC20, Ownable {
+ // Maximum number of tokens that can ever exist
+ uint256 public constant MAX_SUPPLY = 1_000_000_000 * 10**18; // 1 billion tokens
+
+ constructor(
+ string memory name,
+ string memory symbol,
+ uint256 initialSupply,
+ address initialOwner
+ ) ERC20(name, symbol) Ownable(initialOwner) {
+ require(initialSupply <= MAX_SUPPLY, "Initial supply exceeds max supply");
+ // Mint initial supply to the contract deployer
+ _mint(initialOwner, initialSupply);
+ }
+
+ /**
+ * @dev Mint new tokens (only contract owner can call this)
+ * @param to Address to mint tokens to
+ * @param amount Amount of tokens to mint
+ */
+ function mint(address to, uint256 amount) public onlyOwner {
+ require(totalSupply() + amount <= MAX_SUPPLY, "Minting would exceed max supply");
+ _mint(to, amount);
+ }
+
+ /**
+ * @dev Burn tokens from caller's balance
+ * @param amount Amount of tokens to burn
+ */
+ function burn(uint256 amount) public {
+ _burn(msg.sender, amount);
+ }
+}
+```
+
+### Deployment Script
+
+Create a deployment script following Foundry best practices:
+
+```solidity script/DeployToken.s.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import {Script, console} from "forge-std/Script.sol";
+import {MyToken} from "../src/MyToken.sol";
+
+contract DeployToken is Script {
+ function run() external {
+ // Load deployer's private key from environment variables
+ uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
+ address deployerAddress = vm.addr(deployerPrivateKey);
+
+ // Token configuration parameters
+ string memory name = "My Token";
+ string memory symbol = "MTK";
+ uint256 initialSupply = 100_000_000 * 10**18; // 100 million tokens
+
+ // Start broadcasting transactions
+ vm.startBroadcast(deployerPrivateKey);
+
+ // Deploy the token contract
+ MyToken token = new MyToken(
+ name,
+ symbol,
+ initialSupply,
+ deployerAddress
+ );
+
+ // Stop broadcasting transactions
+ vm.stopBroadcast();
+
+ // Log deployment information
+ console.log("Token deployed to:", address(token));
+ console.log("Token name:", token.name());
+ console.log("Token symbol:", token.symbol());
+ console.log("Initial supply:", token.totalSupply());
+ console.log("Deployer balance:", token.balanceOf(deployerAddress));
+ }
+}
+```
+
+### Environment Configuration
+
+Create a `.env` file with your configuration:
+
+```bash .env
+PRIVATE_KEY=your_private_key_here
+BASE_SEPOLIA_RPC_URL=https://sepolia.base.org
+BASE_MAINNET_RPC_URL=https://mainnet.base.org
+BASESCAN_API_KEY=your_basescan_api_key_here
+```
+
+Update `foundry.toml` for Base network configuration:
+
+```toml foundry.toml
+[profile.default]
+src = "src"
+out = "out"
+libs = ["lib"]
+remappings = ["@openzeppelin/=lib/openzeppelin-contracts/"]
+
+[rpc_endpoints]
+base_sepolia = "${BASE_SEPOLIA_RPC_URL}"
+base_mainnet = "${BASE_MAINNET_RPC_URL}"
+
+[etherscan]
+base_sepolia = { key = "${BASESCAN_API_KEY}", url = "https://api-sepolia.basescan.org/api" }
+base = { key = "${BASESCAN_API_KEY}", url = "https://api.basescan.org/api" }
+```
+
+### Testing
+
+Create comprehensive tests for your token:
+
+```solidity test/MyToken.t.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import {Test, console} from "forge-std/Test.sol";
+import {MyToken} from "../src/MyToken.sol";
+
+contract MyTokenTest is Test {
+ MyToken public token;
+ address public owner = address(0x1);
+ address public user = address(0x2);
+
+ uint256 constant INITIAL_SUPPLY = 100_000_000 * 10**18;
+
+ function setUp() public {
+ // Deploy token contract before each test
+ vm.prank(owner);
+ token = new MyToken("Test Token", "TEST", INITIAL_SUPPLY, owner);
+ }
+
+ function testInitialState() public {
+ // Verify token was deployed with correct parameters
+ assertEq(token.name(), "Test Token");
+ assertEq(token.symbol(), "TEST");
+ assertEq(token.totalSupply(), INITIAL_SUPPLY);
+ assertEq(token.balanceOf(owner), INITIAL_SUPPLY);
+ }
+
+ function testMinting() public {
+ uint256 mintAmount = 1000 * 10**18;
+
+ // Only owner should be able to mint
+ vm.prank(owner);
+ token.mint(user, mintAmount);
+
+ assertEq(token.balanceOf(user), mintAmount);
+ assertEq(token.totalSupply(), INITIAL_SUPPLY + mintAmount);
+ }
+
+ function testBurning() public {
+ uint256 burnAmount = 1000 * 10**18;
+
+ // Owner burns their own tokens
+ vm.prank(owner);
+ token.burn(burnAmount);
+
+ assertEq(token.balanceOf(owner), INITIAL_SUPPLY - burnAmount);
+ assertEq(token.totalSupply(), INITIAL_SUPPLY - burnAmount);
+ }
+
+ function testFailMintExceedsMaxSupply() public {
+ // This test should fail when trying to mint more than max supply
+ uint256 excessiveAmount = token.MAX_SUPPLY() + 1;
+
+ vm.prank(owner);
+ token.mint(user, excessiveAmount);
+ }
+
+ function testFailUnauthorizedMinting() public {
+ // This test should fail when non-owner tries to mint
+ vm.prank(user);
+ token.mint(user, 1000 * 10**18);
+ }
+}
+```
+
+Run your tests:
+
+```bash Terminal
+# Run all tests with verbose output
+forge test -vv
+```
+
+### Deployment and Verification
+
+Deploy to Base Sepolia testnet:
+
+```bash Terminal
+# Load environment variables
+source .env
+
+# Deploy to Base Sepolia with automatic verification
+forge script script/DeployToken.s.sol:DeployToken \
+ --rpc-url base_sepolia \
+ --broadcast \
+ --verify
+```
+
+
+The `--verify` flag automatically verifies your contract on BaseScan, making it easier for users to interact with your token.
+
+
+
+To deploy to Base Mainnet, simply change `base_sepolia` to `base_mainnet` in your deployment command. Ensure you have sufficient ETH on Base Mainnet for deployment and gas fees.
+
+
+## Post-Launch Considerations
+
+Once your token is deployed, here are the key next steps to consider:
+
+### Token Distribution and Economics
+
+Carefully consider your token's supply and distribution settings. Think through how tokens will be distributed to your community, team, and ecosystem participants. Consider factors like vesting schedules, allocation percentages, and long-term incentive alignment.
+
+### Community and Social Presence
+
+Establish a community and social presence around your token and project. This includes creating documentation, setting up social media accounts, engaging with the Base ecosystem, and building relationships with other projects and developers.
+
+### Liquidity and Trading
+
+Add liquidity to decentralized exchanges like Uniswap to enable trading. Note that token launchers will typically handle this for you automatically, but for custom deployments, you'll need to create trading pairs and provide initial liquidity.
+
+### Continued Development
+
+For comprehensive guidance on growing your project on Base, including marketing strategies, ecosystem integration, and growth tactics, visit the [Base Launch Playbook](https://www.launchonbase.xyz/).
+
+
+Remember to always prioritize security, transparency, and community value when developing and launching tokens. Consider conducting security audits and following best practices for token distribution.
+
+
+## Resources
+
+
+
+ Complete guide to getting started on Base
+
+
+ Technical specifications and network information
+
+
+ Comprehensive guide to using Foundry
+
+
+ Security-focused smart contract library
+
+
+ Explore transactions and contracts on Base
+
+
+ Get testnet ETH for development
+
+
+
+### Community
+
+
+
+ Join the Base community
+
+
+ Follow Base updates
+
+
+ Contribute to Base development
+
+
+
+---
+
+Whether you choose a platform-based approach for speed and convenience, or custom development for maximum control, Base provides a robust foundation for token launches. Start with the approach that best fits your technical expertise and project requirements, and leverage Base's growing ecosystem to build successful token projects.
\ No newline at end of file
diff --git a/docs/get-started/products.mdx b/docs/get-started/products.mdx
new file mode 100644
index 00000000..2c2ffa42
--- /dev/null
+++ b/docs/get-started/products.mdx
@@ -0,0 +1,19 @@
+---
+title: 'Products'
+keywords: ['onchainkit', 'minikit', 'agentkit', 'base account', 'appchains', 'paymaster','l3','deploy a chain','smart wallet']
+---
+
+
+
+ All-in-one toolkit and ready-to-use, full-stack components.
+
+
+ Feature your mini app on decentralized social platforms with a few lines of code.
+
+
+ A passkey-based universal account to connect with the onchain world.
+
+
+ Launch a chain with dedicated blockspace on Base, in minutes.
+
+
\ No newline at end of file
diff --git a/docs/get-started/prompt-library.mdx b/docs/get-started/prompt-library.mdx
new file mode 100644
index 00000000..32846ff9
--- /dev/null
+++ b/docs/get-started/prompt-library.mdx
@@ -0,0 +1,9 @@
+---
+sidebarTitle: 'Prompt Library'
+title: Developer's Guide to Effective AI Prompting
+description: Learn practical AI prompting techniques to enhance your coding workflow and get better results from AI coding assistants.
+---
+
+import AiPrompt from "/snippets/prompt-library.mdx";
+
+
\ No newline at end of file
diff --git a/docs/get-started/use-cases.mdx b/docs/get-started/use-cases.mdx
new file mode 100644
index 00000000..805fc9fc
--- /dev/null
+++ b/docs/get-started/use-cases.mdx
@@ -0,0 +1,24 @@
+---
+title: 'Use Cases'
+---
+
+
+
+ Unlock the power of DeFi protocols and services directly in your app.
+
+
+ Deploy AI agents that can interact with onchain data and smart contracts.
+
+
+ Integrate secure and efficient crypto payment solutions for your apps.
+
+
+ Let users sign up and sign in with Smart Wallet — the universal account for the onchain world.
+
+
+ Use decentralized social graphs to grow your app and find users — wherever they are.
+
+
+ Enable gasless transactions and simplify user onboarding.
+
+
\ No newline at end of file
diff --git a/docs/get-started/use-cases/agents.mdx b/docs/get-started/use-cases/agents.mdx
new file mode 100644
index 00000000..c3fbbdd7
--- /dev/null
+++ b/docs/get-started/use-cases/agents.mdx
@@ -0,0 +1,3 @@
+---
+title: 'Agents'
+---
\ No newline at end of file
diff --git a/docs/get-started/use-cases/defi.mdx b/docs/get-started/use-cases/defi.mdx
new file mode 100644
index 00000000..2ae239cb
--- /dev/null
+++ b/docs/get-started/use-cases/defi.mdx
@@ -0,0 +1,3 @@
+---
+title: 'DeFi'
+---
\ No newline at end of file
diff --git a/docs/get-started/use-cases/gasless.mdx b/docs/get-started/use-cases/gasless.mdx
new file mode 100644
index 00000000..314ada32
--- /dev/null
+++ b/docs/get-started/use-cases/gasless.mdx
@@ -0,0 +1,3 @@
+---
+title: 'Gasless'
+---
\ No newline at end of file
diff --git a/docs/get-started/use-cases/onboarding.mdx b/docs/get-started/use-cases/onboarding.mdx
new file mode 100644
index 00000000..8e6bf157
--- /dev/null
+++ b/docs/get-started/use-cases/onboarding.mdx
@@ -0,0 +1,3 @@
+---
+title: 'Onboarding'
+---
\ No newline at end of file
diff --git a/docs/get-started/use-cases/payments.mdx b/docs/get-started/use-cases/payments.mdx
new file mode 100644
index 00000000..4240d030
--- /dev/null
+++ b/docs/get-started/use-cases/payments.mdx
@@ -0,0 +1,3 @@
+---
+title: 'Payments'
+---
\ No newline at end of file
diff --git a/docs/get-started/use-cases/social.mdx b/docs/get-started/use-cases/social.mdx
new file mode 100644
index 00000000..9243782a
--- /dev/null
+++ b/docs/get-started/use-cases/social.mdx
@@ -0,0 +1,3 @@
+---
+title: 'Social'
+---
\ No newline at end of file
diff --git a/docs/iframe-theme.js b/docs/iframe-theme.js
new file mode 100644
index 00000000..ab0046cd
--- /dev/null
+++ b/docs/iframe-theme.js
@@ -0,0 +1,62 @@
+(function () {
+ function updateIframesForDarkMode() {
+ const isDark = document.documentElement.classList.contains("dark");
+ console.log("Dark mode:", isDark);
+
+ document.querySelectorAll('iframe[src*="chromatic.com/iframe.html"]').forEach((iframe) => {
+ iframe.style.background = "transparent";
+ iframe.allowTransparency = true;
+ console.log("Found iframe:", iframe.src);
+
+ // Use postMessage to communicate with the iframe since we can't access contentDocument due to CORS
+ const sendThemeMessage = () => {
+ try {
+ const message = {
+ type: 'THEME_CHANGE',
+ isDark: isDark,
+ styles: {
+ background: isDark ? '#0b0d0f' : 'transparent' // transparent for light mode
+ }
+ };
+ console.log("Sending theme message to iframe:", message);
+ iframe.contentWindow.postMessage(message, '*');
+ } catch (e) {
+ console.warn("Could not send message to iframe:", e);
+ }
+ };
+
+ // Send message immediately if iframe might be loaded
+ sendThemeMessage();
+
+ // Also send message when iframe loads
+ iframe.addEventListener("load", () => {
+ console.log("iframe loaded, sending theme message");
+ // Add a small delay to ensure iframe is ready
+ setTimeout(sendThemeMessage, 100);
+ });
+ });
+ }
+
+ // Listen for theme changes on the parent document
+ const observer = new MutationObserver((mutations) => {
+ mutations.forEach((mutation) => {
+ if (mutation.type === 'attributes' &&
+ mutation.attributeName === 'class' &&
+ mutation.target === document.documentElement) {
+ console.log("Theme class changed, updating iframes");
+ updateIframesForDarkMode();
+ }
+ });
+ });
+
+ observer.observe(document.documentElement, {
+ attributes: true,
+ attributeFilter: ['class']
+ });
+
+ if (document.readyState === "loading") {
+ document.addEventListener("DOMContentLoaded", updateIframesForDarkMode);
+ } else {
+ updateIframesForDarkMode();
+ }
+})();
diff --git a/docs/public/images/account-abstraction/privy-console.png b/docs/images/account-abstraction/privy-console.png
similarity index 100%
rename from docs/public/images/account-abstraction/privy-console.png
rename to docs/images/account-abstraction/privy-console.png
diff --git a/docs/public/images/account-abstraction/privy-dashboard-page.png b/docs/images/account-abstraction/privy-dashboard-page.png
similarity index 100%
rename from docs/public/images/account-abstraction/privy-dashboard-page.png
rename to docs/images/account-abstraction/privy-dashboard-page.png
diff --git a/docs/public/images/account-abstraction/privy-login-methods.png b/docs/images/account-abstraction/privy-login-methods.png
similarity index 100%
rename from docs/public/images/account-abstraction/privy-login-methods.png
rename to docs/images/account-abstraction/privy-login-methods.png
diff --git a/docs/public/images/account-abstraction/privy-login-modal.png b/docs/images/account-abstraction/privy-login-modal.png
similarity index 100%
rename from docs/public/images/account-abstraction/privy-login-modal.png
rename to docs/images/account-abstraction/privy-login-modal.png
diff --git a/docs/public/images/account-abstraction/privy-login-page.png b/docs/images/account-abstraction/privy-login-page.png
similarity index 100%
rename from docs/public/images/account-abstraction/privy-login-page.png
rename to docs/images/account-abstraction/privy-login-page.png
diff --git a/docs/public/images/base-docs-og.png b/docs/images/base-docs-og.png
similarity index 100%
rename from docs/public/images/base-docs-og.png
rename to docs/images/base-docs-og.png
diff --git a/docs/public/images/basenames-tutorial/basename-profile-home.png b/docs/images/basenames-tutorial/basename-profile-home.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/basename-profile-home.png
rename to docs/images/basenames-tutorial/basename-profile-home.png
diff --git a/docs/public/images/basenames-tutorial/basenames-frame-final.png b/docs/images/basenames-tutorial/basenames-frame-final.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/basenames-frame-final.png
rename to docs/images/basenames-tutorial/basenames-frame-final.png
diff --git a/docs/public/images/basenames-tutorial/basenames-homepage.png b/docs/images/basenames-tutorial/basenames-homepage.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/basenames-homepage.png
rename to docs/images/basenames-tutorial/basenames-homepage.png
diff --git a/docs/public/images/basenames-tutorial/confirm-textrecord-update.png b/docs/images/basenames-tutorial/confirm-textrecord-update.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/confirm-textrecord-update.png
rename to docs/images/basenames-tutorial/confirm-textrecord-update.png
diff --git a/docs/public/images/basenames-tutorial/confirm-txn.png b/docs/images/basenames-tutorial/confirm-txn.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/confirm-txn.png
rename to docs/images/basenames-tutorial/confirm-txn.png
diff --git a/docs/public/images/basenames-tutorial/edit-basename-profile.png b/docs/images/basenames-tutorial/edit-basename-profile.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/edit-basename-profile.png
rename to docs/images/basenames-tutorial/edit-basename-profile.png
diff --git a/docs/public/images/basenames-tutorial/final-basename.png b/docs/images/basenames-tutorial/final-basename.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/final-basename.png
rename to docs/images/basenames-tutorial/final-basename.png
diff --git a/docs/public/images/basenames-tutorial/frame-preview.png b/docs/images/basenames-tutorial/frame-preview.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/frame-preview.png
rename to docs/images/basenames-tutorial/frame-preview.png
diff --git a/docs/public/images/basenames-tutorial/frames-selector.png b/docs/images/basenames-tutorial/frames-selector.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/frames-selector.png
rename to docs/images/basenames-tutorial/frames-selector.png
diff --git a/docs/public/images/basenames-tutorial/preview-frame.png b/docs/images/basenames-tutorial/preview-frame.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/preview-frame.png
rename to docs/images/basenames-tutorial/preview-frame.png
diff --git a/docs/public/images/basenames-tutorial/profile-component-dropdown.png b/docs/images/basenames-tutorial/profile-component-dropdown.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/profile-component-dropdown.png
rename to docs/images/basenames-tutorial/profile-component-dropdown.png
diff --git a/docs/public/images/basenames-tutorial/show-preview.png b/docs/images/basenames-tutorial/show-preview.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/show-preview.png
rename to docs/images/basenames-tutorial/show-preview.png
diff --git a/docs/public/images/basenames-tutorial/try-now.png b/docs/images/basenames-tutorial/try-now.png
similarity index 100%
rename from docs/public/images/basenames-tutorial/try-now.png
rename to docs/images/basenames-tutorial/try-now.png
diff --git a/docs/public/images/build-with-nouns/auction.png b/docs/images/build-with-nouns/auction.png
similarity index 100%
rename from docs/public/images/build-with-nouns/auction.png
rename to docs/images/build-with-nouns/auction.png
diff --git a/docs/public/images/build-with-nouns/create-dao.png b/docs/images/build-with-nouns/create-dao.png
similarity index 100%
rename from docs/public/images/build-with-nouns/create-dao.png
rename to docs/images/build-with-nouns/create-dao.png
diff --git a/docs/public/images/build-with-thirdweb/car-color-nft.gif b/docs/images/build-with-thirdweb/car-color-nft.gif
similarity index 100%
rename from docs/public/images/build-with-thirdweb/car-color-nft.gif
rename to docs/images/build-with-thirdweb/car-color-nft.gif
diff --git a/docs/public/images/build-with-thirdweb/deploy-contract.png b/docs/images/build-with-thirdweb/deploy-contract.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/deploy-contract.png
rename to docs/images/build-with-thirdweb/deploy-contract.png
diff --git a/docs/public/images/build-with-thirdweb/get-nft-colors.png b/docs/images/build-with-thirdweb/get-nft-colors.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/get-nft-colors.png
rename to docs/images/build-with-thirdweb/get-nft-colors.png
diff --git a/docs/public/images/build-with-thirdweb/hex-to-linear-color.png b/docs/images/build-with-thirdweb/hex-to-linear-color.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/hex-to-linear-color.png
rename to docs/images/build-with-thirdweb/hex-to-linear-color.png
diff --git a/docs/public/images/build-with-thirdweb/import-image-instance.png b/docs/images/build-with-thirdweb/import-image-instance.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/import-image-instance.png
rename to docs/images/build-with-thirdweb/import-image-instance.png
diff --git a/docs/public/images/build-with-thirdweb/mint-nft.png b/docs/images/build-with-thirdweb/mint-nft.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/mint-nft.png
rename to docs/images/build-with-thirdweb/mint-nft.png
diff --git a/docs/public/images/build-with-thirdweb/open-thirdweb-manager.png b/docs/images/build-with-thirdweb/open-thirdweb-manager.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/open-thirdweb-manager.png
rename to docs/images/build-with-thirdweb/open-thirdweb-manager.png
diff --git a/docs/public/images/build-with-thirdweb/open-unreal-project.png b/docs/images/build-with-thirdweb/open-unreal-project.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/open-unreal-project.png
rename to docs/images/build-with-thirdweb/open-unreal-project.png
diff --git a/docs/public/images/build-with-thirdweb/perform-nft-claim.png b/docs/images/build-with-thirdweb/perform-nft-claim.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/perform-nft-claim.png
rename to docs/images/build-with-thirdweb/perform-nft-claim.png
diff --git a/docs/public/images/build-with-thirdweb/play-button.png b/docs/images/build-with-thirdweb/play-button.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/play-button.png
rename to docs/images/build-with-thirdweb/play-button.png
diff --git a/docs/public/images/build-with-thirdweb/scene-game.png b/docs/images/build-with-thirdweb/scene-game.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/scene-game.png
rename to docs/images/build-with-thirdweb/scene-game.png
diff --git a/docs/public/images/build-with-thirdweb/token-airdrop-dashboard.png b/docs/images/build-with-thirdweb/token-airdrop-dashboard.png
similarity index 100%
rename from docs/public/images/build-with-thirdweb/token-airdrop-dashboard.png
rename to docs/images/build-with-thirdweb/token-airdrop-dashboard.png
diff --git a/docs/public/images/build-with-zora/cdp-pick-node.png b/docs/images/build-with-zora/cdp-pick-node.png
similarity index 100%
rename from docs/public/images/build-with-zora/cdp-pick-node.png
rename to docs/images/build-with-zora/cdp-pick-node.png
diff --git a/docs/public/images/build-with-zora/dashboard.png b/docs/images/build-with-zora/dashboard.png
similarity index 100%
rename from docs/public/images/build-with-zora/dashboard.png
rename to docs/images/build-with-zora/dashboard.png
diff --git a/docs/public/images/builder-anniversary-nft/builder-anniversary-nft-preview.webp b/docs/images/builder-anniversary-nft/builder-anniversary-nft-preview.webp
similarity index 100%
rename from docs/public/images/builder-anniversary-nft/builder-anniversary-nft-preview.webp
rename to docs/images/builder-anniversary-nft/builder-anniversary-nft-preview.webp
diff --git a/docs/public/images/connecting-to-the-blockchain/add-project-information.png b/docs/images/connecting-to-the-blockchain/add-project-information.png
similarity index 100%
rename from docs/public/images/connecting-to-the-blockchain/add-project-information.png
rename to docs/images/connecting-to-the-blockchain/add-project-information.png
diff --git a/docs/public/images/connecting-to-the-blockchain/alchemy-new-app.png b/docs/images/connecting-to-the-blockchain/alchemy-new-app.png
similarity index 100%
rename from docs/public/images/connecting-to-the-blockchain/alchemy-new-app.png
rename to docs/images/connecting-to-the-blockchain/alchemy-new-app.png
diff --git a/docs/public/images/connecting-to-the-blockchain/blockdaemon-create-key.png b/docs/images/connecting-to-the-blockchain/blockdaemon-create-key.png
similarity index 100%
rename from docs/public/images/connecting-to-the-blockchain/blockdaemon-create-key.png
rename to docs/images/connecting-to-the-blockchain/blockdaemon-create-key.png
diff --git a/docs/public/images/connecting-to-the-blockchain/connected.png b/docs/images/connecting-to-the-blockchain/connected.png
similarity index 100%
rename from docs/public/images/connecting-to-the-blockchain/connected.png
rename to docs/images/connecting-to-the-blockchain/connected.png
diff --git a/docs/public/images/connecting-to-the-blockchain/quicknode-select-chain.png b/docs/images/connecting-to-the-blockchain/quicknode-select-chain.png
similarity index 100%
rename from docs/public/images/connecting-to-the-blockchain/quicknode-select-chain.png
rename to docs/images/connecting-to-the-blockchain/quicknode-select-chain.png
diff --git a/docs/public/images/connecting-to-the-blockchain/rainbowkit-modal.png b/docs/images/connecting-to-the-blockchain/rainbowkit-modal.png
similarity index 100%
rename from docs/public/images/connecting-to-the-blockchain/rainbowkit-modal.png
rename to docs/images/connecting-to-the-blockchain/rainbowkit-modal.png
diff --git a/docs/public/images/connecting-to-the-blockchain/wallet-connect-create-button.png b/docs/images/connecting-to-the-blockchain/wallet-connect-create-button.png
similarity index 100%
rename from docs/public/images/connecting-to-the-blockchain/wallet-connect-create-button.png
rename to docs/images/connecting-to-the-blockchain/wallet-connect-create-button.png
diff --git a/docs/public/images/deployment-with-remix/base-confirm-transaction.png b/docs/images/deployment-with-remix/base-confirm-transaction.png
similarity index 100%
rename from docs/public/images/deployment-with-remix/base-confirm-transaction.png
rename to docs/images/deployment-with-remix/base-confirm-transaction.png
diff --git a/docs/public/images/deployment-with-remix/compiler-debug-log.png b/docs/images/deployment-with-remix/compiler-debug-log.png
similarity index 100%
rename from docs/public/images/deployment-with-remix/compiler-debug-log.png
rename to docs/images/deployment-with-remix/compiler-debug-log.png
diff --git a/docs/public/images/deployment-with-remix/editor-pane.png b/docs/images/deployment-with-remix/editor-pane.png
similarity index 100%
rename from docs/public/images/deployment-with-remix/editor-pane.png
rename to docs/images/deployment-with-remix/editor-pane.png
diff --git a/docs/public/images/deployment-with-remix/remix-base-goerli-connected.png b/docs/images/deployment-with-remix/remix-base-goerli-connected.png
similarity index 100%
rename from docs/public/images/deployment-with-remix/remix-base-goerli-connected.png
rename to docs/images/deployment-with-remix/remix-base-goerli-connected.png
diff --git a/docs/public/images/deployment-with-remix/remix-home.png b/docs/images/deployment-with-remix/remix-home.png
similarity index 100%
rename from docs/public/images/deployment-with-remix/remix-home.png
rename to docs/images/deployment-with-remix/remix-home.png
diff --git a/docs/public/images/deployment-with-remix/remix-terminal.png b/docs/images/deployment-with-remix/remix-terminal.png
similarity index 100%
rename from docs/public/images/deployment-with-remix/remix-terminal.png
rename to docs/images/deployment-with-remix/remix-terminal.png
diff --git a/docs/public/images/deployment-with-remix/select-provider.png b/docs/images/deployment-with-remix/select-provider.png
similarity index 100%
rename from docs/public/images/deployment-with-remix/select-provider.png
rename to docs/images/deployment-with-remix/select-provider.png
diff --git a/docs/public/images/deployment-with-remix/verify-and-publish.png b/docs/images/deployment-with-remix/verify-and-publish.png
similarity index 100%
rename from docs/public/images/deployment-with-remix/verify-and-publish.png
rename to docs/images/deployment-with-remix/verify-and-publish.png
diff --git a/docs/public/images/deployment-with-tenderly/configuration.png b/docs/images/deployment-with-tenderly/configuration.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/configuration.png
rename to docs/images/deployment-with-tenderly/configuration.png
diff --git a/docs/public/images/deployment-with-tenderly/create-template.png b/docs/images/deployment-with-tenderly/create-template.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/create-template.png
rename to docs/images/deployment-with-tenderly/create-template.png
diff --git a/docs/public/images/deployment-with-tenderly/debugger-button.png b/docs/images/deployment-with-tenderly/debugger-button.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/debugger-button.png
rename to docs/images/deployment-with-tenderly/debugger-button.png
diff --git a/docs/public/images/deployment-with-tenderly/devnet-project-slug.png b/docs/images/deployment-with-tenderly/devnet-project-slug.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/devnet-project-slug.png
rename to docs/images/deployment-with-tenderly/devnet-project-slug.png
diff --git a/docs/public/images/deployment-with-tenderly/github-actions.png b/docs/images/deployment-with-tenderly/github-actions.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/github-actions.png
rename to docs/images/deployment-with-tenderly/github-actions.png
diff --git a/docs/public/images/deployment-with-tenderly/modifying-source.png b/docs/images/deployment-with-tenderly/modifying-source.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/modifying-source.png
rename to docs/images/deployment-with-tenderly/modifying-source.png
diff --git a/docs/public/images/deployment-with-tenderly/output.png b/docs/images/deployment-with-tenderly/output.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/output.png
rename to docs/images/deployment-with-tenderly/output.png
diff --git a/docs/public/images/deployment-with-tenderly/overrides.png b/docs/images/deployment-with-tenderly/overrides.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/overrides.png
rename to docs/images/deployment-with-tenderly/overrides.png
diff --git a/docs/public/images/deployment-with-tenderly/result-of-expression.png b/docs/images/deployment-with-tenderly/result-of-expression.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/result-of-expression.png
rename to docs/images/deployment-with-tenderly/result-of-expression.png
diff --git a/docs/public/images/deployment-with-tenderly/result-of-simulation.png b/docs/images/deployment-with-tenderly/result-of-simulation.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/result-of-simulation.png
rename to docs/images/deployment-with-tenderly/result-of-simulation.png
diff --git a/docs/public/images/deployment-with-tenderly/setgreeting.png b/docs/images/deployment-with-tenderly/setgreeting.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/setgreeting.png
rename to docs/images/deployment-with-tenderly/setgreeting.png
diff --git a/docs/public/images/deployment-with-tenderly/simulation.png b/docs/images/deployment-with-tenderly/simulation.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/simulation.png
rename to docs/images/deployment-with-tenderly/simulation.png
diff --git a/docs/public/images/deployment-with-tenderly/simulator-button.png b/docs/images/deployment-with-tenderly/simulator-button.png
similarity index 100%
rename from docs/public/images/deployment-with-tenderly/simulator-button.png
rename to docs/images/deployment-with-tenderly/simulator-button.png
diff --git a/docs/public/images/dynamic-nfts/NFT_level_1.png b/docs/images/dynamic-nfts/NFT_level_1.png
similarity index 100%
rename from docs/public/images/dynamic-nfts/NFT_level_1.png
rename to docs/images/dynamic-nfts/NFT_level_1.png
diff --git a/docs/public/images/dynamic-nfts/NFT_level_2.png b/docs/images/dynamic-nfts/NFT_level_2.png
similarity index 100%
rename from docs/public/images/dynamic-nfts/NFT_level_2.png
rename to docs/images/dynamic-nfts/NFT_level_2.png
diff --git a/docs/public/images/dynamic-nfts/NFT_level_3.png b/docs/images/dynamic-nfts/NFT_level_3.png
similarity index 100%
rename from docs/public/images/dynamic-nfts/NFT_level_3.png
rename to docs/images/dynamic-nfts/NFT_level_3.png
diff --git a/docs/public/images/dynamic-nfts/all-characters.png b/docs/images/dynamic-nfts/all-characters.png
similarity index 100%
rename from docs/public/images/dynamic-nfts/all-characters.png
rename to docs/images/dynamic-nfts/all-characters.png
diff --git a/docs/public/images/dynamic-nfts/base-dynamic-nft.zip b/docs/images/dynamic-nfts/base-dynamic-nft.zip
similarity index 100%
rename from docs/public/images/dynamic-nfts/base-dynamic-nft.zip
rename to docs/images/dynamic-nfts/base-dynamic-nft.zip
diff --git a/docs/public/images/dynamic-nfts/image-level-1.png b/docs/images/dynamic-nfts/image-level-1.png
similarity index 100%
rename from docs/public/images/dynamic-nfts/image-level-1.png
rename to docs/images/dynamic-nfts/image-level-1.png
diff --git a/docs/public/images/dynamic-nfts/image-level-2.png b/docs/images/dynamic-nfts/image-level-2.png
similarity index 100%
rename from docs/public/images/dynamic-nfts/image-level-2.png
rename to docs/images/dynamic-nfts/image-level-2.png
diff --git a/docs/public/images/dynamic-nfts/image-level-3.png b/docs/images/dynamic-nfts/image-level-3.png
similarity index 100%
rename from docs/public/images/dynamic-nfts/image-level-3.png
rename to docs/images/dynamic-nfts/image-level-3.png
diff --git a/docs/public/images/dynamic-nfts/mutable-references.png b/docs/images/dynamic-nfts/mutable-references.png
similarity index 100%
rename from docs/public/images/dynamic-nfts/mutable-references.png
rename to docs/images/dynamic-nfts/mutable-references.png
diff --git a/docs/public/images/dynamic-nfts/open-sea-mockup.jpg b/docs/images/dynamic-nfts/open-sea-mockup.jpg
similarity index 100%
rename from docs/public/images/dynamic-nfts/open-sea-mockup.jpg
rename to docs/images/dynamic-nfts/open-sea-mockup.jpg
diff --git a/docs/public/images/dynamic-nfts/refresh-metadata.png b/docs/images/dynamic-nfts/refresh-metadata.png
similarity index 100%
rename from docs/public/images/dynamic-nfts/refresh-metadata.png
rename to docs/images/dynamic-nfts/refresh-metadata.png
diff --git a/docs/public/images/frames/100-lines-frame.png b/docs/images/frames/100-lines-frame.png
similarity index 100%
rename from docs/public/images/frames/100-lines-frame.png
rename to docs/images/frames/100-lines-frame.png
diff --git a/docs/public/images/frames/2024-a-base-odyssey.png b/docs/images/frames/2024-a-base-odyssey.png
similarity index 100%
rename from docs/public/images/frames/2024-a-base-odyssey.png
rename to docs/images/frames/2024-a-base-odyssey.png
diff --git a/docs/public/images/frames/first-frame.png b/docs/images/frames/first-frame.png
similarity index 100%
rename from docs/public/images/frames/first-frame.png
rename to docs/images/frames/first-frame.png
diff --git a/docs/public/images/frames/gave-me-away.png b/docs/images/frames/gave-me-away.png
similarity index 100%
rename from docs/public/images/frames/gave-me-away.png
rename to docs/images/frames/gave-me-away.png
diff --git a/docs/public/images/frames/install-action.png b/docs/images/frames/install-action.png
similarity index 100%
rename from docs/public/images/frames/install-action.png
rename to docs/images/frames/install-action.png
diff --git a/docs/public/images/frames/link-button-test.png b/docs/images/frames/link-button-test.png
similarity index 100%
rename from docs/public/images/frames/link-button-test.png
rename to docs/images/frames/link-button-test.png
diff --git a/docs/public/images/frames/real-nft.png b/docs/images/frames/real-nft.png
similarity index 100%
rename from docs/public/images/frames/real-nft.png
rename to docs/images/frames/real-nft.png
diff --git a/docs/public/images/frames/story-time.png b/docs/images/frames/story-time.png
similarity index 100%
rename from docs/public/images/frames/story-time.png
rename to docs/images/frames/story-time.png
diff --git a/docs/public/images/frames/updated-100-lines.png b/docs/images/frames/updated-100-lines.png
similarity index 100%
rename from docs/public/images/frames/updated-100-lines.png
rename to docs/images/frames/updated-100-lines.png
diff --git a/docs/public/images/frames/vercel-build.png b/docs/images/frames/vercel-build.png
similarity index 100%
rename from docs/public/images/frames/vercel-build.png
rename to docs/images/frames/vercel-build.png
diff --git a/docs/public/images/frames/vercel-import.png b/docs/images/frames/vercel-import.png
similarity index 100%
rename from docs/public/images/frames/vercel-import.png
rename to docs/images/frames/vercel-import.png
diff --git a/docs/public/images/frames/vercel-install.png b/docs/images/frames/vercel-install.png
similarity index 100%
rename from docs/public/images/frames/vercel-install.png
rename to docs/images/frames/vercel-install.png
diff --git a/docs/public/images/frames/vercel-projects.png b/docs/images/frames/vercel-projects.png
similarity index 100%
rename from docs/public/images/frames/vercel-projects.png
rename to docs/images/frames/vercel-projects.png
diff --git "a/docs/public/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 3.10.17\342\200\257PM.png" "b/docs/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 3.10.17\342\200\257PM.png"
similarity index 100%
rename from "docs/public/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 3.10.17\342\200\257PM.png"
rename to "docs/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 3.10.17\342\200\257PM.png"
diff --git "a/docs/public/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 8.05.25\342\200\257AM.png" "b/docs/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 8.05.25\342\200\257AM.png"
similarity index 100%
rename from "docs/public/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 8.05.25\342\200\257AM.png"
rename to "docs/images/gasless-transaction-on-base/Screenshot 2024-07-11 at 8.05.25\342\200\257AM.png"
diff --git a/docs/public/images/gasless-transaction-on-base/cdp-allowlist-contract.png b/docs/images/gasless-transaction-on-base/cdp-allowlist-contract.png
similarity index 100%
rename from docs/public/images/gasless-transaction-on-base/cdp-allowlist-contract.png
rename to docs/images/gasless-transaction-on-base/cdp-allowlist-contract.png
diff --git a/docs/public/images/gasless-transaction-on-base/cdp-config.png b/docs/images/gasless-transaction-on-base/cdp-config.png
similarity index 100%
rename from docs/public/images/gasless-transaction-on-base/cdp-config.png
rename to docs/images/gasless-transaction-on-base/cdp-config.png
diff --git a/docs/public/images/gasless-transaction-on-base/cdp-global-user-limits.png b/docs/images/gasless-transaction-on-base/cdp-global-user-limits.png
similarity index 100%
rename from docs/public/images/gasless-transaction-on-base/cdp-global-user-limits.png
rename to docs/images/gasless-transaction-on-base/cdp-global-user-limits.png
diff --git a/docs/public/images/gasless-transaction-on-base/cdp-home.png b/docs/images/gasless-transaction-on-base/cdp-home.png
similarity index 100%
rename from docs/public/images/gasless-transaction-on-base/cdp-home.png
rename to docs/images/gasless-transaction-on-base/cdp-home.png
diff --git a/docs/public/images/gasless-transaction-on-base/cdp-paymaster.png b/docs/images/gasless-transaction-on-base/cdp-paymaster.png
similarity index 100%
rename from docs/public/images/gasless-transaction-on-base/cdp-paymaster.png
rename to docs/images/gasless-transaction-on-base/cdp-paymaster.png
diff --git a/docs/public/images/gasless-transaction-on-base/cdp-select-network.png b/docs/images/gasless-transaction-on-base/cdp-select-network.png
similarity index 100%
rename from docs/public/images/gasless-transaction-on-base/cdp-select-network.png
rename to docs/images/gasless-transaction-on-base/cdp-select-network.png
diff --git a/docs/public/images/gasless-transaction-on-base/cdp-select-project.png b/docs/images/gasless-transaction-on-base/cdp-select-project.png
similarity index 100%
rename from docs/public/images/gasless-transaction-on-base/cdp-select-project.png
rename to docs/images/gasless-transaction-on-base/cdp-select-project.png
diff --git a/docs/public/images/gasless-transaction-on-base/cdp-userops-10.png b/docs/images/gasless-transaction-on-base/cdp-userops-10.png
similarity index 100%
rename from docs/public/images/gasless-transaction-on-base/cdp-userops-10.png
rename to docs/images/gasless-transaction-on-base/cdp-userops-10.png
diff --git a/docs/public/images/hardhat-test-coverage/coverage-report.png b/docs/images/hardhat-test-coverage/coverage-report.png
similarity index 100%
rename from docs/public/images/hardhat-test-coverage/coverage-report.png
rename to docs/images/hardhat-test-coverage/coverage-report.png
diff --git a/docs/images/hero.png b/docs/images/hero.png
new file mode 100644
index 0000000000000000000000000000000000000000..f45b554f09e92631a834072c7af739f5a06adcf6
GIT binary patch
literal 870663
zcmV)iK%&2iP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@
z1ONa40RR98@}L6%1ONa40RR95i~s-t07psxumAu+07*naRCodGy;qYYOLis}GBZ+V
zY1yJ$-R{2KxBIFQzy(HJTflY=yWsB9jD~%o8DIE7KJlH8{105xj0?iJe4wpi0W7fu
z7T6sOMquWOxuUOb-PNV5QfG#a;CDPkMr1~+5-n!RD=WhN`0?Y%k9&AT96xcKUsyWN
zdBOG1@zW@%n~V@4(u+Xp7%Y~E6ikY;>c%b*N9;|-)4jFz<@N%4(;k5U8k~E{M$)52
z7bh7hIy6dEk5N6NF$`~5-cSaPn8_cpd~fmNrq@e9Aw6-G6BkIRbU5hbYZzGnNmd=B
z9ZL*k=a3mEN_-ekJa^ct`NI|*#?ImLj)jweNN^sLl?ZwyI%eS*+7XH$sV^q3mlYVV
zR4-OGufM%tmo+ORNQIO#rxY)7g3_*j#alb)
zmV_%8XEF-+zy9n0Eodbg!2bM(@Y6FZ3rkmurI~apl}@L?zbrXdE=cu;v%P1oZwnor
zlSE`@(n_vWn!R*s?Tt6YtJkDyk?QwCRdv_borjN{&F%e}shn-;U)=3He*C#<@|Gjm
zu4vo5X<4?z*|uq0nqze=v(34h$Z3Mx7Wigf(e6Ij1vNK#iVGuApjTb=q4nzJ)%~j5
z(vXwlgtRDSc|j57oFt_M&djFGVvd_C=jUfrj~+dK|AY7AgT(J@0$Xt?caTt*4gRa?Fk(
zrUXe5rJR^5$m!`!p_D7~xg3|~IoIG^U6uHzESjs!g{6g}k`)hX?w-UM6}Peepjm%h
zukRaLJD+nt{`jMMqsf?Yn1me`@8vKed^ep|78Wmvaz2+YLjZFsH
zj;->pF7j3}pWfVj7`6{rg(uH=B$TZ;6zK{=5f%h?CWwDQ@feRJd^)m=>)Pd|@BPm0
z-97c2M@F^oi0EY@?Fwnf6&*B)6T!KX;xC>p=%X8Aab8_6|JVQWA3xc!
zKD(>$S2`GbynxFm#qpw)%7f=z+PQJL^xNNAt2doHpT7TRfBGlv1;CdHD1QHY-=Cjf
z+SqPy?%9@`lT$@8RZe9WT?kog+GeAmIImsF+`cjYXoGvW;at3OZtjARyC&{#IA8zN
z-nv^Wr1oFGD&!PHPNhHi=<&b*)Bl}w(FEId@k4EBn?rL1CH#&~>Ta)zz-J5+KI^w2
zNvYsJzzGlnO#keGyT_1J2#O)HL;wlSVHFbQ9R(M%=rQ7P2|_+%NIQ)9m2?RKHIfK<
z2=IpFdEMQutha1$P77YbQUtRqOM-K6
zg8Am_&o-Vuj#ho-c)w7NOmbWThphUL#m3_5Wu+Z&+)1_~UQ=Hx7|MMa!vM*JlA*)s
zP+s)f8jd?A{XVolK=%S3Ug79mUK))v1mkf19xD|~45^B;Xl_cFR7aHZvL~r$41&qz
zlA(#@SX&Zvjs~27g`pK47oDM%Jey23CE*e}(Yl{Ql_%PsQ{tx*czGr8LR^h61QRcB
zA3k5sC+)mR@ekWNJVlKE{Mo$=;&$l$P%phLI?y5_fNM%~i_1c}Jl#y}EnYOM`@w`Do_vG+#r*~}FM4w`nLHCxc4nvQJ@U68c!XnM*uY_PpMVj>o9bV4%DeO7{{W8z}ry1rzPXw!+pq&i62A>
z8A&gKdc8gYkOdb>(DV|rG7DAY!)?pf3(%ae=2Fx-Ta}-WVfnvrqT)lJfa`J(tl
z5k
zH-Z-j0Q5{O8el}~_Vn~zAYz;$2MVrZ;p(P>0fa@oTvw76o^MMMAwUwcl!BPBYJibw
zsIFyT6zFNu0kgK_C<2e>6R$+gtI9iiya#cwUUrN|X_WQ`9};8)=Pp`5q?_l*dQp1Q
z0ju3}lmuqWEXIhR*R%XE0r_bkG*YY^ouDnFNOg&JW8;pkGj3Mq6@@Pr
zp)}>8jfHBGX&9*>72_Pde#+2J3!G&dre#7Q&hdsQ3QcC6?$!2mvobrEhl(7kTgNeB
z*H4D!Qr6-m&9Gow&9w7n#*eQ!pPpG=TDg+TPfI8Ry`U(Vre3R6=gm1OyFW3;D0Sz{%{OnIbKSIM
z>lPLaY{B866qX!I7v!wNDVo{gJGNL+Qz`MR82Yb>4`m6fLpFul4m|L*T)
zZ{3g-j%#z=f$QGia{l%Ia>sP_Y-#PFwx5#B>5@~-gQDJS)~nS@TBv{dC@sqxEjanZ
zOoC1vZDv;Oh?=%-@FHr}aorJ4q{}GnL70%RK4ln&B&8(6WHe|Rp*+yx#T1Qo%K=f_
zcFN^BG>lahNQmR^KB}KN%SJR2W`X#kkwzT3uE^s<83I8S1uefMgDQ_Y43)F6e&?8S
z$`N=>8fF?RV!OBoz8*(qSN$idGgY8_gIyJ^_Wk+IuS*iO^esdZ#~ljSk_7IDYQrHHKu566s;d
zOM;hfPaTE&GcOx$4z=QWhmfD=$V|6S40xD56!=Ug
zP}6xCl#?V|@BWSHjm@hxBYSanViPBc1*ZCp%&*6RTJ(a27m%exNa(q@0t_S#@kL`cF&f{h>($sW7(aKxkJMz~3i4ksQy
zTqYNeLr0N{V|%2>Ei({rU`B6kr|FkT0_fIBr?!`=d8fRdO5jui$032!iQ+hYIm1+S
z1KLGsxeIIOFFf7YoL{_9Dlg;q^0~b1dGSVkyy;q7U
zDs3nsJyU(CBgtByvlQ8Uw2l=8tN~DWfdR$_k%U^8-k>Rh(jJ74EKbNC{KHS4T)8;s
zIH`IIB7_74*Ab!Iw*`?GvX%qQzT0e@2UT-%F8iHtfBWbE@Jq-L#fcV$FcKy~nAOU9
zld9qQe7;mHEo3se#l?lW`E!}2Z0@G8@xa-*V^=mm=`EV~U4+9HxVT9xnRGhOiF{Lc_YT}vgKO6|Exl@)9V`!Uj+PQz8vGfF
z_$C4#jXJ)5A0A_t+NOJLRdh;
zU?ZKrU}tl=I=l@9!4n@+Bsx!q>_~Bfu%Slo5s>io`++teN_gMv4*Jfw&=;9nA1hF~
zeCfiaZ)LJmvvaer-ORqmbo!_z$8jBw&(8?odiVO>&zxpuJtefK3T7b(6}{1FL8pI^
zl@Gpth}9+d*by_?VjCZ%kT3&14Xzy*i*BZpl3lkYaP9StZhJ^N-LCT+iR((!bohG0
z0stGQr2PRNt*(JA3#8V!=&O`W7QUe{EZJoXEcS+b{c;Izxad;>A`V$FX%KnBz!i-v
zQI-YUv9XvT*YHga7H>FsvVyffW)(>k6xqf1Fj$QE@D9GTVXH?zqr{2ND8+(g2xF{z
z2rSpDwC5O-=oSlThL8Zze`c+UfP0Gs^+r$nGIpzD|NyraC!3+_k$2t20KSb^2
zkn($RLgYh55~%f7dMLWjs89m?18W}CF3|7-5W;u>3(k{N6qHFiADK?r3S#xh)RI`7
z02X6rf^x@(>N9{zJY;1wZ4Y&V0v<^eAeoO5k}=s61t@qwkfEml`@P)@3Kv}MkXgk*GmGS0kw~V
zd|WsKScrg!sP(}_LWn>k(FDW