Summary
Improper upgradeability implementation, lack of __UUPSUpgradeable_init() on implementation contracts
Vulnerability Details
Swan.sol, LLMOracleCoordinator.sol and LLMOracleRegistry.sol are implementation contracts which should be initialized when calling the initialize() function, but this does not happen on the current application
Swan.sol
function initialize(
SwanMarketParameters calldata _marketParameters,
LLMOracleTaskParameters calldata _oracleParameters,
address _coordinator,
address _token,
address _buyerAgentFactory,
address _swanAssetFactory
) public initializer {
__Ownable_init(msg.sender);
require(_marketParameters.platformFee <= 100, "Platform fee cannot exceed 100%");
marketParameters.push(_marketParameters);
oracleParameters = _oracleParameters;
coordinator = LLMOracleCoordinator(_coordinator);
token = ERC20(_token);
buyerAgentFactory = BuyerAgentFactory(_buyerAgentFactory);
swanAssetFactory = SwanAssetFactory(_swanAssetFactory);
isOperator[address(this)] = true;
isOperator[msg.sender] = true;
}
LLMOracleCoordinator.sol
function initialize(
address _oracleRegistry,
address _feeToken,
uint256 _platformFee,
uint256 _generationFee,
uint256 _validationFee
) public initializer {
__Ownable_init(msg.sender);
__LLMOracleManager_init(_platformFee, _generationFee, _validationFee);
registry = LLMOracleRegistry(_oracleRegistry);
feeToken = ERC20(_feeToken);
nextTaskId = 1;
}
LLMOracleRegistry.sol
function initialize(uint256 _generatorStakeAmount, uint256 _validatorStakeAmount, address _token)
public
initializer
{
__Ownable_init(msg.sender);
generatorStakeAmount = _generatorStakeAmount;
validatorStakeAmount = _validatorStakeAmount;
token = ERC20(_token);
}
Impact
This can cause future upgrades might fail or behave unpredictably, potentially leading to loss of funds or contract state
Tools Used
Manual Review
Recommended Mitigation
function initialize(uint256 _generatorStakeAmount, uint256 _validatorStakeAmount, address _token)
public
initializer
{
......
__UUPSUpgradeable_init();
......
}