<!--
Sitemap:
- [Tempo Accounts SDK - Getting Started](/docs/): Set up the Tempo Accounts SDK to create, manage, and interact with accounts on Tempo.
- [Deploying to Production](/docs/production): Things to consider before deploying your application with the Tempo Accounts SDK to production.
- [FAQ](/docs/faq): Frequently asked questions about the Tempo Accounts SDK.
- [Connect Accounts](/docs/guides/connect-accounts): Connect a Tempo account in your application.
- [Authentication](/docs/guides/authentication): Authenticate connected accounts against your own server with a signed SIWE challenge.
- [Identity](/docs/guides/identity): Request and verify identity claims about a connected account, starting with a verified email.
- [Transfers](/docs/guides/transfers): Send stablecoin transfers from a connected Tempo account, initiated either by the user or by your server.
- [Spend Permissions](/docs/guides/spend-permissions): Authorize spend limits, call scopes, and expiries so repeat transfers can be signed without a confirmation prompt.
- [React Native](/docs/guides/react-native): Set up Tempo Accounts in a React Native app.
- [Subscriptions](/docs/guides/subscriptions): Charge recurring payments from a connected Tempo account.
- [Fee Sponsorship](/docs/guides/fee-sponsorship): Sponsor transaction fees from a server-controlled policy.
- [Deposits](/docs/guides/deposits): Open the Tempo deposit flow from a connected account and let the user choose deposit details.
- [Swaps](/docs/guides/swaps): Open the Tempo swap flow from a connected account with optional pre-filled intent fields.
- [Theming](/docs/guides/theming): Match embedded account surfaces to your product.
- [CLI](/docs/guides/cli): Authorize and use Tempo accounts from command-line tools.
- [Adapters](/docs/adapters/): Choose the signing adapter for your Tempo Accounts SDK integration.
- [Tempo Wallet Adapter](/docs/adapters/tempo-wallet): Use Tempo Wallet as the hosted universal wallet adapter.
- [WebAuthn Adapter](/docs/adapters/webauthn): Use domain-bound passkeys as the account signing adapter.
- [Turnkey Adapter](/docs/adapters/turnkey): Use Turnkey-managed wallet accounts as the account signing adapter.
- [Privy Adapter](/docs/adapters/privy): Use Privy embedded wallets as the account signing adapter.
- [Private Key Adapter](/docs/adapters/private-key): Sign in-process with a `secp256k1` private key.
- [Custom Adapter](/docs/adapters/custom): Author your own adapter with the `Adapter.define` API.
- [Adapters](/docs/api/adapters): Pluggable adapters for the Tempo Accounts SDK Provider.
- [dialog](/docs/api/dialog): Adapter for the Tempo Wallet dialog, an embedded iframe or popup for account management.
- [local](/docs/api/local): Key-agnostic adapter for defining arbitrary account types and signing mechanisms.
- [mobileWebAuth](/docs/api/mobileWebAuth): Mobile web auth adapter for browser-session wallet requests.
- [postMessage](/docs/api/postMessage): Connect to wallet from anywhere on the web
- [privy](/docs/api/privy): React adapter backed by Privy sessions and embedded Ethereum wallets.
- [secp256k1](/docs/api/secp256k1): Adapter that signs in-process with a `secp256k1` private key.
- [turnkey](/docs/api/turnkey): Adapter backed by Turnkey client sessions.
- [webAuthn](/docs/api/webAuthn): Adapter for passkey-based accounts using WebAuthn registration and authentication.
- [Dialog](/docs/api/dialogs): Dialog modes for embedding the Tempo Wallet.
- [Dialog.iframe](/docs/api/dialog.iframe): Embed the Tempo Wallet auth UI in an iframe dialog element.
- [Dialog.popup](/docs/api/dialog.popup): Open the Tempo Wallet auth UI in a popup window.
- [Expiry](/docs/api/expiry): Utility functions for computing access key expiry timestamps.
- [Provider](/docs/api/provider): Create an EIP-1193 provider for managing accounts on Tempo.
- [Rpc](/docs/api/rpc): Per-method Zod schemas and shared building blocks for the Accounts JSON-RPC surface.
- [Schema](/docs/api/schema): Zod-based JSON-RPC schema definitions for the Accounts provider.
- [TrustedHosts](/docs/api/trustedHosts): Trusted host mappings and matching helpers for dialog adapters.
- [WebAuthnCeremony](/docs/api/webauthnceremony): Pluggable strategy for WebAuthn registration and authentication ceremonies.
- [WebAuthnCeremony.from](/docs/api/webauthnceremony.from): Create a WebAuthnCeremony from a custom implementation.
- [WebAuthnCeremony.server](/docs/api/webauthnceremony.server): Server-backed WebAuthn ceremony that delegates to a remote handler.
- [CLI](/docs/cli/provider): Create a Provider for CLI environments.
- [eth_accounts](/docs/rpc/eth_accounts): Get the addresses of the currently connected accounts.
- [eth_chainId](/docs/rpc/eth_chainId): Get the chain ID of the currently active chain.
- [eth_fillTransaction](/docs/rpc/eth_fillTransaction): Fills missing transaction fields and returns wallet-aware metadata.
- [eth_requestAccounts](/docs/rpc/eth_requestAccounts): Request access to user accounts, prompting the user to connect if needed.
- [eth_sendTransaction](/docs/rpc/eth_sendTransaction): Send a transaction from the connected account.
- [eth_sendTransactionSync](/docs/rpc/eth_sendTransactionSync): Send a transaction and wait for the receipt.
- [eth_signTransaction](/docs/rpc/eth_signTransaction): Sign a transaction without broadcasting it.
- [eth_signTypedData_v4](/docs/rpc/eth_signTypedData_v4): Sign EIP-712 typed structured data with the connected account.
- [personal_sign](/docs/rpc/personal_sign): Sign a message with the connected account.
- [wallet_authorizeAccessKey](/docs/rpc/wallet_authorizeAccessKey): Authorize an access key for delegated transaction signing.
- [wallet_connect](/docs/rpc/wallet_connect): Connect account(s) with optional capabilities like access key authorization.
- [wallet_deposit](/docs/rpc/wallet_deposit): Open the wallet deposit flow with optional pre-filled fields.
- [wallet_depositZone](/docs/rpc/wallet_depositZone): Open the wallet zone-deposit flow with optional pre-filled fields.
- [wallet_disconnect](/docs/rpc/wallet_disconnect): Disconnect the connected account(s).
- [wallet_getBalances](/docs/rpc/wallet_getBalances): Get token balances for an account.
- [wallet_getCallsStatus](/docs/rpc/wallet_getCallsStatus): Get the status of a batch of calls sent via wallet_sendCalls.
- [wallet_getCapabilities](/docs/rpc/wallet_getCapabilities): Get account capabilities for specified chains.
- [wallet_revokeAccessKey](/docs/rpc/wallet_revokeAccessKey): Revoke a previously authorized access key.
- [wallet_send](/docs/rpc/wallet_send): Open the wallet send-token flow with optional pre-filled fields.
- [wallet_sendCalls](/docs/rpc/wallet_sendCalls): Send a batch of calls from the connected account.
- [wallet_swap](/docs/rpc/wallet_swap): Open the wallet swap flow with optional pre-filled swap intent fields.
- [wallet_switchEthereumChain](/docs/rpc/wallet_switchEthereumChain): Switch the provider's active chain.
- [wallet_withdrawZone](/docs/rpc/wallet_withdrawZone): Open the wallet zone-withdraw flow with optional pre-filled fields.
- [Remote](/docs/api/remote): Bridge that runs inside the wallet's iframe/popup and serves RPC requests from the host SDK.
- [Remote.create](/docs/api/remote.create): Create a remote context bound to a Messenger and Provider.
- [Remote.useEnsureVisibility](/docs/api/remote.useEnsureVisibility): React hook that monitors iframe visibility and falls back to a popup when occluded.
- [Remote.useState](/docs/api/remote.useState): React hook to subscribe to a remote context's state store.
- [Remote.useTheme](/docs/api/remote.useTheme): React hook that applies theme overrides from URL search params and live messenger updates.
- [Remote.validateSearch](/docs/api/remote.validateSearch): Validate an RPC request payload from URL search params.
- [Tempo Accounts Server Handlers](/docs/server/): Configure server-side Tempo Accounts SDK handlers for relaying wallet RPC requests, composing backends, and managing WebAuthn ceremonies.
- [Handler.auth](/docs/server/handler.auth): Server handler that issues SIWE-based authentication challenges and sessions.
- [Handler.compose](/docs/server/handler.compose): Compose multiple server handlers into a single handler.
- [Handler.deviceCode](/docs/server/handler.deviceCode): Host Wata device-code authorization for wallet RPC requests.
- [Handler.exchange](/docs/server/handler.exchange): Server handler that returns Stablecoin DEX quotes and ready-to-submit calls.
- [Handler.relay](/docs/server/handler.relay): Server handler that proxies certain RPC requests with wallet-aware enrichment.
- [Handler.webAuthn](/docs/server/handler.webAuthn): Server-side WebAuthn ceremony handler for registration and authentication.
- [hc](/docs/server/hc): Typed RPC client for handlers built with the Tempo Accounts SDK.
- [Identity.verify](/docs/server/identity.verify): Verify a wallet-issued identity token (verified email) against an issuer's JWKS.
- [Kv](/docs/server/kv): Key-value store adapters for server-side persistence.
- [Kv.cloudflare](/docs/server/kv.cloudflare): Kv adapter backed by a Cloudflare Workers KV namespace.
- [Kv.durableObject](/docs/server/kv.durableObject): Kv adapter backed by a Cloudflare Durable Object with atomic take and create.
- [Kv.from](/docs/server/kv.from): Wrap a custom Kv-shaped object so the SDK accepts it as a Kv.
- [Kv.memory](/docs/server/kv.memory): In-memory Kv adapter for tests and single-process deployments.
- [Keystore](/docs/api/keystore): Pluggable backends for key material.
- [Keystore.p256](/docs/api/keystore.p256): Pure-JS P-256 keystore.
- [Keystore.secp256k1](/docs/api/keystore.secp256k1): Pure-JS secp256k1 keystore.
- [Keystore.webCryptoP256](/docs/api/keystore.webCryptoP256): WebCrypto P-256 keystore.
- [Storage](/docs/api/storage): Pluggable storage adapters for persisting provider state.
- [Storage.combine](/docs/api/storage.combine): Combine multiple Storage adapters into one.
- [Storage.cookie](/docs/api/storage.cookie): Cookie-backed Storage adapter.
- [Storage.from](/docs/api/storage.from): Create a Storage adapter from a custom implementation.
- [Storage.idb](/docs/api/storage.idb): IndexedDB-backed Storage adapter.
- [Storage.localStorage](/docs/api/storage.localStorage): localStorage-backed Storage adapter.
- [Storage.memory](/docs/api/storage.memory): In-memory Storage adapter.
- [asyncStorage](/docs/api/storage.asyncStorage): React Native Storage adapter backed by AsyncStorage.
- [secureMmkv](/docs/api/storage.secureMmkv): Encrypted React Native Storage adapter backed by MMKV.
- [Tempo Accounts SDK](/index): The fastest way to add stablecoins to your application.
- [Secp256k1 Adapter](/docs/adapters/secp256k1): Sign in-process with a `secp256k1` private key.
- [Bring Your Auth](/docs/enterprise/bring-your-auth/): Connect enterprise auth and signing systems to Tempo accounts.
- [Hosted Universal Wallets](/docs/enterprise/hosted-universal-wallets): Stub for hosting a universal wallet on your own domain.
- [Handler.codeAuth (Deprecated)](/docs/server/handler.codeAuth): Deprecated compatibility handler for the legacy device-code access-key bootstrap flow.
- [Handler.feePayer (Deprecated)](/docs/server/handler.feePayer): Deprecated — use Handler.relay with feePayer option instead.
- [tempoWallet](/docs/wagmi/tempoWallet): Wagmi connector for the Tempo Wallet dialog.
- [webAuthn](/docs/wagmi/webAuthn): Wagmi connector for passkey-based WebAuthn accounts.
- [AWS KMS](/docs/enterprise/bring-your-auth/aws-kms): Stub for integrating AWS KMS-backed signing with the Tempo Accounts SDK.
- [Custom Auth](/docs/enterprise/bring-your-auth/custom): Stub for first-party enterprise auth and signing integrations.
- [Privy](/docs/enterprise/bring-your-auth/privy): Enterprise notes for integrating Privy-backed auth with the Tempo Accounts SDK.
- [Turnkey](/docs/enterprise/bring-your-auth/turnkey): Stub for integrating Turnkey-backed signing with the Tempo Accounts SDK.
-->

# `Provider`

Creates a Provider that bootstraps account access from the terminal via the Wata device-code flow (OAuth 2.0 Device Authorization Grant, RFC 8628 with PKCE).

When `wallet_connect` or `wallet_authorizeAccessKey` runs, the provider:

* registers a device code at the configured `host` and opens the verification page in the user's default browser
* prompts them to approve the access key
* persists the resulting key in provider storage for re-use across CLI invocations

Subsequent transaction signing happens locally with the managed key — no further browser round-trip is required until the key expires.

## Usage

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create()
```

### Authorizing an Access Key

The CLI adapter requires `capabilities.authorizeAccessKey` on `wallet_connect` — the user must explicitly grant a scoped access key during the device-code ceremony.

```ts twoslash [cli.ts]
// @noErrors
import { Expiry } from 'accounts'
import { Provider } from 'accounts/cli'
import { parseUnits } from 'viem'
import { connect } from 'viem/experimental/erc7846'

const provider = Provider.create()
const client = provider.getClient()

await connect(client, { // [!code focus]
  capabilities: { // [!code focus]
    authorizeAccessKey: { // [!code focus]
      expiry: Expiry.days(7), // [!code focus]
      limits: [{ // [!code focus]
        token: '0x20c0000000000000000000000000000000000001', // [!code focus]
        limit: parseUnits('100', 6), // [!code focus]
      }], // [!code focus]
      scopes: [{ // [!code focus]
        address: '0x20c0000000000000000000000000000000000001', // [!code focus]
        selector: 'transfer(address,uint256)', // [!code focus]
      }], // [!code focus]
    }, // [!code focus]
  }, // [!code focus]
}) // [!code focus]
```

## Parameters

### auth

* **Type:** `string | { url?: string; challenge?: string; verify?: string; logout?: string; returnToken?: boolean }`
* **Optional**

Default Server Authentication configuration for `wallet_connect`. See [`Provider.auth`](/docs/api/provider#auth) for full semantics.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  auth: '/auth', // [!code focus]
})
```

### chains

* **Type:** `readonly [Chain, ...Chain[]]`
* **Default:** `[tempo, tempoModerato, tempoDevnet]`

Supported chains. The first chain is the default.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'
import { tempo } from 'viem/tempo/chains'

const provider = Provider.create({
  chains: [tempo], // [!code focus]
})
```

### feePayer

* **Type:** `string | false | { url: string; precedence?: 'fee-payer-first' | 'user-first' }`
* **Optional**

Fee payer configuration. See [`Provider.feePayer`](/docs/api/provider#feepayer) for full semantics.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  feePayer: 'https://myapp.com/fee-payer', // [!code focus]
})
```

### host

* **Type:** `string`
* **Default:** `'https://wallet.tempo.xyz/api/auth/device'`

Base URL of the host's device-code endpoints. The CLI registers at `${host}/register`, opens the browser at `${host}/verify?user_code=<code>`, and polls `${host}/token` for completion.

Designed to point at a host mounting the [`wata`](https://github.com/wevm/wata) device-code transport.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  host: 'https://myapp.com/auth/device', // [!code focus]
})
```

### maxAccounts

* **Type:** `number`
* **Optional**

Maximum number of accounts to persist. Oldest accounts are evicted when exceeded (LRU).

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  maxAccounts: 5, // [!code focus]
})
```

### mpp

* **Type:** `boolean | Provider.mpp.Options`
* **Default:** `true`

Enable [Machine Payment Protocol](https://mpp.dev) (mppx) support. Enabled by default — pass `false` to disable, or an options object to configure.

:::info
For CLI tools that need to control the payment mode, use `mpp: { mode: 'pull' }` so the CLI signs transactions locally and forwards the serialized payload to the server.
:::

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  mpp: false, // [!code focus]
})
```

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  mpp: { // [!code focus]
    mode: 'pull', // [!code focus]
  }, // [!code focus]
})
```

### name

* **Type:** `string`
* **Default:** `'Tempo CLI'`

Display name of the provider.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  name: 'My CLI', // [!code focus]
})
```

### open

* **Type:** `(url: string, prompt: DeviceCode.Prompt) => Promise<void> | void`
* **Default:** `open`/`xdg-open`/`start` depending on platform

Browser opener override. Useful for headless environments, CI, or to intercept the URL before opening (e.g. to print it to the terminal). The second argument carries the full pairing prompt (`userCode`, `verificationUri`, expiry, poll interval).

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  open: (url, prompt) => { // [!code focus]
    console.log(`Open ${url} and confirm code ${prompt.userCode}.`) // [!code focus]
  }, // [!code focus]
})
```

### persistCredentials

* **Type:** `boolean`
* **Default:** `true`

Whether to persist credentials and access keys to storage. When `false`, only account addresses are persisted.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  persistCredentials: false, // [!code focus]
})
```

### pollingInterval

* **Type:** `number`
* **Default:** the host-advertised `interval` (5000 when the host omits one)

How often (in milliseconds) the CLI polls the device-code token endpoint while waiting for the user to approve the request in the browser.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  pollingInterval: 1000, // [!code focus]
})
```

### rdns

* **Type:** `string`
* **Default:** `'xyz.tempo.cli'`

Reverse DNS identifier.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  rdns: 'com.example.cli', // [!code focus]
})
```

### relay

* **Type:** `string`
* **Optional**

Base URL for a wallet relay endpoint. See [`Provider.relay`](/docs/api/provider#relay) for full semantics.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  relay: 'https://myapp.com/relay', // [!code focus]
})
```

### storage

* **Type:** `Storage`
* **Default:** `Storage.filesystem({ path: '~/.tempo/wallet/store.json' })`

Storage adapter for provider persistence. The CLI default stores connected accounts, active chain state, and managed access keys in one filesystem-backed provider store.

```ts twoslash [cli.ts]
import { Provider, Storage } from 'accounts/cli'

const provider = Provider.create({
  storage: Storage.filesystem({ // [!code focus]
    path: '~/.config/myapp/tempo-store.json', // [!code focus]
  }), // [!code focus]
})
```

### testnet

* **Type:** `boolean`
* **Default:** `false`

Use testnet. When `true`, the default chain will be the first testnet chain in `chains`.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  testnet: true, // [!code focus]
})
```

### timeout

* **Type:** `number`
* **Default:** `300000` (5 minutes)

How long (in milliseconds) the CLI waits for the user to complete the device-code ceremony before throwing a timeout error.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'

const provider = Provider.create({
  timeout: 60_000, // [!code focus]
})
```

### transports

* **Type:** `Record<number, Transport>`
* **Optional**

Per-chain transports keyed by chain ID. Layered on top of `relay`. See [`Provider.transports`](/docs/api/provider#transports) for full semantics.

```ts twoslash [cli.ts]
import { Provider } from 'accounts/cli'
import { http } from 'viem'
import { tempo } from 'viem/tempo/chains'

const provider = Provider.create({
  transports: { // [!code focus]
    [tempo.id]: http('https://myapp.com/relay/' + tempo.id), // [!code focus]
  }, // [!code focus]
})
```
