# Монеты и суммы

> Коды монет и их точность, USDT в любой сети, счета в долларах и рублях, формат сумм в PS Wallet Pay API.

В PS Wallet Pay каждая монета обозначается кодом, а суммы передаются строками с точкой. На этой странице — какие коды бывают, сколько у них знаков после запятой и как работают USDT без указания сети и счета в фиате.

## Коды монет

| Код | Монета | Знаков после запятой |
|---|---|---|
| `USDT-TRC20` | Tether в сети TRON | 6 |
| `USDT-BEP20` | Tether в сети BNB Smart Chain | 6 |
| `USDT-ERC20` | Tether в сети Ethereum | 6 |
| `USDT-TON` | Tether в сети TON | 6 |
| `XAUT` | Tether Gold (Ethereum) | 6 |
| `TRX` | TRON | 6 |
| `BNB` | BNB (BEP20) | 8 |
| `ETH` | Ethereum | 8 |
| `GRAM` | Gram (сеть TON) | 9 |
| `RUB` | Российский рубль | 2 |

Кроме них есть код `USDT` — USDT в любой сети (см. ниже), и фиатные валюты для цены счёта: `USD` и `RUB`, по 2 знака после запятой.

> [!NOTE]
> Монеты `TRX`, `BNB`, монеты сети Ethereum (`USDT-ERC20`, `XAUT`, `ETH`) и сети TON (`USDT-TON`, `GRAM`) могут быть временно недоступны. Актуальный список возвращает [getCurrencies](https://help.pswallet.org/ru/pay-api/balance#getcurrencies), а недоступная монета в параметрах даёт ошибку `PARAM_ASSET_INVALID`.

## Где какие коды можно указывать

| Где | Допустимые коды |
|---|---|
| `asset` в [createInvoice](https://help.pswallet.org/ru/pay-api/invoices#createinvoice) | `USDT` или любой код монеты из таблицы. |
| `fiat` в createInvoice | `USD` или `RUB`. |
| `accepted_assets` в createInvoice | Коды монет и `USDT` через запятую. |
| `asset` в [transfer](https://help.pswallet.org/ru/pay-api/transfers#transfer) и [createCheck](https://help.pswallet.org/ru/pay-api/checks#createcheck) | `USDT` или любой код монеты из таблицы. |
| Фильтр `asset` в `getTransfers` и `getChecks` | `USDT` (все сети) или код монеты. |
| Ответы API: `paid_asset`, `asset` переводов и чеков, `currency_code` баланса | Всегда код с сетью (`USDT-TRC20`, `USDT-BEP20` и т. д.), не `USDT`. |

Регистр кода не важен: `usdt-trc20` и `USDT-TRC20` — одно и то же.

## USDT без указания сети

**В счетах** можно указать просто `USDT`. Тогда пользователь заплатит с любого своего счёта USDT — TRC20, BEP20, ERC20 или TON, — и деньги придут на баланс приложения в той сети, с которой он платил. Сеть оплаты указана в поле `paid_asset` оплаченного счёта.

Если нужна конкретная сеть, укажите её код, например `USDT-TRC20`: оплатить счёт можно будет только с этого счёта.

**В `transfer` и `createCheck`** код `USDT` тоже допустим: деньги спишутся с первой сети, где на балансе приложения хватает суммы, в порядке TRC20 → BEP20 → TON → ERC20. Если суммы не хватает ни в одной сети, вернётся ошибка `INSUFFICIENT_FUNDS`. Получатель получит деньги в той же сети — она указана в поле `asset` ответа.

## Счета в долларах и рублях

Счёт можно выставить в долларах (`USD`) или рублях (`RUB`): для этого передайте `currency_type=fiat` и `fiat`. Пользователь выберет, чем платить, из разрешённых монет (`accepted_assets`). Сумма к оплате пересчитывается по курсу в момент оплаты и округляется вверх до минимальной единицы монеты.

По умолчанию фиатный счёт принимает `USDT`, `TRX`, `BNB`, `ETH`, `GRAM` и `RUB` (из них — те, что сейчас доступны). `XAUT` в этот список не входит — чтобы принимать его, перечислите монеты в `accepted_assets` явно.

Курсы, по которым пересчитываются фиатные счета, возвращает [getExchangeRates](https://help.pswallet.org/ru/pay-api/balance#getexchangerates). Фактический курс оплаты сохраняется в счёте в полях `paid_fiat_rate` и `paid_usd_rate`.

## Рубли

Сейчас оплатить счёт с рублёвого счёта нельзя, а рубли нельзя передать другим пользователям:

- `asset=RUB` в `createInvoice` вернёт ошибку `PARAM_ASSET_INVALID`;
- `RUB` в `accepted_assets` при оплате не учитывается, а если в списке только `RUB` — вернётся ошибка `PARAM_ACCEPTED_ASSETS_INVALID`;
- `asset=RUB` в `transfer` и `createCheck` вернёт ошибку `403 TEMPORARILY_UNAVAILABLE`.

Цену счёта при этом можно указывать в рублях (`currency_type=fiat`, `fiat=RUB`) — пользователь заплатит другой монетой.

## Формат сумм

Суммы передаются и возвращаются строками с точкой: `"12.5"`, `"0.000001"`.

- В JSON можно передать и число, но не больше знаков, чем у монеты. Например, `12.5000001` для USDT (6 знаков) — ошибка `PARAM_AMOUNT_INVALID`, никакого округления нет.
- Сумма должна быть больше нуля, без знака, пробелов и разделителей тысяч, не больше 15 цифр до точки.
- Нули в конце не считаются лишними знаками: `"12.500000000"` для USDT — это `12.5`.
- В ответах лишние нули отбрасываются: `"12.5"`, а не `"12.500000"`.

> [!TIP]
> Не считайте деньги в типе `float`. Используйте библиотеки точной арифметики, например `decimal.js` или `Big.js` в JavaScript и `decimal` в Python.

---
Источник: https://help.pswallet.org/ru/pay-api/assets
