From 352a079e753e72fa084b5ac2c6bac78e5cbefe29 Mon Sep 17 00:00:00 2001 From: 0xkorin <0xkorin@proton.me> Date: Tue, 28 Nov 2023 14:49:06 +0100 Subject: [PATCH 1/4] feat: remove curve oracle from redemption contract --- contracts/Redemption.vy | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/contracts/Redemption.vy b/contracts/Redemption.vy index 67500bc..513e83e 100644 --- a/contracts/Redemption.vy +++ b/contracts/Redemption.vy @@ -8,9 +8,6 @@ interface AggregatorV3Interface: interface IDYFI: def burn(owner: address, amount: uint256): nonpayable -interface CurvePoolInterface: - def price_oracle() -> uint256: view - UNIT: constant(uint256) = 10**18 SLIPPAGE_TOLERANCE: constant(uint256) = 3 SLIPPAGE_DENOMINATOR: constant(uint256) = 1000 @@ -18,7 +15,6 @@ SLIPPAGE_DENOMINATOR: constant(uint256) = 1000 DYFI: immutable(IDYFI) YFI: immutable(ERC20) VEYFI: immutable(ERC20) -CURVE_POOL: immutable(CurvePoolInterface) PRICE_FEED: immutable(AggregatorV3Interface) # @dev Returns the address of the current owner. @@ -101,14 +97,13 @@ A11: constant(int256) = 1_064_49_445_891_785_942_956 @external def __init__( yfi: address, d_yfi: address, ve_yfi: address, owner: address, - price_feed: address, curve_pool: address, scaling_factor: uint256, + price_feed: address, scaling_factor: uint256, ): assert scaling_factor >= UNIT and scaling_factor <= 12 * UNIT YFI = ERC20(yfi) DYFI = IDYFI(d_yfi) VEYFI = ERC20(ve_yfi) PRICE_FEED = AggregatorV3Interface(price_feed) - CURVE_POOL = CurvePoolInterface(curve_pool) self._transfer_ownership(owner) self.payee = owner self.packed_scaling_factor = shift(scaling_factor, 128) | shift(scaling_factor, 192) @@ -189,16 +184,6 @@ def get_latest_price() -> uint256: @internal @view def _get_latest_price() -> uint256: - oracle_price: uint256 = convert(self._get_oracle_price(), uint256) - pool_price: uint256 = CURVE_POOL.price_oracle() - if pool_price < oracle_price: - return oracle_price - return pool_price - - -@internal -@view -def _get_oracle_price() -> int256: round_id: uint80 = 0 price: int256 = 0 started_at: uint256 = 0 @@ -206,7 +191,7 @@ def _get_oracle_price() -> int256: answered_in_round: uint80 = 0 (round_id, price, started_at, updated_at, answered_in_round) = PRICE_FEED.latestRoundData() assert updated_at + 3600 > block.timestamp, "price too old" - return price + return convert(price, uint256) @external From b20216da8463fb634a1858fefe54bd89d6846b61 Mon Sep 17 00:00:00 2001 From: 0xkorin <0xkorin@proton.me> Date: Wed, 29 Nov 2023 14:23:24 +0100 Subject: [PATCH 2/4] fix: tests --- tests/conftest.py | 1 - tests/functional/test_redemption.py | 20 +++----------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index b51029d..b85e75c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -55,7 +55,6 @@ def redemption(accounts, project, yfi, d_yfi, ve_yfi): ve_yfi, accounts[0], oft, - "0xc26b89a667578ec7b3f11b2f98d6fd15c07c54ba", 10**18, sender=accounts[0], ) diff --git a/tests/functional/test_redemption.py b/tests/functional/test_redemption.py index 6f8da77..e504de4 100644 --- a/tests/functional/test_redemption.py +++ b/tests/functional/test_redemption.py @@ -136,13 +136,13 @@ def test_sweep(d_yfi, yfi, redemption, gov): def test_oracle(project, yfi, d_yfi, ve_yfi, gov): mock = project.MockOracle.deploy(sender=gov) redemption = project.Redemption.deploy( - yfi, d_yfi, ve_yfi, gov, mock, mock, 10 * AMOUNT, sender=gov + yfi, d_yfi, ve_yfi, gov, mock, 10 * AMOUNT, sender=gov ) mock.set_price(2 * AMOUNT, AMOUNT, sender=gov) assert redemption.get_latest_price() == 2 * AMOUNT - mock.set_price(2 * AMOUNT, 3 * AMOUNT, sender=gov) + mock.set_price(3 * AMOUNT, 2 * AMOUNT, sender=gov) assert redemption.get_latest_price() == 3 * AMOUNT mock.set_updated(1, sender=gov) @@ -166,21 +166,7 @@ def test_chainlink_oracle(project, yfi, d_yfi, ve_yfi, gov): assert actual == expected assert abs(yfieth.latestRoundData()[1] - actual) / actual <= 0.01 - mock = project.MockOracle.deploy(sender=gov) - mock.set_price(AMOUNT, AMOUNT, sender=gov) - - redemption = project.Redemption.deploy( - yfi, d_yfi, ve_yfi, gov, combined, mock, 10 * AMOUNT, sender=gov - ) - assert redemption.get_latest_price() == actual - - -def test_curve_oracle(project, yfi, d_yfi, ve_yfi, gov): - mock = project.MockOracle.deploy(sender=gov) - mock.set_price(AMOUNT, AMOUNT, sender=gov) - curve = project.MockOracle.at("0xC26b89A667578ec7b3f11b2F98d6Fd15C07C54ba") redemption = project.Redemption.deploy( - yfi, d_yfi, ve_yfi, gov, mock, curve, 10 * AMOUNT, sender=gov + yfi, d_yfi, ve_yfi, gov, combined, 10 * AMOUNT, sender=gov ) - actual = curve.price_oracle() assert redemption.get_latest_price() == actual From 1a777b44ab08567660841fdd56decdac9ddc38ba Mon Sep 17 00:00:00 2001 From: 0xkorin <0xkorin@proton.me> Date: Wed, 29 Nov 2023 14:29:33 +0100 Subject: [PATCH 3/4] chore: update ape version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 824c48d..b693c6f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ black==22.3.0 -eth-ape==0.6.20 +eth-ape==0.6.26 From 3d9fe4d01d8c49cf247e97104aeb0a6eed4deaa5 Mon Sep 17 00:00:00 2001 From: 0xkorin <0xkorin@proton.me> Date: Thu, 30 Nov 2023 21:07:03 +0100 Subject: [PATCH 4/4] feat: add oracle price comparison test --- tests/functional/test_redemption.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/functional/test_redemption.py b/tests/functional/test_redemption.py index e504de4..32e8e81 100644 --- a/tests/functional/test_redemption.py +++ b/tests/functional/test_redemption.py @@ -170,3 +170,27 @@ def test_chainlink_oracle(project, yfi, d_yfi, ve_yfi, gov): yfi, d_yfi, ve_yfi, gov, combined, 10 * AMOUNT, sender=gov ) assert redemption.get_latest_price() == actual + + +def test_redeployment_oracle(chain, accounts, project, d_yfi, ve_yfi, gov): + ychad = accounts["0xFEB4acf3df3cDEA7399794D0869ef76A6EfAff52"] + pool = ape.Contract("0xC26b89A667578ec7b3f11b2F98d6Fd15C07C54ba") + yfi = ape.Contract("0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e") + yfi.approve(pool, 1000 * AMOUNT, sender=ychad) + pool.exchange(1, 0, 100 * AMOUNT, 0, sender=ychad) + chain.pending_timestamp += 60 + pool.exchange(1, 0, 100 * AMOUNT, 0, sender=ychad) + chain.pending_timestamp += 60 + pool.exchange(1, 0, 100 * AMOUNT, 0, sender=ychad) + + old = ape.Contract("0x2fBa208E1B2106d40DaA472Cb7AE0c6C7EFc0224") + new = project.Redemption.deploy( + yfi, + d_yfi, + ve_yfi, + gov, + "0x3EbEACa272Ce4f60E800f6C5EE678f50D2882fd4", + 10 * AMOUNT, + sender=gov, + ) + assert old.get_latest_price() == new.get_latest_price()