Skip to content

Commit

Permalink
chore: SaveWrapper admin now governor of keeper
Browse files Browse the repository at this point in the history
chore: SaveWrapper tasks updated to use token symbols rather than addresses
  • Loading branch information
naddison36 committed Feb 22, 2022
1 parent 4512ee8 commit fd4a992
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 198 deletions.
21 changes: 11 additions & 10 deletions contracts/savings/peripheral/SaveWrapper.sol
@@ -1,26 +1,27 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.8.6;

import { ISavingsContractV3 } from "../../interfaces/ISavingsContract.sol";
import { IMasset } from "../../interfaces/IMasset.sol";
import { IFeederPool } from "../../interfaces/IFeederPool.sol";
import { IBoostedVaultWithLockup } from "../../interfaces/IBoostedVaultWithLockup.sol";

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

import { IBoostedVaultWithLockup } from "../../interfaces/IBoostedVaultWithLockup.sol";
import { IFeederPool } from "../../interfaces/IFeederPool.sol";
import { IMasset } from "../../interfaces/IMasset.sol";
import { ISavingsContractV3 } from "../../interfaces/ISavingsContract.sol";
import { IUniswapV2Router02 } from "../../peripheral/Uniswap/IUniswapV2Router02.sol";
import { IBasicToken } from "../../shared/IBasicToken.sol";
import { ImmutableModule } from "../../shared/ImmutableModule.sol";

// FLOWS
// 0 - mAsset -> Savings Vault
// 1 - bAsset -> Save/Savings Vault via Mint
// 2 - fAsset -> Save/Savings Vault via Feeder Pool
// 3 - ETH -> Save/Savings Vault via Uniswap
contract SaveWrapper is Ownable {
contract SaveWrapper is ImmutableModule {
using SafeERC20 for IERC20;

constructor(address _nexus) ImmutableModule(_nexus) {}

/**
* @dev 0. Simply saves an mAsset and then into the vault
* @param _mAsset mAsset address
Expand Down Expand Up @@ -468,7 +469,7 @@ contract SaveWrapper is Ownable {
address[] calldata _fAssets,
address _save,
address _vault
) external onlyOwner {
) external onlyKeeperOrGovernor {
_approve(_mAsset, _save);
_approve(_save, _vault);
_approve(_bAssets, _mAsset);
Expand All @@ -482,14 +483,14 @@ contract SaveWrapper is Ownable {
/**
* @dev Approve one token/spender
*/
function approve(address _token, address _spender) external onlyOwner {
function approve(address _token, address _spender) external onlyKeeperOrGovernor {
_approve(_token, _spender);
}

/**
* @dev Approve multiple tokens/one spender
*/
function approve(address[] calldata _tokens, address _spender) external onlyOwner {
function approve(address[] calldata _tokens, address _spender) external onlyKeeperOrGovernor {
_approve(_tokens, _spender);
}

Expand Down
164 changes: 100 additions & 64 deletions tasks/SaveWrapper.ts
@@ -1,80 +1,116 @@
import "ts-node/register"
import "tsconfig-paths/register"
import { task } from "hardhat/config"
import { task, types } from "hardhat/config"

import { params, deployTx, sendTx } from "./taskUtils"
import { SaveWrapper__factory } from "../types/generated"
import { getSigner } from "./utils/signerFactory"
import { deployContract, logTxDetails } from "./utils/deploy-utils"
import { getChain, resolveAddress, resolveToken } from "./utils/networkAddressFactory"

task("SaveWrapper.deploy", "Deploy a new SaveWrapper").setAction(async (taskArgs, { ethers }) => {
const [deployer] = await ethers.getSigners()
await deployTx(deployer, SaveWrapper__factory, "SaveWrapper")
})
task("SaveWrapper.deploy", "Deploy a new SaveWrapper")
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "fast", types.string)
.setAction(async (taskArgs, hre) => {
const chain = getChain(hre)
const signer = await getSigner(hre, taskArgs.speed)

const nexusAddress = resolveAddress("Nexus", chain)

await deployContract(new SaveWrapper__factory(signer), "SaveWrapper", [nexusAddress])
})

task("SaveWrapper.approveMasset", "Sets approvals for a new mAsset")
.addParam("saveWrapper", "SaveWrapper address", undefined, params.address, false)
.addParam("masset", "mAsset address", undefined, params.address, false)
.addParam("bassets", "bAsset addresses", undefined, params.addressArray, false)
.addParam("fPools", "Feeder Pool addresses", undefined, params.addressArray, false)
.addParam("fAssets", "fAsset addresses (corresponding to fPools)", undefined, params.addressArray, false)
.addParam("save", "Save contract address (i.e. imAsset)", undefined, params.address, false)
.addParam("vault", "BoostedVault contract address", undefined, params.address, false)
.setAction(
async (
{
saveWrapper,
masset,
vault,
bassets,
fassets,
fPools,
save,
}: { saveWrapper: string; masset: string; bassets: string[]; save: string; vault: string; fassets: string[]; fPools: string[] },
hre,
) => {
const deployer = await getSigner(hre)
await sendTx(
SaveWrapper__factory.connect(saveWrapper, deployer),
"approve(address,address[],address[],address[],address,address)",
"Approve mAsset and other assets",
masset,
bassets,
fPools,
fassets,
save,
vault,
)
},
)
.addParam("masset", "Token symbol of the mAsset. eg mUSD or mBTC", undefined, types.string, false)
.addParam("bassets", "Comma separated symbols of the base assets. eg USDC,DAI,USDT,sUSD", undefined, types.string, false)
.addParam("fassets", "Comma separated symbols of the Feeder Pool assets. eg GUSD,BUSD,alUSD,FEI,HBTC", undefined, types.string, false)
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "fast", types.string)
.setAction(async (taskArgs, hre) => {
const chain = getChain(hre)
const signer = await getSigner(hre, taskArgs.speed)

task("SaveWrapper.approveMulti", "Sets approvals for multiple tokens/a single spender")
.addParam("saveWrapper", "SaveWrapper address", undefined, params.address, false)
.addParam("tokens", "Token addresses", undefined, params.address, false)
.addParam("spender", "Spender address", undefined, params.address, false)
.setAction(async ({ saveWrapper, tokens, spender }: { saveWrapper: string; tokens: string[]; spender: string }, hre) => {
const signer = await getSigner(hre)
await sendTx(
SaveWrapper__factory.connect(saveWrapper, signer),
"approve(address[],address)",
"Approve muliple tokens/single spender",
tokens,
spender,
const wrapperAddress = resolveAddress("SaveWrapper", chain)
const wrapper = SaveWrapper__factory.connect(wrapperAddress, signer)

const mAssetToken = resolveToken(taskArgs.masset, chain)

const bAssetSymbols = taskArgs.bassets.split(",")
const bAssetAddresses = bAssetSymbols.map((symbol) => resolveAddress(symbol, chain))

const fAssetSymbols = taskArgs.fassets.split(",")
const fAssetAddresses = fAssetSymbols.map((symbol) => resolveAddress(symbol, chain))
const feederPoolAddresses = fAssetSymbols.map((symbol) => resolveAddress(symbol, chain, "feederPool"))

const tx = await wrapper["address,address[],address[],address[],address,address"](
mAssetToken.address,
bAssetAddresses,
feederPoolAddresses,
fAssetAddresses,
mAssetToken.savings,
mAssetToken.vault,
)
await logTxDetails(tx, "Approve mAsset")
})

task("SaveWrapper.approveMulti", "Sets approvals for multiple tokens/a single spender")
.addParam(
"tokens",
"Comma separated symbols of the tokens that is being approved. eg USDC,DAI,USDT,sUSD",
undefined,
types.string,
false,
)
.addParam(
"spender",
"Token symbol of the mAsset or address type. eg mUSD, mBTC, feederPool, savings or vault",
undefined,
types.string,
false,
)
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "fast", types.string)
.setAction(async (taskArgs, hre) => {
const chain = getChain(hre)
const signer = await getSigner(hre, taskArgs.speed)

const wrapperAddress = resolveAddress("SaveWrapper", chain)
const wrapper = SaveWrapper__factory.connect(wrapperAddress, signer)

const tokenSymbols = taskArgs.tokens.split(",")
const tokenAddresses = tokenSymbols.map((symbol) => resolveAddress(symbol, chain))

const spenderAddress = ["feederPool", "savings", "vault"].includes(taskArgs.spender)
? resolveAddress(taskArgs.token, chain, taskArgs.spender) // token is mUSD or mBTC
: resolveAddress(taskArgs.spender, chain) // spender is mUSD or mBTC

const tx = await wrapper["approve(address[],address)"](tokenAddresses, spenderAddress)
await logTxDetails(tx, "Approve multiple tokens/single spender")
})

task("SaveWrapper.approve", "Sets approvals for a single token/spender")
.addParam("saveWrapper", "SaveWrapper address", undefined, params.address, false)
.addParam("token", "Token address", undefined, params.address, false)
.addParam("spender", "Spender address", undefined, params.address, false)
.setAction(async ({ saveWrapper, token, spender }: { saveWrapper: string; token: string; spender: string }, hre) => {
const signer = await getSigner(hre)
await sendTx(
SaveWrapper__factory.connect(saveWrapper, signer),
"approve(address,address)",
"Approve single token/spender",
token,
spender,
)
.addParam("token", "Symbol of the token that is being approved. eg USDC, WBTC, FEI, HBTC, mUSD, imUSD", undefined, types.string, false)
.addParam(
"spender",
"Token symbol of the mAsset or address type. eg mUSD, mBTC, feederPool, savings or vault",
undefined,
types.string,
false,
)
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "fast", types.string)
.setAction(async (taskArgs, hre) => {
if (!taskArgs.spender) {
throw Error(`spender must be a mAsset symbol, eg mUSD or mBTC, or an address type of a mAsset, eg feederPool, savings or vault`)
}
const chain = getChain(hre)
const signer = await getSigner(hre, taskArgs.speed)

const wrapperAddress = resolveAddress("SaveWrapper", chain)
const wrapper = SaveWrapper__factory.connect(wrapperAddress, signer)

const tokenAddress = resolveAddress(taskArgs.token, chain)
const spenderAddress = ["feederPool", "savings", "vault"].includes(taskArgs.spender)
? resolveAddress(taskArgs.token, chain, taskArgs.spender) // token is mUSD or mBTC
: resolveAddress(taskArgs.spender, chain) // spender is mUSD or mBTC

const tx = await wrapper["approve(address,address)"](tokenAddress, spenderAddress)
await logTxDetails(tx, "Approve single token/spender")
})

export {}
4 changes: 2 additions & 2 deletions tasks/deployMbtc.ts
Expand Up @@ -223,7 +223,7 @@ const deploySave = async (
console.log(`Deployed Vault Proxy to ${vProxy.address}. gas used ${receiptVaultProxy.gasUsed}`)

// SaveWrapper
const wrapper = await new SaveWrapper__factory(sender).deploy()
const wrapper = await new SaveWrapper__factory(sender).deploy(addresses.nexus)
const receiptSavingWrapper = await wrapper.deployTransaction.wait()
console.log(`Deployed Save Wrapper to address ${wrapper.address}. gas used ${receiptSavingWrapper.gasUsed}`)

Expand All @@ -241,7 +241,7 @@ const deploySave = async (
}
// SaveWrapper
console.log(`Deploying Wrapper...`)
const wrapper = await new SaveWrapper__factory(sender).deploy()
const wrapper = await new SaveWrapper__factory(sender).deploy(addresses.nexus)
const receiptSavingWrapper = await wrapper.deployTransaction.wait()
console.log(`Deployed Save Wrapper to address ${wrapper.address}. gas used ${receiptSavingWrapper.gasUsed}`)

Expand Down
2 changes: 1 addition & 1 deletion tasks/feeder.ts
Expand Up @@ -36,7 +36,7 @@ import { getSwapRates } from "./utils/rates-utils"
import { getSigner } from "./utils/signerFactory"
import { logTxDetails } from "./utils"
import { getChain, getChainAddress, resolveAddress, resolveToken } from "./utils/networkAddressFactory"
import { params } from "./taskUtils"
import { params } from "./utils/params"

const getBalances = async (
feederPool: Masset | FeederPool,
Expand Down
121 changes: 0 additions & 121 deletions tasks/taskUtils.ts

This file was deleted.

0 comments on commit fd4a992

Please sign in to comment.