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

# Smart account providers

> Select and configure the smart account implementation used by the Rhinestone SDK.

Set `account.type` in `createAccount` to choose the smart account implementation. If you omit `account`, `@rhinestone/sdk` 2.16.1 uses Nexus `1.2.1`.

The provider configuration contributes to the counterfactual account address. Choose it before funding or deploying the account, and keep the same configuration on every chain.

## Supported providers

| Type     | Configuration                                  | Notes                                                           |
| -------- | ---------------------------------------------- | --------------------------------------------------------------- |
| Nexus    | `{ type: 'nexus', version?, salt? }`           | Default. Versions `1.2.0` and `1.2.1` are supported.            |
| Safe     | `{ type: 'safe', version?, adapter?, nonce? }` | Safe `1.4.1`; adapter `1.0.0` or `2.0.0`.                       |
| Kernel   | `{ type: 'kernel', version?, salt? }`          | Kernel `3.3`.                                                   |
| Startale | `{ type: 'startale', salt? }`                  | Startale modular account.                                       |
| HCA      | `{ type: 'hca', factory? }`                    | Hierarchical account intended for ENS validator configurations. |

## Configure the SDK

SDK-level configuration, including authentication and RPC providers, is shared by every account created from the instance. Keep API-key authentication server-side:

```ts theme={null}
import { RhinestoneSDK } from '@rhinestone/sdk'

const rhinestone = new RhinestoneSDK({
  auth: {
    mode: 'apiKey',
    apiKey: process.env.RHINESTONE_API_KEY!,
  },
})
```

Use short-lived JWTs as described in [security](/wallets/custom-signer/integration/security) when the SDK runs in a browser.

## Select an implementation

The owner shown below is any viem-compatible account from [account setup](/wallets/custom-signer/account-setup/choose-a-signer).

<CodeGroup>
  ```ts Nexus theme={null}
  const account = await rhinestone.createAccount({
    account: {
      type: 'nexus',
      version: '1.2.1',
    },
    owners: { type: 'ecdsa', accounts: [owner] },
  })
  ```

  ```ts Safe theme={null}
  const account = await rhinestone.createAccount({
    account: {
      type: 'safe',
      version: '1.4.1',
      adapter: '2.0.0',
    },
    owners: { type: 'ecdsa', accounts: [owner] },
  })
  ```

  ```ts Kernel theme={null}
  const account = await rhinestone.createAccount({
    account: {
      type: 'kernel',
      version: '3.3',
    },
    owners: { type: 'ecdsa', accounts: [owner] },
  })
  ```

  ```ts Startale theme={null}
  const account = await rhinestone.createAccount({
    account: { type: 'startale' },
    owners: { type: 'ecdsa', accounts: [owner] },
  })
  ```
</CodeGroup>

Omit optional versions and salts unless you need to reproduce an existing address. In particular, upgrading a pinned Nexus `1.2.0` account to `1.2.1` changes its derived address.

To attach an account that already exists, follow [bring your own account](/wallets/custom-signer/configuration/bring-your-own-account).
