-
Notifications
You must be signed in to change notification settings - Fork 0
/
ico.sol
115 lines (96 loc) · 3.35 KB
/
ico.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
pragma solidity ^0.8.0;
import "./erc20.sol";
contract Ico {
uint256 public maxMintable;
uint256 public totalMinted;
uint public endDate;
uint public startDate;
uint public exchangeRate;
bool public isFunding;
ERC20 public Token;
address public ETHWallet;
uint256 public heldTotal;
bool private configSet;
address public creator;
mapping (address => uint256) public heldTokens;
mapping (address => uint) public heldTimeline;
event Contribution(address from, uint256 amount);
event ReleaseTokens(address from, uint256 amount);
constructor (uint _startDate, uint _maxMintable, uint _exchangeRate) {
startDate = _startDate;
maxMintable = _maxMintable;
ETHWallet = msg.sender;
isFunding = true;
creator = msg.sender;
exchangeRate = _exchangeRate;
}
// setup function to be ran only 1 time
// setup token address
// setup end Block number
function setup(address token_address, uint _endDate) public {
require(msg.sender == creator, "You are not allowed.");
require(!configSet);
Token = ERC20(token_address);
endDate = _endDate;
configSet = true;
}
function closeSale() external {
require(msg.sender==creator);
isFunding = false;
}
function buy() public payable {
require(msg.value>0);
require(isFunding);
require(block.timestamp <= endDate);
uint256 amount = msg.value * exchangeRate;
uint256 total = totalMinted + amount;
require(total<=maxMintable);
totalMinted += total;
payable(ETHWallet).transfer(msg.value);
Token._mint(msg.sender, amount);
emit Contribution(msg.sender, amount);
}
// CONTRIBUTE FUNCTION
// converts ETH to TOKEN and sends new TOKEN to the sender
function contribute() external payable {
require(msg.value>0);
require(isFunding);
require(block.timestamp <= endDate);
uint256 amount = msg.value * exchangeRate;
uint256 total = totalMinted + amount;
require(total<=maxMintable);
totalMinted += total;
payable(ETHWallet).transfer(msg.value);
Token._mint(msg.sender, amount);
emit Contribution(msg.sender, amount);
}
// update the ETH/COIN rate
function updateRate(uint256 _rate) external {
require(msg.sender==creator);
require(isFunding);
exchangeRate = _rate;
}
// public function to get the amount of tokens held for an address
function getHeldCoin(address _address) public view returns (uint256) {
return heldTokens[_address];
}
// function to create held tokens for developer
function createHoldToken(address _to, uint256 amount) internal {
heldTokens[_to] = amount;
heldTimeline[_to] = block.number + 0;
heldTotal += amount;
totalMinted += heldTotal;
}
// function to release held tokens for developers
function releaseHeldCoins() external {
uint256 held = heldTokens[msg.sender];
uint heldBlock = heldTimeline[msg.sender];
require(!isFunding);
require(held >= 0);
require(block.number >= heldBlock);
heldTokens[msg.sender] = 0;
heldTimeline[msg.sender] = 0;
Token._mint(msg.sender, held);
emit ReleaseTokens(msg.sender, held);
}
}