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

# ECDSA

> Use one or more ECDSA accounts to authorize a session key.

Pass viem `Account` objects as the session owners. The SDK uses their `signMessage` methods when the session authorizes a transaction:

Examples on this page use `@rhinestone/sdk`, where `rhinestone` is the `RhinestoneSDK` instance from [Create a session with a custom setup](/wallets/session-keys/custom-setup/create-a-session).

```ts theme={null}
import { base } from "viem/chains";

const session = await rhinestone.createSession({
  chain: base,
  owners: {
    type: "ecdsa",
    accounts: [sessionOwnerAccount],
  },
});
```

Treat the session owner's private key as a scoped application credential. Store it separately from the smart account's owner key and revoke the session if it is exposed.

## Require several signatures

Add multiple accounts and set a threshold:

```ts theme={null}
const session = await rhinestone.createSession({
  chain: base,
  owners: {
    type: "ecdsa",
    accounts: [sessionOwnerA, sessionOwnerB, sessionOwnerC],
    threshold: 2,
  },
});
```

The threshold defaults to `1`. The standard session signing flow invokes the configured owners and assembles their validator contribution. Independent owner-signature collection with `assembleTransaction` is not available for session keys, so every required signer must be reachable by the process that calls `signTransaction`.

<Note>
  The session owner controls only the authority granted by that session.
  Restrict its calls, signing capability, duration, and spend instead of
  treating the validator threshold as the only security boundary.
</Note>
