Summary
Dynamic array values tokenAddresses
and priceFeedAddresses
must be added in pairs , this has no control in the constructor
tokenAddresses1 ---> priceFeedAddresses1
tokenAddresses2 ---> priceFeedAddresses2
tokenAddresses3 ---> priceFeedAddresses3
Vulnerability Details
First pair , second pair etc. of dynamic array values tokenAddresses
and priceFeedAddresses
. must be sequential, this has no control
src/DSCEngine.sol:
111
112: constructor(address[] memory tokenAddresses, address[] memory priceFeedAddresses, address dscAddress) {
113:
114: if (tokenAddresses.length != priceFeedAddresses.length) {
115: revert DSCEngine__TokenAddressesAndPriceFeedAddressesMustBeSameLength();
116: }
117:
118: for (uint256 i = 0; i < tokenAddresses.length; i++) {
119: s_priceFeeds[tokenAddresses[i]] = priceFeedAddresses[i];
120: s_collateralTokens.push(tokenAddresses[i]);
121: }
122: i_dsc = DecentralizedStableCoin(dscAddress);
123: }
Impact
Tools Used
Manuel Code Review
Recommendations
contract DSCEngine {
address[] public s_collateralTokens;
mapping(address => address) public s_priceFeeds;
DecentralizedStableCoin public i_dsc;
constructor(address[] memory tokenAddresses, address[] memory priceFeedAddresses, address dscAddress) {
if (tokenAddresses.length != priceFeedAddresses.length || tokenAddresses.length < 2) {
revert DSCEngine__TokenAddressesAndPriceFeedAddressesMustBeSameLengthAndAtLeastTwoPairs();
}
for (uint256 i = 0; i < tokenAddresses.length - 1; i++) {
s_priceFeeds[tokenAddresses[i]] = priceFeedAddresses[i];
s_collateralTokens.push(tokenAddresses[i]);
if (tokenAddresses[i + 1] != address(0) && priceFeedAddresses[i + 1] != address(0)) {
require(s_priceFeeds[tokenAddresses[i + 1]] == address(0), "DSCEngine__TokenAddressesMustBeSequential");
}
}
s_priceFeeds[tokenAddresses[tokenAddresses.length - 1]] = priceFeedAddresses[priceFeedAddresses.length - 1];
s_collateralTokens.push(tokenAddresses[tokenAddresses.length - 1]);
i_dsc = DecentralizedStableCoin(dscAddress);
}
}