Skip to content

Commit

Permalink
feat: Add RevenueForwarder (mstable#260)
Browse files Browse the repository at this point in the history
  • Loading branch information
superduck35 authored Oct 27, 2021
1 parent 71c8e33 commit 37837ad
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 0 deletions.
82 changes: 82 additions & 0 deletions contracts/buy-and-make/RevenueForwarder.sol
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 {}
}
1 change: 1 addition & 0 deletions tasks.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import "./tasks/deployMbtc"
import "./tasks/deployFeeders"
import "./tasks/deployMV3"
import "./tasks/deployPolygon"
import "./tasks/deployRevenueForwarder"
import "./tasks/deployBriber"
import "./tasks/deploySavingsManager"
import "./tasks/feeder"
Expand Down
34 changes: 34 additions & 0 deletions tasks/deployRevenueForwarder.ts
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 = {}

0 comments on commit 37837ad

Please sign in to comment.