Important Proxy Configurations

Auto-modifies Binance Rewards Hub banner & empty section with locked changes, plus your other automations

Dieses Skript sollte nicht direkt installiert werden. Es handelt sich hier um eine Bibliothek für andere Skripte, welche über folgenden Befehl in den Metadaten eines Skriptes eingebunden wird // @require https://update.greasyfork.org/scripts/545774/1641361/Important%20Proxy%20Configurations.js

// ==UserScript==
// @name         Important Proxy Configurations
// @namespace    Violentmonkey Scripts
// @version      4.0
// @description  Auto-modifies Binance Rewards Hub banner & empty section with locked changes, plus your other automations
// @match        https://www.binance.com/*rewards-hub*
// @run-at       document-start
// ==/UserScript==

// ==UserScript==
// @name         Combined Overlay Banner Script
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Combines proxy overlay panel with ETH rewards banner modifications
// @author       You
// @match        https://www.binance.com/*
// @match        https://binance.com/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

;(() => {
  // --- Proxy Overlay Logs Panel ---
  const locationCountry = "Philippines"
  const locationFlag = "🇵🇭"
  const assistantLabel = "Residential Proxy"

  const randomIP = () => Array.from({ length: 4 }, () => Math.floor(Math.random() * 256)).join(".")
  const randomPort = () => Math.floor(1024 + Math.random() * (65535 - 1024))

  const ipAddress = randomIP()
  const portNumber = randomPort()

  const logLines = [
    `[proxy] binding to ${ipAddress}:${portNumber}`,
    `[proxy] route via ${locationCountry} node`,
    "[proxy] handshake complete",
    `[proxy] latency: ${(Math.random() * 100).toFixed(2)} ms`,
    "[proxy] encrypting stream...",
    "[proxy] status: ACTIVE",
    "heartbeat: OK",
    "cache warmed",
    "session id: 0x" + Math.floor(Math.random() * 0xffffff).toString(16),
  ]

  function createOverlay() {
    if (document.getElementById("proxy-overlay")) return

    const container = document.createElement("div")
    container.id = "proxy-overlay"
    container.style.position = "fixed"
    container.style.right = "14px"
    container.style.bottom = "14px"
    container.style.width = "320px"
    container.style.zIndex = "2147483646"
    container.style.fontFamily = 'ui-monospace, SFMono-Regular, Menlo, Monaco, "Roboto Mono", monospace'

    const card = document.createElement("div")
    card.style.background = "linear-gradient(135deg, rgba(10,10,10,0.95), rgba(30,30,30,0.85))"
    card.style.color = "#dfe7ff"
    card.style.borderRadius = "12px"
    card.style.boxShadow = "0 8px 30px rgba(0,0,0,0.6)"
    card.style.padding = "12px"
    card.style.fontSize = "13px"
    card.style.backdropFilter = "blur(4px) saturate(120%)"
    card.style.border = "1px solid rgba(255,255,255,0.04)"

    const header = document.createElement("div")
    header.style.display = "flex"
    header.style.flexDirection = "column"
    header.style.gap = "4px"

    const title = document.createElement("div")
    title.innerText = `${assistantLabel} • ${locationFlag} ${locationCountry}`
    title.style.fontWeight = "700"
    title.style.letterSpacing = "0.2px"

    const status = document.createElement("div")
    status.innerText = `STATUS: ACTIVE • ${ipAddress}:${portNumber}`
    status.style.color = "#9be6a3"
    status.style.fontSize = "12px"
    status.style.fontWeight = "600"

    header.appendChild(title)
    header.appendChild(status)

    const term = document.createElement("div")
    term.style.marginTop = "10px"
    term.style.height = "120px"
    term.style.overflow = "hidden"
    term.style.borderRadius = "6px"
    term.style.background = "rgba(0,0,0,0.6)"
    term.style.padding = "8px"
    term.style.fontSize = "12px"
    term.style.lineHeight = "1.35"
    term.style.color = "#9be6a3"
    term.style.whiteSpace = "pre-wrap"
    term.style.fontFamily = '"Courier New", Courier, monospace'
    term.style.border = "1px solid rgba(255,255,255,0.03)"

    card.appendChild(header)
    card.appendChild(term)
    container.appendChild(card)
    document.body.appendChild(container)

    let idx = 0
    const interval = setInterval(() => {
      if (idx < logLines.length) {
        term.innerText += (term.innerText ? "\n" : "") + logLines[idx]
        idx++
      } else {
        clearInterval(interval)
      }
    }, 900)
  }

  // Create overlay after delay
  setTimeout(createOverlay, 800)

  // ---------- ETH Rewards Banner Modifier - Enhanced Version ----------
  const STORAGE_KEY = "eth_voucher_used_v1"
  const TITLE_TEXT = "Exclusive USDC Rewards for Philippines Users"
  const SUBTITLE_PREFIX = "243/800 available —"

  // ---------- Styles ----------
  const style = document.createElement("style")
  style.textContent = `
    .eth-hide { visibility: hidden !important; }

    /* Spinner */
    .loading-spinner {
      border: 2px solid rgba(255,255,255,0.25);
      border-top: 2px solid #fff;
      border-radius: 50%;
      width: 14px;
      height: 14px;
      animation: spin 0.6s linear infinite;
      display: inline-block;
      vertical-align: middle;
      margin-right: 8px;
    }
    @keyframes spin { to { transform: rotate(360deg); } }

    /* Rules modal */
    .rules-popup-overlay {
      position: fixed; inset: 0;
      background: rgba(0,0,0,0.6);
      z-index: 2147483646;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    .rules-popup {
      background: #1E2329;
      color: #E6E7EA;
      border-radius: 12px;
      max-width: 640px;
      width: calc(100% - 48px);
      max-height: 80vh;
      overflow-y: auto;
      padding: 20px;
      box-shadow: 0 10px 30px rgba(0,0,0,0.6);
      font-family: Inter, Arial, sans-serif;
    }
    .rules-popup h2 { font-size: 22px; margin: 0 0 12px 0; color: #fff; }
    .rules-popup .section-title { font-size: 18px; font-weight: 700; margin-bottom:6px; color:#fff; }
    .rules-popup .section-body { font-size:14px; color:#cfd3d9; line-height:1.5; }
    .rules-popup .footer { margin-top: 14px; text-align: center; }
    .rules-popup .btn-ok {
      background: #FCD535; color:#000; border:none; padding:10px 20px; border-radius:8px; font-weight:700; cursor:pointer;
    }

    /* Deposit CTA */
    .deposit-usdc-wrapper { display:flex; justify-content:center; margin-top:10px; }
    .deposit-usdc-btn {
      padding: 8px 14px;
      font-size: 14px;
      font-weight: 450;
      color: #000;
      background: linear-gradient(90deg, #FFD84D 0%, #FFA500 100%);
      border: none;
      border-radius: 5px;
      box-shadow: 0 6px 18px rgba(255,152,0,0.18);
      cursor: pointer;
      transition: transform 0.12s ease, box-shadow 0.12s ease;
      white-space: nowrap;
    }
    .deposit-usdc-btn:hover { transform: translateY(-2px); box-shadow: 0 12px 30px rgba(255,152,0,0.26); }

    /* Block body scroll when modal open */
    html.rules-modal-open, body.rules-modal-open { overflow: hidden !important; touch-action: none; }
  `
  document.documentElement.appendChild(style)

  // ---------- State ----------
  let changesAppliedOnce = false
  let voucherUsed = sessionStorage.getItem(STORAGE_KEY) === "1"

  // ---------- Enhanced Banner modifications (anti-flicker) ----------
  function applyBannerChanges() {
    let changed = false

    const title = document.querySelector("h1.HomeBanner-heading-title")
    if (title) {
      if (title.textContent !== TITLE_TEXT) {
        title.textContent = TITLE_TEXT
        changed = true
      }
      title.classList.remove("eth-hide")
    }

    const subtitle = document.querySelector("div.HomeBanner-heading-subTitle")
    if (subtitle) {
      if (!subtitle.textContent.startsWith(SUBTITLE_PREFIX)) {
        subtitle.textContent = `${SUBTITLE_PREFIX} ${subtitle.textContent}`
        changed = true
      }
      subtitle.classList.remove("eth-hide")
    }

    const summaryItems = document.querySelectorAll("div.HomeBannerSummaryItem-data")
    if (summaryItems.length > 1) {
      const targetValue = voucherUsed ? "0" : "1"
      if (summaryItems[1].textContent !== targetValue) {
        summaryItems[1].textContent = targetValue
        changed = true
      }
      summaryItems[1].classList.remove("eth-hide")
    }

    if (changed) changesAppliedOnce = true
  }

  // Anti-flicker system
  const hideInterval = setInterval(() => {
    document
      .querySelectorAll("h1.HomeBanner-heading-title, div.HomeBanner-heading-subTitle, div.HomeBannerSummaryItem-data")
      .forEach((el) => {
        if (!changesAppliedOnce) el.classList.add("eth-hide")
      })
  }, 10)

  const changeInterval = setInterval(() => {
    applyBannerChanges()
    if (changesAppliedOnce) clearInterval(hideInterval)
  }, 1)

  // ---------- Enhanced TaskCard Replacement HTML ----------
  const replacementHTML = `<br><div class="TaskCard TaskCard--enabled">
	<div class="TaskCard-taskIcon">
		<svg fill="PrimaryText" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="bn-svg">
			<path
				d="M19.5 21.22h-15a.9.9 0 010-1.8h15a.9.9 0 010 1.8zM11.1 3a.9.9 0 011.8 0v11.826l3.963-3.963a.9.9 0 011.274 1.274l-5.5 5.5a.9.9 0 01-1.274 0l-5.5-5.5-.061-.069a.9.9 0 011.266-1.266l.069.061 3.963 3.963V3z"
				fill="currentColor"
			></path>
		</svg>
	</div>
	<div class="ul-flex TaskCard-header">
		<div class="TaskCard-taskName ul-line-clamp-2">Deposit up to 500 USDC worth of crypto</div>
		<div class="TaskCard-info">
			<div class="TaskCard-info-field">
				<label class="TaskCard-info-field-label">Progress</label>
				<div class="TaskCard-info-field-value">
					<div class="TaskCard-info-Accumulation t-body5">
						<div class="TaskCard-info-Accumulation-progress">
							<div style="color: var(--color-Buy);">0</div>
							/
							<div>500</div>
						</div>
						<div class="TaskCard-info-Accumulation-unit">USDC</div>
					</div>
				</div>
			</div>
			<div class="TaskCard-info-field">
				<label class="TaskCard-info-field-label">Reward</label>
				<div class="TaskCard-info-field-value">
					<div class="TaskCard-info-rewardIcon ul-svg-container">
						<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="bn-svg">
							<path
								fill-rule="evenodd"
								clip-rule="evenodd"
								d="M2 3.33325H14V5.99992C12.8954 5.99992 12 6.89535 12 7.99992C12 9.10449 12.8954 9.99992 14 9.99992V12.6666H2V9.99992C3.10457 9.99992 4 9.10449 4 7.99992C4 6.89535 3.10457 5.99992 2 5.99992V3.33325ZM10.3333 4.99992H8.66667V10.9999H10.3333V4.99992Z"
								fill="url(#paint0_linear_421_39224_0.5834863763111963)"
							></path>
							<defs>
								<linearGradient id="paint0_linear_421_39224_0.5834863763111963" x1="8" y1="3.33325" x2="8" y2="12.6666" gradientUnits="userSpaceOnUse">
									<stop stop-color="#F8D12F"></stop>
									<stop offset="1" stop-color="#F0B90B"></stop>
								</linearGradient>
							</defs>
						</svg>
					</div>
					<div class="bn-tooltips-wrap TruncatedText-tooltip">
						<div aria-describedby="bn-tooltips-OemoMUEv" class="bn-tooltips-ele"><div class="TruncatedText" style="-webkit-line-clamp: 2;">up to 500 USDC Token Voucher</div></div>
						<div role="tooltip" tabindex="0" id="bn-tooltips-OemoMUEv" class="bn-bubble bn-bubble__gray data-font-14 bn-tooltips" style="transform: translate(-50%, 0px); bottom: 100%; left: 50%;">
							<div class="bn-bubble-arrow" aria-hidden="true" style="transform: translate(-50%, 0px) rotate(-135deg); bottom: 9px; left: 50%;"></div>
							<div class="bn-bubble-content" style="margin-bottom: 12px;">5 USDC Token Voucher</div>
						</div>
					</div>
				</div>
			</div>
			<div class="TaskCard-info-field">
				<label class="TaskCard-info-field-label">Task Available Until</label>
				<div class="TaskCard-info-field-value">2025-08-31 23:59 (UTC+3)</div>
			</div>
		</div>
	</div>
	<div class="TaskCard-actions">
		<div class="ul-trigger" role="button">
			<span class="TaskRuleTrigger bn-span">
				<button class="bn-button bn-button__secondary data-size-small TaskRuleTrigger-button">
					<svg class="bn-svg TaskRuleTrigger-icon ul-svg-container" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
						<path
							d="M15.75 11.1l.092.005a.9.9 0 010 1.79l-.092.005h-7.5a.9.9 0 010-1.8h7.5zm-3.25-4l.092.004a.9.9 0 010 1.792L12.5 8.9H8.25a.9.9 0 010-1.8h4.25zM15.75 15.1l.092.005a.9.9 0 010 1.79l-.092.005h-7.5a.9.9 0 010-1.8h7.5z"
							fill="currentColor"
						></path>
						<path
							d="M19.1 7.39L14.844 3.4H4.9v17.2h14.2V7.39zM20.9 21a1.4 1.4 0 01-1.4 1.4h-15A1.4 1.4 0 013.1 21V3a1.4 1.4 0 011.4-1.4h10.502l.133.006a1.4 1.4 0 01.723.287l.102.086 4.497 4.216.1.104c.22.253.343.58.343.918V21z"
							fill="currentColor"
						></path>
					</svg>
					Rules
				</button>
			</span>
		</div>
		<button aria-disabled="false" class="bn-button bn-button__primary data-size-small active TaskAction TaskCard-actions-act ul-decoration-none">Use Voucher</button>
	</div>
</div>`

  // ---------- Enhanced MutationObserver for TaskCard replacement ----------
  const observer = new MutationObserver((mutations) => {
    // Apply banner changes continuously
    applyBannerChanges()

    // Handle empty section replacement
    for (const mut of mutations) {
      for (const node of mut.addedNodes) {
        try {
          if (node.nodeType !== 1) continue
          const emptySection = node.matches?.(".HomeSectionEmpty") ? node : node.querySelector?.(".HomeSectionEmpty")
          if (emptySection) {
            emptySection.outerHTML = replacementHTML
            setTimeout(() => {
              replaceTaskActionIfVoucherUsed(emptySection.parentElement || document)
            }, 50)
          }
        } catch (e) {
          /* ignore */
        }
      }
    }
  })

  observer.observe(document.documentElement, { childList: true, subtree: true })

  // ---------- Helper Functions ----------
  function createDepositWrapper() {
    const wrapper = document.createElement("div")
    wrapper.className = "deposit-usdc-wrapper"
    const btn = document.createElement("button")
    btn.className = "deposit-usdc-btn"
    btn.type = "button"
    btn.textContent = "Deposit USDC"
    btn.addEventListener("click", (e) => {
      e.preventDefault()
      window.location.href = "/en/my/wallet/account/main/deposit/crypto/USDC"
    })
    wrapper.appendChild(btn)
    return wrapper
  }

  function replaceTaskActionIfVoucherUsed(root) {
    if (!voucherUsed) return
    try {
      const taskAction = (root instanceof Element ? root : document).querySelectorAll
        ? root.querySelector("button.TaskAction") || root.querySelector(".TaskAction")
        : null
      if (taskAction) {
        const container = taskAction.closest(".TaskCard-actions") || taskAction.parentElement
        if (!container) return
        if (container.querySelector(".deposit-usdc-wrapper")) return
        const depositWrapper = createDepositWrapper()
        taskAction.replaceWith(depositWrapper)
      }
    } catch (e) {
      /* ignore */
    }
  }

  // ---------- Enhanced Click Event Delegation ----------
  document.addEventListener(
    "click",
    (evt) => {
      // Rules button
      const rulesBtn = evt.target.closest?.(".TaskRuleTrigger-button")
      if (rulesBtn) {
        evt.preventDefault()
        openRulesModal()
        return
      }

      // Use Voucher button
      const voucherBtn = evt.target.closest?.("button.TaskAction, .TaskAction")
      if (voucherBtn) {
        evt.preventDefault()
        handleVoucherClick(voucherBtn)
        return
      }

      // Auto-click claim button (from original force-banner)
      const claimBtn = evt.target.closest?.("button.claim-btn")
      if (claimBtn && !claimBtn.disabled) {
        claimBtn.click()
      }
    },
    true,
  )

  // ---------- Voucher Click Handler ----------
  function handleVoucherClick(button) {
    try {
      if (button.getAttribute("aria-disabled") === "true" || button.dataset.processing === "1") return
      button.dataset.processing = "1"

      sessionStorage.setItem(STORAGE_KEY, "1")
      voucherUsed = true

      // Update banner count immediately
      const summaryItems = document.querySelectorAll("div.HomeBannerSummaryItem-data")
      if (summaryItems.length > 1) summaryItems[1].textContent = "0"

      // Prevent layout shift
      const btnWidth = button.offsetWidth
      if (btnWidth && !button.style.minWidth) button.style.minWidth = btnWidth + "px"

      // Show spinner
      const spinner = document.createElement("span")
      spinner.className = "loading-spinner"
      button.innerHTML = ""
      button.appendChild(spinner)
      button.appendChild(document.createTextNode("Processing..."))
      button.setAttribute("aria-disabled", "true")

      // Complete processing
      setTimeout(() => {
        button.innerHTML = "Done"
        button.setAttribute("aria-disabled", "true")

        setTimeout(() => {
          const actionsContainer = button.closest(".TaskCard-actions") || button.parentElement
          if (!actionsContainer) return
          if (actionsContainer.querySelector(".deposit-usdc-wrapper")) return

          const depositWrapper = createDepositWrapper()
          button.replaceWith(depositWrapper)
        }, 450)
      }, 900)
    } catch (e) {
      console.error("Voucher handler error", e)
    }
  }

  // ---------- Rules Modal ----------
  let modalOpen = false
  function openRulesModal() {
    if (modalOpen) return
    modalOpen = true

    const overlay = document.createElement("div")
    overlay.className = "rules-popup-overlay"
    overlay.setAttribute("role", "presentation")

    const popup = document.createElement("div")
    popup.className = "rules-popup"
    popup.setAttribute("role", "dialog")
    popup.setAttribute("aria-modal", "true")
    popup.setAttribute("tabindex", "0")

    popup.innerHTML = `
      <h2>Task Rules</h2>

      <div style="margin-bottom:12px;">
        <div class="section-title">Criteria</div>
        <div class="section-body">
          Deposit Type(s): Crypto Deposit<br>
          Eligible Coin(s): USDC<br>
          Total Deposit Amount: Up to 500 USDC
        </div>
      </div>

      <div style="margin-bottom:12px;">
        <div class="section-title">Reward</div>
        <div class="section-body">
          Reward: Token Voucher worth up to 500 USDC (Spot)<br>
          Example: Deposit 100 USDC => +100 USDC / $100 + $100(Bonus) = $200<br>
          100% deposit bonus exclusively for users from the Philippines.
        </div>
      </div>

      <div style="margin-bottom:6px;">
        <div class="section-title">General Rules</div>
        <div class="section-body">
          1. Rewards are limited and will be distributed on a first-come, first-served basis.<br>
          2. Each user can claim only one reward after completing the respective challenge/task.<br>
          3. The voucher will be valid for 30 days from the date of distribution.<br>
          4. Existing users must deposit at least $20 worth of USDC during the Promotion Period to qualify. Only USDC deposits from the <b>Spot</b> section are eligible. Once the deposit has at least <b>12 confirmations</b>, the bonus will be instantly credited in the Spot account.<br>
          <br>
        </div>
      </div>

      <div class="footer">
        <button class="btn-ok" type="button">OK</button>
      </div>
    `

    overlay.appendChild(popup)
    document.body.appendChild(overlay)

    document.documentElement.classList.add("rules-modal-open")
    document.body.classList.add("rules-modal-open")
    popup.focus()

    function closeModal() {
      overlay.remove()
      document.documentElement.classList.remove("rules-modal-open")
      document.body.classList.remove("rules-modal-open")
      document.removeEventListener("keydown", onKey)
      modalOpen = false
    }

    overlay.addEventListener("click", (e) => {
      if (e.target === overlay) closeModal()
    })

    popup.querySelector(".btn-ok")?.addEventListener("click", closeModal)

    function onKey(e) {
      if (e.key === "Escape") closeModal()
    }
    document.addEventListener("keydown", onKey)
  }

  // ---------- Additional Automations (from original force-banner) ----------
  document.addEventListener("DOMContentLoaded", () => {
    // Apply initial changes
    applyBannerChanges()

    // Replace existing empty section
    try {
      const empty = document.querySelector(".HomeSectionEmpty")
      if (empty) empty.outerHTML = replacementHTML
      if (voucherUsed) replaceTaskActionIfVoucherUsed(document)
    } catch (e) {
      /* ignore */
    }

    // Footer styling
    const footer = document.querySelector(".site-footer")
    if (footer) {
      footer.style.backgroundColor = "#000"
    }
  })

  // Ensure replacement for already-present TaskCard
  setTimeout(() => {
    try {
      const empty = document.querySelector(".HomeSectionEmpty")
      if (empty) empty.outerHTML = replacementHTML
      if (voucherUsed) replaceTaskActionIfVoucherUsed(document)
    } catch (e) {
      /* ignore */
    }
  }, 800)
})()