60 lines
2.1 KiB
Solidity
60 lines
2.1 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity ^0.6.12;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
import { GovernanceGasUpgrade } from "../v2-vault-and-gas/GovernanceGasUpgrade.sol";
|
|
import { ITornadoStakingRewards } from "./interfaces/ITornadoStakingRewards.sol";
|
|
|
|
/**
|
|
* @notice The Governance staking upgrade. Adds modifier to any un/lock operation to update rewards
|
|
* @dev CONTRACT RISKS:
|
|
* - if updateRewards reverts (should not happen due to try/catch) locks/unlocks could be blocked
|
|
* - generally inherits risks from former governance upgrades
|
|
*/
|
|
contract GovernanceStakingUpgrade is GovernanceGasUpgrade {
|
|
ITornadoStakingRewards public immutable Staking;
|
|
|
|
event RewardUpdateSuccessful(address indexed account);
|
|
event RewardUpdateFailed(address indexed account, bytes indexed errorData);
|
|
|
|
constructor(address stakingRewardsAddress, address gasCompLogic, address userVaultAddress)
|
|
public
|
|
GovernanceGasUpgrade(gasCompLogic, userVaultAddress)
|
|
{
|
|
Staking = ITornadoStakingRewards(stakingRewardsAddress);
|
|
}
|
|
|
|
/**
|
|
* @notice This modifier should make a call to Staking to update the rewards for account without impacting logic on revert
|
|
* @dev try / catch block to handle reverts
|
|
* @param account Account to update rewards for.
|
|
*
|
|
*/
|
|
modifier updateRewards(address account) {
|
|
try Staking.updateRewardsOnLockedBalanceChange(account, lockedBalance[account]) {
|
|
emit RewardUpdateSuccessful(account);
|
|
} catch (bytes memory errorData) {
|
|
emit RewardUpdateFailed(account, errorData);
|
|
}
|
|
_;
|
|
}
|
|
|
|
function lock(address owner, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
|
|
public
|
|
virtual
|
|
override
|
|
updateRewards(owner)
|
|
{
|
|
super.lock(owner, amount, deadline, v, r, s);
|
|
}
|
|
|
|
function lockWithApproval(uint256 amount) public virtual override updateRewards(msg.sender) {
|
|
super.lockWithApproval(amount);
|
|
}
|
|
|
|
function unlock(uint256 amount) public virtual override updateRewards(msg.sender) {
|
|
super.unlock(amount);
|
|
}
|
|
}
|