From 3089ceb827f3ce44fe4fdc0302522b1c80a2fcbe Mon Sep 17 00:00:00 2001 From: Somethingweb <142666525+Somethingweb@users.noreply.github.com> Date: Wed, 2 Apr 2025 14:18:17 -0700 Subject: [PATCH 1/2] Create sales.cairo --- src/components/sales.cairo | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/components/sales.cairo 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); + } +} From fd0e94354ab60e996362ae6398d72b9da8280a23 Mon Sep 17 00:00:00 2001 From: Somethingweb <142666525+Somethingweb@users.noreply.github.com> Date: Wed, 2 Apr 2025 14:20:22 -0700 Subject: [PATCH 2/2] Update voting.cairo --- src/components/voting.cairo | 45 ++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 18 deletions(-) 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()