When an operator is removed by Chainlink's Staking Contract , it needs to call unbound function of Chainlink's OperatorStakingPool.sol before wthdrawing it's principal amounts using unstakeRemovedPrincipal function , but in Stakelink protocol , the Operators misses to call the unbound function , so the unstakeRemovedPrincipal function always reverts causing lock of funds of removed operator in Chainlink's Staking Contract .
As it can be seen in Chainlink's OperatorStakingPool.sol at #233 -
https://etherscan.io/address/0xBc10f2E862ED4502144c7d632a3459F49DFCDB5e#code
removed operators need to go through unbound period and thereby needs to call this function before unstaking from Chainlink's OperatorStakingPool.sol .
In normal condition , when an Operator is not removed the unbound is being called by invoking FundFlowController.sol#updateVaultGroups which gets the vaults for which unbound needs to be called , the flow looks like FundFlowController.sol#updateVaultGroups -> FundFlowController.sol#_getVaultUpdateData -> FundFlowController.sol#_getTotalDepositRoom to get the nonEmptyVaultsFormatted which is further used as curGroupOpVaultsToUnbond in updateVaultGroups function of FundFlowController.sol .
The problem is , while getting the nonEmptyVaultsFormatted from FundFlowController.sol#_getTotalDepositRoom , the vaults for which operator's are removed are avoided as can be seen here -
https://github.com/Cyfrin/2024-09-stakelink/blob/main/contracts/linkStaking/FundFlowController.sol#L413C8-L415C1
So when FundFlowController.sol#updateVaultGroups goes further to call operatorVCS.updateVaultGroups which is VaultControllerStrategy.sol#updateVaultGroups as seen below -
https://github.com/Cyfrin/2024-09-stakelink/blob/main/contracts/linkStaking/base/VaultControllerStrategy.sol#L471C4-L487C1
The removed vaults/operators do not call the unbound function OperatorStakingPool.sol , so the unbound period is never started for Removed operators . So when the attempt is done to remove the vault here -
https://github.com/Cyfrin/2024-09-stakelink/blob/main/contracts/linkStaking/OperatorVCS.sol#L310C2-L312C1
and thereby withdraw the principle amount from Chainlink's Staking contract here -
it would revert and the funds of removed operator is stuck in Chainlink's OperatorStakingPool.sol .
Funds of removed operator is stuck in Chainlink's OperatorStakingPool.sol.
Manual Review ,
Chainlink staking contracts collection - https://ipfs.io/ipfs/QmUWDupeN4D5vHNWH6dEbNuoiZz9bnbqTHw61L27RG6tE2
Create a mechanism to call the stakeController.unbound so that Removed operators go through the unbonding period before they can withdraw.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.