BNBFree AutoBet Fibonacci Bot [v1.0]

Bot de apuestas automáticas para BNBFree.in usando estrategia Fibonacci. Automatiza AutoRoll y optimiza ganancias en faucets BNB.

// ==UserScript==
// @name            BNBFree AutoBet Fibonacci Bot [v1.0]
// @name:en         BNBFree AutoBet Fibonacci Bot [v1.0]
// @namespace       https://bnbfree.in/
// @version         1.0
// @description     Bot de apuestas automáticas para BNBFree.in usando estrategia Fibonacci. Automatiza AutoRoll y optimiza ganancias en faucets BNB.
// @description:en  Automatic Fibonacci betting bot for BNBFree.in. Automates AutoRoll and optimizes earnings on BNB faucets.
// @tags            bnb, faucet, bnbfree, autobet, auto roll, fibonacci, bot, crypto, bnb faucet, bnb bot, bnb roll, bnbfree bot, autoclick, autoroll, crypto faucet, passive income, gambling, automation
// @author          Jan
// @match           https://bnbfree.in/*
// @icon            https://www.google.com/s2/favicons?sz=64&domain=bnbfree.in
// @license         MIT
// @grant           none
// ==/UserScript==

// Tu código aquí...


(function () {
    'use strict';

    let baseBet = 0.00000001;
    const targetProfit = 1.00000000;
    let index = 0;
    let stop = false;
    let startingBalance = 0;
    let currentBalance = 0;
    let maxBetSatoshi = 0;
    let buttonContainer = null;
    let togglePanelBtn = null;

    function createTogglePanelButton() {
        togglePanelBtn = document.createElement('button');
        togglePanelBtn.id = 'toggle_panel_btn';
        togglePanelBtn.innerText = '⚙️';
        togglePanelBtn.title = 'Mostrar/Ocultar Panel';
        togglePanelBtn.style.position = 'fixed';
        togglePanelBtn.style.top = '20px';
        togglePanelBtn.style.right = '20px';
        togglePanelBtn.style.zIndex = '10000';
        togglePanelBtn.style.padding = '10px 14px';
        togglePanelBtn.style.fontSize = '20px';
        togglePanelBtn.style.backgroundColor = '#ff8c00';
        togglePanelBtn.style.border = 'none';
        togglePanelBtn.style.borderRadius = '50%';
        togglePanelBtn.style.color = 'white';
        togglePanelBtn.style.cursor = 'pointer';
        togglePanelBtn.style.boxShadow = '0 0 10px rgba(0,0,0,0.4)';
        togglePanelBtn.style.transition = 'transform 0.3s ease';
        togglePanelBtn.onmouseenter = () => togglePanelBtn.style.transform = 'rotate(30deg)';
        togglePanelBtn.onmouseleave = () => togglePanelBtn.style.transform = 'rotate(0deg)';
        togglePanelBtn.onclick = () => {
            buttonContainer.style.display = buttonContainer.style.display === 'none' ? 'flex' : 'none';
        };

        document.body.appendChild(togglePanelBtn);
    }

    function createControlButtons() {
        buttonContainer = document.createElement('div');
        buttonContainer.id = 'bnb_bot_container';
        buttonContainer.style.position = 'fixed';
        buttonContainer.style.top = '80px';
        buttonContainer.style.right = '20px';
        buttonContainer.style.zIndex = '9999';
        buttonContainer.style.background = '#ff8c00';
        buttonContainer.style.padding = '20px';
        buttonContainer.style.borderRadius = '20px';
        buttonContainer.style.boxShadow = '0 0 20px rgba(0,0,0,0.5)';
        buttonContainer.style.maxWidth = '90vw';
        buttonContainer.style.minWidth = '250px';
        buttonContainer.style.fontFamily = 'Arial, sans-serif';
        buttonContainer.style.color = '#fff';
        buttonContainer.style.display = 'flex';
        buttonContainer.style.flexDirection = 'column';
        buttonContainer.style.alignItems = 'center';
        buttonContainer.style.transition = 'all 0.5s ease';

        const style = document.createElement('style');
        style.innerHTML = `
        @media (max-width: 600px) {
            .radio-container {
                flex-wrap: wrap !important;
            }
            .radio-container label {
                flex: 0 0 45% !important;
            }
            #toggle_panel_btn {
                top: 60px !important;
            }
        }`;
        document.head.appendChild(style);

        const optionsLabel = document.createElement('div');
        optionsLabel.innerText = 'SELECT BASE BET:';
        optionsLabel.style.marginBottom = '10px';
        optionsLabel.style.fontWeight = 'bold';
        optionsLabel.style.textTransform = 'uppercase';
        optionsLabel.style.color = 'black';
        buttonContainer.appendChild(optionsLabel);

        const bets = [
            { label: '1 satoshi', value: 0.00000001 },
            { label: '10 satoshis', value: 0.00000010 },
            { label: '100 satoshis', value: 0.00000100 },
            { label: '1000 satoshis', value: 0.00001000 }
        ];

        const radioContainer = document.createElement('div');
        radioContainer.className = 'radio-container';
        radioContainer.style.display = 'flex';
        radioContainer.style.flexWrap = 'nowrap';
        radioContainer.style.justifyContent = 'center';
        radioContainer.style.marginBottom = '10px';
        radioContainer.style.gap = '10px';

        bets.forEach((bet) => {
            const option = document.createElement('label');
            option.style.flex = '1';
            option.style.textAlign = 'center';
            option.style.padding = '5px 10px';
            option.style.backgroundColor = '#007BFF';
            option.style.borderRadius = '10px';
            option.style.color = 'white';
            option.style.cursor = 'pointer';
            option.style.whiteSpace = 'nowrap';
            option.style.transition = 'transform 0.3s ease';

            option.onmouseenter = () => option.style.transform = 'scale(1.1)';
            option.onmouseleave = () => option.style.transform = 'scale(1)';

            const radio = document.createElement('input');
            radio.type = 'radio';
            radio.name = 'baseBet';
            radio.value = bet.value;
            radio.style.marginRight = '5px';

            option.appendChild(radio);
            option.appendChild(document.createTextNode(bet.label));
            radioContainer.appendChild(option);
        });

        buttonContainer.appendChild(radioContainer);

        const buttonRow = document.createElement('div');
        buttonRow.style.display = 'flex';
        buttonRow.style.justifyContent = 'space-between';
        buttonRow.style.width = '100%';
        buttonRow.style.marginBottom = '10px';
        buttonRow.style.gap = '10px';

        const startButton = document.createElement('button');
        startButton.innerText = 'START BOT';
        startButton.style.flex = '1';
        startButton.style.padding = '10px';
        startButton.style.backgroundColor = '#28a745';
        startButton.style.border = 'none';
        startButton.style.borderRadius = '10px';
        startButton.style.color = 'white';
        startButton.style.fontSize = '16px';
        startButton.style.cursor = 'pointer';
        startButton.style.transition = 'transform 0.3s ease';
        startButton.onmouseenter = () => startButton.style.transform = 'scale(1.05)';
        startButton.onmouseleave = () => startButton.style.transform = 'scale(1)';
        startButton.onclick = () => {
            const selected = document.querySelector('input[name="baseBet"]:checked');
            if (!selected) {
                alert("⛔ Please select a base bet option before starting the bot.");
                return;
            }
            baseBet = parseFloat(selected.value);
            // Simula clic en MULTIPLY BNB
            const multiplyLink = document.querySelector('a.double_your_btc_link');
            if (multiplyLink) multiplyLink.click();
            startBot();
        };

        const stopButton = document.createElement('button');
        stopButton.innerText = 'STOP BOT';
        stopButton.style.flex = '1';
        stopButton.style.padding = '10px';
        stopButton.style.backgroundColor = '#dc3545';
        stopButton.style.border = 'none';
        stopButton.style.borderRadius = '10px';
        stopButton.style.color = 'white';
        stopButton.style.fontSize = '16px';
        stopButton.style.cursor = 'pointer';
        stopButton.style.transition = 'transform 0.3s ease';
        stopButton.onmouseenter = () => stopButton.style.transform = 'scale(1.05)';
        stopButton.onmouseleave = () => stopButton.style.transform = 'scale(1)';
        stopButton.onclick = stopBot;

        buttonRow.appendChild(startButton);
        buttonRow.appendChild(stopButton);
        buttonContainer.appendChild(buttonRow);

        const statusText = document.createElement('div');
        statusText.id = 'bot_status';
        statusText.style.fontSize = '14px';
        statusText.style.color = '#333';
        statusText.style.marginTop = '10px';
        buttonContainer.appendChild(statusText);

        document.body.appendChild(buttonContainer);
    }

    function getFibonacciValue(n) {
        if (n === 0 || n === 1) return baseBet;
        let a = baseBet, b = baseBet, result;
        for (let i = 2; i <= n; i++) {
            result = parseFloat((a + b).toFixed(8));
            a = b;
            b = result;
        }
        return result;
    }

    function updateStatus(profit, currentBet) {
        const statusText = document.getElementById('bot_status');
        if (statusText) {
            if (currentBet * 100000000 > maxBetSatoshi) {
                maxBetSatoshi = Math.floor(currentBet * 100000000);
            }
            statusText.innerText = `Win: ${(profit * 100000000).toFixed(0)} sat | Max Bet: ${maxBetSatoshi} sat`;
        }
    }

    function startBot() {
        stop = false;

        const interval = setInterval(() => {
            const balanceSpan = document.getElementById("balance");
            const stakeInput = document.querySelector("#double_your_btc_stake");
            const hiButton = document.querySelector("#double_your_btc_bet_hi_button");
            const payoutInput = document.querySelector("#double_your_btc_payout_multiplier");

            if (balanceSpan && stakeInput && hiButton && payoutInput) {
                clearInterval(interval);
                payoutInput.value = "3.00";
                startingBalance = parseFloat(balanceSpan.innerText.replace(/,/g, ''));
                currentBalance = startingBalance;
                runBot(stakeInput, hiButton, balanceSpan);
            }
        }, 1000);
    }

    function stopBot() {
        stop = true;
        console.log("⛔ Bot detenido.");
    }

    function runBot(stakeInput, hiButton, balanceSpan) {
        function makeBet() {
            if (stop) return;
            const currentBet = getFibonacciValue(index);
            stakeInput.value = currentBet.toFixed(8);
            hiButton.click();
            waitForResult(currentBet);
        }

        function waitForResult(currentBet) {
            setTimeout(() => {
                const newBalance = parseFloat(balanceSpan.innerText.replace(/,/g, ''));
                const profit = newBalance - startingBalance;
                updateStatus(profit, currentBet);

                if (profit >= targetProfit) {
                    stop = true;
                    console.log("🎉 Meta diaria alcanzada.");
                    return;
                }

                if (newBalance > currentBalance) {
                    index = 0;
                } else {
                    index++;
                }

                currentBalance = newBalance;
                setTimeout(makeBet, 500);
            }, 4000);
        }

        makeBet();
    }

    window.addEventListener("load", () => {
        createControlButtons();
        createTogglePanelButton();
    });
})();