From 74b6021aa7e45a565a6e9ab27b6e04f1eb9256ce Mon Sep 17 00:00:00 2001 From: Drygin Date: Mon, 7 Mar 2022 19:02:53 +0300 Subject: [PATCH] add gov v3 --- contracts/v2-vault-and-gas/ProposalChanges.md | 2 + .../GovernanceStakingUpgrade.sol | 61 +++++++++++++++++++ .../v3-relayer-registry/ProposalChanges.md | 14 +++++ .../interfaces/ITornadoStakingRewards.sol | 7 +++ 4 files changed, 84 insertions(+) create mode 100644 contracts/v3-relayer-registry/GovernanceStakingUpgrade.sol create mode 100644 contracts/v3-relayer-registry/ProposalChanges.md create mode 100644 contracts/v3-relayer-registry/interfaces/ITornadoStakingRewards.sol diff --git a/contracts/v2-vault-and-gas/ProposalChanges.md b/contracts/v2-vault-and-gas/ProposalChanges.md index 4298ea2..0bd16ef 100644 --- a/contracts/v2-vault-and-gas/ProposalChanges.md +++ b/contracts/v2-vault-and-gas/ProposalChanges.md @@ -1,5 +1,7 @@ # Tornado Governance Changes +Governance proposal [repo](). + ## Governance Vault Upgrade (GovernanceVaultUpgrade.sol) `GovernanceVaultUpgrade` is the first major upgrade to tornado governance. This upgrade introduces new logic which is used to communicate with `TornVault` from the governance contract. The motivation behind this upgrade: diff --git a/contracts/v3-relayer-registry/GovernanceStakingUpgrade.sol b/contracts/v3-relayer-registry/GovernanceStakingUpgrade.sol new file mode 100644 index 0000000..b10ccfa --- /dev/null +++ b/contracts/v3-relayer-registry/GovernanceStakingUpgrade.sol @@ -0,0 +1,61 @@ +// 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); + } +} diff --git a/contracts/v3-relayer-registry/ProposalChanges.md b/contracts/v3-relayer-registry/ProposalChanges.md new file mode 100644 index 0000000..d0077cb --- /dev/null +++ b/contracts/v3-relayer-registry/ProposalChanges.md @@ -0,0 +1,14 @@ +# Tornado Relayer Registry + +Governance proposal [repo](https://github.com/Rezan-vm/tornado-relayer-registry). + +Governance upgrade which includes a registry for relayer registration and staking mechanisms for the TORN token. + +## Overview + +1. Anyone can become a relayer by staking TORN into Registry contract. +2. Minimum stake is governed by the Governance. +3. Each Pool has its own fee % which is also set by the Governance. +4. On every withdrawal via relayer, the relayer has to pay the Tornado Pool fee in TORN. The fee is deducted from his staked balance. +5. All collected fees are stored into StakingReward contract. +6. Any TORN holder can stake their TORN into Governance contract like they were before, but earning fees proportionately to their stake. diff --git a/contracts/v3-relayer-registry/interfaces/ITornadoStakingRewards.sol b/contracts/v3-relayer-registry/interfaces/ITornadoStakingRewards.sol new file mode 100644 index 0000000..cdbf071 --- /dev/null +++ b/contracts/v3-relayer-registry/interfaces/ITornadoStakingRewards.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.6.12; + +interface ITornadoStakingRewards { + function updateRewardsOnLockedBalanceChange(address account, uint256 amountLockedBeforehand) external; +}