What you’ll learn
By the end of this guide, you’ll understand:
  • How to handle wallet transactions effectively in Mini Apps, including leveraging enhanced Base Account capabilities when available.

Default Wallets in Mini Apps

Mini Apps launched within the Base App are automatically connected to the user’s Base Account, eliminating wallet connection flows and enabling instant onchain interactions. This zero-friction approach means users can immediately swap, send, and transact without any wallet setup, maintaining a familiar experience with their existing Base Account and assets.

For Mini App Development

1

Detect Base Account Capabilities

Base Accounts offer enhanced features that traditional wallets don’t support.
  • Use wallet_getCapabilities to check for atomicBatch, paymasterService, and auxiliaryFunds
  • Adapt your UI to show streamlined workflows for Base Account users
  • Provide fallback experiences for traditional wallets
Test with both Base Accounts and traditional wallets to ensure your capability detection works correctly.
Learn More: Base Account Capabilities Overview
2

Implement Sponsored Gas Transactions

Enable sponsored gas transactions where your Mini App pays gas fees for users.
  • Check for paymasterService capability before offering gas-free transactions
  • Use the capabilities parameter in writeContracts to enable sponsored gas
  • Handle cases where paymaster service is unavailable
Verify your Mini App works with Base Accounts that have zero ETH balance.
Learn More: Paymaster Service
3

Optimize Transaction Patterns

Base Accounts can batch multiple operations into single transactions.
  • Use atomicBatch capability to group related transactions
  • Implement wallet_sendCalls for complex workflows
  • Show one confirmation instead of multiple prompts
Consider transaction batching for multi-step operations like approve + transfer + mint.
Learn More: Batch Transactions Guide

Base Account Benefits for Mini Apps

FeatureWhat It DoesMini App Benefit
Atomic BatchCombines multiple transactions into oneMulti-step workflows require only one user confirmation
Paymaster ServiceApp pays gas fees, not userUsers can transact without owning ETH
Passkey AuthenticationUses device biometrics instead of private keysFaster, more secure user authentication

Implementation Examples

Capability Detection

function useBaseAccountCapabilities(address) {
  const [capabilities, setCapabilities] = useState({});
  
  useEffect(() => {
    async function detect() {
      const caps = await publicClient.request({
        method: 'wallet_getCapabilities',
        params: [address]
      });
      
      setCapabilities({
        atomicBatch: caps['0x2105']?.atomicBatch?.supported,
        paymasterService: caps['0x2105']?.paymasterService?.supported,
        auxiliaryFunds: caps['0x2105']?.auxiliaryFunds?.supported
      });
    }
    
    if (address) detect();
  }, [address]);
  
  return capabilities;
}
import { useCapabilities, useWriteContracts } from 'wagmi/experimental'

function SponsoredTransactionButton() {
  const account = useAccount()
  const { writeContracts } = useWriteContracts()
  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 {
        paymasterService: {
          url: `https://api.developer.coinbase.com/rpc/v1/base/v7HqDLjJY4e28qgIDAAN4JNYXnz88mJZ`,
        },
      }
    }
    return {}
  }, [availableCapabilities, account.chainId])

  const handleSponsoredMint = () => {
    writeContracts({
      contracts: [{
        address: '0x...',
        abi: contractAbi,
        functionName: 'mint',
        args: [account.address],
      }],
      capabilities,
    })
  }

  return <button onClick={handleSponsoredMint}>Mint NFT (Gas Free)</button>
}

Capability-Based UI

function MiniAppWorkflow() {
  const { address } = useAccount();
  const { atomicBatch } = useBaseAccountCapabilities(address);
  
  if (atomicBatch) {
    // Base Account: One-click workflow
    return <OneClickPurchaseFlow />;
  } else {
    // Traditional wallet: Multi-step workflow  
    return <MultiStepPurchaseFlow />;
  }
}

Additional Resources

For detailed implementation of Base Account features: