> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rhinestone.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Multisig

> Require a threshold of ECDSA owners or passkey owners to approve transactions.

Choose multisig when one account needs several owners of the same signer type. Use it for shared control, treasury approvals, or a passkey-per-device setup.

* A **1-of-n** threshold lets any configured owner sign.
* An **m-of-n** threshold requires at least `m` owners to sign.

Use [multi-factor authentication](/wallets/custom-signer/account-setup/native-signers/multi-factor-authentication) instead when you need different validator types in one approval policy.

## Configure the owner set

Pass every owner and the required threshold when you create the account.

<Tabs>
  <Tab title="ECDSA">
    ```ts theme={null}
    const account = await rhinestone.createAccount({
      owners: {
        type: 'ecdsa',
        accounts: [ownerA, ownerB, ownerC],
        threshold: 2,
      },
    })
    ```
  </Tab>

  <Tab title="Passkeys">
    ```ts theme={null}
    const account = await rhinestone.createAccount({
      owners: {
        type: 'passkey',
        accounts: [passkeyA, passkeyB],
        threshold: 1,
      },
    })
    ```
  </Tab>
</Tabs>

The threshold defaults to one. Keep the complete owner set and threshold when reconstructing the account.

## Select co-located signers

When the required keys are available in one environment, select them while preparing the transaction. This released SDK syntax uses `chain` for a same-chain transaction:

```ts theme={null}
const prepared = await account.prepareTransaction({
  chain,
  calls,
  signers: {
    type: 'owner',
    kind: 'ecdsa',
    accounts: [ownerA, ownerB],
  },
})

const signed = await account.signTransaction(prepared)
```

For passkeys, use `kind: 'passkey'` and provide the selected passkey accounts.

## Collect signatures separately

When owners sign in different environments, prepare once, collect each contribution, and assemble them:

```ts theme={null}
const signatureA = await account.signTransaction(prepared, { owner: ownerA })
const signatureB = await account.signTransaction(prepared, { owner: ownerB })

const signed = await account.assembleTransaction(prepared, [
  signatureA,
  signatureB,
])
```

Every owner must sign the same prepared transaction. Collect enough valid owner signatures to meet the configured threshold.

## Manage the owner set

Use the [ECDSA actions](/wallets/custom-signer/sdk-reference/actions/ecdsa/add-owner) or [passkey actions](/wallets/custom-signer/sdk-reference/actions/passkeys/add-owner) to add and remove owners or change the threshold after deployment.
