> **Can't find what you're looking for?** Use `search_docs` on the docs MCP server at `https://viem-5hgfj8scv-wevm.vercel.app/api/mcp` to find what you need.

# Multisig

## Overview

:::warning
**Experimental.** Native multisig support is experimental and may change in a future release.
It is not yet available on Tempo mainnet or testnet.
:::

Tempo native multisig accounts have owners, weighted approval thresholds, and an optional salt.
The initial configuration derives the account address. Owners and thresholds can change later
without changing that address.

### Local Quorum

When one process holds enough owner accounts to reach the threshold, pass those accounts to
[`Account.fromMultisig`](/tempo/accounts/account.fromMultisig) and use normal
[`sendTransaction`](/docs/actions/wallet/sendTransaction). The account creates the complete
multisig signature locally.

```ts twoslash
import { Account, createClient } from 'viem/tempo'

// 1. Create a client.
const client = createClient()

// 2. Create a 1-of-1 multisig with the local owner.
const owner = Account.fromSecp256k1(
  '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
)
const account = Account.fromMultisig({
  owners: [owner],
})

// 3. Send with the complete local quorum.
const hash = await client.sendTransaction({
  account,
  to: '0xcafebabecafebabecafebabecafebabecafebabe',
  value: 1n,
})
```

### Coordinated Approvals

When owners sign independently, enable `experimental_multisig` on the client and use
[`multisig.approveTransaction`](/tempo/actions/multisig.approveTransaction). The first owner passes
the transaction fields and multisig identity. Every later owner reuses the returned `request`.

The shared store retains valid approvals, reports pending quorum state, and broadcasts a canonical
transaction after the approval weight reaches the threshold.

:::code-group
```ts twoslash [example.ts]
import { Account } from 'viem/tempo'
import { client } from './multisig.config'

// 1. Create the independent owners.
const owner_1 = Account.fromSecp256k1(
  '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
)
const owner_2 = Account.fromSecp256k1(
  '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d'
)

// 2. Create a 2-of-2 multisig from their addresses.
const multisig = Account.fromMultisig({
  owners: [owner_1.address, owner_2.address],
  threshold: 2,
})

// 3. Store the first owner's approval.
const pending = await client.multisig.approveTransaction({
  account: owner_1,
  multisig,
  to: '0xcafebabecafebabecafebabecafebabecafebabe',
  value: 1n,
})

// 4. Reuse the request for the second owner's approval.
const success = await client.multisig.approveTransaction({
  ...pending.request,
  account: owner_2,
})
```

```ts twoslash [multisig.config.ts] filename="multisig.config.ts"
// [!include ~/snippets/tempo/multisig.config.ts:setup]
```
:::

## Recipes

<Cards>
  <Card icon="lucide:send" title="Send Transactions" description="Choose local quorum or coordinate independent owner approvals." to="/tempo/guides/multisig/send" />

  <Card icon="lucide:scale" title="Weighted Owners" description="Configure an M-of-N quorum or assign different approval weights to owners." to="/tempo/guides/multisig/weighted-owners" />

  <Card icon="lucide:fingerprint" title="Passkeys & Other Keys" description="Combine secp256k1, P256, WebAuthn, and WebCrypto owners in one account." to="/tempo/guides/multisig/key-types" />

  <Card icon="lucide:network" title="Nested Accounts" description="Use an initialized multisig account as an owner of another multisig." to="/tempo/guides/multisig/nested-accounts" />

  <Card icon="lucide:key-round" title="Authorize Access Keys" description="Authorize and immediately use an access key from a multisig account." to="/tempo/guides/multisig/access-keys" />

  <Card icon="lucide:hand-coins" title="Sponsor Fees" description="Combine independent multisig approvals with a separate fee payer." to="/tempo/guides/multisig/sponsor-fees" />

  <Card icon="lucide:refresh-cw" title="Rotate Owners" description="Replace owners or thresholds while preserving the multisig address." to="/tempo/guides/multisig/rotate-owners" />
</Cards>

## Best Practices

### Reuse the Prepared Request

Every owner must approve the exact request returned by the first approval. Changing calls, fees,
nonce, fee payer, or validity-window fields creates another signing payload.

### Use Shared Storage

Production coordinators must share one persistent [`Storage`](/tempo/utilities/Storage)
implementation. Implement `compareAndSet` to prevent concurrent approvals from overwriting each
other. The in-memory store is for one process only.

## See More

<Cards>
  <Card icon="lucide:database" title="Multisig" description="Configure the client, request handler, operation types, and store." to="/tempo/utilities/Multisig" />

  <Card icon="lucide:settings" title="Multisig Configuration" description="Read and update a multisig account's current configuration." to="/tempo/actions/multisig.getConfig" />

  <Card icon="lucide:book-open" title="TIP-1061" description="Read the specification for Tempo native multisig accounts." to="https://tips.sh/1061" />
</Cards>
