编译器
0.6.12+commit.27d51765
文件 1 的 6:EnumerableSet.sol
pragma solidity >=0.6.0 <0.8.0;
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping (bytes32 => uint256) _indexes;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
bytes32 lastvalue = set._values[lastIndex];
set._values[toDeleteIndex] = lastvalue;
set._indexes[lastvalue] = toDeleteIndex + 1;
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
struct Bytes32Set {
Set _inner;
}
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(value)));
}
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(value)));
}
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(value)));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint256(_at(set._inner, index)));
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
文件 2 的 6:IERC20.sol
pragma solidity >=0.5.0;
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}
文件 3 的 6:Presale01.sol
pragma solidity 0.6.12;
import "./TransferHelper.sol";
import "./EnumerableSet.sol";
import "./SafeMath.sol";
import "./ReentrancyGuard.sol";
import "./IERC20.sol";
interface IUniswapV2Factory {
function getPair(address tokenA, address tokenB) external view returns (address pair);
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IPresaleLockForwarder {
function lockLiquidity (IERC20 _baseToken, IERC20 _saleToken, uint256 _baseAmount, uint256 _saleAmount, uint256 _unlock_date, address payable _withdrawer) external;
function uniswapPairIsInitialised (address _token0, address _token1) external view returns (bool);
}
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
interface IPresaleSettings {
function getMaxPresaleLength () external view returns (uint256);
function getRound1Length () external view returns (uint256);
function userHoldsSufficientRound1Token (address _user) external view returns (bool);
function referrerIsValid(address _referrer) external view returns (bool);
function getBaseFee () external view returns (uint256);
function getTokenFee () external view returns (uint256);
function getEthAddress () external view returns (address payable);
function getTokenAddress () external view returns (address payable);
function getReferralFee () external view returns (uint256);
function getEthCreationFee () external view returns (uint256);
}
contract Presale01 is ReentrancyGuard {
using SafeMath for uint256;
using EnumerableSet for EnumerableSet.AddressSet;
uint256 public CONTRACT_VERSION = 2;
struct PresaleInfo {
address payable PRESALE_OWNER;
IERC20 S_TOKEN;
IERC20 B_TOKEN;
uint256 TOKEN_PRICE;
uint256 MAX_SPEND_PER_BUYER;
uint256 AMOUNT;
uint256 HARDCAP;
uint256 SOFTCAP;
uint256 LIQUIDITY_PERCENT;
uint256 LISTING_RATE;
uint256 START_BLOCK;
uint256 END_BLOCK;
uint256 LOCK_PERIOD;
bool PRESALE_IN_ETH;
}
struct PresaleFeeInfo {
uint256 UNICRYPT_BASE_FEE;
uint256 UNICRYPT_TOKEN_FEE;
uint256 REFERRAL_FEE;
address payable BASE_FEE_ADDRESS;
address payable TOKEN_FEE_ADDRESS;
address payable REFERRAL_FEE_ADDRESS;
}
struct PresaleStatus {
bool WHITELIST_ONLY;
bool LP_GENERATION_COMPLETE;
bool FORCE_FAILED;
uint256 TOTAL_BASE_COLLECTED;
uint256 TOTAL_TOKENS_SOLD;
uint256 TOTAL_TOKENS_WITHDRAWN;
uint256 TOTAL_BASE_WITHDRAWN;
uint256 ROUND1_LENGTH;
uint256 NUM_BUYERS;
}
struct BuyerInfo {
uint256 baseDeposited;
uint256 tokensOwed;
}
PresaleInfo public PRESALE_INFO;
PresaleFeeInfo public PRESALE_FEE_INFO;
PresaleStatus public STATUS;
address public PRESALE_GENERATOR;
IPresaleLockForwarder public PRESALE_LOCK_FORWARDER;
IPresaleSettings public PRESALE_SETTINGS;
address UNICRYPT_DEV_ADDRESS;
IUniswapV2Factory public UNI_FACTORY;
IWETH public WETH;
mapping(address => BuyerInfo) public BUYERS;
EnumerableSet.AddressSet private WHITELIST;
constructor(address _presaleGenerator) public {
PRESALE_GENERATOR = _presaleGenerator;
UNI_FACTORY = IUniswapV2Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
WETH = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
PRESALE_SETTINGS = IPresaleSettings(0x2A8977E2A829BE0dD8c94fC7886b15937a376C41);
PRESALE_LOCK_FORWARDER = IPresaleLockForwarder(0xCA07E89e9674e9BC5bB9CaDE6771FEc8e14e4042);
UNICRYPT_DEV_ADDRESS = 0xAA3d85aD9D128DFECb55424085754F6dFa643eb1;
}
function init1 (
address payable _presaleOwner,
uint256 _amount,
uint256 _tokenPrice,
uint256 _maxEthPerBuyer,
uint256 _hardcap,
uint256 _softcap,
uint256 _liquidityPercent,
uint256 _listingRate,
uint256 _startblock,
uint256 _endblock,
uint256 _lockPeriod
) external {
require(msg.sender == PRESALE_GENERATOR, 'FORBIDDEN');
PRESALE_INFO.PRESALE_OWNER = _presaleOwner;
PRESALE_INFO.AMOUNT = _amount;
PRESALE_INFO.TOKEN_PRICE = _tokenPrice;
PRESALE_INFO.MAX_SPEND_PER_BUYER = _maxEthPerBuyer;
PRESALE_INFO.HARDCAP = _hardcap;
PRESALE_INFO.SOFTCAP = _softcap;
PRESALE_INFO.LIQUIDITY_PERCENT = _liquidityPercent;
PRESALE_INFO.LISTING_RATE = _listingRate;
PRESALE_INFO.START_BLOCK = _startblock;
PRESALE_INFO.END_BLOCK = _endblock;
PRESALE_INFO.LOCK_PERIOD = _lockPeriod;
}
function init2 (
IERC20 _baseToken,
IERC20 _presaleToken,
uint256 _unicryptBaseFee,
uint256 _unicryptTokenFee,
uint256 _referralFee,
address payable _baseFeeAddress,
address payable _tokenFeeAddress,
address payable _referralAddress
) external {
require(msg.sender == PRESALE_GENERATOR, 'FORBIDDEN');
PRESALE_INFO.PRESALE_IN_ETH = address(_baseToken) == address(WETH);
PRESALE_INFO.S_TOKEN = _presaleToken;
PRESALE_INFO.B_TOKEN = _baseToken;
PRESALE_FEE_INFO.UNICRYPT_BASE_FEE = _unicryptBaseFee;
PRESALE_FEE_INFO.UNICRYPT_TOKEN_FEE = _unicryptTokenFee;
PRESALE_FEE_INFO.REFERRAL_FEE = _referralFee;
PRESALE_FEE_INFO.BASE_FEE_ADDRESS = _baseFeeAddress;
PRESALE_FEE_INFO.TOKEN_FEE_ADDRESS = _tokenFeeAddress;
PRESALE_FEE_INFO.REFERRAL_FEE_ADDRESS = _referralAddress;
STATUS.ROUND1_LENGTH = PRESALE_SETTINGS.getRound1Length();
}
modifier onlyPresaleOwner() {
require(PRESALE_INFO.PRESALE_OWNER == msg.sender, "NOT PRESALE OWNER");
_;
}
function presaleStatus () public view returns (uint256) {
if (STATUS.FORCE_FAILED) {
return 3;
}
if ((block.number > PRESALE_INFO.END_BLOCK) && (STATUS.TOTAL_BASE_COLLECTED < PRESALE_INFO.SOFTCAP)) {
return 3;
}
if (STATUS.TOTAL_BASE_COLLECTED >= PRESALE_INFO.HARDCAP) {
return 2;
}
if ((block.number > PRESALE_INFO.END_BLOCK) && (STATUS.TOTAL_BASE_COLLECTED >= PRESALE_INFO.SOFTCAP)) {
return 2;
}
if ((block.number >= PRESALE_INFO.START_BLOCK) && (block.number <= PRESALE_INFO.END_BLOCK)) {
return 1;
}
return 0;
}
function userDeposit (uint256 _amount) external payable nonReentrant {
require(presaleStatus() == 1, 'NOT ACTIVE');
bool userHoldsUnicryptTokens = PRESALE_SETTINGS.userHoldsSufficientRound1Token(msg.sender);
if (block.number < PRESALE_INFO.START_BLOCK + STATUS.ROUND1_LENGTH) {
require(userHoldsUnicryptTokens, 'INSUFFICENT ROUND 1 TOKEN BALANCE');
} else if (STATUS.WHITELIST_ONLY && !userHoldsUnicryptTokens) {
require(WHITELIST.contains(msg.sender), 'NOT WHITELISTED');
}
BuyerInfo storage buyer = BUYERS[msg.sender];
uint256 amount_in = PRESALE_INFO.PRESALE_IN_ETH ? msg.value : _amount;
uint256 allowance = PRESALE_INFO.MAX_SPEND_PER_BUYER.sub(buyer.baseDeposited);
uint256 remaining = PRESALE_INFO.HARDCAP - STATUS.TOTAL_BASE_COLLECTED;
allowance = allowance > remaining ? remaining : allowance;
if (amount_in > allowance) {
amount_in = allowance;
}
uint256 tokensSold = amount_in.mul(PRESALE_INFO.TOKEN_PRICE).div(10 ** uint256(PRESALE_INFO.B_TOKEN.decimals()));
require(tokensSold > 0, 'ZERO TOKENS');
if (buyer.baseDeposited == 0) {
STATUS.NUM_BUYERS++;
}
buyer.baseDeposited = buyer.baseDeposited.add(amount_in);
buyer.tokensOwed = buyer.tokensOwed.add(tokensSold);
STATUS.TOTAL_BASE_COLLECTED = STATUS.TOTAL_BASE_COLLECTED.add(amount_in);
STATUS.TOTAL_TOKENS_SOLD = STATUS.TOTAL_TOKENS_SOLD.add(tokensSold);
if (PRESALE_INFO.PRESALE_IN_ETH && amount_in < msg.value) {
msg.sender.transfer(msg.value.sub(amount_in));
}
if (!PRESALE_INFO.PRESALE_IN_ETH) {
TransferHelper.safeTransferFrom(address(PRESALE_INFO.B_TOKEN), msg.sender, address(this), amount_in);
}
}
function userWithdrawTokens () external nonReentrant {
require(STATUS.LP_GENERATION_COMPLETE, 'AWAITING LP GENERATION');
BuyerInfo storage buyer = BUYERS[msg.sender];
uint256 tokensRemainingDenominator = STATUS.TOTAL_TOKENS_SOLD.sub(STATUS.TOTAL_TOKENS_WITHDRAWN);
uint256 tokensOwed = PRESALE_INFO.S_TOKEN.balanceOf(address(this)).mul(buyer.tokensOwed).div(tokensRemainingDenominator);
require(tokensOwed > 0, 'NOTHING TO WITHDRAW');
STATUS.TOTAL_TOKENS_WITHDRAWN = STATUS.TOTAL_TOKENS_WITHDRAWN.add(buyer.tokensOwed);
buyer.tokensOwed = 0;
TransferHelper.safeTransfer(address(PRESALE_INFO.S_TOKEN), msg.sender, tokensOwed);
}
function userWithdrawBaseTokens () external nonReentrant {
require(presaleStatus() == 3, 'NOT FAILED');
BuyerInfo storage buyer = BUYERS[msg.sender];
uint256 baseRemainingDenominator = STATUS.TOTAL_BASE_COLLECTED.sub(STATUS.TOTAL_BASE_WITHDRAWN);
uint256 remainingBaseBalance = PRESALE_INFO.PRESALE_IN_ETH ? address(this).balance : PRESALE_INFO.B_TOKEN.balanceOf(address(this));
uint256 tokensOwed = remainingBaseBalance.mul(buyer.baseDeposited).div(baseRemainingDenominator);
require(tokensOwed > 0, 'NOTHING TO WITHDRAW');
STATUS.TOTAL_BASE_WITHDRAWN = STATUS.TOTAL_BASE_WITHDRAWN.add(buyer.baseDeposited);
buyer.baseDeposited = 0;
TransferHelper.safeTransferBaseToken(address(PRESALE_INFO.B_TOKEN), msg.sender, tokensOwed, !PRESALE_INFO.PRESALE_IN_ETH);
}
function ownerWithdrawTokens () external onlyPresaleOwner {
require(presaleStatus() == 3);
TransferHelper.safeTransfer(address(PRESALE_INFO.S_TOKEN), PRESALE_INFO.PRESALE_OWNER, PRESALE_INFO.S_TOKEN.balanceOf(address(this)));
}
function forceFailIfPairExists () external {
require(!STATUS.LP_GENERATION_COMPLETE && !STATUS.FORCE_FAILED);
if (PRESALE_LOCK_FORWARDER.uniswapPairIsInitialised(address(PRESALE_INFO.S_TOKEN), address(PRESALE_INFO.B_TOKEN))) {
STATUS.FORCE_FAILED = true;
}
}
function forceFailByUnicrypt () external {
require(msg.sender == UNICRYPT_DEV_ADDRESS);
STATUS.FORCE_FAILED = true;
}
function addLiquidity() external nonReentrant {
require(!STATUS.LP_GENERATION_COMPLETE, 'GENERATION COMPLETE');
require(presaleStatus() == 2, 'NOT SUCCESS');
if (PRESALE_LOCK_FORWARDER.uniswapPairIsInitialised(address(PRESALE_INFO.S_TOKEN), address(PRESALE_INFO.B_TOKEN))) {
STATUS.FORCE_FAILED = true;
return;
}
uint256 unicryptBaseFee = STATUS.TOTAL_BASE_COLLECTED.mul(PRESALE_FEE_INFO.UNICRYPT_BASE_FEE).div(1000);
uint256 baseLiquidity = STATUS.TOTAL_BASE_COLLECTED.sub(unicryptBaseFee).mul(PRESALE_INFO.LIQUIDITY_PERCENT).div(1000);
if (PRESALE_INFO.PRESALE_IN_ETH) {
WETH.deposit{value : baseLiquidity}();
}
TransferHelper.safeApprove(address(PRESALE_INFO.B_TOKEN), address(PRESALE_LOCK_FORWARDER), baseLiquidity);
uint256 tokenLiquidity = baseLiquidity.mul(PRESALE_INFO.LISTING_RATE).div(10 ** uint256(PRESALE_INFO.B_TOKEN.decimals()));
TransferHelper.safeApprove(address(PRESALE_INFO.S_TOKEN), address(PRESALE_LOCK_FORWARDER), tokenLiquidity);
PRESALE_LOCK_FORWARDER.lockLiquidity(PRESALE_INFO.B_TOKEN, PRESALE_INFO.S_TOKEN, baseLiquidity, tokenLiquidity, block.timestamp + PRESALE_INFO.LOCK_PERIOD, PRESALE_INFO.PRESALE_OWNER);
uint256 unicryptTokenFee = STATUS.TOTAL_TOKENS_SOLD.mul(PRESALE_FEE_INFO.UNICRYPT_TOKEN_FEE).div(1000);
if (PRESALE_FEE_INFO.REFERRAL_FEE_ADDRESS != address(0)) {
uint256 referralBaseFee = unicryptBaseFee.mul(PRESALE_FEE_INFO.REFERRAL_FEE).div(1000);
TransferHelper.safeTransferBaseToken(address(PRESALE_INFO.B_TOKEN), PRESALE_FEE_INFO.REFERRAL_FEE_ADDRESS, referralBaseFee, !PRESALE_INFO.PRESALE_IN_ETH);
unicryptBaseFee = unicryptBaseFee.sub(referralBaseFee);
uint256 referralTokenFee = unicryptTokenFee.mul(PRESALE_FEE_INFO.REFERRAL_FEE).div(1000);
TransferHelper.safeTransfer(address(PRESALE_INFO.S_TOKEN), PRESALE_FEE_INFO.REFERRAL_FEE_ADDRESS, referralTokenFee);
unicryptTokenFee = unicryptTokenFee.sub(referralTokenFee);
}
TransferHelper.safeTransferBaseToken(address(PRESALE_INFO.B_TOKEN), PRESALE_FEE_INFO.BASE_FEE_ADDRESS, unicryptBaseFee, !PRESALE_INFO.PRESALE_IN_ETH);
TransferHelper.safeTransfer(address(PRESALE_INFO.S_TOKEN), PRESALE_FEE_INFO.TOKEN_FEE_ADDRESS, unicryptTokenFee);
uint256 remainingSBalance = PRESALE_INFO.S_TOKEN.balanceOf(address(this));
if (remainingSBalance > STATUS.TOTAL_TOKENS_SOLD) {
uint256 burnAmount = remainingSBalance.sub(STATUS.TOTAL_TOKENS_SOLD);
TransferHelper.safeTransfer(address(PRESALE_INFO.S_TOKEN), 0x000000000000000000000000000000000000dEaD, burnAmount);
}
uint256 remainingBaseBalance = PRESALE_INFO.PRESALE_IN_ETH ? address(this).balance : PRESALE_INFO.B_TOKEN.balanceOf(address(this));
TransferHelper.safeTransferBaseToken(address(PRESALE_INFO.B_TOKEN), PRESALE_INFO.PRESALE_OWNER, remainingBaseBalance, !PRESALE_INFO.PRESALE_IN_ETH);
STATUS.LP_GENERATION_COMPLETE = true;
}
function updateMaxSpendLimit(uint256 _maxSpend) external onlyPresaleOwner {
require(PRESALE_INFO.START_BLOCK > block.number);
PRESALE_INFO.MAX_SPEND_PER_BUYER = _maxSpend;
}
function updateBlocks(uint256 _startBlock, uint256 _endBlock) external onlyPresaleOwner {
require(PRESALE_INFO.START_BLOCK > block.number);
require(_endBlock.sub(_startBlock) <= PRESALE_SETTINGS.getMaxPresaleLength());
PRESALE_INFO.START_BLOCK = _startBlock;
PRESALE_INFO.END_BLOCK = _endBlock;
}
function setWhitelistFlag(bool _flag) external onlyPresaleOwner {
STATUS.WHITELIST_ONLY = _flag;
}
function editWhitelist(address[] memory _users, bool _add) external onlyPresaleOwner {
if (_add) {
for (uint i = 0; i < _users.length; i++) {
WHITELIST.add(_users[i]);
}
} else {
for (uint i = 0; i < _users.length; i++) {
WHITELIST.remove(_users[i]);
}
}
}
function getWhitelistedUsersLength () external view returns (uint256) {
return WHITELIST.length();
}
function getWhitelistedUserAtIndex (uint256 _index) external view returns (address) {
return WHITELIST.at(_index);
}
function getUserWhitelistStatus (address _user) external view returns (bool) {
return WHITELIST.contains(_user);
}
}
文件 4 的 6:ReentrancyGuard.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () internal {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 5 的 6:SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
文件 6 的 6:TransferHelper.sol
pragma solidity 0.6.12;
library TransferHelper {
function safeApprove(address token, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
}
function safeTransferBaseToken(address token, address payable to, uint value, bool isERC20) internal {
if (!isERC20) {
to.transfer(value);
} else {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
}
}
{
"compilationTarget": {
"Presale01.sol": "Presale01"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_presaleGenerator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"BUYERS","outputs":[{"internalType":"uint256","name":"baseDeposited","type":"uint256"},{"internalType":"uint256","name":"tokensOwed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_FEE_INFO","outputs":[{"internalType":"uint256","name":"UNICRYPT_BASE_FEE","type":"uint256"},{"internalType":"uint256","name":"UNICRYPT_TOKEN_FEE","type":"uint256"},{"internalType":"uint256","name":"REFERRAL_FEE","type":"uint256"},{"internalType":"address payable","name":"BASE_FEE_ADDRESS","type":"address"},{"internalType":"address payable","name":"TOKEN_FEE_ADDRESS","type":"address"},{"internalType":"address payable","name":"REFERRAL_FEE_ADDRESS","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_GENERATOR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_INFO","outputs":[{"internalType":"address payable","name":"PRESALE_OWNER","type":"address"},{"internalType":"contract IERC20","name":"S_TOKEN","type":"address"},{"internalType":"contract IERC20","name":"B_TOKEN","type":"address"},{"internalType":"uint256","name":"TOKEN_PRICE","type":"uint256"},{"internalType":"uint256","name":"MAX_SPEND_PER_BUYER","type":"uint256"},{"internalType":"uint256","name":"AMOUNT","type":"uint256"},{"internalType":"uint256","name":"HARDCAP","type":"uint256"},{"internalType":"uint256","name":"SOFTCAP","type":"uint256"},{"internalType":"uint256","name":"LIQUIDITY_PERCENT","type":"uint256"},{"internalType":"uint256","name":"LISTING_RATE","type":"uint256"},{"internalType":"uint256","name":"START_BLOCK","type":"uint256"},{"internalType":"uint256","name":"END_BLOCK","type":"uint256"},{"internalType":"uint256","name":"LOCK_PERIOD","type":"uint256"},{"internalType":"bool","name":"PRESALE_IN_ETH","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_LOCK_FORWARDER","outputs":[{"internalType":"contract IPresaleLockForwarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_SETTINGS","outputs":[{"internalType":"contract IPresaleSettings","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STATUS","outputs":[{"internalType":"bool","name":"WHITELIST_ONLY","type":"bool"},{"internalType":"bool","name":"LP_GENERATION_COMPLETE","type":"bool"},{"internalType":"bool","name":"FORCE_FAILED","type":"bool"},{"internalType":"uint256","name":"TOTAL_BASE_COLLECTED","type":"uint256"},{"internalType":"uint256","name":"TOTAL_TOKENS_SOLD","type":"uint256"},{"internalType":"uint256","name":"TOTAL_TOKENS_WITHDRAWN","type":"uint256"},{"internalType":"uint256","name":"TOTAL_BASE_WITHDRAWN","type":"uint256"},{"internalType":"uint256","name":"ROUND1_LENGTH","type":"uint256"},{"internalType":"uint256","name":"NUM_BUYERS","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNI_FACTORY","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"bool","name":"_add","type":"bool"}],"name":"editWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceFailByUnicrypt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceFailIfPairExists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserWhitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getWhitelistedUserAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistedUsersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_presaleOwner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"},{"internalType":"uint256","name":"_maxEthPerBuyer","type":"uint256"},{"internalType":"uint256","name":"_hardcap","type":"uint256"},{"internalType":"uint256","name":"_softcap","type":"uint256"},{"internalType":"uint256","name":"_liquidityPercent","type":"uint256"},{"internalType":"uint256","name":"_listingRate","type":"uint256"},{"internalType":"uint256","name":"_startblock","type":"uint256"},{"internalType":"uint256","name":"_endblock","type":"uint256"},{"internalType":"uint256","name":"_lockPeriod","type":"uint256"}],"name":"init1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_baseToken","type":"address"},{"internalType":"contract IERC20","name":"_presaleToken","type":"address"},{"internalType":"uint256","name":"_unicryptBaseFee","type":"uint256"},{"internalType":"uint256","name":"_unicryptTokenFee","type":"uint256"},{"internalType":"uint256","name":"_referralFee","type":"uint256"},{"internalType":"address payable","name":"_baseFeeAddress","type":"address"},{"internalType":"address payable","name":"_tokenFeeAddress","type":"address"},{"internalType":"address payable","name":"_referralAddress","type":"address"}],"name":"init2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerWithdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setWhitelistFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"name":"updateBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSpend","type":"uint256"}],"name":"updateMaxSpendLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"userDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"userWithdrawBaseTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userWithdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]