Контракт NMX - это ERC20 токен с предопределенным расписанием выпуска монет. К моменту создания контракта NMX часть токенов уже была распределена биржей централизованно. Эта часть в конструкторе контракта выпускается на адрес биржи. Расписание эмиссии определено при выпуске контракта и не может быть изменено в дальнейшем.
Расписание выстроено таким образом, что количество ежедневно выпускаемых монет каждую неделю уменьшается. В различные периоды времени коэффициент уменьшения недельного пула отличается. Коэффициенты подобраны таким образом, чтобы за все время эмиссии NMX (5218 недель ≈ 100 лет) было выпущено не более 200 млн. токенов. Выпускаемые NMX распределяются среди четырех пулов распределения:
- Основной пул
- Пул Nominex (включая Бонусный и Командный пулы)
Каждый пул распределения представляет собой адрес в сети ethereum, на который будут начислены токены. Пропорции, в которых пулы распределения получают выпущенные NMX, с течением времени изменяются, но также предопределены расписанием.
Nominex пул - адрес, принадлежащий бирже Nominex. На них токены просто начисляются. Дальнейшее распределение начисленных на этот пул NMX осуществляется централизовано биржей Номинекс и не представляет интереса в рамках ethereum сети. Распределение внутри Основного пула рассмотено ниже.
Основной пул представляет собой набор контрактов, предназначенных для начисления NMX за стейкинг LP токенов Uniswap. Всё взаимодействие можно выразить следующим образом: контракт вызывает у своего поставщика NMX метод supplyNMX(), получает дополнительное количество токенов и каким-то образом распределяет их по своим потребителям NMX. Поставщик NMX вызывает в свою очередь метод у своего поставщика NMX и т.д. Схема взаимодействия контрактов представлена ниже:
- При каждом изменении состояния (staking или unstaking) StakingService вызывает у StakingRouter (своего поставщика NMX) метод для получения новых токенов.
- StakingRouter вызывает у NMX (своего поставщика NMX) метод для получения новых токенов.
- NMX видит, что вызывающий его контракт - владелец Основного пула, и запрашивает у расписания обновление состояния распределения Основного пула.
- MintSchedule обновляет состояние распределения основного пула и возвращает количество токенов, которые контракт должен выпустить на адрес Основного пула распределения.
- NMX начисляет на адрес владельца основного пула новые токены и возвращает их количество в качестве результата вызова метода supplyNMX.
- StakingRouter получает информацию о том, сколько NMX ему только что добавили. Распределяет эти NMX между различными StakingService'ами согласно их долям (в вырожденном случае одному StakingService'у начисляются все полученные NMX токены) и запоминает во внутреннем состоянии. Далее возвращает вызвавшему StakingService количество NMX, которые были ему начислены с момента последнего вызова. После этого StakingService на основании количества только что полученных им токенов обновляет внутреннее состояние так, чтобы в будущем было возможно рассчитать вознаграждение в NMX всем адресам, принимавшим участие в стейкинге LP токенов пропорционально их долям и срокам стейкинга.
Пользователи взаимодействуют только с контрактом StakingService для осуществления стейкинга, анстейкинга и получения вознаграждения за стейкинг. Операции, не связанные со стейкингом и доступные в рамках стандарта ERC20, выполняются на контракте NMX.