I am using rewarded ads of admob and using Action<bool> parameter to return true or false but the given reward increases 1 every time.
public void showRewarded(Action<bool> giveReward)
{
    if (rewardedAd.IsLoaded())
    {
        rewardedAd.Show();
        rewardedAd.OnUserEarnedReward += delegate(object sender, Reward reward)
        {
            giveReward(true);
        };
    }
    else
    {
        giveReward(false);
    }
    requestRewarded();
}
I call this method in different places :
        public void watchAdUpgradeFactory()
    {
        AdsController.Instance.showRewarded(delegate(bool b)
        {
            if (b)
            {
                SoundManager.PlaySomeSoundOnce?.Invoke(SoundType.ButtonClick);
                playerStorageSO.ConcretePlayer.GetResource(ResourceType.Coin, 0);
                concreteFactory.Upgrade();
                ConfigureButton();
                checkdAdButton();
            }
        });
    }
        public void watchAdUpgradeTower()
    {
        AdsController.Instance.showRewarded(delegate(bool b)
        {
            if (b)
            {
               
                upgradeTower();
                ConfigureButton();
                checkdAdButton();
            }
        });
    }
This works as intended for the first time but the giveReward(true) stacks up after every time and player gets 1,2,3,4,5... rewards after consequent claims of reward. How can I fix this or is there a better method of achieving the same goal?