The OperatorVault::initialize
function incorrectly handles the initialization process, particularly when the vaultController
is already set. In this scenario, the protocol assumes that stakeController
has also been initialized, and attempts to call the stakeController.migrate()
function. However, since stakeController
was never set, this results in an integration failure with the Chainlink protocol, which is critical for Stake Link's functionality.
The OperatorVault::initialize
function takes two initialization paths based on whether vaultController
is set. The relevant code is as follows:
When vaultController != address(0)
, the else
block is executed, which assumes that stakeController
has already been set. The protocol attempts to call the stakeController.migrate()
function, but this results in an error because stakeController
was never initialized. The function does not provide any mechanism for setting the stakeController
after deployment, leading to an incorrect integration with the Chainlink staking contract.
Since stakeController
is supposed to represent the address of the Chainlink staking contract, its absence means that the protocol cannot communicate with Chainlink, a critical component for the Stake Link protocol’s operation.
The failure to properly initialize stakeController
prevents the protocol from interacting with Chainlink’s staking contract. This breaks core functionality, as the protocol is unable to perform staking-related actions, severely impacting the operations of Stake Link. Without integration with Chainlink, the protocol cannot function as intended.
Manual
Ensure that stakeController
is properly initialized in all cases, regardless of whether vaultController
is set.
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.