1
+ //SPDX-License-Identifier: Unlicense
2
+ pragma solidity ^ 0.8.0 ;
3
+
4
+ import "@openzeppelin/contracts/token/ERC20/ERC20.sol " ;
5
+ import "@openzeppelin/contracts/access/Ownable.sol " ;
6
+ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol " ;
7
+
8
+ // ETH Call Opt
9
+ contract CallOptionsToken is ERC20 , Ownable {
10
+ using SafeERC20 for IERC20 ;
11
+
12
+ uint public price;
13
+ address public udscToken;
14
+ uint public settlementTime; // 行权日期
15
+ uint public constant during = 1 days ; // 行权有效期
16
+
17
+ constructor (address usdc ) ERC20 ("CallOptToken " , "COPT " ) {
18
+ udscToken = usdc;
19
+ price = 10 ;
20
+ settlementTime = 100 days ;
21
+ }
22
+
23
+ // 铸造期权 token
24
+ function mint () external payable onlyOwner {
25
+ _mint (msg .sender , msg .value );
26
+ }
27
+
28
+ // 行权
29
+ function settlement (uint amount ) external {
30
+ require (block .timestamp >= settlementTime && block .timestamp < settlementTime + during, "invalid time " );
31
+ _burn (msg .sender , amount);
32
+ uint needUsdcAmount = price * amount;
33
+ IERC20 (udscToken).safeTransferFrom (msg .sender , address (this ), needUsdcAmount);
34
+ safeTransferETH (msg .sender , amount);
35
+ }
36
+
37
+
38
+ function safeTransferETH (address to , uint256 value ) internal {
39
+ (bool success ,) = to.call {value : value}(new bytes (0 ));
40
+ require (success, 'TransferHelper::safeTransferETH: ETH transfer failed ' );
41
+ }
42
+
43
+ // 销毁合约
44
+ function burnAll () external onlyOwner {
45
+ require (block .timestamp >= settlementTime + during, "not end " );
46
+ uint usdcAmount = IERC20 (udscToken).balanceOf (address (this ));
47
+ IERC20 (udscToken).safeTransfer (msg .sender , usdcAmount);
48
+
49
+ selfdestruct (payable (msg .sender ));
50
+ // uint ethAmount = address(this).balance;
51
+ // safeTransferETH(msg.sender, ethAmount);
52
+ }
53
+
54
+
55
+ }
0 commit comments