# Стандарты

Vilna использует CAIP для идентификаторов сетей, аккаунтов и активов и RFC 7807 для ошибок HTTP API.

Сети **CAIP-2**
Адреса в сети **CAIP-10**
Активы **CAIP-19**
Ошибки **RFC 7807**

## CAIP - идентификаторы вне зависимости от сети 

CAIP (Chain Agnostic Improvement Proposals) задаёт общую форму идентификаторов сетей, адресов в конкретных сетях и активов. Это позволяет одинаково разбирать идентификаторы Ethereum, Bitcoin и Solana, сохраняя различия самих сетей. В ответе Vilna запись ссылается на сеть, адрес или токен одним из этих идентификаторов.

Уровней три, и каждый строится на предыдущем: **CAIP account** - это сеть плюс адрес; **актив** - это сеть плюс описатель актива. Здесь account обозначает адрес в сети, а не учётную запись пользователя или ресурс `account` в VKS.

### CAIP-2 - сеть 

Базовый идентификатор. Называет сеть в двух частях:

`namespace:reference` = `chain_id`

`namespace` (e.g. `eip155`)

Семейство сети - `eip155` для EVM-сетей, `bip122` для Bitcoin-подобных, а также `solana`, `cosmos` и другие.

`reference` (e.g. `1`)

Конкретная сеть внутри семейства - chain ID для EVM, хеш genesis-блока для Bitcoin.

| Сеть | CAIP-2 |
|  --- | --- |
| Ethereum Mainnet | `eip155:1` |
| BNB Smart Chain | `eip155:56` |
| Polygon | `eip155:137` |
| Arbitrum One | `eip155:42161` |
| Bitcoin | `bip122:000000000019d6689c085ae165831e93` |
| Solana | `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp` |


### CAIP-10 - адрес в сети 

Адрес в конкретной сети - возьмите CAIP-2 идентификатор и добавьте адрес:

`chain_id:address` = `account_id`

`chain_id` (e.g. `eip155:1`)

Любой CAIP-2 идентификатор сети - сеть, к которой относится адрес.

`address` (e.g. `0x742d35Cc…7B123`)

Адрес в этой сети, в её родном формате (hex для EVM, base58 для Bitcoin и Solana).

Ethereum

```
eip155:1:0x742d35Cc6634C0532925a3b844Bc9e7595f7B123
```

Bitcoin

```
bip122:000000000019d6689c085ae165831e93:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
```

Solana

```
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM
```

### CAIP-19 - актив 

Любой актив - нативная монета, токен или NFT. Соединяет CAIP-2 сеть с описателем актива через `/`:

`chain_id/asset_namespace:asset_reference` = `asset_id`

`chain_id` (e.g. `eip155:1`)

Любой CAIP-2 идентификатор сети - сеть, в которой живёт актив.

`asset_namespace` (e.g. `erc20`)

Тип актива - `slip44` для нативной монеты, `erc20` для взаимозаменяемого токена, `erc721` / `erc1155` для NFT.

`asset_reference` (e.g. `0xdAC17F…1ec7`)

Актив внутри этого типа - адрес контракта для токенов или тип монеты для нативных валют.

| Актив | CAIP-19 |
|  --- | --- |
| ETH (нативный) | `eip155:1/slip44:60` |
| BTC (нативный) | `bip122:000000000019d6689c085ae165831e93/slip44:0` |
| USDT в Ethereum | `eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7` |
| USDC в Ethereum | `eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48` |
| BAYC #101 (NFT) | `eip155:1/erc721:0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D/101` |


Нативные валюты используют тип монеты из [реестра SLIP-44](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) (`60` = ETH, `0` = BTC); токены и NFT используют адрес контракта, с добавлением token id для одного NFT.

## RFC 7807 - формат ошибок 

Platform, Management и VKS HTTP API используют RFC 7807 Problem Details (`application/problem+json`). Поля, расширения и действия после ошибок описаны в разделе [Ошибки](/ru/apis/errors#body). Blockchain RPC использует свою [модель ошибок протокола](/ru/apis/rpc/json-rpc#error-handling).

## Источники 

- [Спецификация CAIP-2](https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-2.md) - идентификаторы сетей
- [Спецификация CAIP-10](https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-10.md) - идентификаторы аккаунтов
- [Спецификация CAIP-19](https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-19.md) - идентификаторы активов
- [Реестр SLIP-44](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) - типы нативных монет
- [RFC 7807](https://tools.ietf.org/html/rfc7807) - Problem Details for HTTP APIs