-
Notifications
You must be signed in to change notification settings - Fork 173
/
KyberNetworkTokenSale.sol
129 lines (99 loc) · 4.06 KB
/
KyberNetworkTokenSale.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
pragma solidity ^0.4.13;
import './KyberNetworkCrystal.sol';
import './ContributorApprover.sol';
import './KyberContributorWhitelist.sol';
contract KyberNetworkTokenSale is ContributorApprover {
address public admin;
address public kyberMultiSigWallet;
KyberNetworkCrystal public token;
uint public raisedWei;
bool public haltSale;
mapping(bytes32=>uint) public proxyPurchases;
function KyberNetworkTokenSale( address _admin,
address _kyberMultiSigWallet,
KyberContributorWhitelist _whilteListContract,
uint _totalTokenSupply,
uint _premintedTokenSupply,
uint _cappedSaleStartTime,
uint _publicSaleStartTime,
uint _publicSaleEndTime )
ContributorApprover( _whilteListContract,
_cappedSaleStartTime,
_publicSaleStartTime,
_publicSaleEndTime )
{
admin = _admin;
kyberMultiSigWallet = _kyberMultiSigWallet;
token = new KyberNetworkCrystal( _totalTokenSupply,
_cappedSaleStartTime,
_publicSaleEndTime + 7 days,
_admin );
// transfer preminted tokens to company wallet
token.transfer( kyberMultiSigWallet, _premintedTokenSupply );
}
function setHaltSale( bool halt ) {
require( msg.sender == admin );
haltSale = halt;
}
function() payable {
buy( msg.sender );
}
event ProxyBuy( bytes32 indexed _proxy, address _recipient, uint _amountInWei );
function proxyBuy( bytes32 proxy, address recipient ) payable returns(uint){
uint amount = buy( recipient );
proxyPurchases[proxy] = proxyPurchases[proxy].add(amount);
ProxyBuy( proxy, recipient, amount );
return amount;
}
event Buy( address _buyer, uint _tokens, uint _payedWei );
function buy( address recipient ) payable returns(uint){
require( tx.gasprice <= 50000000000 wei );
require( ! haltSale );
require( saleStarted() );
require( ! saleEnded() );
uint weiPayment = eligibleTestAndIncrement( recipient, msg.value );
require( weiPayment > 0 );
// send to msg.sender, not to recipient
if( msg.value > weiPayment ) {
msg.sender.transfer( msg.value.sub( weiPayment ) );
}
// send payment to wallet
sendETHToMultiSig( weiPayment );
raisedWei = raisedWei.add( weiPayment );
uint recievedTokens = weiPayment.mul( 600 );
assert( token.transfer( recipient, recievedTokens ) );
Buy( recipient, recievedTokens, weiPayment );
return weiPayment;
}
function sendETHToMultiSig( uint value ) internal {
kyberMultiSigWallet.transfer( value );
}
event FinalizeSale();
// function is callable by everyone
function finalizeSale() {
require( saleEnded() );
require( msg.sender == admin );
// burn remaining tokens
token.burn(token.balanceOf(this));
FinalizeSale();
}
// ETH balance is always expected to be 0.
// but in case something went wrong, we use this function to extract the eth.
function emergencyDrain(ERC20 anyToken) returns(bool){
require( msg.sender == admin );
require( saleEnded() );
if( this.balance > 0 ) {
sendETHToMultiSig( this.balance );
}
if( anyToken != address(0x0) ) {
assert( anyToken.transfer(kyberMultiSigWallet, anyToken.balanceOf(this)) );
}
return true;
}
// just to check that funds goes to the right place
// tokens are not given in return
function debugBuy() payable {
require( msg.value == 123 );
sendETHToMultiSig( msg.value );
}
}