From fc1d9d6ffbbc816e7902572e0bbb899b01e6461a Mon Sep 17 00:00:00 2001 From: Reuben Rodrigues Date: Wed, 13 Apr 2022 14:30:42 +0530 Subject: [PATCH] TenderToken: Migrate Tenderizer --- contracts/tenderizer/ITenderizer.sol | 8 ++++++ contracts/tenderizer/Tenderizer.sol | 7 ++++++ contracts/token/ITenderToken.sol | 6 +++++ contracts/token/TenderToken.sol | 5 ++++ .../integration/behaviors/setters.behavior.ts | 25 +++++++++++++++++++ 5 files changed, 51 insertions(+) diff --git a/contracts/tenderizer/ITenderizer.sol b/contracts/tenderizer/ITenderizer.sol index 8ad351dd..b4fa36e7 100644 --- a/contracts/tenderizer/ITenderizer.sol +++ b/contracts/tenderizer/ITenderizer.sol @@ -6,6 +6,7 @@ pragma solidity 0.8.4; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../tenderfarm/ITenderFarm.sol"; +import "./ITotalStakedReader.sol"; /** * @title Tenderizer is the base contract to be implemented. @@ -235,4 +236,11 @@ interface ITenderizer { function setStakingContract(address _stakingContract) external; function setTenderFarm(ITenderFarm _tenderFarm) external; + + /** + * @notice MigrateTenderizer sets the staked reader on TenderToken + * and transfers its owndership to the new Tenderizer + * @param _newtenderizer the address of the new Tenderizer + */ + function migrateTenderizer(ITotalStakedReader _newtenderizer) external; } diff --git a/contracts/tenderizer/Tenderizer.sol b/contracts/tenderizer/Tenderizer.sol index 0bce80ae..19ed12a5 100644 --- a/contracts/tenderizer/Tenderizer.sol +++ b/contracts/tenderizer/Tenderizer.sol @@ -237,6 +237,13 @@ abstract contract Tenderizer is Initializable, ITenderizer, SelfPermit { } } + /// @inheritdoc ITenderizer + function migrateTenderizer(ITotalStakedReader _newTenderizer) external override onlyGov { + tenderToken.setTotalStakedReader(_newTenderizer); + tenderToken.transferOwnership(address(_newTenderizer)); + emit GovernanceUpdate("STAKED_READER"); + } + // Internal functions function _depositHook(address _for, uint256 _amount) internal { diff --git a/contracts/token/ITenderToken.sol b/contracts/token/ITenderToken.sol index 4b849b49..37d74bec 100644 --- a/contracts/token/ITenderToken.sol +++ b/contracts/token/ITenderToken.sol @@ -203,4 +203,10 @@ interface ITenderToken { * @dev Used to determine TenderToken total supply. */ function setTotalStakedReader(ITotalStakedReader _stakedReader) external; + + /** + * @notice Changes the owner of the contract + * @param _newOwner address of the new owner + */ + function transferOwnership(address _newOwner) external; } diff --git a/contracts/token/TenderToken.sol b/contracts/token/TenderToken.sol index 31519d75..5496ea4c 100644 --- a/contracts/token/TenderToken.sol +++ b/contracts/token/TenderToken.sol @@ -181,6 +181,11 @@ contract TenderToken is OwnableUpgradeable, ERC20PermitUpgradeable, ITenderToken totalStakedReader = _totalStakedReader; } + /// @inheritdoc ITenderToken + function transferOwnership(address _newOwnner) public override(OwnableUpgradeable, ITenderToken) onlyOwner { + OwnableUpgradeable.transferOwnership(_newOwnner); + } + // INTERNAL FUNCTIONS /** diff --git a/test/integration/behaviors/setters.behavior.ts b/test/integration/behaviors/setters.behavior.ts index f8dab650..3f781267 100644 --- a/test/integration/behaviors/setters.behavior.ts +++ b/test/integration/behaviors/setters.behavior.ts @@ -102,4 +102,29 @@ export default function suite () { expect(tx).to.emit(ctx.Tenderizer, 'GovernanceUpdate').withArgs('GOV') }) }) + + describe('setting staked reader on tenderToken', async () => { + it('reverts if not called by gov', async () => { + await expect(ctx.Tenderizer.connect(ctx.signers[1]).setGov(ethers.constants.AddressZero)).to.be.reverted + }) + + describe('sets succesfully', async () => { + const newTenderizerAddress = '0xd944a0F8C64D292a94C34e85d9038395e3762751' + beforeEach(async () => { + tx = await ctx.Tenderizer.migrateTenderizer(newTenderizerAddress) + }) + + it('sets stakedReader', async () => { + expect(await ctx.TenderToken.totalStakedReader()).to.equal(newTenderizerAddress) + }) + + it('sets owner successfully', async () => { + expect(await ctx.TenderToken.owner()).to.equal(newTenderizerAddress) + }) + + it('should emit GovernanceUpdate event', async () => { + expect(tx).to.emit(ctx.Tenderizer, 'GovernanceUpdate').withArgs('STAKED_READER') + }) + }) + }) }