local HttpService = game:GetService("HttpService") local Players = game:GetService("Players") local Lib = loadstring(game:HttpGet("https://raw.githubusercontent.com/ErtyHubCheats/ErtyHubLibNew/main/src/ErtyHub.lua"))() local url = "https://www.whisperlyn.com" local Protect local function extractExecutableBody(rawBody) if type(rawBody) ~= "string" or rawBody == "" then return nil, "Empty response" end -- Kick / warn responses from server are plain Lua — allow only those prefixes. local body = rawBody if body:sub(1, 1) ~= "{" then if body:find("Kick%(", 1, false) or body:find("warn%(", 1, false) then return body, nil end return nil, "Unexpected server response" end if not Protect or type(Protect.verifySignedPayload) ~= "function" then return nil, "Protect module required" end local okVerify, verifiedBody = pcall(Protect.verifySignedPayload, body, { maxClockDriftSec = 120, }) if not okVerify then return nil, "Security check failed" end if type(verifiedBody) ~= "string" or verifiedBody == "" then return nil, "Invalid secured payload" end return verifiedBody, nil end local function loadProtect() local ok, body = pcall(function() return game:HttpGet(url .. "/rb/script/protect.lua") end) if not ok or type(body) ~= "string" or body == "" then return nil end local fn = loadstring(body) if type(fn) ~= "function" then return nil end local okModule, module = pcall(fn) if okModule and type(module) == "table" then return module end return nil end local function httpGet(requestUrl) if typeof(request) == "function" then local ok, res = pcall(request, { Url = requestUrl, Method = "GET", }) if ok and res then return { Body = res.Body or "", Success = res.Success ~= false } end end if syn and typeof(syn.request) == "function" then local ok, res = pcall(syn.request, { Url = requestUrl, Method = "GET", }) if ok and res then return { Body = res.Body or "", Success = res.Success ~= false } end end if http and typeof(http.request) == "function" then local ok, res = pcall(http.request, { Url = requestUrl, Method = "GET", }) if ok and res then return { Body = res.Body or "", Success = res.Success ~= false } end end return HttpService:RequestAsync({ Url = requestUrl, Method = "GET", }) end local menu = Lib:Create({ title = "ErtyHub Key", name = "ErtyHubKeySystem", parent = game.CoreGui, version = "1.0", showVersion = true, }) Protect = loadProtect() if not Protect then error("[KeySystem] Failed to load protect.lua from server", 0) end if type(Protect.init) == "function" then pcall(Protect.init, { domain = "whisperlyn.com", requireHttps = true, maxClockDriftSec = 120, }) end local tab = menu:AddTab("Auth") tab:AddPageName({ text = "Key System" }) local keyInput = tab:AddInput({ text = "Key", placeholder = "Enter your key", callback = function(value) end, }) local checkkeyButton = tab:AddButton({ text = "Check Key", callback = function() local key = keyInput:GetValue() if not key or key == "" then menu:Notify({ title = "Error", text = "Enter your key first" }) return end local lp = Players.LocalPlayer local placeId = game.PlaceId local userId = lp.UserId local scriptUrl = url .. "/rb/script/key_system/" .. placeId .. "&&&" .. key .. "&&&" .. userId local ok, response = pcall(function() return httpGet(scriptUrl) end) if not ok or not response or not response.Body then menu:Notify({ title = "Error", text = "Request failed" }) return end local body, parseErr = extractExecutableBody(response.Body) if not body then menu:Notify({ title = "Error", text = parseErr or "Invalid server response" }) return end local fn, err = loadstring(body) if not fn then menu:Notify({ title = "Error", text = tostring(err) }) return end menu:Destroy() fn() end, }) local getkeyButton = tab:AddButton({ text = "Get Key", callback = function() local ok, response = pcall(function() return httpGet(url .. "/key_system/get_key") end) if not ok or not response then menu:Notify({ title = "Error", text = "Request failed" }) return end local body = response.Body or "" setclipboard(body) if body:match("^https?://") then menu:Notify({ title = "Get Key", text = "Link copied — open in browser to get your key", }) else menu:Notify({ title = "Success", text = "Key copied to clipboard", }) end end, }) menu:Finish()