Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions contracts/StrategyMigration.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// SPDX-License-Identifier: MIT

pragma solidity >0.7.0;

import "@openzeppelin/contracts/math/Math.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";

interface AaveStrat {
function safeWithdraw(uint256 _amount) external;
function pika(IERC20 _asset, uint256 _amount) external;
function update(address _newStratrgy) external;
function setGovernance(address _governance) external;
}

interface NewStrat {
function D(uint256 _ne18) external;
function setGovernance(address _governance) external;
}

contract MigrateStrat {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;

AaveStrat currentStrategy = AaveStrat(0x5D6DF808Be06d77c726001b1B3163C3294cb8D08);
address nextStrategy = 0xb8d6471cA573C92c7096Ab8600347F6a9Fe268a5;
IERC20 aUSDT = IERC20(0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811);
IERC20 USDT = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7);
address dao = 0x4B827D771456Abd5aFc1D05837F915577729A751;
uint tenMil = 10e12;

function migrate() public {
uint aUSDTonOldStrat = aUSDT.balanceOf(address(currentStrategy));
while (aUSDTonOldStrat > tenMil){
currentStrategy.safeWithdraw(tenMil);
currentStrategy.pika(USDT, tenMil);
uint usdtOwned = USDT.balanceOf(address(this));
USDT.safeTransfer(nextStrategy, usdtOwned);
NewStrat(nextStrategy).D(1e18-1);
aUSDTonOldStrat = aUSDT.balanceOf(address(currentStrategy));
}
currentStrategy.update(nextStrategy);
currentStrategy.setGovernance(dao);
NewStrat(nextStrategy).setGovernance(dao);
}

function returnGovernanceOldStrat() public {
currentStrategy.setGovernance(dao);
}

function returnGovernanceNewStrat() public {
NewStrat(nextStrategy).setGovernance(dao);
}
}
48 changes: 48 additions & 0 deletions test/migrate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
const { expect } = require("chai");

const daoAddress = "0x4B827D771456Abd5aFc1D05837F915577729A751"

async function getUSDTAssets(addr) {
const [owner] = await ethers.getSigners();
const usdt = new ethers.Contract('0xdAC17F958D2ee523a2206206994597C13D831ec7', [
"function balanceOf(address who) public view returns (uint)",
], owner)
const aUSDT = new ethers.Contract('0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811', [
"function balanceOf(address who) public view returns (uint)",
], owner)
const usdtBalance = await usdt.balanceOf(addr)
const aUSDTBalance = await aUSDT.balanceOf(addr)
return usdtBalance.add(aUSDTBalance)
}

it("migration works fine", async () => {
const Mig = await ethers.getContractFactory("MigrateStrat");
const mig = await Mig.deploy();
const [owner, addr1] = await ethers.getSigners();
await hre.network.provider.request({
method: "hardhat_impersonateAccount",
params: [daoAddress]
})
const dao = await ethers.provider.getSigner(daoAddress);
await owner.sendTransaction({
to: daoAddress,
value: ethers.utils.parseEther("1.0")
});

const currentStrat = new ethers.Contract('0x5D6DF808Be06d77c726001b1B3163C3294cb8D08', [
"function setGovernance(address _governance)",
], dao);
const newStrat = new ethers.Contract('0xb8d6471cA573C92c7096Ab8600347F6a9Fe268a5', [
"function setGovernance(address _governance)",
], dao);
await newStrat.setGovernance(mig.address);
await currentStrat.setGovernance(mig.address);

const allUSDT = await getUSDTAssets(currentStrat.address)
expect(await getUSDTAssets(newStrat.address)).to.equal(0)

await mig.migrate();

expect(await getUSDTAssets(newStrat.address)).to.be.closeTo(allUSDT, 10e6) // 10 dollars difference
expect(await getUSDTAssets(currentStrat.address)).to.equal(0)
})