Вестинг-токены

Назначение смарт-контракта golos.vesting

Смарт-контракт golos.vesting обеспечивает привязку вестинга к токену, который создается смарт-контрактом cyber.token.

Общее

Смарт-контракт golos.vesting поддерживает следующие операции:

  • создание/«сжигание» вестинга пользователем;

  • делегирование средств в виде вестинга другому пользователю;

  • начисление вестинга авторам и кураторам из пула вознаграждения;

  • пополнение пула средствами, полученными от смарт-контракта эмиссии.

Создание (покупка) вестинга Пользователь может хранить свои средства в виде токенов и в виде вестинга. Часть средств в виде токенов пользователь может обменять на вестинг у смарт-контракта вестинг по текущей цене. В смарт-контракте вестинг имеется таблица, в которой хранятся данные о наличии средств в виде вестинга на балансе каждого из пользователей. При покупке вестинга передача средств (транзакция) выполняется непосредственно в токенах. Пользователь со своего баланса снимает определенное количество токенов и переводит их на счет смарт-контракта вестинга. На баланс пользователя поступает вестинг по текущей цене сразу по завершении транзакции.

Вывод вестинга Пользователь может обменять имеющиеся на его балансе средства в виде вестинга на токены (вывод вестинга в токен, от англ. withdraw) у смарт-контракта вестинг по текущей цене. Передача средств (транзакция) выполняется непосредственно в токенах. С баланса пользователя снимается сумма вестинга. По истечении определенного времени после транзакции баланс пользователя пополняется соответствующим количеством токенов. Возврат токенов может происходить в несколько этапов в зависимости от настроек смарт-контракта.

Делегирование средств в виде вестинга Пользователь (делегатор) может часть средств в виде вестинга делегировать другому пользователю. Непосредственной передачи средств между балансами не происходит. Вносится запись о передачи права другому пользователю на использование делегированной части вестинга. Данные о распределении средств вестинга в таблице смарт-контракта корректируются.

Возврат делегированных средств По истечении срока делегирования у получателя вестинга отзывается право на пользование делегированным вестингом. Делегированная часть вестинга переходит в «замороженное» состояние (блокируется). Делегатор может воспользоваться данной частью вестинга только после того, как она будет разблокирована. Данные о распределении средств вестинга в таблице смарт-контракта корректируются. Если операция по возврату делегированного вестинга создается до истечения срока делегирования, делегатор может воспользоваться возвращенным вестингом не ранее установленного срока возврата делегированного.

Параметры, устанавливаемые в смарт-контракте golos.vesting

Параметры смарт-контракта устанавливаются с использованием вызова setparams. Каждый параметр vesting_param — это тип «вариант», содержащий структуру одного из следующих типов:

name: vesting_param,
    types: [
        struct vesting_withdraw,
        struct vesting_amount,
        struct vesting_delegation
]

При первом вызове операции-действия setparams все три типа параметров передаются смарт-контракту вестинг. При повторных вызовах (для изменения настроек) разрешается передавать не все параметры.

Параметры: 1) vesting_withdraw — содержит параметры, которые используется для вывода вестинга в токены (конвертирования, «понижения»). Имеет вид структуры:

struct vesting_withdraw : parameter {
    uint32_t intervals;
    uint32_t interval_seconds;
}
  • intervals — количество интервалов. Устанавливаемое значение должно быть больше нуля.

  • interval_seconds — длительность интервала (измеряется в секундах, в первом релизе длительность интервала будет составлять одну неделю). Устанавливаемое значение должно быть больше нуля.

2) vesting_amount — является структурой следующего вида:

struct vesting_amount : parameter {
    uint64_t min_amount;
};
  • min_amount — задает пороговое (минимальное) значение вестина, ниже которого конвертирование его в токены не выполняется.

3) vesting_delegation — настройка параметров делегирования. Значение является структурой следующего вида:

struct vesting_delegation : parameter {
    uint64_t min_amount;
    uint64_t min_remainder;
    uint32_t return_time;
    uint32_t min_time;
}
  • min_amount — минимально допустимое количество вестинга для делегирования/возврата делегированного. Изменение делегированного вестинга на величину меньше этого значения не выполняется.

  • min_remainder — минимальный остаток делегированного. Недопустимо делегировать меньше этого значения. В результате возврата делегированного, остаток должен быть не менее этого значения, либо должен быть нулевым.

  • return_time — время возврата делегированных средств (в секундах). Время отсчитывается с момента снятия средств с баланса аккаунта, которому они были делегированы, до момента их зачисления на баланс делегатора.

  • min_time — минимальное время делегирования (в секундах). Отзыв делегированных средств возможен не ранее этого значения.

Операции-действия, применяемые в смарт-контракте golos.vesting

В смарт-контракте golos.vesting реализованы следующие операции-действия: setparams, validateprms, create, retire, unlocklimit, withdraw, stopwithdraw, delegate, undelegate, timeoutrdel, timeoutconv, timeout, open, close, paydelegator.

setparams

Операция-действие setparams используется для настройки параметров смарт-контракта вестинга. Операция-действие имеет следующий вид:

void vesting::setparams(
    symbol symbol,
    std::vector<vesting_param> params
)

Параметры:

  • symbol — идентификатор вестинга, для которого выполняются настройки (в смарт-контракте может быть несколько видов вестинга. Для каждого вида создается отдельная таблица, содержащая данные по распределению этого вида вестинга);

  • params — вектор-массив из нескольких параметров. Каждый параметр имеет привязку к одному из символов вестинга и представляет собой структуру вида vesting_param .

Примечание: порядок параметров в params важен: параметры должны передаваться в том же порядке, как описаны в vesting_param, при этом допускается передавать не все параметры. Это правило действует в setparams во всех контрактах.

validateprms

Операция-действие validateprms проверяет параметры на валидность, контролирует наличие в них ошибок. Операция-действие имеет следующий вид:

void vesting::validateprms(
    symbol symbol,
    std::vector<vesting_param> params
)

Параметры:

  • symbol — идентификатор вестинга;

  • params — вектор-массив из нескольких параметров.

create

Операция-действие create используется для создания и запуска в обращение токенов в виде вестинга. Операция-действие имеет вид:

void vesting::create(
    symbol symbol,
    name notify_acc
)

Параметры:

  • symbol — идентификатор создаваемого вестинга, символ связанного токена, находящегося в смарт-контракте token;

  • notify_acc — имя аккаунта (смарт-контракта управления), которому будут отправляться уведомления при изменении баланса. Каждому идентификатору вестинга соответствует определенный аккаунт notify_acc, являющийся смарт-контрактом управления. При каждом изменении баланса изменяются веса «лидеров», для этого в смарт-контракт управления поступает уведомление.

Выполнение операции-действия create требует двухшаговой проверки: 1) наличие права аккаунта, который является создателем токена с таким же именем как и вестинг; 2) наличие подписи аккаунта создателя токена.

Дополнительно проверяется наличие ранее созданного вестинга с таким же символом. Повторное создание одноименного вестинга недопустимо.

retire

Операция-действие retire используется для изъятия из оборота («сжигания») вестинга. Операция-действие имеет следующий вид:

void vesting::retire(
    asset quantity,
    name user
)

Параметры:

  • quantity — количество и вид «сжигаемого» вестинга. Параметр имеет вид структуры, содержащей поля:

    • количество «сжигаемых» вестинг-токенов;

    • символ вестинг-токена;

  • user — пользователь, выполняющий действие.

По типу значения asset определяется символ вестинг-токена и, соответственно, его создатель. Значение (количество) изымаемых из оборота вестинг-токенов должно быть больше нуля, но не больше количества, находящегося на балансе пользователя, а также количества, находящегося в разблокированном состоянии.

Операции-действия retire и create аналогичны операциям смарт-контракта token. Отличие в том, что вестинг-токен – это токен для долей и не используется в качестве криптовалюты.

Для выполнения данной операции требуются права аккаунта, выпустившего данный вестинг-токен. Инициировать изъятие из оборота вестинг-токенов может только его издатель.

unlocklimit

Операция-действие unlocklimit используется для ограничения «сжигаемой» смарт-контрактом части вестинга с баланса аккаунта. Пользователь может разрешить смарт-контракту изымать («сжигать») определенную часть вестинга со своего баланса (например, при «сжигании» вестинга за покупку ресурсов bandwidth). Выделенная пользователем часть вестинга для «сжигания» должна быть предварительно разблокирована. Операция-действие имеет следующий вид:

void vesting::unlock_limit(
    name owner,
    asset quantity
)

Параметры:

  • owner — имя аккаунта, который разблокирует и дает разрешение на «сжигание» вестинга со своего баланса;

  • quantity — количество вестинга, предназначенное для «сжигания» и находящееся в разблокированном состоянии. Указанное количество должно быть больше нуля, либо равно нулю. Нулевое количество означает запрет на «сжигание».

Для выполнения данной операции требуется подпись аккаунта owner.

withdraw

Операция-действие withdraw используется для вывода (конвертации) вестинга в токен. Операция-действие имеет вид:

void vesting::withdraw(
    name from,
    name to,
    asset quantity
)

Параметры:

  • from — имя аккаунта, запустившего процесс вывода. В процессе вывода с баланса данного аккаунта снимается сумма средств в вестинге;

  • to — имя аккаунта, на баланс которого зачисляется сумма средств в токенах;

  • quantity — количество средств, выделенных для вывода (конвертации).

Для выполнения данной операции требуется подпись аккаунта from.

Конвертация может быть выполнена как между разными аккаунтами, так и между одним и тем же аккаунтом. Конвертация выполняется не мгновенно, а за определенное количество шагов (действий), длительность каждого из которых устанавливается операцией-действием setparams(по умолчанию длительность одного шага устанавливается равным одной неделе, а длительность всего процесса (всех шагов) конвертации — 13 недель). Конвертация вестинга в токены выполняется равными долями. Конвертация разными долями не допускается (например, на первом шаге установить одно количество вестинга, на последующем шаге — другое).

При повторном вызове операции-действия convert результаты предыдущей конвертации отменяются и устанавливаются новые доли и новый баланс в соответствии с актуальным курсом вестинга и токена. В процессе конвертации периодически вызываются внутренние операции-действия для проверки начала выплаты очередной доли и проведения текущей выплаты.

Ограничения:

  • Конвертироваться может только та часть средств, которая не является делегированной. То есть

    • вестинг, который был зачислен на баланс от операции делегирования, не может быть задействован в конвертации, так как эти средства должны быть возвращены по завершении делегирования;

    • вестинг, помеченный как переданный в делегирование, не может быть конвертирован пока не будет возвращён.

  • Для конвертирования вестинга устанавливается минимально допустимое значение — min_amount, ниже которого конвертирование вестинга в токены не выполняется.

stopwithdraw

Операция-действие stopwithdraw используется для отмены запущенного процесса конвертации вестинга в токены. Операция-действие имеет вид:

void vesting::stopwithdraw(
    name owner,
    symbol symbol
)

Параметры:

  • owner — имя аккаунта, запустившего процесс конвертации;

  • symbol — параметр, определяющий тип вестинга, для которого отменяется процесс конвертации (конвертирование может выполняться по каждому типу вестинга в отдельности и поэтому отдельный вызов stopwithdraw может отменить только один отдельный процесс).

Для выполнения данной операции требуется подпись аккаунта owner. После запуска операции stopwithdraw сразу прекращаются выплаты платежей за конвертирование.

delegate

Операция-действие 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(to_delegator); делегирование, при котором вознаграждения от курирования прибавляются к делегированным средствам — со сложными процентами, то есть с начислением процентов от процентов (to_delegated_vesting)). Принимает одно из двух значений: «0» — to_delegator или «1» — to_delegated_vesting.

Выполнение операции-действия delegate требует подписи аккаунта from.

Ограничения:

  • имена аккаунтов в параметрах from и to должны быть различными (если пользователь имеет два и более аккаунтов, то делегирование между ними допускается);

  • количество выделяемых для делегирования средств должно быть не меньше минимального значения, установленного в параметрах смарт-контракта при вызове setparams;

  • процент выплаты interest_rate не должен превышать максимального значения выплаты за делегирование, установленного в параметрах смарт-контракта при вызове setparams;

  • при повторном вызове операции-действия delegate для одной и той же пары from и to, с одним и тем же символом вестинга, недопустимо:

    • изменять стратегию делегирования;

    • изменять процент выплаты interest_rate;

  • токены, выделенные на конвертацию вестинга, остаются заблокированными и не могут быть выделены на делегирование.

undelegate

Операция-действие undelegate используется для частичного или полного возврата делегированных средств. Операция-действие имеет вид:

void vesting::undelegate(
    name from,
    name to,
    asset quantity
)

Параметры:

  • from — имя аккаунта, запустившего процесс делегирования вестинга;

  • to — имя аккаунта, которому были делегированы средства;

  • quantity — количество средств, получаемых с делегирования. Значение должно быть больше нуля.

Операция-действие undelegate требует выполнение следующих условий:

  • наличие подписи аккаунта from;

  • наличие объекта делегирования, то есть необходим факт предшествующего делегирования между отправителем и получателем. На балансе аккаунта to должны находиться средства, делегированные аккаунтом from;

  • количество выделяемых для делегирования средств должно быть задано в относительном значении (насколько уменьшится по отношению к предыдущему). При этом остаток средств, делегированных аккаунтом from аккаунту to, должен быть не менее delegation.min_remainder;

  • средства не могут быть возвращены раньше даты, установленной на аккаунте при делегировании;

  • сумма возвращаемых средств на баланс аккаунта from не должна превышать сумму делегированных им средств.

Средства на баланс аккаунта from возвращаются не сразу, а по истечении определенного срока (по умолчанию этот период составляет семь суток). Этот период может быть изменен и установлен в параметрах смарт-контракта при вызове setparams.

timeoutrdel, timeoutconv, timeout

Операции-действия timeoutrdel, timeoutconv и timeout относятся к внутренним операциям и вызываются смарт-контрактом для проверки:

  • наступления момента конвертирования средств из вестинга в токены;

  • наступления момента возврата делегированного.

Сигнатура данных операций имеет вид:

void vesting::timeoutrdel()
void vesting::timeoutconv()
void vesting::timeout()

Пользователю вызов данных операций недоступен.

open

Операция-действие open используется для создания в БД записи для хранения баланса пользователя. Пользователь может открыть запись как для себя, так и для другого аккаунта. Операция-действие имеет вид:

void vesting::open(
    name owner,
    symbol symbol,
    name ram_payer
)

Параметры:

  • owner — имя аккаунта, владельца записи;

  • symbol — параметр, однозначно определяющий вид вестинга;

  • ram_payer — имя аккаунта, который подписывает транзакцию и оплачивает использование RAM.

Транзакция должна быть подписана аккаунтом ram_payer.

close

Операция-действие close используется для освобождения памяти, занимаемой записью. Операция-действие имеет вид:

void vesting::close(
    name owner,
    symbol symbol
)

Параметры:

  • owner — имя аккаунта, владельца записи;

  • symbol — параметр, однозначно определяющий вид вестинга.

Транзакция должна быть подписана аккаунтом owner. Для выполнения операции-действия требуется, чтобы баланс всего вестинга, в том числе делегированного, был нулевым.

paydelegator

Операция-действие paydelegator является системной, вызывается смарт-контрактом публикации (posting). Смарт-контракт постинг не может вносить изменения в таблицы смарт-контракта вестинг. Поэтому при закрытии поста смарт-контракт постинг вызывает paydelegator и через него проводит выплаты делегаторам. Операция-действие paydelegator имеет вид:

void vesting::paydelegator(
    name voter,
    asset reward,
    name delegator,
    uint8_t payout_strategy
)

Параметры:

  • voter — имя аккаунта отправителя (куратора), чьи кураторские привели к выплате делегаторам;

  • reward — размер вознаграждения;

  • delegator — имя аккаунта, получателя вознаграждения;

  • payout_strategy — идентификатор стратегии делегирования. Принимает одно из двух значений — «0» или «1». («0» — вознаграждение в виде токенов; «1» — вознаграждение в виде вестинга).

Last updated