Skip to content

Commit fb6c092

Browse files
authored
small change on bases (#184)
* small change on bases * changing oracle contracts to make it more modular * changing deployment scripts and tests * changing deployment scripts and deploying * fixing failing tests on adapter * fixing failing forge test
1 parent 5fc7ed9 commit fb6c092

45 files changed

Lines changed: 329 additions & 466 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

contracts/adapters/SanTokenERC4626Adapter.sol

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ abstract contract SanTokenERC4626Adapter is Initializable, ERC20Upgradeable, IER
5959

6060
uint256 internal constant _BASE_PARAMS = 10**9;
6161
uint256 internal constant _BASE = 10**18;
62+
// `_BASE_27` is the product between `_BASE` and `_BASE_PARAMS`
63+
uint256 internal constant _BASE_27 = 10**27;
6264

6365
// =================================== ERROR ===================================
6466

@@ -282,16 +284,12 @@ abstract contract SanTokenERC4626Adapter is Initializable, ERC20Upgradeable, IER
282284
/// @notice Converts an amount of `assets` to a shares amount with potential exit slippage taken into account
283285
function _convertToSharesWithSlippage(uint256 assets) internal view returns (uint256 shares) {
284286
(uint256 sanRate, uint256 slippage) = _estimateSanRate();
285-
shares = assets.mulDiv(_BASE * _BASE_PARAMS, (_BASE_PARAMS - slippage) * sanRate, MathUpgradeable.Rounding.Up);
287+
shares = assets.mulDiv(_BASE_27, (_BASE_PARAMS - slippage) * sanRate, MathUpgradeable.Rounding.Up);
286288
}
287289

288290
/// @notice Converts an amount of `shares` to an assets amount with potential exit slippage taken into account
289291
function _convertToAssetsWithSlippage(uint256 shares) internal view returns (uint256 assets) {
290292
(uint256 sanRate, uint256 slippage) = _estimateSanRate();
291-
assets = shares.mulDiv(
292-
(_BASE_PARAMS - slippage) * sanRate,
293-
_BASE * _BASE_PARAMS,
294-
MathUpgradeable.Rounding.Down
295-
);
293+
assets = shares.mulDiv((_BASE_PARAMS - slippage) * sanRate, _BASE_27, MathUpgradeable.Rounding.Down);
296294
}
297295
}

contracts/adapters/SanTokenERC4626AdapterStakable.sol

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ abstract contract SanTokenERC4626AdapterStakable is SanTokenERC4626Adapter {
1717
/// @notice Angle-related constants
1818
IERC20 private constant _ANGLE = IERC20(0x31429d1856aD1377A8A0079410B297e1a9e214c2);
1919

20-
uint256 public constant BASE_36 = 10**36;
20+
uint256 internal constant _BASE_36 = 10**36;
2121

2222
// ================================= REFERENCES ================================
2323

@@ -70,9 +70,9 @@ abstract contract SanTokenERC4626AdapterStakable is SanTokenERC4626Adapter {
7070
function claimableRewards(address from, IERC20 _rewardToken) external view returns (uint256) {
7171
uint256 _totalSupply = totalSupply();
7272
uint256 newIntegral = _totalSupply != 0
73-
? integral[_rewardToken] + (_rewardsToBeClaimed(_rewardToken) * BASE_36) / _totalSupply
73+
? integral[_rewardToken] + (_rewardsToBeClaimed(_rewardToken) * _BASE_36) / _totalSupply
7474
: integral[_rewardToken];
75-
uint256 newClaimable = (balanceOf(from) * (newIntegral - integralOf[_rewardToken][from])) / BASE_36;
75+
uint256 newClaimable = (balanceOf(from) * (newIntegral - integralOf[_rewardToken][from])) / _BASE_36;
7676
return pendingRewardsOf[_rewardToken][from] + newClaimable;
7777
}
7878

@@ -90,7 +90,7 @@ abstract contract SanTokenERC4626AdapterStakable is SanTokenERC4626Adapter {
9090
uint256 userBalance = balanceOf(from);
9191
for (uint256 i; i < rewardTokensLength; ++i) {
9292
uint256 totalClaimable = (userBalance * (integral[rewardTokens[i]] - integralOf[rewardTokens[i]][from])) /
93-
BASE_36 +
93+
_BASE_36 +
9494
pendingRewardsOf[rewardTokens[i]][from];
9595
if (totalClaimable != 0) {
9696
if (_claim) {
@@ -119,7 +119,7 @@ abstract contract SanTokenERC4626AdapterStakable is SanTokenERC4626Adapter {
119119
/// @param amount Amount to add to the claimable rewards
120120
function _updateRewards(IERC20 rewardToken, uint256 amount) internal {
121121
uint256 _totalSupply = totalSupply();
122-
if (_totalSupply != 0) integral[rewardToken] += (amount * BASE_36) / _totalSupply;
122+
if (_totalSupply != 0) integral[rewardToken] += (amount * _BASE_36) / _totalSupply;
123123
}
124124

125125
/// @notice Gets the reward tokens given in the liquidity gauge

contracts/mock/MockLiquidityGauge.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: UNLICENSED
2-
pragma solidity 0.8.17;
2+
pragma solidity ^0.8.12;
33

44
import { ILiquidityGauge } from "../interfaces/coreModule/ILiquidityGauge.sol";
55
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

contracts/mock/MockSanTokenERC4626Adapter.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: UNLICENSED
2-
pragma solidity 0.8.17;
2+
pragma solidity ^0.8.12;
33

44
import "../adapters/SanTokenERC4626Adapter.sol";
55
import { SanTokenERC4626AdapterStakable } from "../adapters/SanTokenERC4626AdapterStakable.sol";
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// SPDX-License-Identifier: GPL-3.0
2+
3+
pragma solidity ^0.8.12;
4+
5+
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
6+
7+
import "./BaseOracleChainlinkMulti.sol";
8+
9+
/// @title BaseOracleChainlinkMultiTwoFeeds
10+
/// @author Angle Labs, Inc.
11+
/// @notice Base contract for an oracle that reads into two Chainlink feeds (including an EUR/USD feed) which both have
12+
/// 8 decimals
13+
abstract contract BaseOracleChainlinkMultiTwoFeeds is BaseOracleChainlinkMulti {
14+
constructor(uint32 _stalePeriod, address _treasury) BaseOracleChainlinkMulti(_stalePeriod, _treasury) {}
15+
16+
/// @notice Array with the list of Chainlink feeds in the order in which they are read
17+
function circuitChainlink() public pure virtual returns (AggregatorV3Interface[2] memory);
18+
19+
/// @notice Returns the quote amount of the oracle contract
20+
function _getQuoteAmount() internal view virtual returns (uint256) {
21+
return 10**18;
22+
}
23+
24+
/// @inheritdoc IOracle
25+
function read() external view override returns (uint256 quoteAmount) {
26+
quoteAmount = _getQuoteAmount();
27+
AggregatorV3Interface[2] memory _circuitChainlink = circuitChainlink();
28+
uint8[2] memory circuitChainIsMultiplied = [1, 0];
29+
uint8[2] memory chainlinkDecimals = [8, 8];
30+
for (uint256 i; i < 2; ++i) {
31+
quoteAmount = _readChainlinkFeed(
32+
quoteAmount,
33+
_circuitChainlink[i],
34+
circuitChainIsMultiplied[i],
35+
chainlinkDecimals[i]
36+
);
37+
}
38+
}
39+
}

contracts/oracle/implementations/arbitrum/OracleBTCEURChainlinkArbitrum.sol

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,24 @@ pragma solidity ^0.8.12;
44

55
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
66

7-
import "../../BaseOracleChainlinkMulti.sol";
7+
import "../../BaseOracleChainlinkMultiTwoFeeds.sol";
88

99
/// @title OracleBTCEURChainlinkArbitrum
1010
/// @author Angle Labs, Inc.
1111
/// @notice Gives the price of BTC in Euro in base 18
1212
/// @dev This contract is built to be deployed on Arbitrum
13-
contract OracleBTCEURChainlinkArbitrum is BaseOracleChainlinkMulti {
14-
uint256 public constant OUTBASE = 10**18;
13+
contract OracleBTCEURChainlinkArbitrum is BaseOracleChainlinkMultiTwoFeeds {
1514
string public constant DESCRIPTION = "BTC/EUR Oracle";
1615

17-
/// @notice Constructor of the contract
18-
/// @param _stalePeriod Minimum feed update frequency for the oracle to not revert
19-
/// @param _treasury Treasury associated to the `VaultManager` which reads from this feed
20-
constructor(uint32 _stalePeriod, address _treasury) BaseOracleChainlinkMulti(_stalePeriod, _treasury) {}
16+
constructor(uint32 _stalePeriod, address _treasury) BaseOracleChainlinkMultiTwoFeeds(_stalePeriod, _treasury) {}
2117

22-
/// @inheritdoc IOracle
23-
function read() external view override returns (uint256 quoteAmount) {
24-
quoteAmount = OUTBASE;
25-
AggregatorV3Interface[2] memory circuitChainlink = [
18+
/// @inheritdoc BaseOracleChainlinkMultiTwoFeeds
19+
function circuitChainlink() public pure override returns (AggregatorV3Interface[2] memory) {
20+
return [
2621
// Oracle BTC/USD
2722
AggregatorV3Interface(0x6ce185860a4963106506C203335A2910413708e9),
2823
// Oracle EUR/USD
2924
AggregatorV3Interface(0xA14d53bC1F1c0F31B4aA3BD109344E5009051a84)
3025
];
31-
uint8[2] memory circuitChainIsMultiplied = [1, 0];
32-
uint8[2] memory chainlinkDecimals = [8, 8];
33-
for (uint256 i; i < 2; ++i) {
34-
quoteAmount = _readChainlinkFeed(
35-
quoteAmount,
36-
circuitChainlink[i],
37-
circuitChainIsMultiplied[i],
38-
chainlinkDecimals[i]
39-
);
40-
}
4126
}
4227
}

contracts/oracle/implementations/arbitrum/OracleETHEURChainlinkArbitrum.sol

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,24 @@ pragma solidity ^0.8.12;
44

55
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
66

7-
import "../../BaseOracleChainlinkMulti.sol";
7+
import "../../BaseOracleChainlinkMultiTwoFeeds.sol";
88

99
/// @title OracleETHEURChainlinkArbitrum
1010
/// @author Angle Labs, Inc.
1111
/// @notice Gives the price of ETH in Euro in base 18
1212
/// @dev This contract is built to be deployed on Arbitrum
13-
contract OracleETHEURChainlinkArbitrum is BaseOracleChainlinkMulti {
14-
uint256 public constant OUTBASE = 10**18;
13+
contract OracleETHEURChainlinkArbitrum is BaseOracleChainlinkMultiTwoFeeds {
1514
string public constant DESCRIPTION = "ETH/EUR Oracle";
1615

17-
/// @notice Constructor of the contract
18-
/// @param _stalePeriod Minimum feed update frequency for the oracle to not revert
19-
/// @param _treasury Treasury associated to the `VaultManager` which reads from this feed
20-
constructor(uint32 _stalePeriod, address _treasury) BaseOracleChainlinkMulti(_stalePeriod, _treasury) {}
16+
constructor(uint32 _stalePeriod, address _treasury) BaseOracleChainlinkMultiTwoFeeds(_stalePeriod, _treasury) {}
2117

22-
/// @inheritdoc IOracle
23-
function read() external view override returns (uint256 quoteAmount) {
24-
quoteAmount = OUTBASE;
25-
AggregatorV3Interface[2] memory circuitChainlink = [
18+
/// @inheritdoc BaseOracleChainlinkMultiTwoFeeds
19+
function circuitChainlink() public pure override returns (AggregatorV3Interface[2] memory) {
20+
return [
2621
// Oracle ETH/USD
2722
AggregatorV3Interface(0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612),
2823
// Oracle EUR/USD
2924
AggregatorV3Interface(0xA14d53bC1F1c0F31B4aA3BD109344E5009051a84)
3025
];
31-
uint8[2] memory circuitChainIsMultiplied = [1, 0];
32-
uint8[2] memory chainlinkDecimals = [8, 8];
33-
for (uint256 i; i < 2; ++i) {
34-
quoteAmount = _readChainlinkFeed(
35-
quoteAmount,
36-
circuitChainlink[i],
37-
circuitChainIsMultiplied[i],
38-
chainlinkDecimals[i]
39-
);
40-
}
4126
}
4227
}

contracts/oracle/implementations/arbitrum/OracleUSDCEURChainlinkArbitrum.sol

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,24 @@ pragma solidity ^0.8.12;
44

55
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
66

7-
import "../../BaseOracleChainlinkMulti.sol";
7+
import "../../BaseOracleChainlinkMultiTwoFeeds.sol";
88

99
/// @title OracleUSDCEURChainlinkArbitrum
1010
/// @author Angle Labs, Inc.
1111
/// @notice Gives the price of USDC in Euro in base 18
1212
/// @dev This contract is built to be deployed on Arbitrum
13-
contract OracleUSDCEURChainlinkArbitrum is BaseOracleChainlinkMulti {
14-
uint256 public constant OUTBASE = 10**18;
13+
contract OracleUSDCEURChainlinkArbitrum is BaseOracleChainlinkMultiTwoFeeds {
1514
string public constant DESCRIPTION = "USDC/EUR Oracle";
1615

17-
/// @notice Constructor of the contract
18-
/// @param _stalePeriod Minimum feed update frequency for the oracle to not revert
19-
/// @param _treasury Treasury associated to the `VaultManager` which reads from this feed
20-
constructor(uint32 _stalePeriod, address _treasury) BaseOracleChainlinkMulti(_stalePeriod, _treasury) {}
16+
constructor(uint32 _stalePeriod, address _treasury) BaseOracleChainlinkMultiTwoFeeds(_stalePeriod, _treasury) {}
2117

22-
/// @inheritdoc IOracle
23-
function read() external view override returns (uint256 quoteAmount) {
24-
quoteAmount = OUTBASE;
25-
AggregatorV3Interface[2] memory circuitChainlink = [
18+
/// @inheritdoc BaseOracleChainlinkMultiTwoFeeds
19+
function circuitChainlink() public pure override returns (AggregatorV3Interface[2] memory) {
20+
return [
2621
// Oracle USDC/USD
2722
AggregatorV3Interface(0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3),
2823
// Oracle EUR/USD
2924
AggregatorV3Interface(0xA14d53bC1F1c0F31B4aA3BD109344E5009051a84)
3025
];
31-
uint8[2] memory circuitChainIsMultiplied = [1, 0];
32-
uint8[2] memory chainlinkDecimals = [8, 8];
33-
for (uint256 i; i < 2; ++i) {
34-
quoteAmount = _readChainlinkFeed(
35-
quoteAmount,
36-
circuitChainlink[i],
37-
circuitChainIsMultiplied[i],
38-
chainlinkDecimals[i]
39-
);
40-
}
4126
}
4227
}

contracts/oracle/implementations/avalanche/OracleAVAXEURChainlinkAvalanche.sol

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,24 @@ pragma solidity ^0.8.12;
44

55
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
66

7-
import "../../BaseOracleChainlinkMulti.sol";
7+
import "../../BaseOracleChainlinkMultiTwoFeeds.sol";
88

99
/// @title OracleAVAXEURChainlinkAvalanche
1010
/// @author Angle Labs, Inc.
1111
/// @notice Gives the price of AVAX in Euro in base 18
1212
/// @dev This contract is built to be deployed on Avalanche
13-
contract OracleAVAXEURChainlinkAvalanche is BaseOracleChainlinkMulti {
14-
uint256 public constant OUTBASE = 10**18;
13+
contract OracleAVAXEURChainlinkAvalanche is BaseOracleChainlinkMultiTwoFeeds {
1514
string public constant DESCRIPTION = "AVAX/EUR Oracle";
1615

17-
/// @notice Constructor of the contract
18-
/// @param _stalePeriod Minimum feed update frequency for the oracle to not revert
19-
/// @param _treasury Treasury associated to the `VaultManager` which reads from this feed
20-
constructor(uint32 _stalePeriod, address _treasury) BaseOracleChainlinkMulti(_stalePeriod, _treasury) {}
16+
constructor(uint32 _stalePeriod, address _treasury) BaseOracleChainlinkMultiTwoFeeds(_stalePeriod, _treasury) {}
2117

22-
/// @inheritdoc IOracle
23-
function read() external view override returns (uint256 quoteAmount) {
24-
quoteAmount = OUTBASE;
25-
AggregatorV3Interface[2] memory circuitChainlink = [
18+
/// @inheritdoc BaseOracleChainlinkMultiTwoFeeds
19+
function circuitChainlink() public pure override returns (AggregatorV3Interface[2] memory) {
20+
return [
2621
// Oracle AVAX/USD
2722
AggregatorV3Interface(0x0A77230d17318075983913bC2145DB16C7366156),
2823
// Oracle EUR/USD
2924
AggregatorV3Interface(0x192f2DBA961Bb0277520C082d6bfa87D5961333E)
3025
];
31-
uint8[2] memory circuitChainIsMultiplied = [1, 0];
32-
uint8[2] memory chainlinkDecimals = [8, 8];
33-
for (uint256 i; i < 2; ++i) {
34-
quoteAmount = _readChainlinkFeed(
35-
quoteAmount,
36-
circuitChainlink[i],
37-
circuitChainIsMultiplied[i],
38-
chainlinkDecimals[i]
39-
);
40-
}
4126
}
4227
}

contracts/oracle/implementations/avalanche/OracleETHEURChainlinkAvalanche.sol

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)