Skip to content

Commit

Permalink
feat: poc
Browse files Browse the repository at this point in the history
  • Loading branch information
MerlinEgalite committed Oct 9, 2024
1 parent 0b47984 commit 4596650
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 49 deletions.
19 changes: 0 additions & 19 deletions script/Counter.s.sol

This file was deleted.

14 changes: 0 additions & 14 deletions src/Counter.sol

This file was deleted.

39 changes: 39 additions & 0 deletions src/MorphoTokenVotesNoWrapper.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {ERC20Upgradeable} from "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/ERC20Upgradeable.sol";
import {Ownable2StepUpgradeable} from
"lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol";
import {ERC20VotesUpgradeable} from
"lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol";
import {
ERC20PermitUpgradeable,
NoncesUpgradeable
} from "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20PermitUpgradeable.sol";

contract MorphoTokenVotesNoWrapper is ERC20VotesUpgradeable, ERC20PermitUpgradeable, Ownable2StepUpgradeable {
string constant NAME = "Morpho";
string constant SYMBOL = "Morpho";
address constant DAO = address(0x0);
address constant LEGACY_MORPHO = address(0x0);

function initialize() public initializer {
ERC20VotesUpgradeable.__ERC20Votes_init_unchained();
ERC20Upgradeable.__ERC20_init_unchained(NAME, SYMBOL);
Ownable2StepUpgradeable.__Ownable2Step_init();
ERC20PermitUpgradeable.__ERC20Permit_init(NAME);

_mint(DAO, 1_000_000_000e18); // Mint 1B to the DAO.
}

function _update(address from, address to, uint256 value)
internal
override(ERC20Upgradeable, ERC20VotesUpgradeable)
{
ERC20VotesUpgradeable._update(from, to, value);
}

function nonces(address owner) public view override(ERC20PermitUpgradeable, NoncesUpgradeable) returns (uint256) {
return ERC20PermitUpgradeable.nonces(owner);
}
}
59 changes: 59 additions & 0 deletions src/MorphoTokenVotesWrapper.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {
IERC20, ERC20Upgradeable
} from "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/ERC20Upgradeable.sol";
import {Ownable2StepUpgradeable} from
"lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol";
import {ERC20VotesUpgradeable} from
"lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol";
import {ERC20WrapperUpgradeable} from
"lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20WrapperUpgradeable.sol";
import {
ERC20PermitUpgradeable,
NoncesUpgradeable
} from "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20PermitUpgradeable.sol";

contract MorphoTokenVotesWrapper is
ERC20VotesUpgradeable,
ERC20WrapperUpgradeable,
ERC20PermitUpgradeable,
Ownable2StepUpgradeable
{
string constant NAME = "Morpho";
string constant SYMBOL = "Morpho";
address constant LEGACY_MORPHO = address(0x0);
address constant DAO = address(0x0);

function initialize() public initializer {
ERC20VotesUpgradeable.__ERC20Votes_init_unchained();
ERC20Upgradeable.__ERC20_init_unchained(NAME, SYMBOL);
Ownable2StepUpgradeable.__Ownable2Step_init();
ERC20PermitUpgradeable.__ERC20Permit_init(NAME);
ERC20WrapperUpgradeable.__ERC20Wrapper_init_unchained(IERC20(LEGACY_MORPHO));
}

function _update(address from, address to, uint256 value)
internal
override(ERC20Upgradeable, ERC20VotesUpgradeable)
{
ERC20VotesUpgradeable._update(from, to, value);
}

function nonces(address owner) public view override(ERC20PermitUpgradeable, NoncesUpgradeable) returns (uint256) {
return ERC20PermitUpgradeable.nonces(owner);
}

function decimals() public view override(ERC20Upgradeable, ERC20WrapperUpgradeable) returns (uint8) {
return ERC20WrapperUpgradeable.decimals();
}

// No need to override depositFor as it wraps 1:1 legacy tokens to new tokens.
// We would also mint 1B MORPHO tokens to the DAO at initialization and do the same thing as in `Wrapper` contract here.
// function depositFor(address account, uint256 amount) public override returns (bool)

function withdrawTo(address, uint256) public override pure returns (bool) {
return false;
}
}
20 changes: 20 additions & 0 deletions src/Wrapper.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IBurn {
function burn(uint256 amount) external;
}

contract Wrapper {
address public constant LEGACY_MORPHO = address(0x0);
address public constant DAO = address(0x0);
address public constant MORPHO = address(0x0);

function wrap(uint256 amount) external {
IERC20(LEGACY_MORPHO).transferFrom(msg.sender, address(this), amount);
IBurn(LEGACY_MORPHO).burn(amount);
IERC20(MORPHO).transferFrom(DAO, msg.sender, amount);
}
}
19 changes: 3 additions & 16 deletions test/Counter.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,10 @@
pragma solidity ^0.8.13;

import {Test, console} from "forge-std/Test.sol";
import {Counter} from "../src/Counter.sol";
import {MorphoTokenVotesWrapper} from "../src/MorphoTokenVotesWrapper.sol";

contract CounterTest is Test {
Counter public counter;
MorphoTokenVotesWrapper public token;

function setUp() public {
counter = new Counter();
counter.setNumber(0);
}

function test_Increment() public {
counter.increment();
assertEq(counter.number(), 1);
}

function testFuzz_SetNumber(uint256 x) public {
counter.setNumber(x);
assertEq(counter.number(), x);
}
function setUp() public {}
}

0 comments on commit 4596650

Please sign in to comment.