@@ -27,7 +27,7 @@ pub mod EventFactory {
27
27
i_ticket_721 :: {ITicket721Dispatcher , ITicket721DispatcherTrait },
28
28
},
29
29
};
30
-
30
+ pub const E18 : u256 = 1000000000000000000 ;
31
31
pub const STRK_TOKEN_ADDRESS : felt252 =
32
32
0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d ;
33
33
@@ -55,6 +55,7 @@ pub mod EventFactory {
55
55
EventCanceled : EventCanceled ,
56
56
TicketPurchased : TicketPurchased ,
57
57
TicketRecliamed : TicketRecliamed ,
58
+ AttendeeCheckedIn : AttendeeCheckedIn ,
58
59
}
59
60
60
61
#[derive(Drop , starknet:: Event )]
@@ -99,6 +100,15 @@ pub mod EventFactory {
99
100
amount : u256
100
101
}
101
102
103
+ #[derive(Drop , starknet:: Event )]
104
+ struct AttendeeCheckedIn {
105
+ #[key]
106
+ event_id : u256 ,
107
+ #[key]
108
+ attendee : ContractAddress ,
109
+ time : u64
110
+ }
111
+
102
112
// *//////////////////////////////////////////////////////////////////////////
103
113
// STORAGE
104
114
/// ///////////////////////////////////////////////////////////////////////*//
@@ -110,12 +120,13 @@ pub mod EventFactory {
110
120
accesscontrol : AccessControlComponent :: Storage ,
111
121
#[substorage(v0)]
112
122
upgradeable : UpgradeableComponent :: Storage ,
113
- event_count : u256 ,
114
- events : Map <u256 , EventData >,
115
- event_ticket_balance : Map <u256 , u256 >,
116
123
ticket_721_class_hash : felt252 ,
117
124
tba_registry_class_hash : felt252 ,
118
125
tba_accountv3_class_hash : felt252 ,
126
+ event_count : u256 ,
127
+ events : Map <u256 , EventData >,
128
+ event_ticket_balance : Map <u256 , u256 >,
129
+ event_attendance : Map <u256 , Map <ContractAddress , bool >>,
119
130
}
120
131
121
132
// *//////////////////////////////////////////////////////////////////////////
@@ -234,6 +245,13 @@ pub mod EventFactory {
234
245
tba_address
235
246
}
236
247
248
+ fn check_in (ref self : ContractState , event_id : u256 , attendee : ContractAddress ) -> bool {
249
+ let event_hash = self . _gen_event_hash (event_id );
250
+ self . accesscontrol. assert_only_role (event_hash );
251
+ self . _check_in (event_id , attendee );
252
+ true
253
+ }
254
+
237
255
// -------------- GETTER FUNCTIONS -----------------------
238
256
239
257
fn get_all_events (self : @ ContractState ) -> Array <EventData > {
@@ -481,11 +499,12 @@ pub mod EventFactory {
481
499
let strk_token = IERC20Dispatcher {
482
500
contract_address : STRK_TOKEN_ADDRESS . try_into (). unwrap ()
483
501
};
484
- // verify if caller has enough strk token for the ticket_price
485
- assert (
486
- strk_token . balance_of (buyer ) >= event_instance . ticket_price,
487
- Errors :: INSUFFICIENT_BALANCE
488
- );
502
+
503
+ // verify if caller has enough strk token for the ticket_price + 3% fee
504
+ let _ticket_price = event_instance . ticket_price * E18 ;
505
+ let _ticket_price_ = _ticket_price + ((_ticket_price * 3 ) / 100 );
506
+ let ticket_price_ = _ticket_price_ / E18 ;
507
+ assert (strk_token . balance_of (buyer ) >= ticket_price_ , Errors :: INSUFFICIENT_BALANCE );
489
508
490
509
let event_ticket_address = event_instance . ticket_addr;
491
510
let event_ticket = ITicket721Dispatcher { contract_address : event_ticket_address };
@@ -523,6 +542,33 @@ pub mod EventFactory {
523
542
tba_address
524
543
}
525
544
545
+ fn _check_in (ref self : ContractState , event_id : u256 , attendee : ContractAddress ) {
546
+ let event_instance = self . events. entry (event_id ). read ();
547
+ let event_ticket_address = event_instance . ticket_addr;
548
+ let event_ticket = ITicket721Dispatcher { contract_address : event_ticket_address };
549
+
550
+ // assert event has started
551
+ assert (event_instance . start_date <= get_block_timestamp (), Errors :: EVENT_NOT_STARTED );
552
+
553
+ if ! event_ticket . has_event_started () {
554
+ event_ticket . start_event ();
555
+ }
556
+
557
+ // assert user has a ticket
558
+ assert (event_ticket . balance_of (attendee ) > 0 , Errors :: NOT_TICKET_HOLDER );
559
+
560
+ // checkin attendee
561
+ self . event_attendance. entry (event_id ). entry (attendee ). write (true );
562
+
563
+ // emit event for ticket check in
564
+ self
565
+ . emit (
566
+ AttendeeCheckedIn {
567
+ event_id : event_id , attendee : attendee , time : get_block_timestamp ()
568
+ }
569
+ );
570
+ }
571
+
526
572
fn _deploy_tba (
527
573
self : @ ContractState , event_ticket_address : ContractAddress , ticket_id : u256
528
574
) -> ContractAddress {
0 commit comments