-
Notifications
You must be signed in to change notification settings - Fork 3
golos.vesting_contract.md
Смарт-контракт golos.vesting
обеспечивает привязку вестинга к токену, который создается смарт-контрактом cyber.token
.
Смарт-контракт golos.vesting
поддерживает следующие операции:
- создание/«сжигание» вестинга пользователем;
- делегирование средств в виде вестинга другому пользователю;
- начисление вестинга авторам и кураторам из пула вознаграждения;
- пополнение пула средствами, полученными от смарт-контракта эмиссии.
Создание (покупка) вестинга
Пользователь может хранить свои средства в виде токенов и в виде вестинга. Часть средств в виде токенов пользователь может обменять на вестинг у смарт-контракта вестинг по текущей цене.
В смарт-контракте вестинг имеется таблица, в которой хранятся данные о наличии средств в виде вестинга на балансе каждого из пользователей. При покупке вестинга передача средств (транзакция) выполняется непосредственно в токенах. Пользователь со своего баланса снимает определенное количество токенов и переводит их на счет смарт-контракта вестинга. На баланс пользователя поступает вестинг по текущей цене сразу по завершении транзакции.
«Cжигание» вестинга
Пользователь может обменять имеющиеся на его балансе средства в виде вестинга на токены (вывод вестинга в токен, от англ. withdraw) у смарт-контракта вестинг по текущей цене. Передача средств (транзакция) выполняется непосредственно в токенах. С баланса пользователя снимается сумма вестинга. По истечении определенного времени после транзакции баланс пользователя пополняется соответствующим количеством токенов. Возврат токенов может происходить в несколько этапов в зависимости от настроек смарт-контракта.
Делегирование средств в виде вестинга
Пользователь (делегатор) может часть средств в виде вестинга делегировать другому пользователю. Непосредственной передачи средств между балансами не происходит. Вносится запись о передачи права другому пользователю на использование делегированной части вестинга. Данные о распределении средств вестинга в таблице смарт-контракта корректируются.
Возврат делегированных средств
По истечении срока делегирования у получателя вестинга отзывается право на пользование делегированным вестингом. Делегированная часть вестинга переходит в «замороженное» состояние (блокируется). Делегатор может воспользоваться данной частью вестинга только после того, как она будет разблокирована.
Данные о распределении средств вестинга в таблице смарт-контракта корректируются. Если операция по возврату делегированного вестинга создается до истечения срока делегирования, делегатор может воспользоваться возвращенным вестингом не ранее установленного срока возврата делегированного.
Параметры смарт-контракта устанавливаются с использованием вызова setparams
. Каждый параметр vesting_params
— это тип «вариант», содержащий структуру одного из следующих типов:
name: vesting_param,
types: [
struct vesting_withdraw,
struct vesting_amount,
struct vesting_delegation
]
При первом вызове экшен-операции setparams
все три типа параметров передаются смарт-контракту вестинг. При повторных вызовах (для изменения настроек) может быть передан только один из трех параметров.
Параметры:
-
vesting_withdraw
— содержит параметры, которые используется для понижения вестинга, а также для конвертирования вестинга в токены. Имеет вид структуры:
struct vesting_withdraw : parameter {
uint32_t intervals;
uint32_t interval_seconds;
}
intervals
— количество интервалов. Устанавливаемое значение должно быть больше нуля.
interval_seconds
— длительность интервала (измеряется в секундах, в первом релизе длительность интервала будет составлять одну неделю). Устанавливаемое значение должно быть больше нуля.
-
vesting_amount
— является структурой следующего вида:
struct vesting_amount : parameter {
uint64_t min_amount;
};
min_amount
— задает пороговое (минимальное) значение вестина, ниже которого конвертирование его в токены не выполняется.
-
vesting_delegation
— настройка параметров делегирования. Значение является структурой следующего вида:
struct vesting_delegation : parameter {
uint64_t min_amount;
uint64_t min_remainder;
uint32_t return_time;
uint32_t min_time;
uint16_t max_interest;
}
min_amount
— минимально допустимое количество вестинга при делегировании. Делегирование вестинга ниже этого значения не выполняется.
min_remainder
— минимальный остаток делегированного. Делегирование средств, а также их уменьшение до величины ниже этого значения недопустимо. Параметр должен либо равен нулю, либо быть не меньше min_remainder
.
return_time
— время возврата делегированных средств (в секундах). Время отсчитывается с момента снятия средств с баланса аккаунта, которому они были делегированы, до момента их зачисления в кошелек делегатора.
min_time
— минимально время делегирования (в секундах). Отзыв делегированных средств возможен не ранее этого значения.
max_interest
— максимально допустимый процент вознаграждения за делегирование средств (получаемого от вознаграждения за курирование).
Экшен-операция setparams
используется для настройки параметров смарт-контракта вестинга. Экшен-операция имеет следующий вид:
void vesting::setparams(
symbol symbol,
std::vector<vesting_params> params
)
Параметры:
symbol
— идентификатор вестинга, для которого выполняются настройки (в смарт-контракте может быть несколько видов вестинга. Для каждого вида создается отдельная таблица, содержащая данные по распределению этого вида вестинга);
params
— вектор-массив из нескольких параметров. Каждый параметр имеет привязку к одному из символов вестинга и представляет собой структуру вида vesting_param .
Экшен-операция validateprms
проверяет параметры на валидность, контролирует наличие в них ошибок. Экшен-операция имеет следующий вид:
void vesting::validateprms(
symbol symbol,
std::vector<vesting_params> params
)
Параметры:
symbol
— идентификатор вестинга;
params
— вектор-массив из нескольких параметров.
Экшен-операция create
используется для создания и запуска в обращение токенов в виде вестинга. Экшен-операция имеет вид:
void vesting::create(
symbol symbol,
name notify_acc
)
Параметры:
symbol
— идентификатор создаваемого вестинга, символ связанного токена, находящегося в смарт-контракте token;
notify_acc
— имя аккаунта (смарт-контракта управления), которому будут отправляться уведомления при изменении баланса. Каждому идентификатору вестинга соответствует определенный аккаунт notify_acc
, являющийся смарт-контрактом управления. При каждом изменении баланса изменяются веса «лидеров» и в смарт-контракт управления поступает об этом уведомление;
Выполнение экшен-операции create
требует двухшаговой проверки:
- наличие права аккаунта, который является создателем токена с таким же именем как и вестинг;
- наличие подписи аккаунта создателя токена.
Дополнительно проверяется наличие ранее созданного вестинга с таким же символом. Повторное создание одноименного вестинга недопустимо.
Экшен-операция retire
используется для изъятия из оборота («сжигания») вестинга. Экшен-операция имеет следующий вид:
void vesting::retire(
asset quantity,
name user
)
Параметры:
quantity
— количество и вид «сжигаемого» вестинга. Параметр имеет вид структуры, содержащей поля:
- количество «сжигаемых» вестинг-токенов;
- символ вестинг-токена;
user
— пользователь, выполняющий действие.
По типу значения asset определяется символ вестинг-токена и, соответственно, его создатель. Значение (количество) изымаемых из оборота вестинг-токенов должно быть больше нуля, но не больше количества, находящегося на балансе пользователя, а также количества, находящегося в разблокированном состоянии.
Экшен-операции retire
и create
аналогичны операциям смарт-контракта token. Отличие в том, что вестинг-токен – это токен для долей и не используется в качестве криптовалюты.
Для выполнения данной операции требуются права аккаунта, выпустившего данный вестинг-токен. Инициировать изъятие из оборота вестинг-токенов может только его издатель.
Экшен-операция unlocklimit
используется для ограничения «сжигаемой» смарт-контрактом части вестинга с баланса аккаунта. Пользователь может разрешить смарт-контракту изымать («сжигать») определенную часть вестинга со своего баланса (например, при «сжигании» вестинга за покупку ресурсов bandwidth
). Выделенная пользователем часть вестинга для «сжигания» должна быть предварительно разблокирована. Экшен-операция имеет следующий вид:
void vesting::unlock_limit(
name owner,
asset quantity
)
Параметры:
owner
— имя аккаунта, который разблокирует и дает разрешение на «сжигание» вестинга со своего баланса;
quantity
— количество вестинга, предназначенное для «сжигания» и находящееся в разблокированном состоянии. Указанное количество должно быть больше нуля, либо равно нулю. Нулевое количество означает запрет на «сжигание».
Для выполнения данной операции требуется подпись аккаунта owner
.
Экшен-операция withdraw
используется для конвертации количества вестинга в количество токенов. Экшен-операция имеет вид:
void vesting::withdraw(
name from,
name to,
asset quantity
)
Параметры:
from
— имя аккаунта, запустившего процесс конвертации.В процессе конвертации с баланса данного аккаунта снимается сумма средств в вестинге;
to
— имя аккаунта, на баланс которого зачисляется сумма средств в токенах;
quantity
— количество средств, выделенных для конвертации.
Для выполнения данной экшен-операции требуется подпись аккаунта from
.
Конвертация может быть выполнена как между разными аккаунтами, так и между одним и тем же аккаунтом. Конвертация выполняется не мгновенно, а за определенное количество шагов (действий), длительность каждого из которых устанавливается экшен-операцией setparams
(по умолчанию длительность одного шага устанавливается равным одной неделе, а длительность всего процесса (всех шагов) конвертации — 13 недель). Конвертация вестинга в токены выполняется равными долями. Конвертация разными долями не допускается (например, на первом шаге установить одно количество вестинга, на последующем шаге — другое).
При повторном вызове экшен-операции convert
результаты предыдущей конвертации отменяются и устанавливаются новые доли и новый баланс в соответствии с актуальным курсом вестинга и токена. В процессе конвертации периодически вызываются внутренние экшен-операции для проверки начала выплаты очередной доли и проведения текущей выплаты.
Ограничения:
- Конвертироваться может только та часть средств, которая не является делегированной. То есть те токены, которые были зачислены на баланс от операции делегирования, не могут быть задействованы в конвертации, так как эти средства должны быть возвращены по завершении делегирования.
- Для конвертирования вестинга устанавливается минимально допустимое значение —
min_amount
, ниже которого конвертирование вестинга в токены не выполняется.
Экшен-операция stopwithdraw
используется для отмены запущенного процесса конвертации вестинга в токены. Экшен-операция имеет вид:
void vesting::stopwithdraw(
name owner,
symbol symbol
)
Параметры:
owner
— имя аккаунта, запустившего процесс конвертации;
symbol
— параметр, определяющий тип вестинга, для которого отменяется процесс конвертации (конвертирование может выполняться по каждому типу вестинга в отдельности и поэтому отдельный вызов stopwithdraw
может отменить только один отдельный процесс).
Для выполнения данной экшен-операции требуется подпись аккаунта owner
.
После запуска экшен-операция stopwithdraw
сразу прекращаются выплаты платежей за конвертирование.
Экшен-операция delegate
используется для делегирования средств в виде вестинга. Экшен-операция имеет вид:
void vesting::delegate(
name from,
name to,
asset quantity,
uint16_t interest_rate,
uint8_t payout_strategy
)
Параметры:
from
— имя аккаунта, запустившего процесс делегирования вестинга. Со счета этого аккаунта будет снята сумма средств в вестинге;
to
— имя аккаунта, которому делегируются средства. На счет этого аккаунта будет зачислена сумма средств в вестинге. Эта сумма средств возвратная и по завершении срока делегирования будет возвращена аккаунту from
;
quantity
— количество выделяемых для делегирования средств;
interest_rate
— процент выплаты аккаунту from
от доходов аккаунта to
за курирование;
payout_strategy
— идентификатор стратегии делегирования (варианты делегирования: делегирование средств с последующим их возвратом на счет аккаунта from
; делегирование со сложными процентами, то есть с начислением процентов от процентов). Принимает одно из двух значений — «0» или «1».
Выполнение экшен-операции delegate
требует подписи аккаунта from
.
Ограничения:
- имена аккаунтов в параметрах
from
иto
должны быть различными (если пользователь имеет два и более аккаунтов, то делегирование между ними допускается); - количество выделяемых для делегирования средств должно быть не меньше минимального значения, установленного в параметрах смарт-контракта при вызове
setparams
; - процент выплаты
interest_rate
не должен превышать максимального значения выплаты за делегирование, установленного в параметрах смарт-контракта при вызовеsetparams
; - при повторном вызове экшен-операции
delegate
для одной и той же парыfrom
иto
, с одним и тем же символом вестинга, недопустимо:- изменять стратегию делегирования;
- изменять процент выплаты
interest_rate
;
- токены, выделенные на конвертацию вестинга, остаются заблокированными и не могут быть выделены на делегирование.
Экшен-операция undelegate
используется для частичного или полного возврата делегированных средств. Экшен-операция имеет вид:
void vesting::undelegate(
name from,
name to,
asset quantity
)
Параметры:
from
— имя аккаунта, запустившего процесс делегирования вестинга;
to
— имя аккаунта, которому делегируются средства;
quantity
— количество средств, получаемых с делегирования. Значение должно быть больше нуля.
Экшен-операции undelegate
требует выполнение следующих условий:
- наличие подписи аккаунта
from
; - наличие объекта делегирования, то есть необходим факт предшествующего делегирования между отправителем и получателем., На балансе аккаунта
to
должны находиться средства, делегированные аккаунтомfrom
; - количество выделяемых для делегирования средств должно быть задано в относительном значении (насколько уменьшится по отношению к предыдущему). При этом у аккаунта
to
остаток средств должен быть не менееvesting_delegation.min_remainder
; - средства не могут быть возвращены раньше даты, установленной на аккаунте при делегировании;
- сумма возвращаемых средств на баланс аккаунта
from
не должна превышать сумму делегированных им средств.
Средства на баланс аккаунта from
возвращаются не сразу, а по истечении определенного срока (по умолчанию этот период составляет семь суток). Этот период может быть изменен и установлен в параметрах смарт-контракта при вызове setparams
.
Экшен-операции timeoutrdel
, timeoutconv
и timeout
относятся к внутренним операциям и вызываются смарт-контрактом для проверки:
- наступления момента конвертирования средств из вестинга в токены;
- наступления момента возврата делегированного.
Сигнатура данных экшен-операций имеет вид:
void vesting::timeoutrdel()
void vesting::timeoutconv()
void vesting::timeout()
Пользователю вызов данных экшен-операций недоступен.
Экшен-операция open
используется для создания в БД записи для хранения баланса пользователя. Пользователь может открыть запись как для себя, так и для другого аккаунта. Экшен-операция имеет вид:
void vesting::open(
name owner,
symbol symbol,
name ram_payer
)
Параметры:
owner
— имя аккаунта, владельца записи;
symbol
— параметр, однозначно определяющий вид вестинга;
ram_payer
— имя аккаунта, который подписывает транзакцию и оплачивает использование RAM.
Транзакция должна быть подписана аккаунтом ram_payer
.
Экшен-операция close
используется для освобождения памяти, занимаемой записью. Экшен-операция имеет вид:
void vesting::close(
name owner,
symbol symbol
)
Параметры:
owner
— имя аккаунта, владельца записи;
symbol
— параметр, однозначно определяющий вид вестинга.
Транзакция должна быть подписана аккаунтом owner
.
Для выполнения экшен-операции требуется, чтобы баланс всего вестинга, в том числе делегированного, был нулевым.
Экшен-операция paydelegator
является системной, вызывается смарт-контрактом публикации (posting). Смарт-контракт постинг не может вносить изменения в таблицы смарт-контракта вестинг. Поэтому при закрытии поста смарт-контракт постинг вызывает paydelegator
и через него проводит выплаты делегаторам. Экшен-операция paydelegator
имеет вид:
void vesting::paydelegator(
name account,
asset reward,
name delegator,
uint8_t payout_strategy
)
Параметры:
account
— имя аккаунта отправителя (куратора), чьи кураторские привели к выплате делегаторам;
reward
— размер вознаграждения;
delegator
— имя аккаунта, получателя вознаграждения;
payout_strategy
— идентификатор стратегии делегирования. Принимает одно из двух значений — «0» или «1». («0» — вознаграждение в виде токенов; «1» — вознаграждение в виде вестинга).