Skip to content

Commit

Permalink
chore: network address factory now handles forked tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
naddison36 committed Jul 5, 2021
1 parent 461391c commit 31232eb
Show file tree
Hide file tree
Showing 8 changed files with 101 additions and 89 deletions.
90 changes: 41 additions & 49 deletions tasks/deployPolygon.ts
Expand Up @@ -449,57 +449,49 @@ task("liquidator-snap", "Dumps the config details of the liquidator on Polygon")
console.log(liquidationConfig)
})

task("deploy-imusd-staking", "Deploy Polygon imUSD staking contract v-imUSD").setAction(async (_, { ethers, network }) => {
const signer = await getSigner(ethers)
task("deploy-imusd-staking", "Deploy Polygon imUSD staking contract v-imUSD").setAction(
async (_, { ethers, hardhatArguments, network }) => {
const signer = await getSigner(ethers)

const networkName = network.name === "hardhat" ? "polygon_mainnet" : network.name
const fundManagerAddress = getNetworkAddress("FundManager", networkName)
const governorAddress = getNetworkAddress("Governor", networkName)
const nexusAddress = getNetworkAddress("Nexus", networkName)
const fundManagerAddress = getNetworkAddress("FundManager", network.name, hardhatArguments.config)
const governorAddress = getNetworkAddress("Governor", network.name, hardhatArguments.config)
const nexusAddress = getNetworkAddress("Nexus", network.name, hardhatArguments.config)

const rewardsDistributor = await deployContract(new RewardsDistributor__factory(signer), "RewardsDistributor", [
nexusAddress,
[fundManagerAddress, governorAddress],
])

/* StakingRewardsWithPlatformToken Constructor params
address _nexus,
address _stakingToken,
address _rewardsToken,
address _platformToken,
address _rewardsDistributor,
string memory _nameArg,
string memory _symbolArg
*/
const stakingRewardsImpl = await deployContract(
new StakingRewardsWithPlatformToken__factory(signer),
"StakingRewardsWithPlatformToken",
[
const rewardsDistributor = await deployContract(new RewardsDistributor__factory(signer), "RewardsDistributor", [
nexusAddress,
PmUSD.savings, // imUSD
PMTA.address, // MTA bridged to Polygon
PWMATIC.address, // Wrapped Matic on Polygon
],
)
const initializeData = stakingRewardsImpl.interface.encodeFunctionData("initialize", [
rewardsDistributor.address,
"imUSD Vault",
"v-imUSD",
])
const proxy = await deployContract(new AssetProxy__factory(signer), "Staking Rewards Proxy", [
stakingRewardsImpl.address,
governorAddress,
initializeData,
])
const stakingRewards = StakingRewardsWithPlatformToken__factory.connect(proxy.address, signer)

console.log(`Name ${await stakingRewards.name()}`)
console.log(`Symbol ${await stakingRewards.symbol()}`)
console.log(`Nexus ${await stakingRewards.nexus()}`)
console.log(`Staking token ${await stakingRewards.stakingToken()}`)
console.log(`Rewards token ${await stakingRewards.rewardsToken()}`)
console.log(`Platform token ${await stakingRewards.platformToken()}`)
console.log(`Rewards distributor ${await stakingRewards.rewardsDistributor()}`)
})
[fundManagerAddress, governorAddress],
])

const stakingRewardsImpl = await deployContract(
new StakingRewardsWithPlatformToken__factory(signer),
"StakingRewardsWithPlatformToken",
[
nexusAddress,
PmUSD.savings, // imUSD
PMTA.address, // MTA bridged to Polygon
PWMATIC.address, // Wrapped Matic on Polygon
],
)
const initializeData = stakingRewardsImpl.interface.encodeFunctionData("initialize", [
rewardsDistributor.address,
"imUSD Vault",
"v-imUSD",
])
const proxy = await deployContract(new AssetProxy__factory(signer), "Staking Rewards Proxy", [
stakingRewardsImpl.address,
governorAddress,
initializeData,
])
const stakingRewards = StakingRewardsWithPlatformToken__factory.connect(proxy.address, signer)

console.log(`Name ${await stakingRewards.name()}`)
console.log(`Symbol ${await stakingRewards.symbol()}`)
console.log(`Nexus ${await stakingRewards.nexus()}`)
console.log(`Staking token ${await stakingRewards.stakingToken()}`)
console.log(`Rewards token ${await stakingRewards.rewardsToken()}`)
console.log(`Platform token ${await stakingRewards.platformToken()}`)
console.log(`Rewards distributor ${await stakingRewards.rewardsDistributor()}`)
},
)

module.exports = {}
6 changes: 3 additions & 3 deletions tasks/feeder.ts
Expand Up @@ -3,7 +3,7 @@ import "tsconfig-paths/register"
import { task, types } from "hardhat/config"
import { Signer } from "ethers"

import { ERC20__factory, FeederPool, FeederPool__factory, IERC20__factory, Masset } from "types/generated"
import { ERC20__factory, FeederPool, FeederPool__factory, IERC20__factory, Masset, SavingsManager__factory } from "types/generated"
import { BN, simpleToExactAmount } from "@utils/math"
import { dumpConfigStorage, dumpFassetStorage, dumpTokenStorage } from "./utils/storage-utils"
import {
Expand All @@ -18,7 +18,6 @@ import {
getSwaps,
getRedemptions,
outputFees,
getSavingsManager,
getCollectedInterest,
} from "./utils/snap-utils"
import { PFRAX, PmUSD, Token, tokens } from "./utils/tokens"
Expand Down Expand Up @@ -114,7 +113,8 @@ task("feeder-snap", "Gets feeder transactions over a period of time")
const fpAssets = [mAsset, fAsset]

const feederPool = getFeederPool(signer, fAsset.feederPool)
const savingsManager = getSavingsManager(signer, network.name)
const savingsManagerAddress = getNetworkAddress("SavingsManager", network.name)
const savingsManager = SavingsManager__factory.connect(savingsManagerAddress, signer)

const { quantityFormatter } = getQuantities(fAsset, taskArgs.swapSize)

Expand Down
6 changes: 4 additions & 2 deletions tasks/mBTC.ts
Expand Up @@ -19,11 +19,12 @@ import {
outputFees,
getBalances,
getCollectedInterest,
getSavingsManager,
} from "./utils/snap-utils"
import { Token, renBTC, sBTC, WBTC, mBTC, TBTC, HBTC } from "./utils/tokens"
import { getSwapRates } from "./utils/rates-utils"
import { getSigner } from "./utils/defender-utils"
import { SavingsManager__factory } from "types/generated"
import { getNetworkAddress } from "./utils/networkAddressFactory"

const bAssets: Token[] = [renBTC, sBTC, WBTC]

Expand Down Expand Up @@ -71,7 +72,8 @@ task("mBTC-snap", "Get the latest data from the mBTC contracts")
}

const mAsset = getMasset(signer)
const savingsManager = getSavingsManager(signer, network.name)
const savingsManagerAddress = getNetworkAddress("SavingsManager", network.name)
const savingsManager = SavingsManager__factory.connect(savingsManagerAddress, signer)

const { fromBlock, toBlock } = await getBlockRange(ethers, taskArgs.from, taskArgs.to)

Expand Down
9 changes: 5 additions & 4 deletions tasks/mUSD.ts
Expand Up @@ -5,7 +5,7 @@ import "tsconfig-paths/register"
import { task, types } from "hardhat/config"
import { Contract, Signer } from "ethers"

import { Masset, Masset__factory } from "types/generated"
import { Masset, Masset__factory, SavingsManager__factory } from "types/generated"
import { BN } from "@utils/math"
import { MusdEth } from "types/generated/MusdEth"
import mUsdEthAbi from "../contracts/masset/versions/mUsdEth.json"
Expand All @@ -24,14 +24,14 @@ import {
getBalances,
snapSave,
getCollectedInterest,
getSavingsManager,
getCompTokens,
getAaveTokens,
} from "./utils/snap-utils"
import { Token, sUSD, USDC, DAI, USDT, PUSDT, PUSDC, PDAI, mUSD, PmUSD, MmUSD, RmUSD } from "./utils/tokens"
import { usdFormatter } from "./utils/quantity-formatters"
import { getSwapRates } from "./utils/rates-utils"
import { getSigner } from "./utils"
import { getNetworkAddress } from "./utils/networkAddressFactory"

const mUsdBassets: Token[] = [sUSD, USDC, DAI, USDT]
const mUsdPolygonBassets: Token[] = [PUSDC, PDAI, PUSDT]
Expand Down Expand Up @@ -86,7 +86,8 @@ task("mUSD-snap", "Snaps mUSD")
}

const mAsset = getMasset(signer, network.name)
const savingsManager = getSavingsManager(signer, network.name)
const savingsManagerAddress = getNetworkAddress("SavingsManager", network.name)
const savingsManager = SavingsManager__factory.connect(savingsManagerAddress, signer)

const { fromBlock, toBlock } = await getBlockRange(ethers, taskArgs.from, taskArgs.to)

Expand Down Expand Up @@ -190,7 +191,7 @@ task("mUSD-rates", "mUSD rate comparison to Curve")

task("rewards", "Get Compound and Aave platform reward tokens")
.addOptionalParam("block", "Block number to compare rates at. (default: current block)", 0, types.int)
.setAction(async (taskArgs, { ethers, network }) => {
.setAction(async (taskArgs, { ethers }) => {
const signer = await getSigner(ethers)

const block = await getBlock(ethers, taskArgs.block)
Expand Down
39 changes: 18 additions & 21 deletions tasks/ops.ts
@@ -1,9 +1,6 @@
import axios from "axios"
import { Signer } from "ethers"
import { task, types } from "hardhat/config"
import {
ISavingsManager,
ISavingsManager__factory,
IEjector__factory,
PAaveIntegration__factory,
PLiquidator__factory,
Expand All @@ -19,15 +16,13 @@ import { logTxDetails } from "./utils/deploy-utils"
import { getNetworkAddress } from "./utils/networkAddressFactory"
import { usdFormatter } from "./utils"

const getSavingsManager = (signer: Signer, contractAddress = "0x9781c4e9b9cc6ac18405891df20ad3566fb6b301"): ISavingsManager =>
ISavingsManager__factory.connect(contractAddress, signer)

task("eject-stakers", "Ejects expired stakers from Meta staking contract (vMTA)")
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", types.string)
.setAction(async (taskArgs, { ethers }) => {
.setAction(async (taskArgs, { ethers, hardhatArguments, network }) => {
const signer = await getSigner(ethers, taskArgs.speed)

const ejector = IEjector__factory.connect("0x71061E3F432FC5BeE3A6763Cd35F50D3C77A0434", signer)
const ejectorAddress = getNetworkAddress("Ejector", network.name, hardhatArguments.config)
const ejector = IEjector__factory.connect(ejectorAddress, signer)
// TODO check the last time the eject was run
// Check it's been more than 7 days since the last eject has been run

Expand All @@ -53,17 +48,18 @@ task("collect-interest", "Collects and streams interest from platforms")
false,
)
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", types.string)
.setAction(async (taskArgs, { ethers }) => {
.setAction(async (taskArgs, { ethers, hardhatArguments, network }) => {
const asset = tokens.find((t) => t.symbol === taskArgs.asset)
if (!asset) {
console.error(`Failed to find main or feeder pool asset with token symbol ${taskArgs.asset}`)
process.exit(1)
}

const signer = await getSigner(ethers, taskArgs.speed)
const savingManager = getSavingsManager(signer)
const savingsManagerAddress = getNetworkAddress("SavingsManager", network.name, hardhatArguments.config)
const savingsManager = SavingsManager__factory.connect(savingsManagerAddress, signer)

const lastBatchCollected = await savingManager.lastBatchCollected(asset.address)
const lastBatchCollected = await savingsManager.lastBatchCollected(asset.address)
const lastBatchDate = new Date(lastBatchCollected.mul(1000).toNumber())
console.log(`The last interest collection was ${lastBatchDate.toUTCString()}, epoch ${lastBatchCollected} seconds`)

Expand All @@ -73,25 +69,27 @@ task("collect-interest", "Collects and streams interest from platforms")
process.exit(3)
}

const tx = await savingManager.collectAndStreamInterest(asset.address)
const tx = await savingsManager.collectAndStreamInterest(asset.address)
await logTxDetails(tx, "collectAndStreamInterest")
})

task("polly-daily", "Runs the daily jobs against the contracts on Polygon mainnet")
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "fast", types.string)
.setAction(async (taskArgs, { ethers }) => {
.setAction(async (taskArgs, { ethers, hardhatArguments, network }) => {
const signer = await getSigner(ethers, taskArgs.speed)

const aave = new PAaveIntegration__factory(signer).attach("0xeab7831c96876433dB9B8953B4e7e8f66c3125c3")
const aave = PAaveIntegration__factory.connect(PmUSD.integrator, signer)
const aaveTx = await aave.claimRewards({ gasLimit: 200000 })
await logTxDetails(aaveTx, "claimRewards")

const liquidator = new PLiquidator__factory(signer).attach("0x9F1C06CC13EDc7691a2Cf02E31FaAA64d57867e2")
const liquidatorTx = await liquidator.triggerLiquidation("0xeab7831c96876433dB9B8953B4e7e8f66c3125c3", { gasLimit: 2000000 })
const liquidatorAddress = getNetworkAddress("Liquidator", network.name, hardhatArguments.config)
const liquidator = PLiquidator__factory.connect(liquidatorAddress, signer)
const liquidatorTx = await liquidator.triggerLiquidation(PmUSD.integrator, { gasLimit: 2000000 })
await logTxDetails(liquidatorTx, "triggerLiquidation")

const savingsManager = new SavingsManager__factory(signer).attach("0x10bFcCae079f31c451033798a4Fd9D2c33Ea5487")
const savingsManagerTx = await savingsManager.collectAndStreamInterest("0xE840B73E5287865EEc17d250bFb1536704B43B21", {
const savingsManagerAddress = getNetworkAddress("SavingsManager", network.name, hardhatArguments.config)
const savingsManager = SavingsManager__factory.connect(savingsManagerAddress, signer)
const savingsManagerTx = await savingsManager.collectAndStreamInterest(PmUSD.address, {
gasLimit: 2000000,
})
await logTxDetails(savingsManagerTx, "collectAndStreamInterest")
Expand All @@ -117,13 +115,12 @@ task("polly-dis-rewards", "Distributes MTA and WMATIC rewards to vaults on Polyg
.addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "fast", types.string)
.addOptionalParam("mtaAmount", "MTA tokens", 20833, types.int)
.addOptionalParam("wmaticAmount", "WMATIC tokens", 18666, types.int)
.setAction(async (taskArgs, { ethers, network }) => {
.setAction(async (taskArgs, { ethers, hardhatArguments, network }) => {
const signer = await getSigner(ethers, taskArgs.speed)
const mtaAmount = simpleToExactAmount(taskArgs.mtaAmount)
const wmaticAmount = simpleToExactAmount(taskArgs.wmaticAmount)

const networkName = network.name === "hardhat" ? "polygon_mainnet" : network.name
const rewardsDistributorAddress = getNetworkAddress("RewardsDistributor", networkName)
const rewardsDistributorAddress = getNetworkAddress("RewardsDistributor", network.name, hardhatArguments.config)
const rewardsDistributor = RewardsDistributor__factory.connect(rewardsDistributorAddress, signer)

const mtaToken = ERC20__factory.connect(PMTA.address, signer)
Expand Down
32 changes: 29 additions & 3 deletions tasks/utils/networkAddressFactory.ts
@@ -1,5 +1,31 @@
export const getNetworkAddress = (contractName: string, networkName = "mainnet"): string => {
if (networkName === "mainnet") {
export const contractNames = [
"Nexus",
"DelayedProxyAdmin",
"ProtocolDAO",
"Governor",
"FundManager",
"mStableDAO",
"SavingsManager",
"Liquidator",
"RewardsDistributor",
"BoostDirector",
"Collector",
"Ejector",
"Poker",
"SaveWrapper",
"RevenueRecipient",
"FeederManager",
"FeederLogic",
"FeederWrapper",
"FeederInterestValidator",
"AaveIncentivesController",
"AaveLendingPoolAddressProvider",
"QuickSwapRouter",
] as const
export type ContractNames = typeof contractNames[number]

export const getNetworkAddress = (contractName: ContractNames, networkName = "mainnet", hardhatConfig?: string): string => {
if (networkName === "mainnet" || hardhatConfig === "tasks-fork.config.ts") {
switch (contractName) {
case "Nexus":
return "0xAFcE80b19A8cE13DEc0739a1aaB7A028d6845Eb3"
Expand Down Expand Up @@ -40,7 +66,7 @@ export const getNetworkAddress = (contractName: string, networkName = "mainnet")
return "0xf1049aeD858C4eAd6df1de4dbE63EF607CfF3262"
default:
}
} else if (networkName === "polygon_mainnet") {
} else if (networkName === "polygon_mainnet" || hardhatConfig === "tasks-fork-polygon.config.ts") {
switch (contractName) {
case "Nexus":
return "0x3C6fbB8cbfCB75ecEC5128e9f73307f2cB33f2f6"
Expand Down
7 changes: 0 additions & 7 deletions tasks/utils/snap-utils.ts
Expand Up @@ -97,13 +97,6 @@ export const getBlockRange = async (ethers, fromBlockNumber: number, _toBlockNum
}
}

export const getSavingsManager = (signer: Signer, networkName: string): SavingsManager => {
if (networkName === "polygon_mainnet") {
return SavingsManager__factory.connect("0x10bFcCae079f31c451033798a4Fd9D2c33Ea5487", signer)
}
return SavingsManager__factory.connect("0x9781C4E9B9cc6Ac18405891DF20Ad3566FB6B301", signer)
}

export const snapConfig = async (asset: Masset | MusdEth | FeederPool, toBlock: number): Promise<void> => {
let ampData
if (isMusdEth(asset)) {
Expand Down
1 change: 1 addition & 0 deletions tasks/utils/tokens.ts
Expand Up @@ -48,6 +48,7 @@ export const mBTC: Token = {
export const PmUSD: Token = {
symbol: "PmUSD",
address: "0xE840B73E5287865EEc17d250bFb1536704B43B21",
integrator: "0xeab7831c96876433dB9B8953B4e7e8f66c3125c3",
chain: Chain.polygon,
decimals: 18,
quantityFormatter: "USD",
Expand Down

0 comments on commit 31232eb

Please sign in to comment.