Skip to content

Commit 3617143

Browse files
committed
feat: allow to pass the vault decimals directly
1 parent 2103045 commit 3617143

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

src/ChainlinkOracle.sol

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ contract ChainlinkOracle is IOracle {
3838
/// @param baseFeed2 Second base feed. Pass address zero if the price = 1.
3939
/// @param quoteFeed1 First quote feed. Pass address zero if the price = 1.
4040
/// @param quoteFeed2 Second quote feed. Pass address zero if the price = 1.
41+
/// @param vaultDecimals Vault decimals, where the vault is an ERC4626 seen as an ERC20. Pass 0 if the oracle does
42+
/// not use a vault.
4143
/// @param baseTokenDecimals Base token decimals.
4244
/// @param quoteTokenDecimals Quote token decimals.
4345
constructor(
@@ -46,14 +48,15 @@ contract ChainlinkOracle is IOracle {
4648
AggregatorV3Interface baseFeed2,
4749
AggregatorV3Interface quoteFeed1,
4850
AggregatorV3Interface quoteFeed2,
51+
uint256 vaultDecimals,
4952
uint256 baseTokenDecimals,
5053
uint256 quoteTokenDecimals
5154
) {
5255
// The vault parameter is used for ERC4626 tokens, to price its shares.
5356
// It is used to price a full unit of the vault shares, so it requires dividing by that number, hence the
5457
// `VAULT_DECIMALS` subtraction in the following `SCALE_FACTOR` definition.
5558
VAULT = vault;
56-
VAULT_DECIMALS = VAULT.getDecimals();
59+
VAULT_DECIMALS = vaultDecimals;
5760
BASE_FEED_1 = baseFeed1;
5861
BASE_FEED_2 = baseFeed2;
5962
QUOTE_FEED_1 = quoteFeed1;
@@ -75,7 +78,7 @@ contract ChainlinkOracle is IOracle {
7578
SCALE_FACTOR = 10
7679
** (
7780
36 + quoteTokenDecimals + quoteFeed1.getDecimals() + quoteFeed2.getDecimals() - baseTokenDecimals
78-
- baseFeed1.getDecimals() - baseFeed2.getDecimals() - VAULT_DECIMALS
81+
- baseFeed1.getDecimals() - baseFeed2.getDecimals() - vaultDecimals
7982
);
8083
}
8184

test/ChainlinkOracleTest.sol

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ contract ChainlinkOracleTest is Test {
3333
}
3434

3535
function testOracleWbtcUsdc() public {
36-
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, wBtcBtcFeed, btcUsdFeed, usdcUsdFeed, feedZero, 8, 6);
36+
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, wBtcBtcFeed, btcUsdFeed, usdcUsdFeed, feedZero, 0, 8, 6);
3737
(, int256 firstBaseAnswer,,,) = wBtcBtcFeed.latestRoundData();
3838
(, int256 secondBaseAnswer,,,) = btcUsdFeed.latestRoundData();
3939
(, int256 quoteAnswer,,,) = usdcUsdFeed.latestRoundData();
@@ -45,7 +45,7 @@ contract ChainlinkOracleTest is Test {
4545
}
4646

4747
function testOracleUsdcWbtc() public {
48-
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, usdcUsdFeed, feedZero, wBtcBtcFeed, btcUsdFeed, 6, 8);
48+
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, usdcUsdFeed, feedZero, wBtcBtcFeed, btcUsdFeed, 0, 6, 8);
4949
(, int256 baseAnswer,,,) = usdcUsdFeed.latestRoundData();
5050
(, int256 firstQuoteAnswer,,,) = wBtcBtcFeed.latestRoundData();
5151
(, int256 secondQuoteAnswer,,,) = btcUsdFeed.latestRoundData();
@@ -57,56 +57,56 @@ contract ChainlinkOracleTest is Test {
5757
}
5858

5959
function testOracleWbtcEth() public {
60-
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero,wBtcBtcFeed, btcEthFeed, feedZero, feedZero, 8, 18);
60+
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero,wBtcBtcFeed, btcEthFeed, feedZero, feedZero, 0, 8, 18);
6161
(, int256 firstBaseAnswer,,,) = wBtcBtcFeed.latestRoundData();
6262
(, int256 secondBaseAnswer,,,) = btcEthFeed.latestRoundData();
6363
assertEq(oracle.price(), (uint256(firstBaseAnswer) * uint256(secondBaseAnswer) * 10 ** (36 + 18 - 8 - 8 - 18)));
6464
}
6565

6666
function testOracleStEthUsdc() public {
67-
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, stEthEthFeed, feedZero, usdcEthFeed, feedZero, 18, 6);
67+
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, stEthEthFeed, feedZero, usdcEthFeed, feedZero,0, 18, 6);
6868
(, int256 baseAnswer,,,) = stEthEthFeed.latestRoundData();
6969
(, int256 quoteAnswer,,,) = usdcEthFeed.latestRoundData();
7070
assertEq(oracle.price(), uint256(baseAnswer) * 10 ** (36 + 18 + 6 - 18 - 18) / uint256(quoteAnswer));
7171
}
7272

7373
function testOracleEthUsd() public {
74-
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, ethUsdFeed, feedZero, feedZero, feedZero, 18, 0);
74+
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, ethUsdFeed, feedZero, feedZero, feedZero, 0, 18, 0);
7575
(, int256 expectedPrice,,,) = ethUsdFeed.latestRoundData();
7676
assertEq(oracle.price(), uint256(expectedPrice) * 10 ** (36 - 18 - 8));
7777
}
7878

7979
function testOracleStEthEth() public {
80-
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, stEthEthFeed, feedZero, feedZero, feedZero, 18, 18);
80+
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, stEthEthFeed, feedZero, feedZero, feedZero, 0, 18, 18);
8181
(, int256 expectedPrice,,,) = stEthEthFeed.latestRoundData();
8282
assertEq(oracle.price(), uint256(expectedPrice) * 10 ** (36 + 18 - 18 - 18));
8383
assertApproxEqRel(oracle.price(), 1e36, 0.01 ether);
8484
}
8585

8686
function testOracleEthStEth() public {
87-
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, feedZero, feedZero, stEthEthFeed, feedZero, 18, 18);
87+
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, feedZero, feedZero, stEthEthFeed, feedZero, 0, 18, 18);
8888
(, int256 expectedPrice,,,) = stEthEthFeed.latestRoundData();
8989
assertEq(oracle.price(), 10 ** (36 + 18 + 18 - 18) / uint256(expectedPrice));
9090
assertApproxEqRel(oracle.price(), 1e36, 0.01 ether);
9191
}
9292

9393
function testOracleUsdcUsd() public {
94-
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, usdcUsdFeed, feedZero, feedZero, feedZero, 6, 0);
94+
ChainlinkOracle oracle = new ChainlinkOracle(vaultZero, usdcUsdFeed, feedZero, feedZero, feedZero, 0, 6, 0);
9595
assertApproxEqRel(oracle.price(), 1e36 / 1e6, 0.01 ether);
9696
}
9797

9898
function testNegativeAnswer(int256 price) public {
9999
price = bound(price, type(int256).min, -1);
100100
ChainlinkAggregatorMock aggregator = new ChainlinkAggregatorMock();
101101
ChainlinkOracle oracle =
102-
new ChainlinkOracle(vaultZero, AggregatorV3Interface(address(aggregator)), feedZero, feedZero, feedZero, 18, 0);
102+
new ChainlinkOracle(vaultZero, AggregatorV3Interface(address(aggregator)), feedZero, feedZero, feedZero, 0, 18, 0);
103103
aggregator.setAnwser(price);
104104
vm.expectRevert(bytes(ErrorsLib.NEGATIVE_ANSWER));
105105
oracle.price();
106106
}
107107

108108
function testSDaiEthOracle() public {
109-
ChainlinkOracle oracle = new ChainlinkOracle(sDaiVault, daiEthFeed, feedZero, feedZero, feedZero, 18, 18);
109+
ChainlinkOracle oracle = new ChainlinkOracle(sDaiVault, daiEthFeed, feedZero, feedZero, feedZero, 18, 18, 18);
110110
(, int256 expectedPrice,,,) = daiEthFeed.latestRoundData();
111111
assertEq(
112112
oracle.price(),
@@ -115,7 +115,7 @@ contract ChainlinkOracleTest is Test {
115115
}
116116

117117
function testSDaiUsdcOracle() public {
118-
ChainlinkOracle oracle = new ChainlinkOracle(sDaiVault, daiEthFeed, feedZero, usdcEthFeed, feedZero, 18, 6);
118+
ChainlinkOracle oracle = new ChainlinkOracle(sDaiVault, daiEthFeed, feedZero, usdcEthFeed, feedZero, 18, 18, 6);
119119
(, int256 baseAnswer,,,) = daiEthFeed.latestRoundData();
120120
(, int256 quoteAnswer,,,) = usdcEthFeed.latestRoundData();
121121
assertEq(

0 commit comments

Comments
 (0)