Assume we are staking MyToken (MTK) in return for MTK rewards. Here are some features I have in mind:
a staker (user) is assigned a weight, which increases as a function of the amount of MTK they stake and also increases as a function of the duration they choose to lock their MTK in the staking contract
a staker is continuously (however one wishes to interpret that on-chain) rewarded with MTK based on their weight as a fraction of the total pool weight
the total amount of MTK which is given out in rewards, per block (or more abstractly per second), is computed as some function of the MTK balance of a contract which holds the rewards
MTK rewards are classified as pending until the staker chooses to claim the rewards (so we are not making continuous MTK transfers)
the staking pool should last as long as the contract holding MTK rewards maintains positive balance (perhaps virtual positive balance, considering the notion of pending rewards)
One of the biggest implementation challenges with this sort of contract seems to be enabling rewards with multiple tokens. In your requirements you specify a single MKR token for rewards, but have you considered this other possibility and do you think it could be important?
I'm not sure if you mean giving out multiple types of tokens as rewards, or if you mean staking multiple types of tokens.
However, I have considered the possibility of staking multiple types of tokens. So, in addition to just staking MTK, another reasonable situation is where users stake MTK-ETH liquidity tokens. The reason a protocol might want to do this is because giving out rewards for staking MTK-ETH liquidity tokens is a way to incentivize the creation of a liquid market.
But, as for the implementations I have considered, users would have to stake MTK and MTK-ETH in different pools, because I don't see any natural way to define "weight" which can apply simultaneously to both MTK and MTK-ETH token types. More specifically, although it is possible to instantaneously associate an MTK-ETH token with some corresponding amount of MTK, I don't see a way to define a conversion which is constant over time.