# RAFFLE ```plantuml !include https://raw.githubusercontent.com/mariusgeorgescu/Project-Sputnik1/main/RaffleDApp-UC.puml ``` # USECASE DIAGRAM - RAFFLE --- <div hidden> ```plantuml @startuml left to right direction Actor User as U Actor Participant as P Actor Organizer as O U <|-- P U <|-- O package wallet { usecase (construct & sign\n transaction) as tx } package website{ usecase (Initiate raffle) as init usecase (View active raffles) as viewactive usecase (View raffles I joined) as viewjoin usecase (View raffles I created) as viewinit usecase (Buy tickets\n to raffle) as buy usecase (Participate\n to raffle) as join usecase (Refund) as refund usecase (Redeem) as redeem usecase (Close expired) as expired usecase (Reveal secret) as reveal usecase (Commit secret hash) as commit usecase (Re-commit secret hash) as recommit init ..> tx : inlcude buy ..> tx : inlcude join ..> tx : inlcude expired ..> tx : inlcude buy ..> commit : inlcude join ..> reveal : inlcude join <.. redeem : extend join <.. refund : extend join <.. recommit : extend } U --> tx U --> viewactive U --> init U --> buy P --> viewjoin P --> join O --> viewinit O --> expired @enduml ``` --- </div> # STATE DIAGRAM - RAFFLE LIFECYCLE --- ```plantuml @startuml hide empty description [*] --> NEW : Initiate Raffle NEW: Asset NEW --> [*] : Canceled By Organizer NEW --> EXPIRED : Commit deadline\n reached EXPIRED --> [*] : Closed by Organizer \nor by a Participant NEW --> COMMIT : buyTickets (User, no, [ticketSecretHash] ) state COMMIT { state "Accumulate Amount" as acc acc : ticketsSold :: [Ticket] acc --> acc : buyTickets \n(User, no, [ticketSecretHash]) } state C <<choice>> COMMIT --> C : Commit deadline\n reached C --> EXPIRED : Minimum amount \nNOT reached C --> REVEAL : Minimum amount \nreached state REVEAL { state "Collect secrets" as rv rv: secretsReceived :: [TicketSecret] rv --> rv : revealSecrets \n( User, [(secetID, secret)] ) } REVEAL --> REDEEMABLE :All secrets received state R <<choice>> REVEAL --> R : Reveal deadline reached R --> RECOMMIT : Not all secrets received R --> REDEEMABLE : All secrets received state RECOMMIT { state "Get new secret hashes \nfrom valid participants" as rc rc : ticketsActive :: [Ticket] rc --> rc : newSecretHashes \n(User, [(secretID, ticketSecretHash)] ) } RECOMMIT --> REVEAL : Re-commit deadline\n reached REDEEMABLE --> [*] : Redeemed by winner @enduml ``` --- # CLASS DIAGRAM - RAFFLE --- ```plantuml @startuml class Raffle { +id :: Int +status :: RaffleState +organizer :: User +asset :: Value +minimumAmount :: Value +ticketValue :: Value +commitDeadline :: Date +revealDeadline :: Date +ticketsSold :: [Ticket] +ticketsActive :: [Ticket] +secretsReceived :: [TicketSecret] +buyTickets ( User, no, [ticketSecretHash]) +newSecretHashes (User, [(secretID, ticketSecretHash)] ) +revealSecrets (User, [(secetID, secret)] ) +cancel ( User ) +redeem ( User ) } User <|-- Organizer User <|-- Participant class User { +publicKeyHash : PKH :: Hash } class Organizer { +raffles : [raffleID] :: [Int] } class Participant { +tickets :: [ Ticket ] +secrets :: [ TicketSecret ] } class Ticket { +ticketID :: Int +ticketSecretHash :: Hash +owner :: User } class TicketSecret { +secretID :: Int +secretValue :: Int } TicketSecret "1" -- "1" Ticket : is for > Organizer "1" *-- "1..*" Raffle : initiate > Raffle "1" *-- "0..1" Participant : is won by > Participant "1" *-- "1..*" Ticket : buys > Raffle "1" *-- "0..*" Ticket : sell > @enduml ``` # SEQUENCE DIAGRAM - RAFFLE --- ```plantuml @startuml actor Organizer as O actor Participant as P entity Raffle as R O -> R ** : initiate raffle (asset, commitDate, revealDate, minAmnt, ticketVal) opt cancel O -> R !! : Cancel Raffle end loop while commitDate not reached P -> R : buyTickets (User, no, [ticketSecretHash] ) R -> R : update R --> P : ticketID end alt Min amoun reached loop while revealDate not reached P -> R : revealSecrets ( User, [(secetID, secret)] ) R -> R: validate \n& update state R --> P : ok end alt All secrets received P -> R : Redeem R -> R: validate \n& update state R --> P : ok else failure : Not all secrets received ref over P, R : re-commit process end else failure : Min amount not reached alt Canceled by Organizer O -> R !! : Cancel Raffle else Canceled by any Participant P-> R !! : Cancel Raffle end end ``` --- ## Userstories (USER) --- ### USU-1: View active raffles As a User, I want view active raffles initiated by other users, so that I can choose to participate in one of them. #### Acceptance Criteria. Scenario: User not logged in / (wallet not connected) Given User is not logged in / (wallet not connected) When goes to main page Then the following elements should be available - A section where all active raffles are displayed; - A option to create a raffle; - An option to login (connect wallet); Scenario: User logged in (wallet connected) Given User is already logged / (wallet connected) When goes to main page Then the following elements should be available - A section where all active raffles are displayed; - A navigation menu; - "logged user info" section; ### USU-2: Create a raffle As a User, I want to create a raffle for one or more digital assets I own, so that other users can buy chances (tickets) to win the asset/s and I'll get the funds in exchange. #### Acceptance Criteria. Scenario: Logged in user wants to create a raffle Given User is in the main page and is logged in. When User clicks on "Create new raffle" Then a new page should be displayed allowing the possibility to select the digital asset/s which is/are subject of the raffle; Scenario: Not logged in user wants to create a raffle Given User is in the main page and is not logged in. When User clicks on "Create new raffle" Then a the login page must be displayed for the user to log in which will redirect "Create new raffle" page. Scenario: Fill in raffle details Given Digital asset/s is/are selected for a given raffle. When Confirms selection Then a form with the following input fields - minimum amount that needs to be collected for the raffle to be valid; - the ticket price value; - the deadline for participating in the raffle; - the deadline for revealing ticket secret hashes; Scenario: Create raffle Given Raffle details form is displayed. When All input fields are filled in with valid values. Then The "Create Raffle" button should become available. Scenario: Raffle Created Given "Create Raffle" button is available When "Create Raffle" is pressed Then user must be returned to his "MyRaffles" page, where previously created raffle should be displayed besides his existing raffles. Scenario: User exists/refresh the page before creating the raffle Given Given User is in the "Create Raffle" page. AND selected the digital assets . AND filled 0 or many raffle info fields. When exits the page. Then previous input is lost. ### USU-3: Buy ticket to raffle As a User, I want to participate to a raffle, so that I have a chance to win the prize. #### Acceptance Criteria. Scenario: Logged in user picks a raffle and wants to buy tickets Given User is logged in When user clicks on the "Buy Ticket" button next to the raffle he chose. Then a new page should be displayed containing the following elements: - Raffle info (tbd); - an input numeric field ("No of tickets") for user to select the no. of tickets he wants to buy, by default filled with value 0; - the total cost of the tickets ("no of tickets" value * raffle's ticket price); - website navigation menu; Scenario: Not logged in user picks a raffle and wants to buy tickets Given User is not logged in When user clicks on the "Buy Ticket" button next to the raffle he chose. Then a the login page must be displayed for the user to log in which will redirect "Buy tickets" page of the slected raffle. Scenario: User updates the value of the no of tickets Given User is in the "Buy tickets" page for a specific raffle. When he changes the value in the "No of tickets" field. Then 1. the value of "Total cost" should be updated with the new "no of tickets" value multiplied by raffle's ticket price; 2. for each ticket an empty input field (for ticket secret hash) should be displayed; Scenario: Provide ticket secret hash\hashes Given User selected the "No of tickets" and input fields for secret hashes are displayed. When all fields are filled in. Then a "Payment" button should become available. Scenario: Payment successful Given No of tickets selected and secret hashes provided. When User successfully payed for tickets. Then user must be returned to his "MyTickets" page, where previously bought tickets should be displayed besides his existing tickets. Scenario: Payment unsuccessful - TBD Given No of tickets selected and secret hashes provided. When User payment was unsuccessful. Then the following message should be displayed ... Scenario: User exists/refresh the page before completing payment Given Given User is in the "Buy tickets" page for a specific raffle. AND selected the "No of tickets" value. AND filled 0 or many secret hash input fields. When exits the page. Then previous input is lost. --- ## Userstories (PARTICIPANT) --- ### USP-1: View joined raffles **As a** Participant, **I want** visualize raffles I joined, **so that** I can follow the progress #### Acceptance Criteria. 1. For each raffle I joined, I should be able to see the following details - raffle status (active/closed) - for active raffles - the *minimum amount* that needs to be collected (or min. # of tickets) for the raffle to be valid. - amount collected so far - the *deadline for participating* in the raffle. - the *deadline for claiming* the prize. - for closed raffles - if I am the winner - ### USP-2: Redeem **As a** Participant, **I want** redeem my prize from raffles I won, **so that** I'll be happy :-). #### Acceptance Criteria. TBD ### US-5: Refund **As a** Participant, **I want** get refunded for tickets bought to raffles that were not executed correctly, **so that** I won't get frustrated. #### Acceptance Criteria. TBD --- ## Userstories (ORGANISER) --- ### USO-1: Close expired raffle **As an** Organizer, **I want** close an expired raffled created by me **so that** I can unlock my asset/s. #### Acceptance Criteria ### USO-2: View created raffles **As an** Organizer, **I want** visualize raffles I initiated, **so that** I can follow the progress #### Acceptance Criteria. 1. For each raffle I initiated, I should be able to see the following details - raffle status (active/closed) - for active raffles - the *minimum amount* that needs to be collected (or min. # of tickets) for the raffle to be valid. - amount collected so far - the *deadline for participating* in the raffle. - the *deadline for claiming* the prize. ----