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

> Control a smart account with standard Ethereum keys.

Choose ECDSA for server wallets, agents, existing wallet clients, or any integration that already produces Ethereum signatures. You are responsible for securing and recovering the key.

## Configure an ECDSA owner

Pass a Viem account in the `owners` configuration:

```ts theme={null}
import { RhinestoneSDK } from '@rhinestone/sdk'
import type { Hex } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'

const apiKey = process.env.RHINESTONE_API_KEY
const privateKey = process.env.OWNER_PRIVATE_KEY

if (!apiKey || !privateKey) {
  throw new Error('RHINESTONE_API_KEY and OWNER_PRIVATE_KEY are required')
}

const owner = privateKeyToAccount(privateKey as Hex)
const rhinestone = new RhinestoneSDK({
  auth: { mode: 'apiKey', apiKey },
})

const account = await rhinestone.createAccount({
  owners: {
    type: 'ecdsa',
    accounts: [owner],
  },
})
```

The account uses the current Ownable Validator by default. The threshold defaults to one.

<Warning>
  Never expose a private key in client code, logs, or source control. Use a key management system for production server signers.
</Warning>

## Use more than one owner

Use [multisig](/wallets/custom-signer/account-setup/native-signers/multisig) when several ECDSA owners should control one account. Use [multi-factor authentication](/wallets/custom-signer/account-setup/native-signers/multi-factor-authentication) when you need different validator types, such as ECDSA and passkeys.

## Manage owners

Use the SDK actions to change an account after deployment:

* [`addOwner`](/wallets/custom-signer/sdk-reference/actions/ecdsa/add-owner)
* [`removeOwner`](/wallets/custom-signer/sdk-reference/actions/ecdsa/remove-owner)
* [`changeThreshold`](/wallets/custom-signer/sdk-reference/actions/ecdsa/change-threshold)
