-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathMETH.sol
83 lines (69 loc) · 2.8 KB
/
METH.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Initializable} from "openzeppelin-upgradeable/proxy/utils/Initializable.sol";
import {AccessControlEnumerableUpgradeable} from
"openzeppelin-upgradeable/access/AccessControlEnumerableUpgradeable.sol";
import {AccessControlEnumerable} from "openzeppelin/access/AccessControlEnumerable.sol";
import {
ERC20PermitUpgradeable,
IERC20PermitUpgradeable
} from "openzeppelin-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol";
import {IMETH} from "./interfaces/IMETH.sol";
import {IStaking} from "./interfaces/IStaking.sol";
import {IUnstakeRequestsManager} from "./interfaces/IUnstakeRequestsManager.sol";
/// @title METH
/// @notice METH is the ERC20 LSD token for the protocol.
contract METH is Initializable, AccessControlEnumerableUpgradeable, ERC20PermitUpgradeable, IMETH {
// Errors.
error NotStakingContract();
error NotUnstakeRequestsManagerContract();
/// @notice The staking contract which has permissions to mint tokens.
IStaking public stakingContract;
/// @notice The unstake requests manager contract which has permissions to burn tokens.
IUnstakeRequestsManager public unstakeRequestsManagerContract;
/// @notice Configuration for contract initialization.
struct Init {
address admin;
IStaking staking;
IUnstakeRequestsManager unstakeRequestsManager;
}
constructor() {
_disableInitializers();
}
/// @notice Inititalizes the contract.
/// @dev MUST be called during the contract upgrade to set up the proxies state.
function initialize(Init memory init) external initializer {
__AccessControlEnumerable_init();
__ERC20_init("mETH", "mETH");
__ERC20Permit_init("mETH");
_grantRole(DEFAULT_ADMIN_ROLE, init.admin);
stakingContract = init.staking;
unstakeRequestsManagerContract = init.unstakeRequestsManager;
}
/// @inheritdoc IMETH
/// @dev Expected to be called during the stake operation.
function mint(address staker, uint256 amount) external {
if (msg.sender != address(stakingContract)) {
revert NotStakingContract();
}
_mint(staker, amount);
}
/// @inheritdoc IMETH
/// @dev Expected to be called when a user has claimed their unstake request.
function burn(uint256 amount) external {
if (msg.sender != address(unstakeRequestsManagerContract)) {
revert NotUnstakeRequestsManagerContract();
}
_burn(msg.sender, amount);
}
/// @dev See {IERC20Permit-nonces}.
function nonces(address owner)
public
view
virtual
override(ERC20PermitUpgradeable, IERC20PermitUpgradeable)
returns (uint256)
{
return ERC20PermitUpgradeable.nonces(owner);
}
}