Skip to content

Commit

Permalink
Added updateAssetFeeds function
Browse files Browse the repository at this point in the history
  • Loading branch information
ggviana committed Aug 4, 2021
1 parent 6360adf commit 87a7932
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 0 deletions.
18 changes: 18 additions & 0 deletions abi/PriceProvider.json
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,24 @@
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_assets",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "_feeds",
"type": "address[]"
}
],
"name": "updateAssetFeeds",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "updateMinUpdateInterval",
Expand Down
2 changes: 2 additions & 0 deletions contracts/interfaces/IPriceProvider.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ pragma solidity 0.6.12;
interface IPriceProvider {
function setAssetFeeds(address[] memory _assets, address[] memory _feeds) external;

function updateAssetFeeds(address[] memory _assets, address[] memory _feeds) external;

function removeAssetFeeds(address[] memory _assets) external;

function getAssetPrice(address _asset) external view returns (uint256);
Expand Down
12 changes: 12 additions & 0 deletions contracts/oracle/PriceProvider.sol
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,18 @@ contract PriceProvider is IPriceProvider, Ownable {
_setAssetFeeds(_assets, _feeds);
}

/**
* @notice Updates previously registered price feeds
* @param _assets Array of assets
* @param _feeds Array of price feeds
*/
function updateAssetFeeds(address[] memory _assets, address[] memory _feeds) external override onlyOwner {
for (uint256 i = 0; i < _assets.length; i++) {
require(address(_assetPriceFeeds[_assets[i]]) != address(0), "PriceProvider: PriceFeed not set");
}
_setAssetFeeds(_assets, _feeds);
}

/**
* @notice Unregister price feeds
* @dev Will not remove unregistered assets
Expand Down
50 changes: 50 additions & 0 deletions test/oracle/PriceProvider.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,56 @@ describe('PriceProvider', () => {
})
})

describe('updateAssetFeeds', () => {
it('should update a previously set feed', async () => {
const startingPriceFeed = await createPriceFeedMock(deployer)
await startingPriceFeed.setDecimals(6)
await startingPriceFeed.setRoundData({
roundId: 1,
answer: 50e6,
startedAt,
updatedAt,
answeredInRound: 1
})
await provider.setAssetFeeds([asset1], [startingPriceFeed.contract.address])

const newPriceFeed = await createPriceFeedMock(deployer)
await newPriceFeed.setDecimals(6)
await newPriceFeed.setRoundData({
roundId: 1,
answer: 50e6,
startedAt,
updatedAt,
answeredInRound: 1
})

const tx = provider.updateAssetFeeds([asset1], [newPriceFeed.contract.address])

await expect(tx)
.to.emit(provider, 'AssetFeedUpdated')
.withArgs(asset1, newPriceFeed.contract.address)

expect(await provider.getPriceFeed(asset1)).to.equal(newPriceFeed.contract.address)
})

it('should revert if the feed was not previously set', async () => {
const newPriceFeed = await createPriceFeedMock(deployer)
await newPriceFeed.setDecimals(6)
await newPriceFeed.setRoundData({
roundId: 1,
answer: 50e6,
startedAt,
updatedAt,
answeredInRound: 1
})

const tx = provider.updateAssetFeeds([asset1], [newPriceFeed.contract.address])

await expect(tx)
.to.be.revertedWith('PriceProvider: PriceFeed not set')
})
})

describe('removeAssetFeeds', () => {
it('should remove a feed', async () => {
const newPriceFeed = await createPriceFeedMock(deployer)
Expand Down

0 comments on commit 87a7932

Please sign in to comment.