Currently most variables are stored inside the program as U64s.
This means the larger the numbers you use for your farm, the higher the chance you'll hit the U64::max limit and cause an overflow. This in turn will cause your transaction to fail, typically with code 0x1770.
In simple terms what I'm saying is - if at any point in your program's math journey there is a number bigger than 18,446,744,073,709,551,615 (1.8 * 10^19) - you'll get an error.
So what are the numbers that matter?
Decimals for your token - if you have 9 decimals, you should add * 10^9 to all math operations.
Rarity points assigned to each NFT (remember default is 1, but you can assign up to 65,535 per item)
Number of NFTs staked
Duration the reward is funded for
Amount of promised reward per unit of time
Let's go through an example
You have a collection of 10,000 NFTs and you suspect the max a single user might want to stake is 100
You've added rarities and the most rare one has a rarity of 5,000
You want to let your users stake NFTs on a fixed schedule, promising them 1,000 tokens per day
You've funded your reward for 365 days
Your token has 9 decimals
Let's see what we get:
Number of NFTs staked * Max rarity * Rewards/day promised * Days promised * Token decimals
100 * 5000 * 1000 * 365 * 10^9 = 1.82 * 10^20
Uh oh! That's about 10 times bigger than u64::max. You'll get an error.