forked from mstable/mStable-contracts
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Add RevenueForwarder (mstable#260)
- Loading branch information
1 parent
71c8e33
commit 37837ad
Showing
3 changed files
with
117 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
// SPDX-License-Identifier: AGPL-3.0-or-later | ||
pragma solidity 0.8.6; | ||
|
||
import { IRevenueRecipient } from "../interfaces/IRevenueRecipient.sol"; | ||
import { ImmutableModule } from "../shared/ImmutableModule.sol"; | ||
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; | ||
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; | ||
|
||
/** | ||
* @title RevenueForwarder | ||
* @author mStable | ||
* @notice Sends to trusted forwarded | ||
* @dev VERSION: 1.0 | ||
* DATE: 2021-10-26 | ||
*/ | ||
contract RevenueForwarder is IRevenueRecipient, ImmutableModule { | ||
using SafeERC20 for IERC20; | ||
|
||
event RevenueReceived(address indexed mAsset, uint256 amountIn); | ||
event Withdrawn(uint256 amountOut); | ||
|
||
IERC20 public immutable musd; | ||
|
||
address public immutable keeper; | ||
address public forwarder; | ||
|
||
constructor( | ||
address _nexus, | ||
address _musd, | ||
address _keeper, | ||
address _forwarder | ||
) ImmutableModule(_nexus) { | ||
musd = IERC20(_musd); | ||
keeper = _keeper; | ||
forwarder = _forwarder; | ||
} | ||
|
||
modifier keeperOrGovernor() { | ||
require(msg.sender == keeper || msg.sender == _governor(), "Only keeper or governor"); | ||
_; | ||
} | ||
|
||
/** | ||
* @dev Simply transfers the mAsset from the sender to here | ||
* @param _mAsset Address of mAsset | ||
* @param _amount Units of mAsset collected | ||
*/ | ||
function notifyRedistributionAmount(address _mAsset, uint256 _amount) external override { | ||
require(_mAsset == address(musd), "This Recipient is only for mUSD"); | ||
// Transfer from sender to here | ||
IERC20(_mAsset).safeTransferFrom(msg.sender, address(this), _amount); | ||
|
||
emit RevenueReceived(_mAsset, _amount); | ||
} | ||
|
||
/** | ||
* @dev Withdraws to forwarder | ||
*/ | ||
function forward() external keeperOrGovernor { | ||
uint256 amt = musd.balanceOf(address(this)); | ||
musd.safeTransfer(forwarder, amt); | ||
|
||
emit Withdrawn(amt); | ||
} | ||
|
||
/** | ||
* @dev Sets details | ||
* @param _forwarder new forwarder | ||
*/ | ||
function setConfig(address _forwarder) external onlyGovernor { | ||
require(_forwarder != address(0), "Invalid forwarder"); | ||
forwarder = _forwarder; | ||
} | ||
|
||
/** | ||
* @dev Abstract override | ||
*/ | ||
function depositToPool( | ||
address[] calldata, /* _mAssets */ | ||
uint256[] calldata /* _percentages */ | ||
) external override {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
import "ts-node/register" | ||
import "tsconfig-paths/register" | ||
import { task, types } from "hardhat/config" | ||
import { RevenueForwarder__factory } from "types/generated" | ||
import { deployContract } from "./utils/deploy-utils" | ||
import { getSigner } from "./utils/signerFactory" | ||
import { verifyEtherscan } from "./utils/etherscan" | ||
import { getChain, resolveAddress } from "./utils/networkAddressFactory" | ||
|
||
task("deploy-RevenueForwarder") | ||
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "fast", types.string) | ||
.setAction(async (taskArgs, hre) => { | ||
const signer = await getSigner(hre, taskArgs.speed) | ||
const chain = getChain(hre) | ||
|
||
const nexus = resolveAddress("Nexus", chain) | ||
const musd = resolveAddress("mUSD", chain, "address") | ||
const keeper = "0xdccb7a6567603af223c090be4b9c83eced210f18" | ||
const forwarder = "0xd0f0F590585384AF7AB420bE1CFB3A3F8a82D775" | ||
|
||
const revenueForwarder = await deployContract(new RevenueForwarder__factory(signer), "RevenueForwarder", [ | ||
nexus, | ||
musd, | ||
keeper, | ||
forwarder, | ||
]) | ||
|
||
await verifyEtherscan(hre, { | ||
address: revenueForwarder.address, | ||
contract: "contracts/buy-and-make/RevenueForwarder.sol:RevenueForwarder", | ||
}) | ||
}) | ||
|
||
module.exports = {} |