(null);
const handleGetTickets = async () => {
+ setErrorMessage(null);
+ setTickets(null);
+
+ if (eventId === null) {
+ setErrorMessage('Please enter a valid Event ID.');
+ return;
+ }
+
try {
+ // Get the contract instance
const contract = getContract();
- if (eventId === null) return;
-
+ // Fetch tickets for the given event ID
const eventTickets = await contract.getEventTickets(eventId);
- setTickets(eventTickets);
+
+ // Convert BigNumbers to plain numbers for display
+ setTickets(
+ eventTickets.map((ticket: ethers.BigNumber) => ticket.toNumber())
+ );
} catch (error) {
console.error('Error fetching event tickets:', error);
+ setErrorMessage(
+ 'Failed to fetch tickets. Please check the Event ID and try again.'
+ );
}
};
@@ -37,6 +54,8 @@ const GetEventTickets = () => {
Get Tickets
+ {errorMessage && {errorMessage}
}
+
{tickets && (
Tickets for Event {eventId}:
diff --git a/contracts/EventManager.sol b/contracts/EventManager.sol
index 11ae5bb..f68a7a7 100644
--- a/contracts/EventManager.sol
+++ b/contracts/EventManager.sol
@@ -29,7 +29,7 @@ contract EventManager {
uint256 eventDate;
string[] images; // array of image URLs
uint256[] tickets;
- address eventHost;
+ address payable eventHost;
}
struct Ticket {
@@ -71,7 +71,7 @@ contract EventManager {
return _cents * power(10, decimals) * 1 ether / 100 / feedValue;
}
- function power(uint base, int8 exponent) public pure returns (uint) {
+ function power(uint base, int8 exponent) private pure returns (uint) {
require(exponent >= 0, "Exponent must be non-negative");
uint result = 1;
for (int8 i = 0; i < exponent; i++) {
@@ -85,9 +85,10 @@ contract EventManager {
return centsToFlare(events[_eventId].ticketPrice);
}
- function createEvent(string memory _name, string memory _description, uint256 _capacity, uint256 _ticketPrice, uint256 _eventDate, string[] memory _images) public {
- events[eventCounter] = Event(_name, _description, _capacity, 0, _ticketPrice, _eventDate, _images, new uint256[](0), msg.sender);
+ function createEvent(string memory _name, string memory _description, uint256 _capacity, uint256 _ticketPrice, uint256 _eventDate, string[] memory _images) public returns (uint256 _eventId) {
+ events[eventCounter] = Event(_name, _description, _capacity, 0, _ticketPrice, _eventDate, _images, new uint256[](0), payable(msg.sender));
eventCounter++;
+ return eventCounter - 1;
}
function getEventImages(uint256 _eventId) public view returns (string[] memory) {
@@ -100,12 +101,18 @@ contract EventManager {
return events[_eventId].tickets;
}
- //TODO: ADD CURRENCY CONVERSION + CHECK
- function buyTicket(uint256 _eventId) public payable {
+ function buyTicket(uint256 _eventId) public payable returns (uint256 _ticketId) {
require(_eventId < eventCounter, "Invalid event ID");
require(events[_eventId].eventDate > block.timestamp, "Event has already passed");
require(events[_eventId].tickets.length < events[_eventId].capacity, "Event is full");
- require(msg.value == events[_eventId].ticketPrice, "Invalid ticket price");
+
+ uint256 ticketCost = getEventPriceFlare(_eventId); // Get ticket price in FLR
+ require(msg.value >= ticketCost, "Insufficient value provided"); // Ensure user has paid >= ticket price
+ if (msg.value > ticketCost) {
+ // Pay any excess the user paid
+ (bool sentExcess, ) = msg.sender.call{value: msg.value - ticketCost}("");
+ require(sentExcess, "Failed to send FLR excess back to buyer");
+ }
// Create new ticket
tickets[ticketCounter] = Ticket(msg.sender, block.timestamp, _eventId);
@@ -119,8 +126,10 @@ contract EventManager {
events[_eventId].ticketsSold++;
// Transfer FLR to event host
- (bool sent, ) = events[_eventId].eventHost.call{value: msg.value}("");
- require(sent, "Failed to send FLR to event host");
+ (bool sentToHost, ) = events[_eventId].eventHost.call{value: ticketCost}("");
+ require(sentToHost, "Failed to send FLR to event host");
+
+ return ticketCounter - 1;
}
function transferTicketForce(uint256 _ticketId, address _to) private {
diff --git a/lib/ethers.ts b/lib/ethers.ts
index bc08861..304b2e5 100644
--- a/lib/ethers.ts
+++ b/lib/ethers.ts
@@ -2,7 +2,7 @@ import { ethers } from 'ethers';
const FLARE_TESTNET_RPC_URL = 'https://coston2.enosys.global/ext/C/rpc';
-const CONTRACT_ADDRESS = '0x0B236423274D36C32fb2362cc177756a21A025A3';
+const CONTRACT_ADDRESS = '0xa67f64937a0a4daf3b5f5Eea7903d1E81d375b7b';
export function getFlareProvider() {
const flareRpcUrl = FLARE_TESTNET_RPC_URL;
@@ -46,7 +46,13 @@ export function getContract() {
},
],
name: 'buyTicket',
- outputs: [],
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '_ticketId',
+ type: 'uint256',
+ },
+ ],
stateMutability: 'payable',
type: 'function',
},
@@ -84,7 +90,13 @@ export function getContract() {
},
],
name: 'createEvent',
- outputs: [],
+ outputs: [
+ {
+ internalType: 'uint256',
+ name: '_eventId',
+ type: 'uint256',
+ },
+ ],
stateMutability: 'nonpayable',
type: 'function',
},
@@ -184,7 +196,7 @@ export function getContract() {
type: 'uint256',
},
{
- internalType: 'address',
+ internalType: 'address payable',
name: 'eventHost',
type: 'address',
},
@@ -314,30 +326,6 @@ export function getContract() {
stateMutability: 'view',
type: 'function',
},
- {
- inputs: [
- {
- internalType: 'uint256',
- name: 'base',
- type: 'uint256',
- },
- {
- internalType: 'int8',
- name: 'exponent',
- type: 'int8',
- },
- ],
- name: 'power',
- outputs: [
- {
- internalType: 'uint256',
- name: '',
- type: 'uint256',
- },
- ],
- stateMutability: 'pure',
- type: 'function',
- },
{
inputs: [],
name: 'ticketCounter',