Skip to content

Commit 143ff39

Browse files
committed
implement 3% fee on purchase ticket and add checkin function
1 parent 1cfd629 commit 143ff39

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

src/event_factory/event_factory.cairo

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub mod EventFactory {
2727
i_ticket_721::{ITicket721Dispatcher, ITicket721DispatcherTrait},
2828
},
2929
};
30-
30+
pub const E18: u256 = 1000000000000000000;
3131
pub const STRK_TOKEN_ADDRESS: felt252 =
3232
0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d;
3333

@@ -55,6 +55,7 @@ pub mod EventFactory {
5555
EventCanceled: EventCanceled,
5656
TicketPurchased: TicketPurchased,
5757
TicketRecliamed: TicketRecliamed,
58+
AttendeeCheckedIn: AttendeeCheckedIn,
5859
}
5960

6061
#[derive(Drop, starknet::Event)]
@@ -99,6 +100,15 @@ pub mod EventFactory {
99100
amount: u256
100101
}
101102

103+
#[derive(Drop, starknet::Event)]
104+
struct AttendeeCheckedIn {
105+
#[key]
106+
event_id: u256,
107+
#[key]
108+
attendee: ContractAddress,
109+
time: u64
110+
}
111+
102112
//*//////////////////////////////////////////////////////////////////////////
103113
// STORAGE
104114
//////////////////////////////////////////////////////////////////////////*//
@@ -110,12 +120,13 @@ pub mod EventFactory {
110120
accesscontrol: AccessControlComponent::Storage,
111121
#[substorage(v0)]
112122
upgradeable: UpgradeableComponent::Storage,
113-
event_count: u256,
114-
events: Map<u256, EventData>,
115-
event_ticket_balance: Map<u256, u256>,
116123
ticket_721_class_hash: felt252,
117124
tba_registry_class_hash: felt252,
118125
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>>,
119130
}
120131

121132
//*//////////////////////////////////////////////////////////////////////////
@@ -234,6 +245,13 @@ pub mod EventFactory {
234245
tba_address
235246
}
236247

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+
237255
// -------------- GETTER FUNCTIONS -----------------------
238256

239257
fn get_all_events(self: @ContractState) -> Array<EventData> {
@@ -481,11 +499,12 @@ pub mod EventFactory {
481499
let strk_token = IERC20Dispatcher {
482500
contract_address: STRK_TOKEN_ADDRESS.try_into().unwrap()
483501
};
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);
489508

490509
let event_ticket_address = event_instance.ticket_addr;
491510
let event_ticket = ITicket721Dispatcher { contract_address: event_ticket_address };
@@ -523,6 +542,33 @@ pub mod EventFactory {
523542
tba_address
524543
}
525544

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+
526572
fn _deploy_tba(
527573
self: @ContractState, event_ticket_address: ContractAddress, ticket_id: u256
528574
) -> ContractAddress {

src/interfaces/i_event_factory.cairo

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub trait IEventFactory<TContractState> {
3232
fn add_organizer(ref self: TContractState, event_id: u256, organizer: ContractAddress);
3333
fn remove_organizer(ref self: TContractState, event_id: u256, organizer: ContractAddress);
3434
fn purchase_ticket(ref self: TContractState, event_id: u256) -> ContractAddress;
35+
fn check_in(ref self: TContractState, event_id: u256, attendee: ContractAddress) -> bool;
3536
fn get_all_events(self: @TContractState) -> Array<EventData>;
3637
fn get_event(self: @TContractState, event_id: u256) -> EventData;
3738
fn get_event_count(self: @TContractState) -> u256;

0 commit comments

Comments
 (0)