# Accounts

An account represents a store of value for fiat currencies and/or stablecoins.

- **Bank account**: Account that exists at a regulated depository financial institution (i.e. a bank). Stores fiat.
- **Wallet**: An on-chain wallet. Stores stablecoins.
- **Ledger**: An account at a liquidity provider/custodian. May store fiat and/or stablecoins.

Accounts may be managed by Tesser or unmanaged. "Unmanaged" accounts are accounts that were not provisioned by Tesser, and instead were provisioned by a third party. "Managed" accounts are accounts that are provisioned by Tesser.

The distinction is about who provisioned the underlying account, not who created the record at Tesser: Tesser creates unmanaged account records on your behalf to represent external accounts it encounters. The sending wallet on an inbound payment is the common case — the first time funds arrive from a wallet address Tesser has not seen before, Tesser creates an unmanaged wallet account for it. See [Receive an Inbound Payment to a Wallet](/how-tos/receive-an-inbound-payment-to-a-wallet#sending-wallet-account-handling).

Accounts will always belong to the workspace they are created in. They can optionally also belong to one of a counterparty or tenant.

<table>
  <thead>
    <tr>
      <th>*Belongs to:*</th>
      <th>**Type: Bank account**</th>
      <th>**Type: Wallet**</th>
      <th>**Type: Ledger**</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>**Workspace**</td>
      <td>n/a</td>
      <td>
        <p>An omnibus wallet an organization uses to manage its treasury operations in an aggregated manner.</p>
        <p>(Managed)</p>
      </td>
      <td>
        <p>An omnibus wallet an organization uses to manage its treasury operations in an aggregated manner.</p>
        <p>(Managed)</p>
      </td>
    </tr>
    <tr>
      <td>**Tenant**</td>
      <td>n/a</td>
      <td>
        <p>A wallet designated for funds belonging to a tenant.</p>
        <p>(Managed)</p>
      </td>
      <td>
        <p>A wallet designated for funds belonging to a tenant.</p>
        <p>(Managed)</p>
      </td>
    </tr>
    <tr>
      <td>**Counterparty**</td>
      <td>
        <p>A bank account that belongs to an originator or a beneficiary.</p>
        <p>(Unmanaged)</p>
        <p>For fiat payouts, bank account info as transmitted as part of Travel Rule compliance.</p>
        <ul>
          <li>Bank accounts of originators are the ultimate source of funds.</li>
          <li>Bank accounts of beneficiaries are the ultimate destination of funds.</li>
        </ul>
      </td>
      <td>
        <p>A wallet designated for an originator or beneficiary provisioned by Tesser. (Managed)</p>
        <p>A wallet provisioned for the originator or beneficiary by a non-Tesser provider. (Unmanaged)</p>
      </td>
      <td>
        <p>A wallet designated for an originator or beneficiary.</p>
        <p>(Managed)</p>
      </td>
    </tr>
  </tbody>
</table>

## Wallets

A wallet's `type` identifies the **blockchain family** it belongs to, not a single network:

- `stablecoin_ethereum` — the **EVM (Ethereum Virtual Machine) family**, which includes Ethereum, Base, Polygon, and other EVM-compatible chains.
- `stablecoin_solana` — the Solana network.
- `stablecoin_stellar` — the Stellar network.

:::info
`stablecoin_ethereum` covers every EVM chain, not just Ethereum mainnet. Because EVM wallets share a single address across all EVM chains, one `stablecoin_ethereum` wallet has the same `crypto_wallet_address` on Ethereum, Base, Polygon, and any other EVM network. We use `stablecoin_ethereum` rather than `stablecoin_evm` for readability.
:::

### Assets

A wallet holds an `assets` array — one entry per `currency` and `network` combination the wallet is enabled for. A single EVM wallet therefore commonly returns balances across **multiple networks**:

```json
{
  "type": "stablecoin_ethereum",
  "crypto_wallet_address": "0x9A7c3B2e1F4d5C6b8A0e2D1c4B5a6F7e8D9c0B1a",
  "assets": [
    { "currency": "USDC", "network": "ETHEREUM", "available_balance": "0" },
    { "currency": "USDT", "network": "ETHEREUM", "available_balance": "0" },
    { "currency": "USDC", "network": "BASE", "available_balance": "0" },
    { "currency": "USDC", "network": "POLYGON", "available_balance": "0" },
    { "currency": "USDT", "network": "POLYGON", "available_balance": "0" }
  ]
}
```

Although an EVM wallet is theoretically compatible with any EVM chain and token, Tesser only enables a curated set of `currency` and `network` combinations. See [Supported Tokens and Networks](./tokens-and-networks) for the current list and each combination's status.

### Sandbox Networks

In the sandbox, `network` values are testnet identifiers that map to their mainnet equivalents in production:

| Sandbox (testnet) | Production (mainnet) |
| --- | --- |
| `ETHEREUM_SEPOLIA` | `ETHEREUM` |
| `BASE_SEPOLIA` | `BASE` |
| `POLYGON_AMOY` | `POLYGON` |

:::note
A wallet's `assets` are generally fixed once it is created. Tesser may enable additional networks or tokens on an existing wallet — coordinated with you in advance — and a new asset can also appear if a wallet organically receives funds on a network it hasn't held before (for example, a rebalance that lands USDC on a newly supported EVM chain).
:::

### Wallet Registration with Liquidity Providers

Before a liquidity provider can transfer funds to a wallet, the wallet's
address must be registered with that provider:

- **Circle**: Tesser submits registrations automatically. New wallets are
  registered as recipients on every supported network in their family — an
  EVM wallet on Ethereum, Base, and Polygon; a Stellar wallet on Stellar.
  Each registration starts as `pending` and must be approved in your Circle
  account console before it becomes active.
- **OpenFX**: In production, you must manually register the wallet address
  as a withdrawal address in your OpenFX dashboard for the relevant asset.
  Tesser picks up verified addresses automatically the next time the wallet
  is used — no API call needed. (Not required in the sandbox.)

Registration is **per blockchain network**: a wallet can receive
withdrawals from a provider on a network as soon as that network's
registration is active. Other networks' registrations do not block it.

:::warning{title="Circle approval required"}
Wallets registered with Circle require approval via email: Circle emails
your account administrators when approvals are pending. Approve each
recipient address within **48 hours** (per Circle's notification email);
unapproved registrations may expire. Until a network's registration is
approved, deposits and transfers to the wallet on that network are
rejected. If you didn't approve in time, contact Tesser support.
:::
