## Bipzy Staking smart contract Specs The Goal of this new smart contract is to allow holders of Bipzy NFT and Bipzy Pass to stake NFTs, participate in priority rounds and get booster on maximum investable limit i.e. if a max investment for a project is 100 ETH and the holder has staked NFTs for 180 days, the holder will be allowed to invest maximum 150 ETH. ### Functional Requirement - The NFTs can be staked only for set fixed duration of 90 days, 180 days or 360 days. - Booster will be a number denoted in basis points. So if a user have 2x, it will be shown as 20000. - 1x - 10000 - 1.5x - 15000 - 2x - 20000 - and so on... - The booster are like this: - 90 days - 1x i.e. no boost - 180 days - 1.5x i.e 150% - 360 days = 3x i.e 300% - Once staked, the NFT is locked in the staking contract. - Have read-only functions to get booster of a holder. - Booster = totalNumberOfNFTsStaked * boosterBasedOnDuration - If a holder already have staked NFTs and X amount of duration have passed, where 0 < X < TotalStakeDuration, then, user cannot add new NFTs to same stake entry. The User will have to create a new stake entry. - If a user have multiple stake entries, the total booster will be (for example, user have 2 entries): TotalBooster = Entry1Booster + Entry2Booster - The NFTs will be locked within the smart contract and can only be withdrawn after the staking duration is complete. - Store each stake as a single entry of struct StakeEntry with variable packing. We need following data in the StakeEntry - tokenID, token contract identifier, start date, end date/duration ### Non-functional requirement - Gas efficient, the contract will be deployed on Ethereum mainnet and our goal is to make the transaction cost, worth the investment. - Secure - conduct heavy unit testing and fuzz testing