@@ -5,23 +5,28 @@ mod CampaignPools {
5
5
// *************************************************************************
6
6
// IMPORT
7
7
// *************************************************************************
8
+ use core :: num :: traits :: Zero ;
8
9
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 ;
17
10
use openzeppelin :: access :: ownable :: OwnableComponent ;
18
11
use openzeppelin :: upgrades :: UpgradeableComponent ;
19
12
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 ,
22
16
};
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 ;
23
25
use tokengiver :: interfaces :: IRegistry :: {
24
- IRegistryDispatcher , IRegistryDispatcherTrait , IRegistryLibraryDispatcher
26
+ IRegistryDispatcher , IRegistryDispatcherTrait , IRegistryLibraryDispatcher ,
27
+ };
28
+ use tokengiver :: interfaces :: ITokenGiverNft :: {
29
+ ITokenGiverNftDispatcher , ITokenGiverNftDispatcherTrait ,
25
30
};
26
31
27
32
component! (path : OwnableComponent , storage : ownable , event : OwnableEvent );
@@ -40,16 +45,16 @@ mod CampaignPools {
40
45
struct Storage {
41
46
campaign_pool : Map <ContractAddress , CampaignPool >,
42
47
campaign_pool_applications : Map <
43
- ContractAddress , (ContractAddress , u256 )
48
+ ContractAddress , (ContractAddress , u256 ),
44
49
>, // map<Campaign Address, (campaign pool address, amount)>
45
50
campaign_pool_count : u16 ,
46
51
campaign_pool_nft_token : Map <
47
- ContractAddress , (ContractAddress , u256 )
52
+ ContractAddress , (ContractAddress , u256 ),
48
53
>, // (recipient, (campaign_address, token_id));
49
54
donations : Map <ContractAddress , u256 >,
50
55
donation_count : Map <ContractAddress , u16 >,
51
56
donation_details : Map <
52
- (ContractAddress , ContractAddress ), DonationDetails
57
+ (ContractAddress , ContractAddress ), DonationDetails ,
53
58
>, // map((campaign pool address, Campaign Address), donation_details)
54
59
strk_address : ContractAddress ,
55
60
token_giver_nft_contract_address : ContractAddress ,
@@ -59,6 +64,8 @@ mod CampaignPools {
59
64
ownable : OwnableComponent :: Storage ,
60
65
#[substorage(v0)]
61
66
upgradeable : UpgradeableComponent :: Storage ,
67
+ donor_votes : Map <(ContractAddress , ContractAddress ), VoteData >,
68
+ campaign_votes_count : Map <ContractAddress , u256 >,
62
69
}
63
70
64
71
@@ -71,12 +78,20 @@ mod CampaignPools {
71
78
CreateCampaignPool : CreateCampaignPool ,
72
79
DonationMade : DonationMade ,
73
80
ApplicationMade : ApplicationMade ,
81
+ DonorVoted : DonorVoted ,
74
82
#[flat]
75
83
OwnableEvent : OwnableComponent :: Event ,
76
84
#[flat]
77
85
UpgradeableEvent : UpgradeableComponent :: Event ,
78
86
}
79
87
88
+ #[derive(Drop , starknet:: Event )]
89
+ pub struct DonorVoted {
90
+ campaign_address : ContractAddress ,
91
+ donor_address : ContractAddress ,
92
+ time : u64 ,
93
+ }
94
+
80
95
#[derive(Drop , starknet:: Event )]
81
96
pub struct CreateCampaignPool {
82
97
#[key]
@@ -121,6 +136,12 @@ mod CampaignPools {
121
136
amount : u256 ,
122
137
}
123
138
139
+ #[derive(Drop , Copy , Serde , starknet:: Store )]
140
+ pub struct VoteData {
141
+ campaign_address : ContractAddress ,
142
+ donor : ContractAddress ,
143
+ }
144
+
124
145
// *************************************************************************
125
146
// CONSTRUCTOR
126
147
// *************************************************************************
@@ -130,7 +151,7 @@ mod CampaignPools {
130
151
token_giver_nft_class_hash : ClassHash ,
131
152
token_giver_nft_contract_address : ContractAddress ,
132
153
strk_address : ContractAddress ,
133
- owner : ContractAddress
154
+ owner : ContractAddress ,
134
155
) {
135
156
self . token_giver_nft_class_hash. write (token_giver_nft_class_hash );
136
157
self . token_giver_nft_contract_address. write (token_giver_nft_contract_address );
@@ -155,15 +176,15 @@ mod CampaignPools {
155
176
let campaign_pool_count : u16 = self . campaign_pool_count. read () + 1 ;
156
177
let token_giver_nft_contract_address = self . token_giver_nft_contract_address. read ();
157
178
let nft_contract_dispatcher = ITokenGiverNftDispatcher {
158
- contract_address : token_giver_nft_contract_address
179
+ contract_address : token_giver_nft_contract_address ,
159
180
};
160
181
let token_id : u256 = nft_contract_dispatcher . mint_token_giver_nft (get_caller_address ());
161
182
162
183
let campaign_address = IRegistryLibraryDispatcher {
163
- class_hash : registry_hash . try_into (). unwrap ()
184
+ class_hash : registry_hash . try_into (). unwrap (),
164
185
}
165
186
. 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 ,
167
188
);
168
189
let token_uri = nft_contract_dispatcher . get_token_uri (token_id );
169
190
let campaign_details = CampaignPool {
@@ -187,26 +208,57 @@ mod CampaignPools {
187
208
campaign_pool_id : campaign_pool_count . try_into (). unwrap (),
188
209
nft_token_uri : token_uri . clone (),
189
210
token_giver_nft_address : token_giver_nft_contract_address ,
190
- block_timestamp : get_block_timestamp ()
191
- }
211
+ block_timestamp : get_block_timestamp (),
212
+ },
192
213
);
193
214
194
215
campaign_address
195
216
}
196
217
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
+
197
249
fn get_campaign (self : @ ContractState , campaign_address : ContractAddress ) -> CampaignPool {
198
250
self . campaign_pool. read (campaign_address )
199
251
}
200
252
201
253
fn donate_campaign_pool (
202
- ref self : ContractState , campaign_pool_address : ContractAddress , amount : u256
254
+ ref self : ContractState , campaign_pool_address : ContractAddress , amount : u256 ,
203
255
) {}
204
256
205
257
fn apply_to_campaign_pool (
206
258
ref self : ContractState ,
207
259
campaign_address : ContractAddress ,
208
260
campaign_pool_address : ContractAddress ,
209
- amount : u256
261
+ amount : u256 ,
210
262
) {
211
263
// Get caller address to identify who is applying
212
264
let caller = get_caller_address ();
@@ -243,11 +295,11 @@ mod CampaignPools {
243
295
recipient : caller ,
244
296
amount : amount ,
245
297
block_timestamp : get_block_timestamp (),
246
- }
298
+ },
247
299
);
248
300
}
249
301
fn get_campaign_application (
250
- self : @ ContractState , campaign_address : ContractAddress
302
+ self : @ ContractState , campaign_address : ContractAddress ,
251
303
) -> (ContractAddress , u256 ) {
252
304
self . campaign_pool_applications. read (campaign_address )
253
305
}
0 commit comments