<!-- tempo-docs-context -->
> Source: [/docs/accounts/wallets](https://tempo.xyz/developers/docs/accounts/wallets.md)
> Section: [Accounts](https://tempo.xyz/developers/docs/accounts.md). Create accounts, set up signing methods, policies, access keys, key rotation, and fees, and follow guides for users, automations, agents, and teams.
> [Documentation index](https://tempo.xyz/developers/llms.txt) · [Docs skill](https://tempo.xyz/developers/SKILL.md)

> Tempo MCP: Use `search`, `find_pages`, `read_page`, and `code` at `https://mcp.tempo.xyz` for Tempo and related documentation.
> If an indexed page is missing or reflects an older site, read this site’s [documentation index](https://tempo.xyz/developers/llms.txt) and Markdown pages directly.

# Wallets

Add Tempo to a wallet, or let your users pay with the wallet they already have.

<span id="recommended-wallet-setup" />

## Overview

A wallet, such as MetaMask, Rabby, or Ledger, holds the private key of a [single-key account](https://tempo.xyz/developers/docs/accounts/how-it-works#address). That key approves every transaction. Single-key accounts work on mainnet and testnet.

Wallet teams [add Tempo to their wallet](https://tempo.xyz/developers/docs/accounts/wallets/add-tempo-to-your-wallet), so users hold and send stablecoins on Tempo from it. App teams [connect a wallet to their app](https://tempo.xyz/developers/docs/accounts/wallets#connect-a-wallet-to-your-app), so users pay with the wallet they already have.

<span id="legacy-accounts" />

## Connect a Browser Wallet

Connect your wallet to add Tempo mainnet to it.

Connect a wallet in the interactive web page.

In your app, wagmi's `injected` connector connects the browser's wallet. wagmi also finds every other installed wallet that announces itself ([EIP-6963](https://eips.ethereum.org/EIPS/eip-6963)) and lists it in `useConnectors()`. Keep it for users who already have a browser wallet.

```ts [wagmi.config.ts]
import { tempo } from 'viem/chains'
import { createConfig, http } from 'wagmi'
import { injected } from 'wagmi/connectors'

export const config = createConfig({
  chains: [tempo],
  connectors: [injected()], // [!code hl]
  transports: { [tempo.id]: http() },
})
```

From there, `useConnect` and wagmi's transaction hooks work as on any EVM chain. Tempo has no native gas token. The wallet pays each fee in a stablecoin. [By default](https://tempo.xyz/developers/docs/accounts/fees#fee-token-precedence), that's the stablecoin a payment sends, and pathUSD for most other calls. Some wallets also show a placeholder native balance. [Show stablecoin balances](https://tempo.xyz/developers/docs/quickstart/evm-compatibility#handling-eth-native-token-balance-checks) in your app instead.

<span id="legacy-accounts-compared-with-tempo-accounts" />

<span id="what-a-browser-wallets-account-cant-do" />

## Browser Wallet Limits

A browser wallet signs standard Ethereum transactions. They differ from [Tempo Transactions](https://tempo.xyz/developers/docs/guide/tempo-transaction), Tempo's own transaction type, in these ways.

| | Standard Ethereum transactions (browser wallet) | Tempo Transactions |
| --- | --- | --- |
| Signers | One private key, in the wallet | [Passkeys, device keys, or private keys](https://tempo.xyz/developers/docs/accounts/authentication); several per configurable account |
| Lost key | Loses the account and its funds | On a configurable account, [another signer replaces it](https://tempo.xyz/developers/docs/accounts/account-configuration#plan-for-recovery). On a single-key account, losing the key loses the account. |
| Network fees | Paid by the user | [Sponsored by your app](https://tempo.xyz/developers/docs/accounts/fees/fee-sponsorship), if you choose |
| Several calls | One call per transaction | Several calls that succeed or fail together |
| [Access keys](https://tempo.xyz/developers/docs/accounts/access-keys) | The wallet authorizes one with an `authorizeKey` call to the [Account Keychain](https://tempo.xyz/developers/docs/development/account-keychain#authorize-an-access-key). The access key then signs its own Tempo Transactions in your app. | Authorized in the transaction that first uses the key |

A hardware wallet also holds one private key, so its account is a single-key account (EOA) with the same limits. Several signers per account and lost-key replacement need a configurable account.

:::warning
**Multiple signers arrive with the [T14 network upgrade](https://tempo.xyz/developers/docs/protocol/upgrades/t14).** Until T14 activates, an account with several signers and a threshold runs only on the [Tempo Accounts devnet](https://tempo.xyz/developers/docs/accounts/create#connect-to-the-devnet), not on mainnet or testnet, and may still change.
:::

<span id="what-we-recommend" />

<span id="support-browser-wallets-for-users-who-have-one" />

<span id="move-wallet-users-to-a-passkey-or-more-signers" />

<span id="passkeys-and-signers-for-wallet-users" />

## Passkeys for Wallet Users

<span id="move-a-legacy-account-to-modern-signers" />

<span id="move-to-a-passkey-or-device-key" />

<span id="create-new-accounts-with-a-passkey-or-device-key" />

### Move to a New Account

For accounts you create for your users, prefer a [passkey or device key](https://tempo.xyz/developers/docs/accounts/authentication). To move off a browser wallet, a user sends the funds to a new account. Its key is a passkey or device key. On mainnet or testnet, that's a [single-key account](https://tempo.xyz/developers/docs/development/single-key-accounts). On the devnet, it's a [configurable account](https://tempo.xyz/developers/docs/accounts/create) with that key as its first signer.

<span id="upgrade-an-existing-address-in-place" />

### Upgrade in Place

To keep the address instead, [upgrade the account in place](https://tempo.xyz/developers/docs/accounts/account-configuration/account-upgrade). The upgrade adds signers, such as backup signers, at the same address. Until T14, upgrades run only on the devnet. The original key signs it as a Tempo Transaction, so the wallet holding that key must support Tempo Transactions.

<span id="let-the-provider-run-login-services" />

<span id="integrate-accounts" />

<span id="connect-tempo-wallet" />

<span id="use-tempo-wallet-sign-in" />

<span id="use-tempos-hosted-sign-in" />

<span id="sign-users-in-with-tempo-wallet" />

<span id="connect-a-self-custodial-wallet-instead" />

<span id="connect-an-existing-self-custodial-wallet" />

<span id="connect-a-wallet-to-your-app" />

## Connect a User's Wallet

If a user already has a self-custodial wallet, such as Tempo Wallet, connect it with the [Accounts SDK](https://accounts.tempo.xyz/docs). The wallet holds the keys and signs. Your app uses the address the user selects. Tempo Wallet sends transactions through its own RPC endpoint, not your devnet client. The demo and code run on Moderato testnet, whose stablecoins have no value.

**Interactive demo: Connect Tempo Wallet**

1. Connect Tempo Wallet

```bash [Terminal]
pnpm add --save-exact accounts@0.18.4 viem
```

<span id="connect-tempo-wallet-from-your-application" />

```ts [connect.ts]
import { Provider } from 'accounts'
import { tempoModerato } from 'viem/chains'

const provider = Provider.create({ chains: [tempoModerato], testnet: true }) // [!code hl]
const [address] = await provider.request({ method: 'eth_requestAccounts' }) // [!code hl]
if (!address) throw new Error('No account was selected')
```

Track the wallet connection separately from your app's signed-in session. On `accountsChanged`, update the selected address, or clear it when the wallet disconnects. On `chainChanged`, refresh network-dependent state before you enable transactions. To send payments, create wallet and public clients from this provider as in the [browser wallet setup](https://tempo.xyz/developers/docs/guide/payments/send-a-payment/examples#browser-wallet-setup). You can also connect other [wallet partners](https://tempo.xyz/developers/docs/partners/wallets).

<span id="wallet-guides" />

## Related

[Add Tempo to Your Wallet](https://tempo.xyz/developers/docs/accounts/wallets/add-tempo-to-your-wallet): Use for adding the networks, stablecoin balances, fee tokens, and Tempo Transactions to a wallet.

[Signing Methods](https://tempo.xyz/developers/docs/accounts/authentication): Covers passkeys, device keys, and private keys.

[Account Upgrade](https://tempo.xyz/developers/docs/accounts/account-configuration/account-upgrade): Use for adding signers to an existing address. Devnet until T14.

[Wallet Partners](https://tempo.xyz/developers/docs/partners/wallets): Covers wallets that support Tempo.
