---
title: "Стандарт мультитокенів ERC-1155"
description: "Дізнайтеся про ERC-1155 — стандарт мультитокенів, який поєднує взаємозамінні та невзаємозамінні токени в одному контракті."
lang: uk
---

## Вступ {#introduction}

Стандартний інтерфейс для контрактів, які керують кількома типами токенів. Один розгорнутий контракт може містити будь-яку комбінацію взаємозамінних токенів, невзаємозамінних токенів або інших конфігурацій (наприклад, напіввзаємозамінних токенів).

**Що мається на увазі під стандартом мультитокенів?**

Ідея проста і полягає у створенні інтерфейсу смарт-контракту, який може представляти та контролювати будь-яку кількість типів взаємозамінних і невзаємозамінних токенів. Таким чином, токен ERC-1155 може виконувати ті ж функції, що й токени [ERC-20](/developers/docs/standards/tokens/erc-20/) та [ERC-721](/developers/docs/standards/tokens/erc-721/), і навіть обидві одночасно. Він покращує функціональність стандартів ERC-20 та ERC-721, роблячи його ефективнішим і виправляючи очевидні помилки реалізації.

Токен ERC-1155 повністю описаний у [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155).

## Передумови {#prerequisites}

Для кращого розуміння цієї сторінки ми рекомендуємо спочатку прочитати про [стандарти токенів](/developers/docs/standards/tokens/), [ERC-20](/developers/docs/standards/tokens/erc-20/) та [ERC-721](/developers/docs/standards/tokens/erc-721/).

## Функції та особливості ERC-1155: {#body}

- [Пакетний переказ](#batch-transfers): переказ кількох активів за один виклик.
- [Пакетний баланс](#batch-balance): отримання балансів кількох активів за один виклик.
- [Пакетне схвалення](#batch-approval): схвалення всіх токенів для адреси.
- [Хуки](#receive-hook): хук отримання токенів.
- [Підтримка NFT](#nft-support): якщо пропозиція дорівнює лише 1, він розглядається як NFT.
- [Правила безпечного переказу](#safe-transfer-rule): набір правил для безпечного переказу.

### Пакетні перекази {#batch-transfers}

Пакетний переказ працює дуже подібно до звичайних переказів ERC-20. Давайте поглянемо на звичайну функцію ERC-20 `transferFrom`:

```solidity
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);

// ERC-1155
function safeBatchTransferFrom(
    address _from,
    address _to,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external;
```

Єдина відмінність в ERC-1155 полягає в тому, що ми передаємо значення як масив, а також передаємо масив ідентифікаторів. Наприклад, якщо задано `ids=[3, 6, 13]` та `values=[100, 200, 5]`, отримані перекази будуть такими:

1. Переказ 100 токенів з ідентифікатором 3 від `_from` до `_to`.
2. Переказ 200 токенів з ідентифікатором 6 від `_from` до `_to`.
3. Переказ 5 токенів з ідентифікатором 13 від `_from` до `_to`.

В ERC-1155 ми маємо лише `transferFrom`, без `transfer`. Щоб використовувати його як звичайний `transfer`, просто встановіть адресу відправника (from) на адресу, яка викликає функцію.

### Пакетний баланс {#batch-balance}

Відповідний виклик ERC-20 `balanceOf` також має свою партнерську функцію з підтримкою пакетної обробки. Нагадаємо, це версія ERC-20:

```solidity
// ERC-20
function balanceOf(address owner) external view returns (uint256);

// ERC-1155
function balanceOfBatch(
    address[] calldata _owners,
    uint256[] calldata _ids
) external view returns (uint256[] memory);
```

Ще простіше для виклику балансу: ми можемо отримати кілька балансів за один виклик. Ми передаємо масив власників, за яким слідує масив ідентифікаторів токенів.

Наприклад, якщо задано `_ids=[3, 6, 13]` та `_owners=[0xbeef..., 0x1337..., 0x1111...]`, значення, що повертається, буде таким:

```solidity
[
    balanceOf(0xbeef...),
    balanceOf(0x1337...),
    balanceOf(0x1111...)
]
```

### Пакетне схвалення {#batch-approval}

```solidity
// ERC-1155
function setApprovalForAll(
    address _operator,
    bool _approved
) external;

function isApprovedForAll(
    address _owner,
    address _operator
) external view returns (bool);
```

Схвалення дещо відрізняються від ERC-20. Замість того, щоб схвалювати конкретні суми, ви встановлюєте оператора як схваленого або не схваленого за допомогою `setApprovalForAll`.

Прочитати поточний статус можна за допомогою `isApprovedForAll`. Як бачите, це операція «все або нічого». Ви не можете визначити, скільки токенів схвалювати або навіть який клас токенів.

Це навмисно розроблено з урахуванням простоти. Ви можете схвалити лише все для однієї адреси.

### Хук отримання {#receive-hook}

```solidity
function onERC1155BatchReceived(
    address _operator,
    address _from,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external returns(bytes4);
```

Враховуючи підтримку [EIP-165](https://eips.ethereum.org/EIPS/eip-165), ERC-1155 підтримує хуки отримання лише для смарт-контрактів. Функція хука повинна повертати магічне попередньо визначене значення bytes4, яке задається як:

```solidity
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
```

Коли контракт-отримувач повертає це значення, передбачається, що контракт приймає переказ і знає, як обробляти токени ERC-1155. Чудово, більше ніяких застряглих токенів у контракті!

### Підтримка NFT {#nft-support}

Коли пропозиція дорівнює лише одиниці, токен по суті є невзаємозамінним токеном (NFT). І, як це стандартно для ERC-721, ви можете визначити URL-адресу метаданих. URL-адресу можуть читати та змінювати клієнти, див. [тут](https://eips.ethereum.org/EIPS/eip-1155#metadata).

### Правило безпечного переказу {#safe-transfer-rule}

Ми вже торкалися кількох правил безпечного переказу в попередніх поясненнях. Але давайте розглянемо найважливіші з них:

1. Абонент, що викликає, повинен бути схвалений для витрачання токенів для адреси `_from`, або абонент, що викликає, повинен дорівнювати `_from`.
2. Виклик переказу має бути скасовано, якщо:
   1. Адреса `_to` дорівнює 0.
   2. Довжина `_ids` не збігається з довжиною `_values`.
   3. Будь-який з балансів власників для токенів у `_ids` є нижчим за відповідні суми в `_values`, надіслані одержувачу.
   4. Виникає будь-яка інша помилка.

_Примітка_: усі пакетні функції, включно з хуком, також існують у версіях без пакетної обробки. Це зроблено для ефективності використання газу, враховуючи, що переказ лише одного активу, ймовірно, все ще буде найпоширенішим способом. Ми опустили їх для простоти в поясненнях, включно з правилами безпечного переказу. Назви ідентичні, просто видаліть «Batch».

## Подальше читання {#further-reading}

- [EIP-1155: стандарт мультитокенів](https://eips.ethereum.org/EIPS/eip-1155)
- [ERC-1155: документація ОупенЗеппелін](https://docs.openzeppelin.com/contracts/5.x/erc1155)
- [ERC-1155: репозиторій на GitHub](https://github.com/enjin/erc-1155)
- [Alchemy NFT API](https://www.alchemy.com/docs/reference/nft-api-quickstart)