require('dotenv').config(); const { ethers } = require('ethers'); const express = require('express'); // Load environment variables const INFURA_PROJECT_ID = process.env.INFURA_PROJECT_ID; const PRIVATE_KEY = process.env.PRIVATE_KEY; const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS; const ABI = [ // Add your contract's ABI here "function shilft() public", "function slide() public" ]; // Initialize the provider const provider = new ethers.providers.InfuraProvider('sepolia', INFURA_PROJECT_ID); const wallet = new ethers.Wallet(PRIVATE_KEY, provider); const contract = new ethers.Contract(CONTRACT_ADDRESS, ABI, wallet); let startTime = new Date(); let lastShilftTime = null; let lastSlideTime = null; async function checkFunds() { const balance = await wallet.getBalance(); return ethers.utils.formatEther(balance); } async function canCallFunction(func) { try { // Simulate calling the function await func.callStatic(); return true; } catch (error) { return false; } } function formatDuration(ms) { let seconds = Math.floor(ms / 1000); let minutes = Math.floor(seconds / 60); let hours = Math.floor(minutes / 60); let days = Math.floor(hours / 24); seconds = seconds % 60; minutes = minutes % 60; hours = hours % 24; return `${days} days, ${hours} hours, ${minutes} minutes`; } async function main() { console.log('Service started...'); while (true) { try { if (await canCallFunction(contract.shilft)) { console.log('Calling shilft...'); const tx = await contract.shilft(); await tx.wait(); lastShilftTime = new Date(); console.log('shilft called successfully.'); } else if (await canCallFunction(contract.slide)) { console.log('Calling slide...'); const tx = await contract.slide(); await tx.wait(); lastSlideTime = new Date(); console.log('slide called successfully.'); } else { console.log('No function can be called at the moment.'); } } catch (error) { console.error('Error in main loop:', error); } // Wait for some time before checking again await new Promise(resolve => setTimeout(resolve, 60000)); // 1 minute } } // Start the main loop main().catch(async (error) => { console.error('Fatal error:', error); }); // Set up the Express server const app = express(); const PORT = process.env.PORT || 3000; app.get('/status', async (req, res) => { try { const balance = await checkFunds(); const uptime = formatDuration(new Date() - startTime); const status = { balance: `${balance} ETH`, uptime: uptime, lastShilftTime: lastShilftTime ? lastShilftTime.toString() : 'Never', lastSlideTime: lastSlideTime ? lastSlideTime.toString() : 'Never' }; if (parseFloat(balance) < 0.1) { res.status(500).send(`Low Ethereum Balance: ${balance} ETH`); } else { res.status(200).json(status); } } catch (error) { res.status(500).send(`Error checking funds: ${error.message}`); } }); app.listen(PORT, () => { console.log(`HTTP server running on port ${PORT}`); });