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

# Rotate Multisig Owners

## Overview

The initial configuration permanently derives the multisig address. Updating the current
configuration changes which owners can approve future transactions without changing that address.

This example assumes that `account` has already been initialized.

## Recipes

These recipes assume you have [set up a Tempo client](/tempo).

### Submit the New Config

Prepare the update under the original multisig account with
[`multisig.updateConfig.call`](/tempo/actions/multisig.updateConfig). The current owners approve
the update.

:::code-group
```ts twoslash [example.ts]
import { Account, Actions } from 'viem/tempo'
import {
  prepareTransactionRequest,
  sendTransaction,
  signTransaction,
} from 'viem/actions'
import { client } from './viem.config'

const owner_1 = Account.fromSecp256k1(
  '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
)
const owner_2 = Account.fromSecp256k1(
  '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d'
)
const owner_3 = Account.fromSecp256k1(
  '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a'
)
const owner_4 = Account.fromSecp256k1(
  '0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6'
)
const account = Account.fromMultisig(
  '0x7b378778e4b0dfd068bc74979508219e2ba2074c'
)

const update = await prepareTransactionRequest(client, {
  account,
  calls: [
    Actions.multisig.updateConfig.call({
      owners: [
        { owner: owner_3.address, weight: 1 },
        { owner: owner_4.address, weight: 1 },
      ],
      threshold: 2,
    }),
  ],
})
const updateSignatures = await Promise.all(
  [owner_1, owner_2].map((owner) =>
    signTransaction(client, { ...update, account: owner })
  )
)
await sendTransaction(client, {
  ...update,
  signatures: updateSignatures,
})
```

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

### Sign with the New Owners

Keep using the original `account`. Preparation resolves its latest configuration and version,
and the new owners approve the request.

```ts twoslash
import { Account } from 'viem/tempo'
import {
  prepareTransactionRequest,
  sendTransaction,
  signTransaction,
} from 'viem/actions'
import { client } from './viem.config'

declare const owner_3: Account.RootAccount
declare const owner_4: Account.RootAccount

const account = Account.fromMultisig(
  '0x7b378778e4b0dfd068bc74979508219e2ba2074c'
)
const request = await prepareTransactionRequest(client, {
  account,
  calls: [
    { to: '0xcafebabecafebabecafebabecafebabecafebabe', value: 1n },
  ],
})
const signatures = await Promise.all(
  [owner_3, owner_4].map((owner) =>
    signTransaction(client, { ...request, account: owner })
  )
)
const hash = await sendTransaction(client, { ...request, signatures })
```

## Best Practices

### Keep the Stable Account Address

:::warning
Do not derive another account from the rotated config. The rotated config would produce a
different address. Store the original account address and reconstruct it with
`Account.fromMultisig(address)`.
:::

:::tip
If you retain the original initial config, you can continue using
`Account.fromMultisig(initialConfig)`. Both forms identify the same stable account address.
:::

### Read the Current Configuration

Use [`multisig.getConfig`](/tempo/actions/multisig.getConfig) when an application needs to display
the active owners, threshold, or version. Transaction preparation resolves these values before
signing.

## See More

<Cards>
  <Card icon="lucide:square-function" title="multisig.updateConfig" description="Replace a multisig account's current configuration." to="/tempo/actions/multisig.updateConfig" />

  <Card icon="lucide:settings" title="multisig.getConfig" description="Read the active owners, threshold, and version." to="/tempo/actions/multisig.getConfig" />

  <Card icon="lucide:send" title="Send Transactions" description="Collect approvals from the account's current owners." to="/tempo/guides/multisig/send" />
</Cards>
