Skip to content
Merged
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
2 changes: 1 addition & 1 deletion contracts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"node": "yarn run node:fork",
"node:fork": "./node.sh fork",
"lint": "yarn run lint:js && yarn run lint:sol",
"lint:js": "eslint \"test/**/*.js\"",
"lint:js": "eslint \"test/**/*.js\" \"tasks/**/*.js\"",
"lint:sol": "solhint \"contracts/**/*.sol\"",
"prettier": "yarn run prettier:js && yarn run prettier:sol",
"prettier:check": "prettier -c \"*.js\" \"deploy/**/*.js\" \"scripts/**/*.js\" \"smoke/**/*.js\" \"scripts/**/*.js\" \"tasks/**/*.js\" \"test/**/*.js\" \"utils/**/*.js\"",
Expand Down
225 changes: 0 additions & 225 deletions contracts/tasks/account.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
const _ = require("lodash");

// USDT has its own ABI because of non standard returns
const usdtAbi = require("../test/abi/usdt.json").abi;
const daiAbi = require("../test/abi/erc20.json");
Expand All @@ -15,12 +13,6 @@ const defaultAccountIndex = 4;
// By default, fund each test account with 10k worth of each stable coin.
const defaultFundAmount = 10000;

// By default, mint 1k worth of OUSD for each test account.
const defaultMintAmount = 1000;

// By default, redeem 1k worth of OUSD for each test account.
const defaultRedeemAmount = 1000;

/**
* Prints test accounts.
*/
Expand Down Expand Up @@ -55,7 +47,6 @@ async function fund(taskArguments, hre) {
usdtUnits,
daiUnits,
usdcUnits,
tusdUnits,
isFork,
isLocalhost,
} = require("../test/helpers");
Expand Down Expand Up @@ -173,219 +164,6 @@ async function fund(taskArguments, hre) {
}
}

/**
* Mints OUSD using USDT on local or fork.
*/
async function mint(taskArguments, hre) {
const addresses = require("../utils/addresses");
const { usdtUnits, isFork, isLocalhost } = require("../test/helpers");

if (!isFork) {
throw new Error("Task can only be used on fork");
}

const ousd = await ethers.getContractAt("OUSD", addresses.mainnet.OUSDProxy);
const vault = await ethers.getContractAt(
"IVault",
addresses.mainnet.VaultProxy
);

const usdt = await hre.ethers.getContractAt(usdtAbi, addresses.mainnet.USDT);

const numAccounts = Number(taskArguments.num) || defaultNumAccounts;
const accountIndex = Number(taskArguments.index) || defaultAccountIndex;
const mintAmount = taskArguments.amount || defaultMintAmount;

const signers = await hre.ethers.getSigners();
for (let i = accountIndex; i < accountIndex + numAccounts; i++) {
const signer = signers[i];
const address = signer.address;
console.log(
`Minting ${mintAmount} OUSD for account ${i} at address ${address}`
);

// Ensure the account has sufficient USDT balance to cover the mint.
const usdtBalance = await usdt.balanceOf(address);
if (usdtBalance.lt(usdtUnits(mintAmount))) {
throw new Error(
`Account USDT balance insufficient to mint the requested amount`
);
}

// for some reason we need to call impersonateAccount even on default list of signers
await hre.network.provider.request({
method: "hardhat_impersonateAccount",
params: [signer.address],
});

// Reset approval before requesting a fresh one, or non first approve calls will fail
await usdt
.connect(signer)
.approve(vault.address, "0x0", { gasLimit: 1000000 });
await usdt
.connect(signer)
.approve(vault.address, usdtUnits(mintAmount), { gasLimit: 1000000 });

// Mint.
await vault
.connect(signer)
.mint(usdt.address, usdtUnits(mintAmount), 0, { gasLimit: 2000000 });

// Show new account's balance.
const ousdBalance = await ousd.balanceOf(address);
console.log(
"New OUSD balance=",
hre.ethers.utils.formatUnits(ousdBalance, 18)
);
}
}

/**
* Redeems OUSD on fork for specific account
*/
async function redeemFor(taskArguments, hre) {
const addresses = require("../utils/addresses");
const {
ousdUnits,
ousdUnitsFormat,
daiUnitsFormat,
usdcUnitsFormat,
usdtUnitsFormat,
isFork,
isLocalhost,
} = require("../test/helpers");

if (!isFork) {
throw new Error("Task can only be used on fork");
}

const ousd = await ethers.getContractAt("OUSD", addresses.mainnet.OUSDProxy);
const vault = await ethers.getContractAt(
"IVault",
addresses.mainnet.VaultProxy
);
const dai = await hre.ethers.getContractAt(usdtAbi, addresses.mainnet.DAI);
const usdc = await hre.ethers.getContractAt(usdtAbi, addresses.mainnet.USDC);
const usdt = await hre.ethers.getContractAt(usdtAbi, addresses.mainnet.USDT);

const address = taskArguments.account;

const signer = await hre.ethers.getSigner(address);
await hre.network.provider.request({
method: "hardhat_impersonateAccount",
params: [address],
});

const redeemAmount = taskArguments.amount;

console.log(`Redeeming ${redeemAmount} OUSD for address ${address}`);

// Show the current balances.
let ousdBalance = await ousd.balanceOf(address);
let daiBalance = await dai.balanceOf(address);
let usdcBalance = await usdc.balanceOf(address);
let usdtBalance = await usdt.balanceOf(address);
console.log("OUSD balance=", ousdUnitsFormat(ousdBalance, 18));
console.log("DAI balance=", daiUnitsFormat(daiBalance, 18));
console.log("USDC balance=", usdcUnitsFormat(usdcBalance, 6));
console.log("USDT balance=", usdtUnitsFormat(usdtBalance, 6));

const redeemAmountInt = parseInt(redeemAmount);
// Redeem.
await vault
.connect(signer)
.redeem(
ousdUnits(redeemAmount),
ousdUnits((redeemAmountInt - redeemAmountInt * 0.05).toString()),
{ gasLimit: 2500000 }
);

// Show the new balances.
ousdBalance = await ousd.balanceOf(address);
daiBalance = await dai.balanceOf(address);
usdcBalance = await usdc.balanceOf(address);
usdtBalance = await usdt.balanceOf(address);
console.log("New OUSD balance=", ousdUnitsFormat(ousdBalance, 18));
console.log("New DAI balance=", daiUnitsFormat(daiBalance, 18));
console.log("New USDC balance=", usdcUnitsFormat(usdcBalance, 18));
console.log("New USDT balance=", usdtUnitsFormat(usdtBalance, 18));
}

/**
* Redeems OUSD on local or fork.
*/
async function redeem(taskArguments, hre) {
const addresses = require("../utils/addresses");
const {
ousdUnits,
ousdUnitsFormat,
daiUnitsFormat,
usdcUnitsFormat,
usdtUnitsFormat,
isFork,
isLocalhost,
} = require("../test/helpers");

if (!isFork && !isLocalhost) {
throw new Error("Task can only be used on local or fork");
}

const ousdProxy = await ethers.getContract("OUSDProxy");
const ousd = await ethers.getContractAt("OUSD", ousdProxy.address);

const vaultProxy = await ethers.getContract("VaultProxy");
const vault = await ethers.getContractAt("IVault", vaultProxy.address);

let dai, usdc, usdt;
if (isFork) {
dai = await hre.ethers.getContractAt(usdtAbi, addresses.mainnet.DAI);
usdc = await hre.ethers.getContractAt(usdtAbi, addresses.mainnet.USDC);
usdt = await hre.ethers.getContractAt(usdtAbi, addresses.mainnet.USDT);
} else {
dai = await hre.ethers.getContract("MockDAI");
usdc = await hre.ethers.getContract("MockUSDC");
usdt = await hre.ethers.getContract("MockUSDT");
}

const numAccounts = Number(taskArguments.num) || defaultNumAccounts;
const accountIndex = Number(taskArguments.index) || defaultAccountIndex;
const redeemAmount = taskArguments.amount || defaultRedeemAmount;

const signers = await hre.ethers.getSigners();
for (let i = accountIndex; i < accountIndex + numAccounts; i++) {
const signer = signers[i];
const address = signer.address;
console.log(
`Redeeming ${redeemAmount} OUSD for account ${i} at address ${address}`
);

// Show the current balances.
let ousdBalance = await ousd.balanceOf(address);
let daiBalance = await dai.balanceOf(address);
let usdcBalance = await usdc.balanceOf(address);
let usdtBalance = await usdt.balanceOf(address);
console.log("OUSD balance=", ousdUnitsFormat(ousdBalance, 18));
console.log("DAI balance=", daiUnitsFormat(daiBalance, 18));
console.log("USDC balance=", usdcUnitsFormat(usdcBalance, 6));
console.log("USDT balance=", usdtUnitsFormat(usdtBalance, 6));

// Redeem.
await vault
.connect(signer)
.redeem(ousdUnits(redeemAmount), 0, { gasLimit: 2000000 });

// Show the new balances.
ousdBalance = await ousd.balanceOf(address);
daiBalance = await dai.balanceOf(address);
usdcBalance = await usdc.balanceOf(address);
usdtBalance = await usdt.balanceOf(address);
console.log("New OUSD balance=", ousdUnitsFormat(ousdBalance, 18));
console.log("New DAI balance=", daiUnitsFormat(daiBalance, 18));
console.log("New USDC balance=", usdcUnitsFormat(usdcBalance, 18));
console.log("New USDT balance=", usdtUnitsFormat(usdtBalance, 18));
}
}

// Sends OUSD to a destination address.
async function transfer(taskArguments) {
const {
Expand Down Expand Up @@ -437,8 +215,5 @@ async function transfer(taskArguments) {
module.exports = {
accounts,
fund,
mint,
redeem,
redeemFor,
transfer,
};
30 changes: 30 additions & 0 deletions contracts/tasks/block.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const log = require("../utils/logger")("task:block");

async function getBlock(block) {
// Get the block to get all the data from
const blockTag = !block ? await hre.ethers.provider.getBlockNumber() : block;
log(`block: ${blockTag}`);

return blockTag;
}

async function getDiffBlocks(taskArguments, hre) {
// Get the block to get all the data from
const blockTag = !taskArguments.block
? await hre.ethers.provider.getBlockNumber()
: taskArguments.block;
console.log(`block: ${blockTag}`);
const fromBlockTag = taskArguments.fromBlock || 0;
const diffBlocks = fromBlockTag > 0;

return {
diffBlocks,
blockTag,
fromBlockTag,
};
}

module.exports = {
getBlock,
getDiffBlocks,
};
Loading