Extremely weird glitch which randomly gave players a ton of in game currency?

In two of my games I saw that the number one leaderboard player in both games have a ton of in game currency which is nearly unobtainable if you play the game normally. Two different players have an unobtainable amount of currency.

I recently added a “x2 Points” gamepass in the two games using the same script, and both players have the gamepass in the games that they are number one in.

I’ve reviewed every single script in the two games and checked my recent sales. I can only assume that this glitch has something to do with this script, but I can’t find anything wrong with it.

Maybe there’s some weird glitch that’s possible if you own the x2 points gamepass?

The script has two children values named “Currency” and “GamepassId”.
x2 Points script:

game.Players.PlayerAdded:Connect(function(player)
	
	local marketservice = game:GetService("MarketplaceService")
	
	local can = true
	repeat wait() until player:FindFirstChild("leaderstats")
	local leader = player:FindFirstChild("leaderstats")
	if leader then
	repeat wait() until leader:FindFirstChild(script:WaitForChild("Currency").Value)
	local currency = leader:FindFirstChild(script:WaitForChild("Currency").Value)
		if currency then
			local folder = Instance.new("Folder",player)
			folder.Name = "2xGamepass"
			local oldcash = Instance.new("NumberValue",folder)
			oldcash.Name = "OldCoins"
			oldcash.Value = currency.Value
			local give2x = Instance.new("NumberValue",folder)
			give2x.Name = "Give2x"
			give2x.Value = 0
			
			currency.Changed:Connect(function()
				if marketservice:UserOwnsGamePassAsync(player.UserId, script:WaitForChild("GamepassId").Value) then
				
					
				if can == true then
					can = false
				if currency.Value > oldcash.Value then
				give2x.Value = currency.Value - oldcash.Value
			
				currency.Value = currency.Value + give2x.Value
				
				oldcash.Value = currency.Value
					can = true
					else
						
							oldcash.Value = currency.Value
							can = true
						
						
				end
					
				end
				else
					oldcash.Value = currency.Value
				end
			end)
			
		end
	end
end)


I doubt the players are hacking, because one of them decided to express their surprise to their new hyperinflated wallet in the chat.

I’ve sent a friend request to the players who are number one in each game to ask them what they did when they got that many points, but they have yet to accept.

Any ideas?

This may be unrelated, and I may just be uneducated, but aren’t searching for a property “Value” in a “FindFirstChild” function?
Shouldn’t it just be leader:FindFirstChild(script:WaitForChild(“Currency”)).Value?
Or no value at all, if you’re just checking to see if Currency exists?
Also, couldn’t you skip the FindFirstChild and just use WaitForChild? I thought I saw somewhere that it will wait for it if it doesn’t exist and it will work if it already does exist?

Also, couldn’t this just be completely replaced with player:WaitForChild(“leaderstats”)?

Recursive?

Triggering this?
Maybe?

1 Like

could be the currency change function, maybe everytime the money changes, it checks if you own the gamepass, then continues to add the credits to the player?

1 Like