Summary
The setStakeAmounts
function in LLMOracleRegistry
lacks input validation, allowing stake amounts to be set to zero.
This could severely compromise the protocol's security by allowing oracles to register without any meaningful stake.
Vulnerability Details
Current implementation allows any value including zero:
function setStakeAmounts(uint256 _generatorStakeAmount, uint256 _validatorStakeAmount) public onlyOwner {
generatorStakeAmount = _generatorStakeAmount;
validatorStakeAmount = _validatorStakeAmount;
}
This affects the registration process:
function register(LLMOracleKind kind) public {
uint256 amount = getStakeAmount(kind);
if (token.allowance(msg.sender, address(this)) < amount) {
revert InsufficientFunds();
}
token.transferFrom(msg.sender, address(this), amount);
registrations[msg.sender][kind] = amount;
emit Registered(msg.sender, kind);
}
Impact
No economic stake required for oracles
Tools Used
Manual Review
Recommendations
Add minimum stake requirements:
contract LLMOracleRegistry {
uint256 public constant MIN_GENERATOR_STAKE = 1000 ether;
uint256 public constant MIN_VALIDATOR_STAKE = 500 ether;
error StakeTooLow(uint256 provided, uint256 minimum);
function setStakeAmounts(uint256 _generatorStakeAmount, uint256 _validatorStakeAmount)
public
onlyOwner
{
if (_generatorStakeAmount < MIN_GENERATOR_STAKE) {
revert StakeTooLow(_generatorStakeAmount, MIN_GENERATOR_STAKE);
}
if (_validatorStakeAmount < MIN_VALIDATOR_STAKE) {
revert StakeTooLow(_validatorStakeAmount, MIN_VALIDATOR_STAKE);
}
generatorStakeAmount = _generatorStakeAmount;
validatorStakeAmount = _validatorStakeAmount;
emit StakeAmountsUpdated(_generatorStakeAmount, _validatorStakeAmount);
}
}