Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: Standardization and Cleanup #10

Merged
merged 1 commit into from
Mar 16, 2022
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
5 changes: 2 additions & 3 deletions contracts/Migrator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import { IERC20Like } from "./interfaces/Interfaces.sol";

contract Migrator {

address public immutable oldToken;
address public immutable newToken;
address public immutable oldToken;

constructor(address oldToken_, address newToken_) {
require(IERC20Like(newToken_).decimals() == IERC20Like(oldToken_).decimals(), "M:C:DECIMAL_MISMATCH");
Expand All @@ -22,8 +22,7 @@ contract Migrator {
}

function migrate(address owner, uint256 amount_) public {
require(amount_ > 0, "M:M:ZERO_AMOUNT");

require(amount_ > uint256(0), "M:M:ZERO_AMOUNT");
require(ERC20Helper.transferFrom(oldToken, owner, address(this), amount_), "M:M:TRANSFER_FROM_FAILED");
require(ERC20Helper.transfer(newToken, owner, amount_), "M:M:TRANSFER_FAILED");
}
Expand Down
12 changes: 6 additions & 6 deletions contracts/interfaces/IMigrator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@ pragma solidity 0.8.7;

interface IMigrator {

/**
* @dev Get address of oldToken.
* @return oldToken_ The address of new token.
*/
function oldToken() external view returns (address oldToken_);

/**
* @dev Get address of newToken.
* @return newToken_ The address of new token.
*/
function newToken() external view returns (address newToken_);

/**
* @dev Get address of oldToken.
* @return oldToken_ The address of new token.
*/
function oldToken() external view returns (address oldToken_);

/**
* @dev Exchange the oldToken for the same amount of newToken.
* @param amount_ The amount of oldToken to swap for newToken.
Expand Down
204 changes: 100 additions & 104 deletions contracts/test/Migrator.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -40,209 +40,205 @@ contract MigratorConstructorTest is TestUtils {

contract MigratorTest is TestUtils {

uint256 public constant OLD_SUPPLY = 10_000_000 ether;
uint256 internal constant OLD_SUPPLY = 10_000_000 ether;

Migrator migrator;
MockERC20 oldToken;
MockERC20 newToken;
Migrator internal _migrator;
MockERC20 internal _oldToken;
MockERC20 internal _newToken;

function setUp() external {
oldToken = new MockERC20("Old Token", "OT", 18);
newToken = new MockERC20("New Token", "NT", 18);
_oldToken = new MockERC20("Old Token", "OT", 18);
_newToken = new MockERC20("New Token", "NT", 18);

migrator = new Migrator(address(oldToken), address(newToken));
_migrator = new Migrator(address(_oldToken), address(_newToken));

// Mint new token to migrator
newToken.mint(address(migrator), OLD_SUPPLY);
_newToken.mint(address(_migrator), OLD_SUPPLY);
}

function test_migrate_zeroAmount() external {
uint256 amount_ = 0;

vm.expectRevert("M:M:ZERO_AMOUNT");
migrator.migrate(amount_);

amount_ = 1;
_migrator.migrate(0);

oldToken.mint(address(this), amount_);
oldToken.approve(address(migrator), amount_);
_oldToken.mint(address(this), 1);
_oldToken.approve(address(_migrator), 1);

migrator.migrate(amount_);
_migrator.migrate(1);

assertEq(oldToken.allowance(address(this), address(migrator)), 0);
assertEq(_oldToken.allowance(address(this), address(_migrator)), 0);

assertEq(oldToken.balanceOf(address(this)), 0);
assertEq(oldToken.balanceOf(address(migrator)), amount_);
assertEq(newToken.balanceOf(address(this)), amount_);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY - amount_);
assertEq(_oldToken.balanceOf(address(this)), 0);
assertEq(_oldToken.balanceOf(address(_migrator)), 1);
assertEq(_newToken.balanceOf(address(this)), 1);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY - 1);
}

function test_migrate_insufficientApproval(uint256 amount_) external {
function testFuzz_migrate_insufficientApproval(uint256 amount_) external {
amount_ = constrictToRange(amount_, 1, OLD_SUPPLY);

// Mint amount of old token
oldToken.mint(address(this), amount_);
_oldToken.mint(address(this), amount_);

oldToken.approve(address(migrator), amount_ - 1);
_oldToken.approve(address(_migrator), amount_ - 1);

vm.expectRevert("M:M:TRANSFER_FROM_FAILED");
migrator.migrate(amount_);
_migrator.migrate(amount_);

// Approve
oldToken.approve(address(migrator), amount_);
_oldToken.approve(address(_migrator), amount_);

migrator.migrate(amount_);
_migrator.migrate(amount_);

assertEq(oldToken.allowance(address(this), address(migrator)), 0);
assertEq(_oldToken.allowance(address(this), address(_migrator)), 0);

assertEq(oldToken.balanceOf(address(this)), 0);
assertEq(oldToken.balanceOf(address(migrator)), amount_);
assertEq(newToken.balanceOf(address(this)), amount_);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY - amount_);
assertEq(_oldToken.balanceOf(address(this)), 0);
assertEq(_oldToken.balanceOf(address(_migrator)), amount_);
assertEq(_newToken.balanceOf(address(this)), amount_);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY - amount_);
}

function test_migrate_insufficientBalance(uint256 amount_) external {
function testFuzz_migrate_insufficientBalance(uint256 amount_) external {
amount_ = constrictToRange(amount_, 1, OLD_SUPPLY);

oldToken.mint(address(this), amount_ - 1);
_oldToken.mint(address(this), amount_ - 1);

oldToken.approve(address(migrator), amount_);
_oldToken.approve(address(_migrator), amount_);

vm.expectRevert("M:M:TRANSFER_FROM_FAILED");
migrator.migrate(amount_);
_migrator.migrate(amount_);

// Mint
oldToken.mint(address(this), 1);
_oldToken.mint(address(this), 1);

migrator.migrate(amount_);
_migrator.migrate(amount_);

assertEq(oldToken.allowance(address(this), address(migrator)), 0);
assertEq(_oldToken.allowance(address(this), address(_migrator)), 0);

assertEq(oldToken.balanceOf(address(this)), 0);
assertEq(oldToken.balanceOf(address(migrator)), amount_);
assertEq(newToken.balanceOf(address(this)), amount_);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY - amount_);
assertEq(_oldToken.balanceOf(address(this)), 0);
assertEq(_oldToken.balanceOf(address(_migrator)), amount_);
assertEq(_newToken.balanceOf(address(this)), amount_);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY - amount_);
}

function test_migrate_newTokenInsufficientBalance(uint256 amount_) external {
function testFuzz_migrate_newTokenInsufficientBalance(uint256 amount_) external {
amount_ = constrictToRange(amount_, 1, OLD_SUPPLY);

// Burn new supply that was added in setUp
newToken.burn(address(migrator), OLD_SUPPLY - amount_ + 1);
_newToken.burn(address(_migrator), OLD_SUPPLY - amount_ + 1);

// Mint amount of old token
oldToken.mint(address(this), amount_);
_oldToken.mint(address(this), amount_);

// Approve
oldToken.approve(address(migrator), amount_);
_oldToken.approve(address(_migrator), amount_);

vm.expectRevert("M:M:TRANSFER_FAILED");
migrator.migrate(amount_);
_migrator.migrate(amount_);

newToken.mint(address(migrator), 1);
_newToken.mint(address(_migrator), 1);

migrator.migrate(amount_);
_migrator.migrate(amount_);

assertEq(oldToken.allowance(address(this), address(migrator)), 0);
assertEq(_oldToken.allowance(address(this), address(_migrator)), 0);

assertEq(oldToken.balanceOf(address(this)), 0);
assertEq(oldToken.balanceOf(address(migrator)), amount_);
assertEq(newToken.balanceOf(address(this)), amount_);
assertEq(newToken.balanceOf(address(migrator)), 0);
assertEq(_oldToken.balanceOf(address(this)), 0);
assertEq(_oldToken.balanceOf(address(_migrator)), amount_);
assertEq(_newToken.balanceOf(address(this)), amount_);
assertEq(_newToken.balanceOf(address(_migrator)), 0);
}

function test_migrate_success(uint256 amount_) external {
function testFuzz_migrate_success(uint256 amount_) external {
amount_ = constrictToRange(amount_, 1, OLD_SUPPLY);

// Mint amount of old token
oldToken.mint(address(this), amount_);
_oldToken.mint(address(this), amount_);

// Approve
oldToken.approve(address(migrator), amount_);
_oldToken.approve(address(_migrator), amount_);

assertEq(oldToken.allowance(address(this), address(migrator)), amount_);
assertEq(_oldToken.allowance(address(this), address(_migrator)), amount_);

assertEq(oldToken.balanceOf(address(this)), amount_);
assertEq(oldToken.balanceOf(address(migrator)), 0);
assertEq(newToken.balanceOf(address(this)), 0);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY);
assertEq(_oldToken.balanceOf(address(this)), amount_);
assertEq(_oldToken.balanceOf(address(_migrator)), 0);
assertEq(_newToken.balanceOf(address(this)), 0);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY);

migrator.migrate(amount_);
_migrator.migrate(amount_);

assertEq(oldToken.allowance(address(this), address(migrator)), 0);
assertEq(_oldToken.allowance(address(this), address(_migrator)), 0);

assertEq(oldToken.balanceOf(address(this)), 0);
assertEq(oldToken.balanceOf(address(migrator)), amount_);
assertEq(newToken.balanceOf(address(this)), amount_);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY - amount_);
assertEq(_oldToken.balanceOf(address(this)), 0);
assertEq(_oldToken.balanceOf(address(_migrator)), amount_);
assertEq(_newToken.balanceOf(address(this)), amount_);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY - amount_);
}

function test_migration_specifiedOwner(uint256 amount_) external {
function testFuzz_migration_specifiedOwner(uint256 amount_) external {
amount_ = constrictToRange(amount_, 1, OLD_SUPPLY);

SomeAccount someAccount = new SomeAccount();

// Mint amount of old token
oldToken.mint(address(someAccount), amount_);
_oldToken.mint(address(someAccount), amount_);

// Approve
someAccount.approve(address(oldToken), address(migrator), amount_);
someAccount.approve(address(_oldToken), address(_migrator), amount_);

assertEq(oldToken.allowance(address(someAccount), address(migrator)), amount_);
assertEq(_oldToken.allowance(address(someAccount), address(_migrator)), amount_);

assertEq(oldToken.balanceOf(address(someAccount)), amount_);
assertEq(oldToken.balanceOf(address(migrator)), 0);
assertEq(newToken.balanceOf(address(someAccount)), 0);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY);
assertEq(_oldToken.balanceOf(address(someAccount)), amount_);
assertEq(_oldToken.balanceOf(address(_migrator)), 0);
assertEq(_newToken.balanceOf(address(someAccount)), 0);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY);

migrator.migrate(address(someAccount), amount_);
_migrator.migrate(address(someAccount), amount_);

assertEq(oldToken.allowance(address(someAccount), address(migrator)), 0);
assertEq(_oldToken.allowance(address(someAccount), address(_migrator)), 0);

assertEq(oldToken.balanceOf(address(someAccount)), 0);
assertEq(oldToken.balanceOf(address(migrator)), amount_);
assertEq(newToken.balanceOf(address(someAccount)), amount_);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY - amount_);
assertEq(_oldToken.balanceOf(address(someAccount)), 0);
assertEq(_oldToken.balanceOf(address(_migrator)), amount_);
assertEq(_newToken.balanceOf(address(someAccount)), amount_);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY - amount_);
}

function test_migrate_partialMigration(uint256 amount_, uint256 partialAmount_) external {
function testFuzz_migrate_partialMigration(uint256 amount_, uint256 partialAmount_) external {
amount_ = constrictToRange(amount_, 2, OLD_SUPPLY);
partialAmount_ = constrictToRange(partialAmount_, 1, amount_ - 1);

// Mint amount of old token
oldToken.mint(address(this), amount_);
_oldToken.mint(address(this), amount_);

// Approve partial
oldToken.approve(address(migrator), partialAmount_);
_oldToken.approve(address(_migrator), partialAmount_);

assertEq(oldToken.allowance(address(this), address(migrator)), partialAmount_);
assertEq(_oldToken.allowance(address(this), address(_migrator)), partialAmount_);

assertEq(oldToken.balanceOf(address(this)), amount_);
assertEq(oldToken.balanceOf(address(migrator)), 0);
assertEq(newToken.balanceOf(address(this)), 0);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY);
assertEq(_oldToken.balanceOf(address(this)), amount_);
assertEq(_oldToken.balanceOf(address(_migrator)), 0);
assertEq(_newToken.balanceOf(address(this)), 0);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY);

migrator.migrate(partialAmount_);
_migrator.migrate(partialAmount_);

assertEq(oldToken.allowance(address(this), address(migrator)), 0);
assertEq(_oldToken.allowance(address(this), address(_migrator)), 0);

assertEq(oldToken.balanceOf(address(this)), amount_ - partialAmount_);
assertEq(oldToken.balanceOf(address(migrator)), partialAmount_);
assertEq(newToken.balanceOf(address(this)), partialAmount_);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY - partialAmount_);
assertEq(_oldToken.balanceOf(address(this)), amount_ - partialAmount_);
assertEq(_oldToken.balanceOf(address(_migrator)), partialAmount_);
assertEq(_newToken.balanceOf(address(this)), partialAmount_);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY - partialAmount_);

uint256 remaining = amount_ - partialAmount_;

oldToken.approve(address(migrator), remaining);
_oldToken.approve(address(_migrator), remaining);

migrator.migrate(remaining);
_migrator.migrate(remaining);

assertEq(oldToken.allowance(address(this), address(migrator)), 0);
assertEq(_oldToken.allowance(address(this), address(_migrator)), 0);

assertEq(oldToken.balanceOf(address(this)), 0);
assertEq(oldToken.balanceOf(address(migrator)), amount_);
assertEq(newToken.balanceOf(address(this)), amount_);
assertEq(newToken.balanceOf(address(migrator)), OLD_SUPPLY - amount_);
assertEq(_oldToken.balanceOf(address(this)), 0);
assertEq(_oldToken.balanceOf(address(_migrator)), amount_);
assertEq(_newToken.balanceOf(address(this)), amount_);
assertEq(_newToken.balanceOf(address(_migrator)), OLD_SUPPLY - amount_);
}

}