Написать solana-программу на Rust: платформа для сбора пожертвований в виде нативной валюты (в лампортах). Описание:
- Все кампании по сбору бессрочные, но инициатор может остановить кампанию(и получить задоначенные SOL).
- У проекта есть свой собственный токен CHRT, которым поощряют пользователей(рефереров) привлекающих жертвователей(рефералов).
- Также не чаще чем раз в период N владелец платформы может наградить ТОП-3 жертвователей CHRT-токеном.
- Минт токена принадлежит платформе; децимал - 3.
- Создателю платформы полагается некоторая комиссия с каждого перевода.
- Владельцы CHRT могут внести свои токены в сбор пожертвований, и при определённом количестве внесённых CHRT-токенов, в этом сборе не будет взиматься комиссия владельца платформы. Освобождение от комиссии происходит для всех последующих пожертвований, после того как достигнут лимит CHRT-токена для кампании по сбору.
- Также с помощью CHRT-токена сообщество может закрыть кампанию по сбору; в этом случае собранные SOL распределяются между активными кампаниями по сбору, соразмерно размеру их текущего сбора.
- Длительность периода N, размер комиссии, размер поощрения CHRT-токеном для топовых донатеров, лимит CHRT-токенов для освобождения от комиссии и лимит CHRT-токенов для закрытия указываются при инициализации(и более не меняются).
Основной функционал
- Инициировать новый сбор пожертвований.
- Внести пожертвование; при вносе пожертвования жертвователь может указать адрес своего “реферера”. Рефереру начисляется CHRT-токены пропорционально от суммы пожертвования. Пропорция 1:101, за один SOL начисляется 101 СHRT.
- Вывести пожертвования на кошелёк инициатора пожертвования.
- Владелец выводит накопившуюся комиссию.
- Владелец награждает топ-3 донатеров (топ-3 всей платформы).
- Инициатор останавливает сбор пожертвований.
- Перевести CHRT-токен в какую-либо из кампаний по сбору пожертвований, чтобы закрыть сбор. Переведённые CHRT-токены повторно не используются.
- Перевести CHRT-токен в какую-либо из кампаний по сбору пожертвований, чтобы освободить сбор от комиссии. Переведённые CHRT-токены повторно не используются.
Особенности.
- В любой момент доступны данные о суммарном количестве пожертвований любого жертвователя в любую конкретную кампанию по сбору пожертвований.
- В любой момент доступны данные по ТОП-10 жертвователей на всей платформе и ТОП-3 в каждую из компаний.
- В любой момент доступны данные о сумме всех пожертвований платформы и о сумме собранной в каждой кампании(и активной и уже нет); общая сумма комиссии не уплаченная владельцу(а пошедшая в пожертвования) и общая сумма “перераспределённых” сообществом пожертвований.
- При награждении ТОП-3 донатеров, награждать за “одни и те же пожертвования” нельзя. Чтобы избежать ситуации, когда сформировался пул лидеров и они из раза в раз получают CHRT-токены. При награждении учитываются только “ещё не отмеченные” пожертвования.
- Технические ограничения на размер аккаунтов(а значит, в какой-то степени, и всей платформы) должны быть отданы на выбор владельцу платформы: этот момент должен быть параметризован, а не захардкожен.
- В случае если, при выполнении инструкций, вы столкнетёсь с непреодолимыми ограничениями рантайма соланы – укажите это в readme, и соответствующе прокомментируйте (допустимые)параметры в коде. —--------------------------------------------------------------------------------- Чек лист.
- программа написана на Anchor
- программа задеплоенна в test/dev, есть минималистичный клиент для проверки(не обязательно браузерный и даже cli, можно просто скрипт воспроизводящий определённый сценарий).
- есть скрипт деплоя, для защиты от перехвата owner’ства. Никакого хардкода адресов. всё что должно вычисляться на БЧ – вычисляется на БЧ; смарт-контракт это непредвзятая “третья сторона”, которой должны мочь доверять все участники. должны быть errors, в тех местах, где может “поломаться”; программа может упасть с солановской ошибкой, с ошибкой из анкора, или собственной, но не с растовской; в тех местах где могут “поломать” ошибки тоже должны быть. должны быть эвенты. эвенты должны быть полезными.
- все ненужные более данные – освобождаются для возврата ренты рента за данные максимально переложена на пользователей потери из-за целочисленного округления сведены к (разумному) минимуму
- тесты на typescript
- тесты на happy-path, на безопасность.
- тесты читаемые: всё что можно вынести в helpers; в теле теста только взятие базы для ассерта, инвоук(и) и ассерт.
- тесты разбиты на suit’s
Материалы https://doc.rust-lang.ru/book/ - основная документация по rust, рекомендуются к прочтению главы 1-8. 10, 13 и 17 можно посмотреть дополнительно. https://docs.solana.com/developing/programming-model/overview - оф.дока по Solana, рекомендуется к прочтению весь раздел "Developing". https://solanacookbook.com/#contributing - помимо оф.доки советуем к прочтению(более «живая» теория и снипеты кода) https://project-serum.github.io/anchor/tutorials/tutorial-0.html и https://book.anchor-lang.com/ - базовые материалы по Anchor. https://www.brianfriel.xyz/learning-how-to-build-on-solana/ - программа на Anchor https://www.brianfriel.xyz/understanding-program-derived-addresses/ - она же с PDA https://pencilflip.medium.com/solanas-token-program-explained-de0ddce29714 - spl-token https://book.solmeet.dev/notes/intro-to-anchor - escrow-program with Anchor.