Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions contracts/tenderizer/ITenderizer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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;
}
7 changes: 7 additions & 0 deletions contracts/tenderizer/Tenderizer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
6 changes: 6 additions & 0 deletions contracts/token/ITenderToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
5 changes: 5 additions & 0 deletions contracts/token/TenderToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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

/**
Expand Down
25 changes: 25 additions & 0 deletions test/integration/behaviors/setters.behavior.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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')
})
})
})
}