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

Контракт на вестинг

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.

Этот контракт позволяет вам заблокировать определенное количество Toncoin на определенное время и постепенно разблокировать их.

Параметры вестинга

Параметры вестинга не изменяются и устанавливаются во время развертывания.

vesting_total_amount - в nanoton, общее количество заблокированных Toncoin.

vesting_start_time - unixtime, начальная точка периода вестинга, до этого момента vesting_total_amount заблокирован, после этого он начинает разблокироваться в соответствии с другими параметрами.

vesting_total_duration - общая продолжительность вестинга в секундах (например, 31104000 на один год).

unlock_period - период разблокировки в секундах (например, 2592000 один раз в месяц).

cliff_duration - начальный период без разблокировки в секундах (например, 5184000 на 2 месяца).

vesting_sender_address - адрес, на который вы можете вернуть Toncoin (даже если они заблокированы) в любое время; также этот адрес может добавить белый список.

owner_address - тот, кому был выдан вестинг, с этого адреса он может инициировать отправку Toncoin из контракта вестинга.

Вы можете получить эти параметры с помощью метода get_vesting_data() get-method.

Параметры должны удовлетворять следующим условиям:

vesting_total_duration > 0
vesting_total_duration <= 135 years (2^32 seconds)
unlock_period > 0
unlock_period <= vesting_total_duration
cliff_duration >= 0
cliff_duration < vesting_total_duration
vesting_total_duration mod unlock_period == 0
cliff_duration mod unlock_period == 0

Хотя смарт-контракт не проверяет соответствие этим условиям, после развертывания контракта и перед отправкой ему Toncoin пользователь может проверить, что все параметры в порядке, с помощью метода get-method.

Блокировка

До vesting_start_time все vesting_total_amount заблокированы.

Начиная с vesting_start_time сумма начинает пропорционально разблокироваться.

Например, если vesting_total_duration составляет 10 месяцев, а unlock_period - 1 месяц, а vesting_total_amount - 500 TON, то каждый месяц будет разблокироваться 500*(10/100)=50 TON, и через 10 месяцев будут разблокированы все 500 TON.

Если есть период без разблокировки, в течение этого периода ничего не разблокируется, а после его окончания сумма разблокируется в соответствии с приведенной выше формулой.

Например, если cliff_period составляет 3 месяца, а другие параметры такие же, как в предыдущем примере, то первые 3 месяца ничего не будет разблокировано, а через 3 месяца сразу будет разблокировано 150 TON (а затем по 50 TON каждый месяц).

Метод получения get_locked_amount(int at_time) позволяет рассчитать, сколько будет заблокировано в определенный момент времени.

Вы можете отправлять заблокированные Toncoin только на адреса из белого списка или vesting_sender_address.

Вы можете отправлять разблокированные Toncoin когда и куда захотите.

Белый список

Белый список — это список адресов, на которые вы можете отправлять Toncoin, даже если монеты все еще заблокированы.

Метод получения get_whitelist() возвращает все адреса из белого списка в виде списка кортежей (wc, hash_part).

Метод получения is_whitelisted(slice address) проверяет, находится ли этот адрес в белом списке.

vesting_sender_address может добавлять новые адреса в белый список в любое время с помощью сообщения op::add_whitelist.

Невозможно удалить адрес из белого списка.

Кроме того, заблокированные монеты всегда можно отправлять на vesting_sender_address (их не нужно отдельно добавлять в белый список).

Пополнение

Вы можете отправлять Toncoin в контракт вестинга с любого адреса.

Смарт-контракт кошелька

Этот контракт разработан аналогично стандартному смарт-контракту кошелька V3.

В своих данных он хранит seqno, subwallet_id, public_key и принимает внешние сообщения того же формата.

Доступны методы получения seqno(), get_subwallet_id() и get_public_key().

В отличие от стандартного кошелька, контракт вестинга позволяет отправлять только одно сообщение за раз.

Отправка

Владелец открытого ключа может инициировать отправку Toncoin из контракта вестинга внешним сообщением, как в стандартных кошельках.

Отправка Toncoin также может быть инициирована внутренним сообщением op::send, отправленным с owner_address.

На практике и открытый ключ, и owner_address принадлежат одному и тому же пользователю.

Ограничения в отношении белого списка

Сообщения, которые можно отправлять на vesting_sender_address, имеют следующие ограничения:

  • разрешен только send_mode == 3;

В большинстве случаев адреса добавляются в белый список, чтобы позволить пользователю выполнять проверку с помощью заблокированных монет или закладывать заблокированные монеты в пулы.

Чтобы избежать кражи Toncoin, сообщения, которые можно отправлять в белый список, имеют следующие ограничения:

  • разрешен только send_mode == 3;

  • разрешены только сообщения с возможностью возврата;

  • не разрешено вложение state_init;

Если пункт назначения — адрес системного избирателя:

  • разрешены только операции op::elector_new_stake, op::elector_recover_stake, op::vote_for_complaint, op::vote_for_proposal;

Если пункт назначения — адрес системной конфигурации:

  • разрешена только операция op::vote_for_proposal;

Для других пунктов назначения:

  • разрешены пустые сообщения и пустые текстовые сообщения;
  • разрешены текстовые сообщения, начинающиеся только с "d", "w", "D", "W";
  • разрешены операции op::single_nominator_pool_withdraw, op::single_nominator_pool_change_validator, op::ton_stakers_deposit, op::jetton_burn, op::ton_stakers_vote, op::vote_for_proposal, op::vote_for_complaint;

Нет ограничений на адреса, не включенные в белый список.

Никаких ограничений не применяется при отправке разблокированных Toncoin, даже если мы отправляем в белый список или vesting_sender_address.

Структура проекта

  • contracts - исходный код всех смарт-контрактов проекта и их зависимостей.
  • wrappers - классы-обертки (реализующие Contract из ton-core) для контрактов, включая любые примитивы [де]сериализации и функции компиляции.
  • tests - тесты для контрактов.
  • scripts - скрипты, используемые проектом, в основном скрипты развертывания.

Как использовать

Сборка

npx blueprint build или yarn blueprint build.

Тестирование

npx blueprint test или yarn blueprint test.

Развертывание или запуск другого скрипта

npx blueprint run или yarn blueprint run.

Добавить новый контракт

npx blueprint create ContractName или yarn blueprint create ContractName.

См. также