fix multiple tickers + abi

This commit is contained in:
Ayush Acharjya
2024-10-27 01:03:00 +01:00
parent c5b020d71d
commit 85ad44cc64
3 changed files with 551 additions and 537 deletions

View File

@@ -33,42 +33,54 @@ export const buyHandler = async (
return;
}
try {
if (typeof window.ethereum === 'undefined') {
toast({
title:
'You might be asked to approve multiple transactions if you buy multiple tickets',
});
while (numTickets > 0) {
try {
if (typeof window.ethereum === 'undefined') {
toast({
title: 'Please install MetaMask or another Ethereum wallet',
variant: 'destructive',
});
return;
}
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const contract = getContract().connect(signer);
const singleTicketCost = await contract.getEventPriceFlare(eventId);
const totalTicketCost = singleTicketCost
.mul(numTickets)
.mul(105)
.div(100);
const balance = await provider.getBalance(await signer.getAddress());
if (balance.lt(totalTicketCost)) {
toast({
title: 'Insufficient balance to cover ticket cost and gas fees.',
variant: 'destructive',
});
return;
}
const tx = await contract.buyTicket(eventId, { value: totalTicketCost });
const receipt = await tx.wait();
toast({
title: 'Please install MetaMask or another Ethereum wallet',
title: `Tickets purchased successfully! Transaction Hash: ${receipt.transactionHash}`,
});
numTickets -= 1;
} catch (error) {
console.error('Error buying tickets:', error);
toast({
title: 'Transaction failed. Please try again.',
variant: 'destructive',
});
return;
}
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const contract = getContract().connect(signer);
const singleTicketCost = await contract.getEventPriceFlare(eventId);
const totalTicketCost = singleTicketCost.mul(numTickets).mul(105).div(100);
const balance = await provider.getBalance(await signer.getAddress());
if (balance.lt(totalTicketCost)) {
toast({
title: 'Insufficient balance to cover ticket cost and gas fees.',
variant: 'destructive',
});
return;
}
const tx = await contract.buyTicket(eventId, { value: totalTicketCost });
const receipt = await tx.wait();
toast({
title: `Tickets purchased successfully! Transaction Hash: ${receipt.transactionHash}`,
});
} catch (error) {
console.error('Error buying tickets:', error);
toast({
title: 'Transaction failed. Please try again.',
variant: 'destructive',
});
}
};

View File

@@ -1,4 +1,5 @@
import { ethers } from 'ethers';
import EventManagerABI from '../contracts/EventManagerABI.json';
const FLARE_TESTNET_RPC_URL = process.env.NEXT_PUBLIC_RPC_URL;
const CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_CONTRACT_ADDRESS;
@@ -12,509 +13,6 @@ export function getFlareProvider() {
export function getContract() {
const provider = getFlareProvider();
const contractAddress = CONTRACT_ADDRESS;
const contractABI = [
{
inputs: [
{
internalType: 'uint256',
name: '_ticketId',
type: 'uint256',
},
{
internalType: 'address',
name: '_to',
type: 'address',
},
{
internalType: 'bool',
name: '_allowed',
type: 'bool',
},
],
name: 'approveTicket',
outputs: [],
stateMutability: 'nonpayable',
type: 'function',
},
{
inputs: [
{
internalType: 'uint256',
name: '_eventId',
type: 'uint256',
},
],
name: 'buyTicket',
outputs: [
{
internalType: 'uint256',
name: '_ticketId',
type: 'uint256',
},
],
stateMutability: 'payable',
type: 'function',
},
{
inputs: [
{
internalType: 'string',
name: '_name',
type: 'string',
},
{
internalType: 'string',
name: '_description',
type: 'string',
},
{
internalType: 'uint256',
name: '_capacity',
type: 'uint256',
},
{
internalType: 'uint256',
name: '_ticketPrice',
type: 'uint256',
},
{
internalType: 'uint256',
name: '_eventDate',
type: 'uint256',
},
{
internalType: 'string[]',
name: '_images',
type: 'string[]',
},
],
name: 'createEvent',
outputs: [
{
internalType: 'uint256',
name: '_eventId',
type: 'uint256',
},
],
stateMutability: 'nonpayable',
type: 'function',
},
{
inputs: [],
stateMutability: 'nonpayable',
type: 'constructor',
},
{
anonymous: false,
inputs: [
{
indexed: false,
internalType: 'uint256',
name: 'eventId',
type: 'uint256',
},
{
indexed: false,
internalType: 'string',
name: 'name',
type: 'string',
},
{
indexed: false,
internalType: 'uint256',
name: 'eventDate',
type: 'uint256',
},
],
name: 'EventCreated',
type: 'event',
},
{
anonymous: false,
inputs: [
{
indexed: false,
internalType: 'uint256',
name: 'ticketId',
type: 'uint256',
},
{
indexed: false,
internalType: 'uint256',
name: 'eventId',
type: 'uint256',
},
{
indexed: false,
internalType: 'address',
name: 'buyer',
type: 'address',
},
{
indexed: false,
internalType: 'uint256',
name: 'price',
type: 'uint256',
},
],
name: 'TicketPurchased',
type: 'event',
},
{
anonymous: false,
inputs: [
{
indexed: false,
internalType: 'uint256',
name: 'ticketId',
type: 'uint256',
},
{
indexed: false,
internalType: 'address',
name: 'owner',
type: 'address',
},
{
indexed: false,
internalType: 'address',
name: 'trustee',
type: 'address',
},
],
name: 'TicketTransferApproved',
type: 'event',
},
{
anonymous: false,
inputs: [
{
indexed: false,
internalType: 'uint256',
name: 'ticketId',
type: 'uint256',
},
{
indexed: false,
internalType: 'address',
name: 'from',
type: 'address',
},
{
indexed: false,
internalType: 'address',
name: 'to',
type: 'address',
},
],
name: 'TicketTransferred',
type: 'event',
},
{
inputs: [
{
internalType: 'uint256',
name: '_ticketId',
type: 'uint256',
},
{
internalType: 'address',
name: '_to',
type: 'address',
},
],
name: 'transferTicket',
outputs: [],
stateMutability: 'nonpayable',
type: 'function',
},
{
inputs: [
{
internalType: 'uint256',
name: '_ticketId',
type: 'uint256',
},
{
internalType: 'address',
name: '_to',
type: 'address',
},
],
name: 'transferTicketFrom',
outputs: [],
stateMutability: 'nonpayable',
type: 'function',
},
{
inputs: [
{
internalType: 'uint256',
name: '_cents',
type: 'uint256',
},
],
name: 'centsToFlare',
outputs: [
{
internalType: 'uint256',
name: '_flr',
type: 'uint256',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [],
name: 'eventCounter',
outputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256',
},
],
name: 'events',
outputs: [
{
internalType: 'string',
name: 'name',
type: 'string',
},
{
internalType: 'string',
name: 'description',
type: 'string',
},
{
internalType: 'uint256',
name: 'capacity',
type: 'uint256',
},
{
internalType: 'uint256',
name: 'ticketsSold',
type: 'uint256',
},
{
internalType: 'uint256',
name: 'ticketPrice',
type: 'uint256',
},
{
internalType: 'uint256',
name: 'eventDate',
type: 'uint256',
},
{
internalType: 'address payable',
name: 'eventHost',
type: 'address',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256',
},
],
name: 'feedIds',
outputs: [
{
internalType: 'bytes21',
name: '',
type: 'bytes21',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [
{
internalType: 'uint256',
name: '_eventId',
type: 'uint256',
},
],
name: 'getEventImages',
outputs: [
{
internalType: 'string[]',
name: '',
type: 'string[]',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [
{
internalType: 'uint256',
name: '_eventId',
type: 'uint256',
},
],
name: 'getEventPriceFlare',
outputs: [
{
internalType: 'uint256',
name: '_flr',
type: 'uint256',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [
{
internalType: 'uint256',
name: '_eventId',
type: 'uint256',
},
],
name: 'getEventTickets',
outputs: [
{
internalType: 'uint256[]',
name: '',
type: 'uint256[]',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [],
name: 'getFlareFeed',
outputs: [
{
internalType: 'uint256',
name: '_feedValue',
type: 'uint256',
},
{
internalType: 'int8',
name: '_decimals',
type: 'int8',
},
{
internalType: 'uint64',
name: '_timestamp',
type: 'uint64',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [],
name: 'getFtsoV2CurrentFeedValues',
outputs: [
{
internalType: 'uint256[]',
name: '_feedValues',
type: 'uint256[]',
},
{
internalType: 'int8[]',
name: '_decimals',
type: 'int8[]',
},
{
internalType: 'uint64',
name: '_timestamp',
type: 'uint64',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [],
name: 'ticketCounter',
outputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256',
},
],
name: 'tickets',
outputs: [
{
internalType: 'address',
name: 'holder',
type: 'address',
},
{
internalType: 'uint256',
name: 'boughtTime',
type: 'uint256',
},
{
internalType: 'uint256',
name: 'eventId',
type: 'uint256',
},
],
stateMutability: 'view',
type: 'function',
},
{
inputs: [
{
internalType: 'address',
name: '',
type: 'address',
},
{
internalType: 'uint256',
name: '',
type: 'uint256',
},
],
name: 'userTickets',
outputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256',
},
],
stateMutability: 'view',
type: 'function',
},
];
const contractABI = EventManagerABI;
return new ethers.Contract(contractAddress!, contractABI, provider);
}