Блокчейн Free TON нуждается в проверке всех созданных блоков и эту работу за вознаграждение выполняет Валидатор. Однако, чтобы им стать, требуется значительные депозиты, которые могут превышать бюджет потенциального валидатора. Смарт-контракт DePool решает эту проблему, позволяя объединять депозиты разных вкладчиков для участия в формировании блоков методом PoS.
Терминология
Elector — смарт-контракт, который проводит выборы валидатора, подсчитывает “голоса” и оглашает результаты выборов.
DePool и Elector находятся в разных системах и не могут общаться напрямую, поэтому им нужен переводчик — DePool Proxy.
Participant (участник) — помощник, спонсор-инвестор валидатора.
Валидатор — программное обеспечение, запускающее узел блокчейна. Каждый DePool работает только с одним узлом.
Кошелек валидатора — финансовый минимум валидатора, гарантия того, что он может избираться и получать награды.
Стейк — ставка участника, чтобы валидатор имел возможность избираться. Стейки имеют минимальный порог принятия в DePool.
Инвестиционный раунд начинается с инвестирования стейков в DePool и закачивается когда DePool возвращает их обратно участникам.
Архитектура

DePool получает стейки от участников и передает средства с них валидатору, чтобы тот мог участвовать в выборах. После завершения выборов, DePool награждает участников.
DePool имеет ограниченное время принятия стейков — до истечения срока таймера Elector. Для вызова DePool используется контракт Timer.
DePool Helper запрашивает Timer периодически вызывать его и передает каждый вызов из Timer в DePool.
Чтобы валидатор мог участвовать в выборах, его кошелек должен быть привязан к DePool.
Когда Elector размораживает стейки валидатора, DePool возвращает свой стейк с вознаграждениями: 25% поступает на баланс кошелька Валидатора, 5% идет в сам DePool, а 70% распределяется между всеми Участниками инвестиционного раунда.
Последовательность действий
- Предварительное (RoundStep.Pooling) — раунд готов к приему стейков от Участников.
- Шаг «Ожидание запроса Elector`a» (RoundStep.WaitingValidatorRequest) — ожидание запроса на выборы с кошелька Валидатора.
- «Ожидание принятия стейка» (RoundStep.WaitingIfStakeAccepted) — получен запрос на выборы с кошелька Валидатора. Теперь DePool прикрепляет стейк раунда к запросу и передает ее Elector`у и ждет ответа.
- «Ожидание старта валидации» (RoundStep.WaitingValidationStart) — если стейк принят, то Валидатор стал кандидатом. Elector подсчитывает голоса, чтобы узнать, выиграл ли валидатор на выборах.
- «Ожидание результатов выборов» (RoundStep.WaitingIfValidatorWinElections) — если валидатор побеждает на выборах, Elector оставляет стейк себе (замораживает его). Если валидатор проигрывает, то стейк возвращается обратно участнику.
- «Ожидание разморозки стейка» (RoundStep.WaitingUnfreeze).
- «Ожидание вознаграждения» (RoundStep.WaitingReward) — Elector вернул стейки DePool. Теперь DePool`у нужно попросить Elector`а, чтобы тот раздал вознаграждения Участникам.
- «Завершение» (RoundStep.Completing) — после обработки всех стейков раунда DePool награждает участников.