Spaces:
Build error
Build error
| <html lang="vi"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Listen to Smart Contract Events</title> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/web3/4.0.2/web3.min.js"></script> | |
| </head> | |
| <body> | |
| <h2>Smart Contract Event Listener</h2> | |
| <button onclick="connectWallet()">Kết nối Metamask</button> | |
| <div id="events"></div> | |
| <script> | |
| const contractAddress = "0xc8d9f01b9d1552D276a589db920620F328B7208E"; | |
| const contractABI = [ | |
| { | |
| "inputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "constructor" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "address", | |
| "name": "sessionId", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string[]", | |
| "name": "dataChannels", | |
| "type": "string[]" | |
| } | |
| ], | |
| "name": "DataChannelsUpdated", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "address", | |
| "name": "user", | |
| "type": "address" | |
| } | |
| ], | |
| "name": "JoinedRoom", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "address", | |
| "name": "user", | |
| "type": "address" | |
| } | |
| ], | |
| "name": "LeftRoom", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "key", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "value", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "MetadataUpdated", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "name", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "address", | |
| "name": "owner", | |
| "type": "address" | |
| } | |
| ], | |
| "name": "RoomCreated", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "bool", | |
| "name": "isActive", | |
| "type": "bool" | |
| } | |
| ], | |
| "name": "RoomStatusChanged", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": true, | |
| "internalType": "address", | |
| "name": "user", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "sessionID", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "SessionIDUpdated", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "address", | |
| "name": "sessionId", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "sdp", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "sdpType", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "SessionRenegotiated", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "address", | |
| "name": "participant", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "trackName", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "TrackPublished", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "address", | |
| "name": "sessionId", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "address", | |
| "name": "remoteSession", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "trackName", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "TrackPulled", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "address", | |
| "name": "participant", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "trackName", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "TrackUnpublished", | |
| "type": "event" | |
| }, | |
| { | |
| "anonymous": false, | |
| "inputs": [ | |
| { | |
| "indexed": true, | |
| "internalType": "address", | |
| "name": "userAddress", | |
| "type": "address" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "bool", | |
| "name": "isModerator", | |
| "type": "bool" | |
| }, | |
| { | |
| "indexed": false, | |
| "internalType": "string", | |
| "name": "role", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "UserUpdated", | |
| "type": "event" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "urls", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "username", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "credential", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "addIceServer", | |
| "outputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "address", | |
| "name": "user", | |
| "type": "address" | |
| } | |
| ], | |
| "name": "checkUserInRoom", | |
| "outputs": [ | |
| { | |
| "internalType": "bool", | |
| "name": "", | |
| "type": "bool" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "name", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "metadata", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "createRoom", | |
| "outputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [], | |
| "name": "getAllRooms", | |
| "outputs": [ | |
| { | |
| "internalType": "string[]", | |
| "name": "", | |
| "type": "string[]" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [], | |
| "name": "getIceServers", | |
| "outputs": [ | |
| { | |
| "components": [ | |
| { | |
| "internalType": "string", | |
| "name": "urls", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "username", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "credential", | |
| "type": "string" | |
| } | |
| ], | |
| "internalType": "struct Meeting.ICEServer[]", | |
| "name": "", | |
| "type": "tuple[]" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "getRoomDetails", | |
| "outputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "id", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "name", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "metadata", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "address", | |
| "name": "roomOwner", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "uint256", | |
| "name": "createdAt", | |
| "type": "uint256" | |
| }, | |
| { | |
| "internalType": "bool", | |
| "name": "isActive", | |
| "type": "bool" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "key", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "getRoomMetadata", | |
| "outputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "", | |
| "type": "string" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "getRoomParticipants", | |
| "outputs": [ | |
| { | |
| "internalType": "address[]", | |
| "name": "", | |
| "type": "address[]" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "address", | |
| "name": "user", | |
| "type": "address" | |
| } | |
| ], | |
| "name": "getSessionID", | |
| "outputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "", | |
| "type": "string" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "address", | |
| "name": "participantAddr", | |
| "type": "address" | |
| } | |
| ], | |
| "name": "getSessionTracks", | |
| "outputs": [ | |
| { | |
| "internalType": "string[]", | |
| "name": "", | |
| "type": "string[]" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "userAddress", | |
| "type": "address" | |
| } | |
| ], | |
| "name": "getUserInfo", | |
| "outputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "userId", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "bool", | |
| "name": "isModerator", | |
| "type": "bool" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "role", | |
| "type": "string" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "joinRoom", | |
| "outputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "leaveRoom", | |
| "outputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "roomExists", | |
| "outputs": [ | |
| { | |
| "internalType": "bool", | |
| "name": "", | |
| "type": "bool" | |
| } | |
| ], | |
| "stateMutability": "view", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "sessionID", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "saveSessionID", | |
| "outputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "bool", | |
| "name": "isActive", | |
| "type": "bool" | |
| } | |
| ], | |
| "name": "setRoomStatus", | |
| "outputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "address", | |
| "name": "userAddress", | |
| "type": "address" | |
| }, | |
| { | |
| "internalType": "bool", | |
| "name": "isModerator", | |
| "type": "bool" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "role", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "setUserInfo", | |
| "outputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| }, | |
| { | |
| "inputs": [ | |
| { | |
| "internalType": "string", | |
| "name": "roomId", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "key", | |
| "type": "string" | |
| }, | |
| { | |
| "internalType": "string", | |
| "name": "value", | |
| "type": "string" | |
| } | |
| ], | |
| "name": "updateRoomMetadata", | |
| "outputs": [], | |
| "stateMutability": "nonpayable", | |
| "type": "function" | |
| } | |
| ]; | |
| let web3; | |
| let contract; | |
| const wsWeb3 = new Web3(new Web3.providers.WebsocketProvider('wss://bsc-testnet-rpc.publicnode.com')); | |
| const wsContract = new wsWeb3.eth.Contract(contractABI, contractAddress); | |
| async function connectWallet() { | |
| if (window.ethereum) { | |
| web3 = new Web3(window.ethereum); | |
| await window.ethereum.request({ method: "eth_requestAccounts" }); | |
| const accounts = await web3.eth.getAccounts(); | |
| console.log("Connected account:", accounts[0]); | |
| listenToEvents(); | |
| } else { | |
| alert("Vui lòng cài đặt MetaMask!"); | |
| } | |
| } | |
| function listenToEvents() { | |
| wsContract.events.RoomCreated() | |
| .on("data", event => { | |
| console.log("📥 Room created:", event.returnValues); | |
| const eventData = ` | |
| <p><strong>Room ID:</strong> ${event.returnValues.roomId}</p> | |
| <p><strong>Tên phòng:</strong> ${event.returnValues.name}</p> | |
| <p><strong>Chủ phòng:</strong> ${event.returnValues.owner}</p> | |
| <hr> | |
| `; | |
| document.getElementById("events").innerHTML += eventData; | |
| }) | |
| .on("error", error => { | |
| console.error("❌ WebSocket Error:", error); | |
| }); | |
| } | |
| </script> | |
| </body> | |
| </html> |