Перейти к основному содержимому

EUnitCoin (EUNIT)

Нетрансферабельный UUPS-апгрейдабельный ERC20 (contracts/tokens/EUnitCoin.sol). Паттерн — как у UnitCoin: AccessControl + TransferManager (вайтлисты/блэклисты, transferEnabled = false по умолчанию). Минт под MINTER_ROLE, саплай не ограничен.

Обмен UNIT ↔ EUNIT

  • exchangeUnit(amount) — переводит UNIT пользователя на баланс контракта (лок) и минтит EUNIT 1:1. Требуется approve UNIT на адрес EUnitCoin.
  • exchangeBack(amount) — сжигает EUNIT и возвращает залоченные UNIT 1:1. Ограничен квотой unitExchanged[user]: вернуть можно не больше, чем вложил. Квота — числовой счётчик; трата EUNIT её не уменьшает, минт наградами не даёт. Сжигание идёт в обход checkBurnAccess и не зависит от burnEnabled.

События

  • UnitExchanged(user, amount, timestamp)
  • UnitExchangedBack(user, amount, timestamp)

Деплой

deploy/eunit.deploy.ts (тег EUnitCoin, требует UNIT_COIN_ADDRESS в env). Обязательный шаг (зашит в скрипт): добавить EUnitCoin в transferWhitelist UnitCoin — иначе exchangeUnit ревертится, т.к. checkTransferAccess в UnitCoin пропускает transferFrom только для вайтлистнутого msg.sender.

Тесты

test/EUnitCoin.test.ts — деплой/инициализация, ограничения transfer/burn, обе стороны обмена, семантика квоты, роли и апгрейд:

npx hardhat test test/EUnitCoin.test.ts