Gold spawning twice

SERVER SIDE :

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Remotes = ReplicatedStorage:FindFirstChild("Remotes")

function proximityTriggered(playerWhoTriggered, money, part)
	playerWhoTriggered.leaderstats.Gold.Value += money
	part:Destroy()
end

function drop(amountOfMoney, player)
	player.leaderstats.Gold.Value -= amountOfMoney
	local part = Instance.new("Part", workspace)
	part.Material = Enum.Material.Neon
	part.BrickColor = BrickColor.new("New Yeller")
	part.Size = Vector3.new(1,1,1)
	part.Position = player.Character.HumanoidRootPart.Position + Vector3.new(0, 5, 0)
	local numberVal = Instance.new("NumberValue", part)
	numberVal.Value = amountOfMoney
	local ProximityPrompt = Instance.new("ProximityPrompt", part)
	ProximityPrompt.ActionText = "Get"
	ProximityPrompt.ObjectText = amountOfMoney
	ProximityPrompt.Triggered:Connect(function(player)
		proximityTriggered(player, amountOfMoney, part)
	end)
end

function send(amount, playerWhoSend, playerWhoGets)
	local playerWhoGetsAsPlayer = game.Players:FindFirstChild(playerWhoGets)
	playerWhoGetsAsPlayer.leaderstats.Gold.Value += amount
	playerWhoSend.leaderstats.Gold.Value -= amount
end

Remotes.Currency.OnServerEvent:Connect(function(plr, amountOfMoney, CurrencyType, plrWritten)
	if plrWritten then
		print("PlrWritten")
	else
		print("no plr written")
	end
	if CurrencyType == "Drop" then
		drop(amountOfMoney, plr)
	elseif CurrencyType == "Send" then
		send(amountOfMoney, plr, plrWritten)
	end
end)

It spawns the gold double times for no reason?

try adding a debounce if you havent already on the client, maybe the event is being fired twice

It duplicates compared to number of players. I don’t think its about debounce…

Looks like the ProximityPrompt event is triggering for both the original player and the player who picks it up. Maybe something like this will help that …

small adjustments
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Remotes = ReplicatedStorage:FindFirstChild("Remotes")

function proximityTriggered(playerWhoTriggered, money, part)
	if playerWhoTriggered ~= part.Creator then
		playerWhoTriggered.leaderstats.Gold.Value += money
		part:Destroy()
	end
end

function drop(amountOfMoney, player)
	player.leaderstats.Gold.Value -= amountOfMoney
	local part = Instance.new("Part", workspace)
	part.Material = Enum.Material.Neon
	part.BrickColor = BrickColor.new("New Yeller")
	part.Size = Vector3.new(1,1,1)
	part.Position = player.Character.HumanoidRootPart.Position + Vector3.new(0, 5, 0)
	part.Creator = player
	local numberVal = Instance.new("NumberValue", part)
	numberVal.Value = amountOfMoney
	local ProximityPrompt = Instance.new("ProximityPrompt", part)
	ProximityPrompt.ActionText = "Get"
	ProximityPrompt.ObjectText = amountOfMoney
	ProximityPrompt.Triggered:Connect(function(player)
		proximityTriggered(player, amountOfMoney, part)
	end)
end

function send(amount, playerWhoSend, playerWhoGets)
	local playerWhoGetsAsPlayer = game.Players:FindFirstChild(playerWhoGets)
	playerWhoGetsAsPlayer.leaderstats.Gold.Value += amount
	playerWhoSend.leaderstats.Gold.Value -= amount
end

Remotes.Currency.OnServerEvent:Connect(function(plr, amountOfMoney, CurrencyType, plrWritten)
	if plrWritten then
		print("PlrWritten")
	else
		print("no plr written")
	end
	if CurrencyType == "Drop" then
		drop(amountOfMoney, plr)
	elseif CurrencyType == "Send" then
		send(amountOfMoney, plr, plrWritten)
	end
end)

That might be right. But it also happens at the send function. It does the same thing on sending and earning.

Sorry tried to do that without testing … need more of what you’re doing to really do it right.