> **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.

# Weighted Owners

## Overview

Each multisig owner has a weight. A transaction is authorized when the sum of the approving
owners' weights reaches the account threshold.

## Recipes

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

### M-of-N Approvals

When every owner has weight `1`, the threshold defines how many owners must approve. This 2-of-3
account can send with any two owner signatures.

:::code-group
```ts twoslash [example.ts]
import { Account } 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 account = Account.fromMultisig({
  owners: [owner_1.address, owner_2.address, owner_3.address],
  threshold: 2,
})

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

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

### Different Weights

Weighted entries let some owners contribute more toward the threshold. In this configuration,
the heavy owner and either light owner satisfy the threshold of `3`.

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

const account = Account.fromMultisig({
  owners: [
    { owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', weight: 2 },
    { owner: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', weight: 1 },
    { owner: '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC', weight: 1 },
  ],
  threshold: 3,
})
```

## Best Practices

### Meet the Threshold Exactly

Collect exactly the approvals needed for your quorum. A submission that is below threshold or
contains unnecessary approvals is rejected.

### Keep Recovery Possible

Choose weights and a threshold that still permit recovery when an expected signer is unavailable.
Test each intended owner combination before funding the account.

## See More

<Cards>
  <Card icon="lucide:send" title="Send Transactions" description="Prepare one request and collect independent owner approvals." to="/tempo/guides/multisig/send" />

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

  <Card icon="lucide:wallet-cards" title="Account.fromMultisig" description="Configure owner weights and the approval threshold." to="/tempo/accounts/account.fromMultisig" />
</Cards>
