Laborator 10
Tematica laboratorului: Tema practica si prezentari articole
Tema practica
Se doreste o implementare care sa permita adunarea de fonduri sub forma de token ERC-20 de la mai multi contribuitori si distribuirea acestora unor beneficiari.
Implementati mai intai un contract de tip token ERC-20, care pe langa functiile definite de standardul de token sa permita si achizitionarea de unitati de token pe baza unui pret fixat in contract de catre un proprietar al contractului token. Contractul va pre-initializa balanta contractului token cu o suma totala consistenta ce va putea fi ulterior cumparata si utilizata de alti utilizatori in interactiunile cu celelalte contracte.
Implementati trei alte contracte: CrowdFunding, SponsorFunding si DistributeFunding, care sa functioneze in modul descris mai jos, operand cu unitati de token, si care pot accesa unde este necesar functiile din contractul token (au disponibila adresa acestuia).
Contractul CrowdFunding include un o suma tinta in unitati de token - "fundingGoal" - ce se doreste sa fie adunata de la mai multi contribuitori. Un contribuitor poate fi identificat printr-o adresa.
Contractul SponsorFunding are rolul de a adauga unei sume adunate o extra sponsorizare intr-un cuantum fixat in contract. Pentru aceasta, contractul SponsorFunding necesita acces la fonduri in unitati de token, lipsa unei sume suficiente (mai mica decat suma fixata in contract), rezultand in anularea sponsorizarii. Pentru asigurarea fondurilor contractul va expune o functie apelabila doar de catre proprietarul contractului ce poate cumpara tokens pentru sponsorizari de la contractul token. De asemenea contractul va expune pentru proprietar o functie ce poate schimba cuantumul fixat pentru sponsorizari.
Contractul DistributeFunding permite adaugarea unui numar de actionari/beneficiari cu rolul de a distribui acestora suma cumulata in final. Fiecare actionar adaugat are o pondere asociata din procentul de 100% al sumei (ponderea totala a actionarilor poate fi mai mica de 100%).
Consideram trei "stari" ale finantarii: 1) "nefinantat" - inainte de atingerea sumei tinta, 2) "prefinantat" - dupa atingerea sumei inainte de sponsorizare, 3) "finantat" - dupa eventuala sponsorizare.
Este posibila interograrea acestei stari (ex., cu un raspuns de tip string mentinut de contractul CrowdFunding) la orice moment de catre oricine pentru a sti in ce stare se afla finantarea.
Inainte de atingerea sumei tinta (starea "nefinantat"), contractul CrowdFunding trebuie sa ofere posibilitatea de:
- Depunere a unei sume in unitati de token de catre un contribuitor prin transfer catre adresa contractului. La fiecare depunere contractul va verifica daca s-a atins suma tinta.
- Retragere a oricarei sume, inclusiv partiala, depuse de un contribuitor.
Dupa atingerea sumei tinta (starea "prefinantat"):
- Nu se mai pot retrage sau depune sume.
- Proprietarul contractului CrowdFunding poate comunica contractului SponsorFunding finalizarea colectarii sumei, la care contractul SponsorFunding va verifica balanta contractului CrowdFunding si va vira catre acesta sponsorizarea oferita in unitati de token. In cazul in care contractul SponsorFunding nu dispune de o balanta suficienta pentru sponsorizare nu va vira nimic.
Dupa eventuala sponsorizare (starea "finantat"):
- Proprietarul contractului CrowdFunding poate vira suma totala adunata in unitati de token catre contractul DistributeFunding.
- Doar dupa acest virament, contractul DistributeFunding va permite fiecarui actionar sa isi retraga, o singura data, venitul calculat conform cu ponderea proprie.
Bonus: Se acorda pana la maxim 5 puncte bonus pentru implementarea unei frontend web de DAPP care sa asigure o interfata vizuala pentru utilizarea functionalitatilor contractelor. Punctajul se acorda in functie de complexitate si atractivitate. Pentru maxim implementarea ar trebui sa includa de exemplu suport pentru pornirea si accesarea a mai multor campanii de crowdfunding simultane, o pagina/sectiune dedicata achizitionarii de tokens si de verificare a balantei proprii, si evident acoperirea functionalitatilor expuse de catre contracte cu restrictionarea accesului in functie de functiile disponibile pentru un utilizator.
Detalii organizare si termene
Tema poate fi realizata in echipe de pana la 3 studenti. Predarea temei se va face prin e-mail - arhiva zip cu sursele Solidity sau link la un repository cu drepturi de acces, subiect: Tema Blockchain ; in functie de titularul de laborator adresa pentru trimiterea temei este emanuel.onica@uaic.ro sau emanuel.onica@info.uaic.ro, respectiv andrei.arusoaie@uaic.ro - nu se accepta echipe mixte intre serii decat daca urmeaza laboratorul cu acelasi profesor (alternativ, pentru varianta cu link la repository acesta se poate transmite si prin mesaj privat pe Discord). Data limita a predarii este 9 ianuarie inclusiv, fiind urmata de finalizarea evaluarii in cadrul laboratoarelor urmatoare (15-16 ianuarie), aceasta urmand a se desfasura online. O programare a echipelor pe sloturi orare si alte detalii vor fi anuntate in data de 13 ianuarie.
Nota: In cazul implementarii bonusului, nu este necesara trimiterea pana la termenul de predare si a surselor ce tin strict de aplicatia web (.js, .html, .css, resurse grafice, etc) - partea aceasta va fi evaluata direct in cadrul laboratorului.