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

ETHDistributor

Обзор

ETHDistributor — контракт для распределения комиссий между оракульными операторами по заданным долям. Адрес этого контракта устанавливается в diamond как получатель комиссий, чтобы затем автоматически распределять полученные комиссии между операторами.

Ключевые свойства:

  • owner‑управление (Ownable);
  • распределение по фиксированным долям в базисных пунктах (100% = 1000);
  • защита от потери wei за счет отправки остатка последнему получателю.

Контекст и зависимости

  • Diamond: адрес ETHDistributor задается как получатель комиссий в diamond, после чего контракт принимает ETH и распределяет их между операторами.
  • Оракульные операторы: перечислены в конфигурации контракта как recipients.

Состояние

  • recipients — массив адресов получателей (оракульных операторов).
  • percentages — массив долей в базисных пунктах (1% = 10, 100% = 1000).
  • TOTAL_BASIS_POINTS — константа 1000.

События

ConfigUpdated

event ConfigUpdated(address[] recipients, uint16[] percentages);

Эмитится при обновлении конфигурации распределения.

ETHDistributed

event ETHDistributed(uint256 amount, address indexed sender);

Эмитится после распределения входящего ETH.

PaymentSent

event PaymentSent(address indexed recipient, uint256 amount);

Эмитится для каждой выплаты получателю.

Ошибки

InvalidArrayLength

Реверт, если длины recipients и percentages не совпадают.

EmptyArray

Реверт, если массив получателей пуст.

InvalidPercentageSum

Реверт, если сумма percentages не равна TOTAL_BASIS_POINTS (1000).

ZeroAddress

Реверт, если один из получателей равен address(0).

TransferFailed

Реверт, если отправка ETH не удалась.

Функции: получение и распределение

receive

receive() external payable

Назначение: принимает ETH и распределяет их между получателями по текущей конфигурации.

Логика:

  1. Если msg.value > 0, вызывает _distributeETH(msg.value).
  2. Эмитит ETHDistributed.

_distributeETH

function _distributeETH(uint256 amount) private

Назначение: внутреннее распределение суммы amount по recipients и percentages.

Правила:

  • доли рассчитываются как amount * percentages[i] / 1000;
  • весь остаток из‑за округления отправляется последнему получателю.

Функции: конфигурация

updateConfig

function updateConfig(address[] memory _recipients, uint16[] memory _percentages) external onlyOwner

Назначение: обновить список получателей и их доли.

Проверки:

  • массивы не пустые;
  • длины совпадают;
  • сумма долей = 1000;
  • нет нулевых адресов.

getConfig

function getConfig() external view returns (address[] memory _recipients, uint16[] memory _percentages)

Назначение: вернуть текущую конфигурацию распределения.

getRecipientsCount

function getRecipientsCount() external view returns (uint256)

Назначение: вернуть количество получателей.

Функции: вывод средств

withdrawToken

function withdrawToken(address token, address recipient, uint256 amount) external onlyOwner

Назначение: вывести ERC20‑токены, ошибочно попавшие на контракт.

withdrawETH

function withdrawETH(address recipient, uint256 amount) external onlyOwner

Назначение: вывести ETH с контракта вручную (админская операция).

Ограничения и безопасность

  • Контракт не хранит историю распределений, только текущую конфигурацию.
  • Распределение происходит при получении ETH (receive). Если diamond переводит комиссии в другом токене, требуется отдельный механизм.
  • Вывод токенов и ETH доступен только владельцу (onlyOwner).

Типовой сценарий использования

  1. Деплой ETHDistributor с перечнем оракульных операторов и их долями.
  2. Установка адреса контракта в diamond как получателя комиссий.
  3. При каждом поступлении ETH на ETHDistributor сумма автоматически распределяется между операторами.