#39528 [SC-Insight] Lack of Validation for Min and Max Values in FlatCFMFactory leads to wrong payou
Description
Brief/Intro
Vulnerability Details
function createFlatCFM(
FlatCFMOracleAdapter oracleAdapter,
uint256 decisionTemplateId,
uint256 metricTemplateId,
FlatCFMQuestionParams calldata flatCFMQParams,
GenericScalarQuestionParams calldata genericScalarQuestionParams,
IERC20 collateralToken,
string calldata metadataUri
) external payable returns (FlatCFM cfm) {
uint256 outcomeCount = flatCFMQParams.outcomeNames.length;
if (outcomeCount == 0 || outcomeCount > MAX_OUTCOME_COUNT) {
revert InvalidOutcomeCount();
}
for (uint256 i = 0; i < outcomeCount; i++) {
string memory outcomeName = flatCFMQParams.outcomeNames[i];
if (bytes(outcomeName).length > MAX_OUTCOME_NAME_LENGTH) revert InvalidOutcomeNameLength(outcomeName);
}
cfm = FlatCFM(flatCfmImplementation.clone());
bytes32 decisionQuestionId =
oracleAdapter.askDecisionQuestion{value: msg.value}(decisionTemplateId, flatCFMQParams);
// +1 for 'Invalid' slot.
bytes32 decisionConditionId =
conditionalTokens.getConditionId(address(cfm), decisionQuestionId, outcomeCount + 1);
if (conditionalTokens.getOutcomeSlotCount(decisionConditionId) == 0) {
conditionalTokens.prepareCondition(address(cfm), decisionQuestionId, outcomeCount + 1);
}
paramsToDeploy[cfm] = DeploymentParams({
collateralToken: collateralToken,
metricTemplateId: metricTemplateId,
genericScalarQuestionParams: genericScalarQuestionParams,
decisionConditionId: decisionConditionId,
outcomeNames: flatCFMQParams.outcomeNames
});
cfm.initialize(oracleAdapter, conditionalTokens, outcomeCount, decisionQuestionId, metadataUri);
emit FlatCFMCreated(address(cfm), decisionConditionId);
}Impact Details
References
Proof of Concept
Previous39495 [SC-Low] flatcfm cannot be resolved in case answer of questionid are in greater or equal to 2Next#39524 [SC-Insight] Incorrect Outcome Formatting in Reality Adapter Leads to Wrong Number of Outcome
Last updated
Was this helpful?