Skip to content

golos.vesting_contract.md

Alexander Nazarov edited this page Mar 22, 2019 · 2 revisions

Смарт-контракт golos.vesting

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

Общее

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

  • создание/«сжигание» вестинга пользователем;
  • делегирование средств в виде вестинга другому пользователю;
  • начисление вестинга авторам и кураторам из пула вознаграждения;
  • пополнение пула средствами, полученными от смарт-контракта эмиссии.

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

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

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

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

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

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

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 — длительность интервала (измеряется в секундах, в первом релизе длительность интервала будет составлять одну неделю). Устанавливаемое значение должно быть больше нуля.

  1. vesting_amount — является структурой следующего вида:
struct vesting_amount : parameter {
    uint64_t min_amount;
};

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

  1. 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 — максимально допустимый процент вознаграждения за делегирование средств (получаемого от вознаграждения за курирование).

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

Экшен-операция setparams

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

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

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

Экшен-операция validateprms

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

void vesting::validateprms(
    symbol symbol,
    std::vector<vesting_params> 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; делегирование со сложными процентами, то есть с начислением процентов от процентов). Принимает одно из двух значений — «0» или «1».

Выполнение экшен-операции 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;
  • количество выделяемых для делегирования средств должно быть задано в относительном значении (насколько уменьшится по отношению к предыдущему). При этом у аккаунта to остаток средств должен быть не менее vesting_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 account,
    asset reward,
    name delegator,
    uint8_t payout_strategy
)

Параметры:
account — имя аккаунта отправителя (куратора), чьи кураторские привели к выплате делегаторам;
reward — размер вознаграждения;
delegator — имя аккаунта, получателя вознаграждения;
payout_strategy — идентификатор стратегии делегирования. Принимает одно из двух значений — «0» или «1». («0» — вознаграждение в виде токенов; «1» — вознаграждение в виде вестинга).