USER_Donate_Tx - my-crypto-datascience-portfolio/my_crypto_donations_bank_solana GitHub Wiki

Проводка транзакции доната

Проводка доната в банк донатов состоит из 2-х действий (USER'а):

  • Подготовка доната (ввод мета-информации)
  • Подтверждение доната - Finalization & Seal (подтверждение Tx и финальный перевод SOL)

После подтверждения Tx доната - уже SOL переводится от USER'а на счет банка донатов.


Подготовка доната

Создание слота для будущего доната.

Слот доната (DonationSlot - структура RUST) сигнализирует, что кто-то хотел сделать донат, но мог (в итоге) принять или не принять окончательное решение (отказаться) - актуально для больших донатов. Сообщение (приложение к донату), в любом случае, сохранится. Т.е. банк получит хотя бы метаданные USER'а.

Тут мы будем сохранять данные пользователя (без права изменения):

  • Размер доната - donate_amount - (f64 - floating point)
  • Сообщение (любой string, сопровождающее донат) (не используем в первой версии сервиса)
  • Время доната - donationDate - (Epoch Unix Timestamp: f64 - floating point) - Date.now() в JS
  • ID кампании по сборам - campaignId

Аккаунты

Плата за создание аккаунтов для донатов переносится на USER'а.

Параметры CreateAccount (кто платит за акк. (пополнение баланса нового адреса), НОВЫЙ АДРЕС, на сколько пополнить, размер поля data, ВЛАДЕЛЕЦ НОВОГО АКК.)

Аккаунты на входе:

0. `[writeable,signer]` Funding account - просто USER (кто платит за аккаунт) = донатер, фактически

1. `[writeable]` Unallocated account - аккаунт для хранения слота доната

2. `[]` System program - program_id()

Транзакция

Данные для транзакции (одна инструкция):

CreateDonationSlot {

    time: DonationSlotTime,  | Время создания доната

    donation_id: String, | ID доната

}, 

Подтверждение доната и финальная проводка

Аккаунты

Donation bank account - аккаунт банка донатов - публично всем известен и прошит на WEB странице.

Аккаунты на входе:

0. `[writeable]` bank account - аккаунт банка донатов (куда переводим донаты)

1. `[writeable,signer]` donation account: Funding account - просто USER (кто платит за аккаунт и за донат) = донатер

2. `[writeable]` reservation account: Unallocated account - новый аккаунт для резервации данных доната (аккаунт генерим внутри контракта)

3. `[writeable]` donation slot account: Слот доната из предыдущего шага (уже сделали слот доната - теперь используем его)

4. `[]` System program - program_id()

Результат:

Готовая struct Reservation (структура, записанная в аккаунт) | Данные о донате

pub struct Reservation {

pub donation_slot_account: Pubkey, | Метаданные доната

pub name: String,  | Кто сделал донат

}


Аккаунт для сбора комиссии создателем платформы

Данный аккаунт можно прописать в настройках при инициализации банка донатов (или новой кампании?).

Данный аккаунт никак не передается из WEB-клиента при обычной работе сервиса банка (сбор донатов).


Финальная часть транзакции (FINALIZATION и SEAL)

В финальную часть проводки доната (FINALIZATION) входит:

  • Собственно, перевод доната на счет банка
  • Чтение настроек кампании
  • Выплата комиссии владельцу платформы (исходя из настроек)
  • Обновление счетчиков статистики (у каждого USER'а - свой аккаунт счетчика на блокчейне Solana)

Таким образом, появляются дополнительные аккаунты, которые нужно передать в инструкцию проводки доната (FINALIZATION и SEAL стадия):

  • Аккаунт настроек (передаем из WEB-client)
  • Аккаунт для сбора комиссии (CREATOR'а)
  • Аккаунт счетчика статистики
  • Аккаунт реферера (токен-аккаунт) - для сохранения в struct DonationSlot и будущего получения вознаграждения от CREATOR'а

В завершающую часть проводки доната (SEAL) входит:

  • Запись структуры резервации в аккаунт (reservation_account). Записанная struct Reservation означает финальную печать транзакции перевода доната.

Алгоритм завершения транзакции доната

1. 	Прочитать комиссию из настроек								
									
	creator_fee_size, // [u8] - Комиссия для Владельца - в процентах								
									
2. 	Вычислить тело реального перевода								
									
3. 	Вычислить размер комисии - как остаток								
									
4.  	Перечислить комиссию								
									
5.	Перечислить тело доната								
									
6.	Обновить Donation Slot (метаданные)								
									
7. 	Запись структуры SEAL-Reservation (донат успешно завершен)