Summary
The setStakeAmounts
function in LLMOracleRegistry
allows immediate changes to stake requirements without any timelock or notification period, potentially causing disruption to oracle participants and enabling unfair advantages.
Vulnerability Details
Current implementation allows instant changes to stake parameters:
function setStakeAmounts(uint256 _generatorStakeAmount, uint256 _validatorStakeAmount) public onlyOwner {
generatorStakeAmount = _generatorStakeAmount;
validatorStakeAmount = _validatorStakeAmount;
}
Problem scenarios:
Unfair Registration Prevention:
currentStake = registry.getStakeAmount(LLMOracleKind.Generator);
user.approve(registry, currentStake);
registry.setStakeAmounts(currentStake * 2, validatorStakeAmount);
registry.register(LLMOracleKind.Generator);
Impact
Disrupts oracle participation planning
Tools Used
Manual Review
Recommendations
Implement basic timelock:
contract LLMOracleRegistry {
uint256 public constant STAKE_CHANGE_DELAY = 7 days;
struct PendingStakeUpdate {
uint256 generatorStake;
uint256 validatorStake;
uint256 effectiveTime;
}
PendingStakeUpdate public pendingUpdate;
event StakeUpdateScheduled(
uint256 generatorStake,
uint256 validatorStake,
uint256 effectiveTime
);
function scheduleStakeUpdate(uint256 _generatorStake, uint256 _validatorStake)
public
onlyOwner
{
pendingUpdate = PendingStakeUpdate({
generatorStake: _generatorStake,
validatorStake: _validatorStake,
effectiveTime: block.timestamp + STAKE_CHANGE_DELAY
});
emit StakeUpdateScheduled(
_generatorStake,
_validatorStake,
pendingUpdate.effectiveTime
);
}
function executeStakeUpdate() public {
require(
block.timestamp >= pendingUpdate.effectiveTime,
"Update not ready"
);
require(pendingUpdate.effectiveTime != 0, "No pending update");
generatorStakeAmount = pendingUpdate.generatorStake;
validatorStakeAmount = pendingUpdate.validatorStake;
emit StakeAmountsUpdated(
generatorStakeAmount,
validatorStakeAmount
);
delete pendingUpdate;
}
}