From 4b3855bd1b7337ff832f71c23f923645a2bd3286 Mon Sep 17 00:00:00 2001 From: ayomaska18 Date: Sat, 26 Oct 2024 12:55:15 +0100 Subject: [PATCH] added transferTicket.tsx component --- components/sc/centsToFlare.tsx | 0 components/sc/transferTicket.tsx | 78 ++++++++++++++++++++++++++++---- contracts/EventManager.sol | 3 +- lib/ethers.ts | 2 +- 4 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 components/sc/centsToFlare.tsx diff --git a/components/sc/centsToFlare.tsx b/components/sc/centsToFlare.tsx new file mode 100644 index 0000000..e69de29 diff --git a/components/sc/transferTicket.tsx b/components/sc/transferTicket.tsx index 3307bca..a2bfdc6 100644 --- a/components/sc/transferTicket.tsx +++ b/components/sc/transferTicket.tsx @@ -17,6 +17,7 @@ const TransferTicket = () => { const [isWalletConnected, setIsWalletConnected] = useState(false); const [walletAddress, setWalletAddress] = useState(null); const [errorMessage, setErrorMessage] = useState(null); + const [isApprovedTransfer, setIsApprovedTransfer] = useState(false); // Connect Wallet const handleConnectWallet = async () => { @@ -40,11 +41,9 @@ const TransferTicket = () => { // Handle transferring the ticket const handleTransferTicket = async () => { - if (ticketId !== null) { - if (ticketId < 0) { - alert('Please enter a valid Ticket ID.'); - return; - } + if (!ticketId) { + alert('Please enter a valid Ticket ID.'); + return; } if (!ethers.utils.isAddress(recipientAddress)) { alert('Please enter a valid recipient address.'); @@ -57,10 +56,16 @@ const TransferTicket = () => { const signer = provider.getSigner(); const contract = getContract().connect(signer); - // Call `transferTicket` function - const tx = await contract.transferTicket(ticketId, recipientAddress); - const receipt = await tx.wait(); + let tx; + if (isApprovedTransfer) { + // Transfer using `transferTicketFrom` for approved users + tx = await contract.transferTicketFrom(ticketId, recipientAddress); + } else { + // Direct transfer by the owner using `transferTicket` + tx = await contract.transferTicket(ticketId, recipientAddress); + } + const receipt = await tx.wait(); setTransactionHash(receipt.transactionHash); console.log( 'Ticket transferred successfully, transaction hash:', @@ -75,6 +80,40 @@ const TransferTicket = () => { } }; + // Handle ticket approval for transfer + const handleApproveTransfer = async () => { + if (ticketId !== null) { + if (ticketId < 0) { + alert('Please enter a valid Ticket ID.'); + return; + } + } + + if (!ethers.utils.isAddress(recipientAddress)) { + alert('Please enter a valid recipient address.'); + return; + } + + try { + // Get the provider and signer + const provider = new ethers.providers.Web3Provider(window.ethereum); + const signer = provider.getSigner(); + const contract = getContract().connect(signer); + + // Approve recipient to transfer the ticket + const tx = await contract.approveTicket(ticketId, recipientAddress, true); + const receipt = await tx.wait(); + + console.log( + 'Ticket transfer approved, transaction hash:', + receipt.transactionHash + ); + alert(`Approved ${recipientAddress} to transfer ticket ID ${ticketId}`); + } catch (error) { + console.error('Error approving transfer:', error); + } + }; + return (

Transfer Ticket

@@ -103,13 +142,34 @@ const TransferTicket = () => { className="border p-2 mb-2" /> + {/* Toggle for approved transfer */} + + + {/* Transfer Ticket Button */} + {/* Approve Transfer Button */} + {!isApprovedTransfer && ( + + )} + {errorMessage &&

{errorMessage}

} {transactionHash && (

diff --git a/contracts/EventManager.sol b/contracts/EventManager.sol index 1485b9a..a395b94 100644 --- a/contracts/EventManager.sol +++ b/contracts/EventManager.sol @@ -159,9 +159,10 @@ contract EventManager { require(found, "Ticket not found in sender's inventory"); // Remove ticket from holder's array - for (; i < userTickets[prevHolder].length; i++) { + for (; i < userTickets[prevHolder].length-1; i++) { userTickets[prevHolder][i] = userTickets[prevHolder][i+1]; } + userTickets[prevHolder].pop(); // Add ticket to _to's array userTickets[_to].push(_ticketId); diff --git a/lib/ethers.ts b/lib/ethers.ts index 5f5c093..31b5576 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 = '0xA171873976afaf4b1442c959C2e03b7d52656340'; +const CONTRACT_ADDRESS = '0xa12B3168e8FC621493c9db2dc1Db31e75cCA00bb'; export function getFlareProvider() { const flareRpcUrl = FLARE_TESTNET_RPC_URL;