|
| 1 | +# Vesting — linear time-based vesting (Aptos Move) |
| 2 | + |
| 3 | +**Модуль:** `Vesting::vesting` |
| 4 | +**Статус:** компилируется; CI зелёный; есть юнит-тесты |
| 5 | +**Юзкейсы:** эмиссия и разлок токенов по времени, тим-вестинг, инвест-расписания |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +## Идея |
| 10 | +Простейший вестинг с **линейным разлоком** между `[start, end]`. Денежной логики тут нет — это **учётная модель**: всё считается во внутренних числовых балансах (u64), чтобы было легко интегрировать в реальный токен позже. |
| 11 | + |
| 12 | +Формула: |
| 13 | +vested(now) = |
| 14 | +0, if now <= start |
| 15 | +total, if now >= end |
| 16 | +floor(total * (now-start) / (end-start)), otherwise |
| 17 | + |
| 18 | +claimable(now) = vested(now) - already_claimed |
| 19 | + |
| 20 | +## Данные |
| 21 | +- `struct Schedule { ben: address, total: u64, start: u64, end: u64, claimed: u64, active: bool }` |
| 22 | +- `vector<Schedule>` — хранится под адресом админа (инициатора) |
| 23 | +- Внутренние «балансы» по адресам для демо-учёта: `view_balance(admin_addr, owner) -> u64` |
| 24 | + |
| 25 | +--- |
| 26 | + |
| 27 | +## Публичный API (entries) |
| 28 | +- `entry init(admin: &signer)` |
| 29 | + - Однократная инициализация хранилища под `address_of(admin)`. |
| 30 | + |
| 31 | +- `entry create(admin: &signer, ben: address, total: u64, start: u64, end: u64)` |
| 32 | + - Добавляет расписание. Первый созданный идёт под `id = 0`, далее по инкременту. |
| 33 | + - Валидация времени: `start < end`. |
| 34 | + |
| 35 | +- `entry claim(ben: &signer, admin_addr: address, id: u64, now: u64)` |
| 36 | + - Клеймит дельту `claimable(now)` для расписания `id` и увеличивает внутренний баланс бенефициара. |
| 37 | + - Проверяет, что `ben` == назначенный бенефициар. |
| 38 | + |
| 39 | +- `fun view_balance(admin_addr: address, owner: address): u64` |
| 40 | + - Возвращает внутренний «накопленный» баланс адреса в рамках хранилища `admin_addr`. |
| 41 | + |
| 42 | +> ⚠️ Денежные переводов нет — это осознанно. В реальном проекте сюда можно подвязать `Coin`/трансфер NFT или экспортировать учтённую величину в другой модуль. |
| 43 | +
|
| 44 | +--- |
| 45 | + |
| 46 | +## Errors (major) |
| 47 | +- creation with an invalid time (e.g., `start >= end`) |
| 48 | +- labels non-beneficiary |
| 49 | +- accessing a non-existent schedule/uninitialized storage |
| 50 | + |
| 51 | +--- |
| 52 | + |
| 53 | +## Unit tests (`tests/vesting_tests.move`) |
| 54 | +- **Линейный разлок**: последовательные клеймы увеличивают баланс до `total`. |
| 55 | +- **Bad time**: создание с неправильным временем падает. |
| 56 | +- **Wrong beneficiary**: клейм не тем адресом падает. |
| 57 | + |
| 58 | +--- |
| 59 | + |
| 60 | +## Quick start (локально) |
| 61 | + |
| 62 | +```bash |
| 63 | +cd vesting |
| 64 | +aptos move compile |
| 65 | +aptos move test --filter . |
0 commit comments