文件 1 的 1:RFIEXTPresale.sol
pragma solidity ^0.6.0;
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a / b;
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
function ceil(uint a, uint m) internal pure returns (uint r) {
return (a + m - 1) / m * m;
}
}
contract Owned {
address payable public owner;
event OwnershipTransferred(address indexed _from, address indexed _to);
constructor() public {
owner = msg.sender;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
function transferOwnership(address payable _newOwner) public onlyOwner {
owner = _newOwner;
emit OwnershipTransferred(msg.sender, _newOwner);
}
}
interface IToken {
function transfer(address to, uint256 tokens) external returns (bool success);
function burnTokens(uint256 _amount) external;
function balanceOf(address tokenOwner) external view returns (uint256 balance);
}
contract PreSale is Owned {
using SafeMath for uint256;
address public tokenAddress;
bool public saleOpen;
uint256 tokenRatePerEth = 7246;
mapping(address => uint256) public usersInvestments;
constructor() public {
owner = msg.sender;
}
function startSale() external onlyOwner{
require(!saleOpen, "Sale is open");
saleOpen = true;
}
function setTokenAddress(address tokenContract) external onlyOwner{
require(tokenAddress == address(0), "token address already set");
tokenAddress = tokenContract;
}
function closeSale() external onlyOwner{
require(saleOpen, "Sale is not open");
saleOpen = false;
}
receive() external payable{
require(saleOpen, "Sale is not open");
require(usersInvestments[msg.sender].add(msg.value) <= 1 ether
&& usersInvestments[msg.sender].add(msg.value) >= 500 finney,
"Installment must be in range of 1 to 0.5 ether");
uint256 tokens = getTokenAmount(msg.value);
require(IToken(tokenAddress).transfer(msg.sender, tokens), "Insufficient balance of sale contract!");
usersInvestments[msg.sender] = usersInvestments[msg.sender].add(msg.value);
owner.transfer(msg.value);
}
function getTokenAmount(uint256 amount) internal view returns(uint256){
return amount.mul(tokenRatePerEth).div(100);
}
function burnUnSoldTokens() external onlyOwner{
require(!saleOpen, "Please close the sale first");
IToken(tokenAddress).burnTokens(IToken(tokenAddress).balanceOf(address(this)));
}
}
{
"compilationTarget": {
"browser/RFIEXTPresale.sol": "PreSale"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}