diff --git a/packages/contracts/src/dollar/libraries/LibUbiquityPool.sol b/packages/contracts/src/dollar/libraries/LibUbiquityPool.sol index 2f2a90a35..c5f68dc17 100644 --- a/packages/contracts/src/dollar/libraries/LibUbiquityPool.sol +++ b/packages/contracts/src/dollar/libraries/LibUbiquityPool.sol @@ -202,6 +202,24 @@ library LibUbiquityPool { return poolStorage.collateralAddresses; } + /** + * @notice Check if collateral token with given address already exists + * @param collateralAddress The collateral token address to check + */ + function collateralExists( + address collateralAddress + ) internal view returns (bool) { + UbiquityPoolStorage storage poolStorage = ubiquityPoolStorage(); + address[] memory collateralAddresses = poolStorage.collateralAddresses; + + for (uint256 i = 0; i < collateralAddresses.length; i++) { + if (collateralAddresses[i] == collateralAddress) { + return true; + } + } + return false; + } + /** * @notice Returns collateral information * @param collateralAddress Address of the collateral token @@ -533,10 +551,9 @@ library LibUbiquityPool { // roundId int256 answer, // startedAt , - uint256 updatedAt, + uint256 updatedAt, // answeredInRound - ) = // answeredInRound - priceFeed.latestRoundData(); + ) = priceFeed.latestRoundData(); // fetch number of decimals in chainlink feed uint256 priceFeedDecimals = priceFeed.decimals(); @@ -631,6 +648,11 @@ library LibUbiquityPool { address chainLinkPriceFeedAddress, uint256 poolCeiling ) internal { + require( + !collateralExists(collateralAddress), + "Collateral already added" + ); + UbiquityPoolStorage storage poolStorage = ubiquityPoolStorage(); uint256 collateralIndex = poolStorage.collateralAddresses.length; diff --git a/packages/contracts/test/diamond/facets/UbiquityPoolFacet.t.sol b/packages/contracts/test/diamond/facets/UbiquityPoolFacet.t.sol index de8946d67..31d17d85c 100644 --- a/packages/contracts/test/diamond/facets/UbiquityPoolFacet.t.sol +++ b/packages/contracts/test/diamond/facets/UbiquityPoolFacet.t.sol @@ -692,6 +692,17 @@ contract UbiquityPoolFacetTest is DiamondTestSetup { assertEq(info.redemptionFee, 20000); } + function testAddCollateralToken_ShouldRevertIfCollateralExists() public { + uint256 poolCeiling = 50_000e18; + vm.startPrank(admin); + vm.expectRevert("Collateral already added"); + ubiquityPoolFacet.addCollateralToken( + address(collateralToken), + address(collateralTokenPriceFeed), + poolCeiling + ); + } + function testRemoveAmoMinter_ShouldRemoveAmoMinter() public { vm.startPrank(admin);