diff --git a/src/components/sales.cairo b/src/components/sales.cairo new file mode 100644 index 0000000..6a34c5b --- /dev/null +++ b/src/components/sales.cairo @@ -0,0 +1,26 @@ +#[starknet::storage] +struct Storage { + sales: LegacyMap, +} + +#[derive(Drop, Serde, Copy)] +enum SalesTerm { + Bought: (), + Sold: (), + None: (), // Default state +} + +#[starknet::contract] +mod sales { + use super::SalesTerm; + + #[external(v0)] + fn buy(ref self, item_id: u256) { + self.sales.write(item_id, SalesTerm::Bought); + } + + #[external(v0)] + fn sell(ref self, item_id: u256) { + self.sales.write(item_id, SalesTerm::Sold); + } +} diff --git a/src/components/voting.cairo b/src/components/voting.cairo index 7202dc0..80a69b7 100644 --- a/src/components/voting.cairo +++ b/src/components/voting.cairo @@ -1,3 +1,5 @@ +use crate::components::sales::{SalesComponent, SalesTerm}; + #[starknet::component] pub mod VotingComponent { use starknet::storage::{ @@ -37,27 +39,34 @@ pub mod VotingComponent { } fn vote(ref self: ComponentState, support: bool, id: u256) { - let mut poll = self.polls.entry(id).read(); - assert(poll != Default::default(), 'INVALID POLL'); - assert(poll.status == Default::default(), 'POLL NOT PENDING'); - let caller = get_caller_address(); - let has_voted = self.voters.entry((caller, id)).read(); - assert(!has_voted, 'CALLER HAS VOTED'); - - match support { - true => poll.yes_votes += 1, - _ => poll.no_votes += 1, - } + let mut poll = self.polls.entry(id).read(); + assert(poll != Default::default(), 'INVALID POLL'); + assert(poll.status == Default::default(), 'POLL NOT PENDING'); + let caller = get_caller_address(); + let has_voted = self.voters.entry((caller, id)).read(); + assert(!has_voted, 'CALLER HAS VOTED'); - let vote_count = poll.yes_votes + poll.no_votes; - if vote_count >= DEFAULT_THRESHOLD { - poll.resolve(); - } + match support { + true => poll.yes_votes += 1, + _ => { + poll.no_votes += 1; - self.polls.entry(id).write(poll); - self.voters.entry((caller, id)).write(true); - self.emit(Voted { id, voter: caller }); + // ❗ If voting fails, sell the item + let mut sales = SalesComponent::new(); + sales.sell(id); } + } + + let vote_count = poll.yes_votes + poll.no_votes; + if vote_count >= DEFAULT_THRESHOLD { + poll.resolve(); + } + + self.polls.entry(id).write(poll); + self.voters.entry((caller, id)).write(true); + self.emit(Voted { id, voter: caller }); +} + fn get_poll(self: @ComponentState, id: u256) -> Poll { self.polls.entry(id).read()