Skip to content

Commit 3f6ea30

Browse files
committed
move to Campaign pool
1 parent 7240254 commit 3f6ea30

File tree

2 files changed

+83
-27
lines changed

2 files changed

+83
-27
lines changed

src/campaign_pool.cairo

Lines changed: 76 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,28 @@ mod CampaignPools {
55
// *************************************************************************
66
// IMPORT
77
// *************************************************************************
8+
use core::num::traits::Zero;
89
use core::traits::TryInto;
9-
use starknet::{
10-
ContractAddress, get_caller_address, get_block_timestamp, ClassHash, get_contract_address,
11-
syscalls::deploy_syscall, SyscallResultTrait, syscalls, class_hash::class_hash_const,
12-
storage::{Map, StoragePathEntry, StoragePointerReadAccess, StoragePointerWriteAccess}
13-
};
14-
use tokengiver::base::errors::Errors;
15-
use tokengiver::interfaces::ICampaignPool::ICampaignPool;
16-
use tokengiver::base::types::CampaignPool;
1710
use openzeppelin::access::ownable::OwnableComponent;
1811
use openzeppelin::upgrades::UpgradeableComponent;
1912
use openzeppelin::upgrades::interface::IUpgradeable;
20-
use tokengiver::interfaces::ITokenGiverNft::{
21-
ITokenGiverNftDispatcher, ITokenGiverNftDispatcherTrait
13+
use starknet::class_hash::class_hash_const;
14+
use starknet::storage::{
15+
Map, StoragePathEntry, StoragePointerReadAccess, StoragePointerWriteAccess,
2216
};
17+
use starknet::syscalls::deploy_syscall;
18+
use starknet::{
19+
ClassHash, ContractAddress, SyscallResultTrait, get_block_timestamp, get_caller_address,
20+
get_contract_address, syscalls,
21+
};
22+
use tokengiver::base::errors::Errors;
23+
use tokengiver::base::types::CampaignPool;
24+
use tokengiver::interfaces::ICampaignPool::ICampaignPool;
2325
use tokengiver::interfaces::IRegistry::{
24-
IRegistryDispatcher, IRegistryDispatcherTrait, IRegistryLibraryDispatcher
26+
IRegistryDispatcher, IRegistryDispatcherTrait, IRegistryLibraryDispatcher,
27+
};
28+
use tokengiver::interfaces::ITokenGiverNft::{
29+
ITokenGiverNftDispatcher, ITokenGiverNftDispatcherTrait,
2530
};
2631

2732
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
@@ -40,16 +45,16 @@ mod CampaignPools {
4045
struct Storage {
4146
campaign_pool: Map<ContractAddress, CampaignPool>,
4247
campaign_pool_applications: Map<
43-
ContractAddress, (ContractAddress, u256)
48+
ContractAddress, (ContractAddress, u256),
4449
>, // map<Campaign Address, (campaign pool address, amount)>
4550
campaign_pool_count: u16,
4651
campaign_pool_nft_token: Map<
47-
ContractAddress, (ContractAddress, u256)
52+
ContractAddress, (ContractAddress, u256),
4853
>, // (recipient, (campaign_address, token_id));
4954
donations: Map<ContractAddress, u256>,
5055
donation_count: Map<ContractAddress, u16>,
5156
donation_details: Map<
52-
(ContractAddress, ContractAddress), DonationDetails
57+
(ContractAddress, ContractAddress), DonationDetails,
5358
>, // map((campaign pool address, Campaign Address), donation_details)
5459
strk_address: ContractAddress,
5560
token_giver_nft_contract_address: ContractAddress,
@@ -59,6 +64,8 @@ mod CampaignPools {
5964
ownable: OwnableComponent::Storage,
6065
#[substorage(v0)]
6166
upgradeable: UpgradeableComponent::Storage,
67+
donor_votes: Map<(ContractAddress, ContractAddress), VoteData>,
68+
campaign_votes_count: Map<ContractAddress, u256>,
6269
}
6370

6471

@@ -71,12 +78,20 @@ mod CampaignPools {
7178
CreateCampaignPool: CreateCampaignPool,
7279
DonationMade: DonationMade,
7380
ApplicationMade: ApplicationMade,
81+
DonorVoted: DonorVoted,
7482
#[flat]
7583
OwnableEvent: OwnableComponent::Event,
7684
#[flat]
7785
UpgradeableEvent: UpgradeableComponent::Event,
7886
}
7987

88+
#[derive(Drop, starknet::Event)]
89+
pub struct DonorVoted {
90+
campaign_address: ContractAddress,
91+
donor_address: ContractAddress,
92+
time: u64,
93+
}
94+
8095
#[derive(Drop, starknet::Event)]
8196
pub struct CreateCampaignPool {
8297
#[key]
@@ -121,6 +136,12 @@ mod CampaignPools {
121136
amount: u256,
122137
}
123138

139+
#[derive(Drop, Copy, Serde, starknet::Store)]
140+
pub struct VoteData {
141+
campaign_address: ContractAddress,
142+
donor: ContractAddress,
143+
}
144+
124145
// *************************************************************************
125146
// CONSTRUCTOR
126147
// *************************************************************************
@@ -130,7 +151,7 @@ mod CampaignPools {
130151
token_giver_nft_class_hash: ClassHash,
131152
token_giver_nft_contract_address: ContractAddress,
132153
strk_address: ContractAddress,
133-
owner: ContractAddress
154+
owner: ContractAddress,
134155
) {
135156
self.token_giver_nft_class_hash.write(token_giver_nft_class_hash);
136157
self.token_giver_nft_contract_address.write(token_giver_nft_contract_address);
@@ -155,15 +176,15 @@ mod CampaignPools {
155176
let campaign_pool_count: u16 = self.campaign_pool_count.read() + 1;
156177
let token_giver_nft_contract_address = self.token_giver_nft_contract_address.read();
157178
let nft_contract_dispatcher = ITokenGiverNftDispatcher {
158-
contract_address: token_giver_nft_contract_address
179+
contract_address: token_giver_nft_contract_address,
159180
};
160181
let token_id: u256 = nft_contract_dispatcher.mint_token_giver_nft(get_caller_address());
161182

162183
let campaign_address = IRegistryLibraryDispatcher {
163-
class_hash: registry_hash.try_into().unwrap()
184+
class_hash: registry_hash.try_into().unwrap(),
164185
}
165186
.create_account(
166-
implementation_hash, token_giver_nft_contract_address, token_id.clone(), salt
187+
implementation_hash, token_giver_nft_contract_address, token_id.clone(), salt,
167188
);
168189
let token_uri = nft_contract_dispatcher.get_token_uri(token_id);
169190
let campaign_details = CampaignPool {
@@ -187,26 +208,57 @@ mod CampaignPools {
187208
campaign_pool_id: campaign_pool_count.try_into().unwrap(),
188209
nft_token_uri: token_uri.clone(),
189210
token_giver_nft_address: token_giver_nft_contract_address,
190-
block_timestamp: get_block_timestamp()
191-
}
211+
block_timestamp: get_block_timestamp(),
212+
},
192213
);
193214

194215
campaign_address
195216
}
196217

218+
fn vote_project(
219+
ref self: ContractState,
220+
campaign_pool_address: ContractAddress,
221+
campaign_address: ContractAddress,
222+
) {
223+
let caller = get_caller_address();
224+
225+
let user_votes = self.donor_votes.read((caller, campaign_address));
226+
let caller_donation = self.donations.read(caller);
227+
let campaign_count = self.campaign_votes_count.read(campaign_address);
228+
229+
assert(caller_donation > 0, 'Caller not donor');
230+
231+
assert(user_votes.donor.is_non_zero(), 'Voted already');
232+
233+
let new_vote = VoteData { campaign_address: campaign_address, donor: caller };
234+
235+
self.donor_votes.write((caller, campaign_address), new_vote);
236+
237+
self.campaign_votes_count.write(campaign_address, campaign_count + 1);
238+
239+
self
240+
.emit(
241+
DonorVoted {
242+
campaign_address: campaign_address,
243+
donor_address: caller,
244+
time: get_block_timestamp(),
245+
},
246+
);
247+
}
248+
197249
fn get_campaign(self: @ContractState, campaign_address: ContractAddress) -> CampaignPool {
198250
self.campaign_pool.read(campaign_address)
199251
}
200252

201253
fn donate_campaign_pool(
202-
ref self: ContractState, campaign_pool_address: ContractAddress, amount: u256
254+
ref self: ContractState, campaign_pool_address: ContractAddress, amount: u256,
203255
) {}
204256

205257
fn apply_to_campaign_pool(
206258
ref self: ContractState,
207259
campaign_address: ContractAddress,
208260
campaign_pool_address: ContractAddress,
209-
amount: u256
261+
amount: u256,
210262
) {
211263
// Get caller address to identify who is applying
212264
let caller = get_caller_address();
@@ -243,11 +295,11 @@ mod CampaignPools {
243295
recipient: caller,
244296
amount: amount,
245297
block_timestamp: get_block_timestamp(),
246-
}
298+
},
247299
);
248300
}
249301
fn get_campaign_application(
250-
self: @ContractState, campaign_address: ContractAddress
302+
self: @ContractState, campaign_address: ContractAddress,
251303
) -> (ContractAddress, u256) {
252304
self.campaign_pool_applications.read(campaign_address)
253305
}

src/interfaces/ICampaignPool.cairo

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use starknet::{ContractAddress, ClassHash};
1+
use starknet::{ClassHash, ContractAddress};
22
use tokengiver::base::types::CampaignPool;
33
// *************************************************************************
44
// INTERFACE of TOKEN GIVER CAMPAIGN POOL
@@ -23,11 +23,15 @@ pub trait ICampaignPool<TState> {
2323
ref self: TState,
2424
campaign_address: ContractAddress,
2525
campaign_pool_address: ContractAddress,
26-
amount: u256
26+
amount: u256,
2727
);
2828
fn upgrade(ref self: TState, new_class_hash: ClassHash);
2929

30+
fn vote_project(
31+
ref self: TState, campaign_pool_address: ContractAddress, campaign_address: ContractAddress,
32+
);
33+
3034
fn get_campaign_application(
31-
self: @TState, campaign_address: ContractAddress
35+
self: @TState, campaign_address: ContractAddress,
3236
) -> (ContractAddress, u256);
3337
}

0 commit comments

Comments
 (0)