Контракт на вестинг
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @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
.