Commit Graph

18 Commits

Author SHA1 Message Date
r4bbit
e570fb634d test: formally verify that MPs only decrease when unstaking/leaving 2024-12-04 11:37:32 +01:00
r4bbit
9374025924 feat(StakeManager): add capabilities to register vaults
This commit introduces changes related to vault registrations in the
stake manager.

The stake manager needs to keep track of the vaults a users creates so
it can aggregate accumulated MP across vaults for any given user.

The `StakeVault` now comes with a `register()` function which needs to
be called to register itself with the stake manager. `StakeManager` has
a new `onlyRegisteredVault` modifier that ensures only registered vaults
can actually `stake` and `unstake`.

Closes #70
2024-12-03 16:55:34 +01:00
Andrea Franz
b1a4e5ad37 fix(RewardsStreamerMP): rename _calculateAccruedRewards to _calculatePendingRewards and fix specs 2024-12-03 13:50:52 +01:00
Andrea Franz
7211b493f7 test(RewardsStreamerMP): fix EmergencyMode spec 2024-12-03 13:50:52 +01:00
Andrea Franz
dffaea2a73 feat(RewardsStreamerMP): stream rewards for a period without checking a real reward token balance 2024-12-03 13:50:52 +01:00
r4bbit
fcfe72d050 feat(RewardsStreamerMP): introduce leave() function
This function allows users to `leave()` the system if they can't or
don't want to trust the stake manager. This is the case when the owner
of the stake manager performs an upgrade.

In case of such an upgrade, the stake manager will be marked as not
trusted which prevents the user from staking, unstaking, locking etc.

The user can then either explicitly trust stake manager (will happen in
future changes) to enable the vault's functionality again, or, `leave()`
the system at which point it will try to perform a benign `leave()`
operation and then move the funds out of the vault.

Closes #66
2024-12-01 08:25:36 +01:00
Ricardo Guilherme Schmidt
8561a68ffd feat(RewardsStreamerMP): make RewardsStreamerMP upgradeable
This commit introduces upgradeability of the `RewardsStreamerMP`
contract by leveraging the UUPS pattern.

This means, for deployment, we have to first deploy an instance of
`RewardsStreamerMP` contract as a "template" logic contract and then
create a ERC1967Proxy that points to it.

The proxy ensures the implementation address is stored in a
deterministic storage slot.

This will later be leveraged by the `StakeVault` contract to implement
the functionality to leave the system in case there was a malicious
upgrade.

Closes #22
2024-12-01 08:06:51 +01:00
r4bbit
1e703e3f71 feat(RewardStreamerMP): add emergency mode so users can exit the system
This adds a new emergency mode that can be enabled by the owner of the system.
When in emergency mode, stakers or `StakeVault`s can leave the system immediately.

This also applies when there was a malicious upgrade and a call to
`emergencyModeEnabled()` panics.

To have this in a fully secure manner, we still have to add the counter
part of "leaving" the system. This will allow users that don't agree
with a (malicious) upgrade to get their funds out of the vaults
regardless.

Closes #66
2024-11-28 08:27:58 +01:00
r4bbit
91cd844dd6 chore(certora): formally verify StakeVault account balance vs ERC20
balance

Closes #29
2024-10-30 12:52:21 +01:00
r4bbit
ba26e7cc79 refactor(RewardStreamerMP): rename user vars to account
Closes #59
2024-10-21 13:49:29 +02:00
r4bbit
044301869a chore(certora): dont wait for results 2024-10-18 14:51:36 +02:00
r4bbit
ad2d11d138 chore(certora): add rule that greater lockup means greater MPs
Closes #28
2024-10-18 14:25:14 +02:00
r4bbit
77d77b8017 chore(certora): add rule that MPs are minted at 1-to-1 ratio
Closes #27
2024-10-18 13:56:15 +02:00
r4bbit
b79deb70f5 chore(certora): add accountMPGreaterEqualsAccountBalance invariant
Closes #26
2024-10-16 14:01:51 +02:00
r4bbit
59f2566c78 refactor(RewardStreamerMP): keep track of maxMP instead of
`potentialMP`

This commit changes the mechanics to ensure there are no more MP
generated that what's allowed as per max limiting.

Previously we've kept track of `potentialMP` which would decrease as
more MP are generated.

This made verifying certain rules on certora hard and/or impossible.
So we decided to track `maxMP` instead, which only decreases when users
unstake.

This commit also introduces a rule that ensures any accounts MP never
exceed their max mp.

Closes #44
2024-10-16 12:44:47 +02:00
r4bbit
3eb4aa830e chore(certora): add sumOfBalancesIsTotalStaked invariant
Closes #24
2024-10-14 12:04:52 +02:00
Andrea Franz
478174a356 chore(XPToken): add certora base config 2024-10-11 16:56:03 +02:00
Andrea Franz
4ef75621a3 import foundry template (#1) 2024-09-25 09:39:14 +02:00