Overview
ETH Balance
0.2048908229807 ETH
Eth Value
$561.81 (@ $2,741.98/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,783 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Max Gas Pric... | 8694123 | 1963 days ago | IN | 0 ETH | 0.00024036 | ||||
Set Max Gas Pric... | 8510029 | 1992 days ago | IN | 0 ETH | 0.00040261 | ||||
Set Max Gas Pric... | 8508952 | 1992 days ago | IN | 0 ETH | 0.00053782 | ||||
Set Max Gas Pric... | 8507865 | 1992 days ago | IN | 0 ETH | 0.00039059 | ||||
Set Max Gas Pric... | 8506796 | 1992 days ago | IN | 0 ETH | 0.00024036 | ||||
Set Max Gas Pric... | 8505738 | 1992 days ago | IN | 0 ETH | 0.00021032 | ||||
Set Max Gas Pric... | 8504688 | 1993 days ago | IN | 0 ETH | 0.00025539 | ||||
Set Max Gas Pric... | 8503613 | 1993 days ago | IN | 0 ETH | 0.00042965 | ||||
Set Max Gas Pric... | 8502562 | 1993 days ago | IN | 0 ETH | 0.00060092 | ||||
Set Max Gas Pric... | 8501492 | 1993 days ago | IN | 0 ETH | 0.00036055 | ||||
Set Max Gas Pric... | 8500387 | 1993 days ago | IN | 0 ETH | 0.00021032 | ||||
Set Max Gas Pric... | 8499279 | 1993 days ago | IN | 0 ETH | 0.00011992 | ||||
Set Max Gas Pric... | 8498204 | 1994 days ago | IN | 0 ETH | 0.00027041 | ||||
Set Max Gas Pric... | 8497129 | 1994 days ago | IN | 0 ETH | 0.00060092 | ||||
Set Max Gas Pric... | 8496063 | 1994 days ago | IN | 0 ETH | 0.00060092 | ||||
Set Max Gas Pric... | 8495008 | 1994 days ago | IN | 0 ETH | 0.00048073 | ||||
Set Max Gas Pric... | 8494013 | 1994 days ago | IN | 0 ETH | 0.00030046 | ||||
Set Max Gas Pric... | 8492919 | 1994 days ago | IN | 0 ETH | 0.00011992 | ||||
Set Max Gas Pric... | 8491865 | 1995 days ago | IN | 0 ETH | 0.00011992 | ||||
Set Max Gas Pric... | 8490802 | 1995 days ago | IN | 0 ETH | 0.00060092 | ||||
Set Max Gas Pric... | 8489717 | 1995 days ago | IN | 0 ETH | 0.00054082 | ||||
Set Max Gas Pric... | 8488655 | 1995 days ago | IN | 0 ETH | 0.00031848 | ||||
Set Max Gas Pric... | 8487579 | 1995 days ago | IN | 0 ETH | 0.00024036 | ||||
Set Max Gas Pric... | 8486468 | 1995 days ago | IN | 0 ETH | 0.00012892 | ||||
Set Max Gas Pric... | 8485388 | 1996 days ago | IN | 0 ETH | 0.00011992 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
8009939 | 2070 days ago | 0.05589309 ETH | ||||
7395933 | 2165 days ago | 0 ETH | ||||
7395933 | 2165 days ago | 0 ETH | ||||
7395933 | 2165 days ago | 0 ETH | ||||
7395933 | 2165 days ago | 0 ETH | ||||
7394313 | 2166 days ago | 0.00137663 ETH | ||||
7394313 | 2166 days ago | 0.00137663 ETH | ||||
7394313 | 2166 days ago | 0.0041299 ETH | ||||
7394313 | 2166 days ago | 0.01238971 ETH | ||||
7387687 | 2167 days ago | 0 ETH | ||||
7387687 | 2167 days ago | 0 ETH | ||||
7387687 | 2167 days ago | 0.00000001 ETH | ||||
7387687 | 2167 days ago | 0.00000003 ETH | ||||
7387602 | 2167 days ago | 0.00000002 ETH | ||||
7387602 | 2167 days ago | 0.00000002 ETH | ||||
7387602 | 2167 days ago | 0.00000006 ETH | ||||
7387602 | 2167 days ago | 0.00000018 ETH | ||||
7386795 | 2167 days ago | 0.00000009 ETH | ||||
7386795 | 2167 days ago | 0.00000009 ETH | ||||
7386795 | 2167 days ago | 0.00000029 ETH | ||||
7386795 | 2167 days ago | 0.00000088 ETH | ||||
7386528 | 2167 days ago | 0.00000001 ETH | ||||
7386528 | 2167 days ago | 0.00000001 ETH | ||||
7386528 | 2167 days ago | 0.00000004 ETH | ||||
7386528 | 2167 days ago | 0.00000014 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
EtheramaCore
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-12-18 */ pragma solidity ^0.4.25; contract IStdToken { function balanceOf(address _owner) public view returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); function transferFrom(address _from, address _to, uint256 _value) public returns(bool); } contract EtheramaCommon { //main adrministrators of the Etherama network mapping(address => bool) private _administrators; //main managers of the Etherama network mapping(address => bool) private _managers; modifier onlyAdministrator() { require(_administrators[msg.sender]); _; } modifier onlyAdministratorOrManager() { require(_administrators[msg.sender] || _managers[msg.sender]); _; } constructor() public { _administrators[msg.sender] = true; } function addAdministator(address addr) onlyAdministrator public { _administrators[addr] = true; } function removeAdministator(address addr) onlyAdministrator public { _administrators[addr] = false; } function isAdministrator(address addr) public view returns (bool) { return _administrators[addr]; } function addManager(address addr) onlyAdministrator public { _managers[addr] = true; } function removeManager(address addr) onlyAdministrator public { _managers[addr] = false; } function isManager(address addr) public view returns (bool) { return _managers[addr]; } } contract EtheramaGasPriceLimit is EtheramaCommon { uint256 public MAX_GAS_PRICE = 0 wei; event onSetMaxGasPrice(uint256 val); //max gas price modifier for buy/sell transactions in order to avoid a "front runner" vulnerability. //It is applied to all network contracts modifier validGasPrice(uint256 val) { require(val > 0); _; } constructor(uint256 maxGasPrice) public validGasPrice(maxGasPrice) { setMaxGasPrice(maxGasPrice); } //only main administators or managers can set max gas price function setMaxGasPrice(uint256 val) public validGasPrice(val) onlyAdministratorOrManager { MAX_GAS_PRICE = val; emit onSetMaxGasPrice(val); } } // Core contract for Etherama network contract EtheramaCore is EtheramaGasPriceLimit { uint256 constant public MAGNITUDE = 2**64; // Max and min amount of tokens which can be bought or sold. There are such limits because of math precision uint256 constant public MIN_TOKEN_DEAL_VAL = 0.1 ether; uint256 constant public MAX_TOKEN_DEAL_VAL = 1000000 ether; // same same for ETH uint256 constant public MIN_ETH_DEAL_VAL = 0.001 ether; uint256 constant public MAX_ETH_DEAL_VAL = 200000 ether; // percent of a transaction commission which is taken for Big Promo bonus uint256 public _bigPromoPercent = 5 ether; // percent of a transaction commission which is taken for Quick Promo bonus uint256 public _quickPromoPercent = 5 ether; // percent of a transaction commission which is taken for Etherama DEV team uint256 public _devRewardPercent = 15 ether; // percent of a transaction commission which is taken for Token Owner. uint256 public _tokenOwnerRewardPercent = 30 ether; // percent of a transaction commission which is taken for share reward. Each token holder receives a small reward from each buy or sell transaction proportionally his holding. uint256 public _shareRewardPercent = 25 ether; // percent of a transaction commission which is taken for a feraral link owner. If there is no any referal then this part of commission goes to share reward. uint256 public _refBonusPercent = 20 ether; // interval of blocks for Big Promo bonus. It means that a user which buy a bunch of tokens for X ETH in that particular block will receive a special bonus uint128 public _bigPromoBlockInterval = 9999; // same same for Quick Promo uint128 public _quickPromoBlockInterval = 100; // minimum eth amount of a purchase which is required to participate in promo. uint256 public _promoMinPurchaseEth = 1 ether; // minimum eth purchase which is required to get a referal link. uint256 public _minRefEthPurchase = 0.5 ether; // percent of fee which is supposed to distribute. uint256 public _totalIncomeFeePercent = 100 ether; // current collected big promo bonus uint256 public _currentBigPromoBonus; // current collected quick promo bonus uint256 public _currentQuickPromoBonus; uint256 public _devReward; uint256 public _initBlockNum; mapping(address => bool) private _controllerContracts; mapping(uint256 => address) private _controllerIndexer; uint256 private _controllerContractCount; //user token balances per data contracts mapping(address => mapping(address => uint256)) private _userTokenLocalBalances; //user reward payouts per data contracts mapping(address => mapping(address => uint256)) private _rewardPayouts; //user ref rewards per data contracts mapping(address => mapping(address => uint256)) private _refBalances; //user won quick promo bonuses per data contracts mapping(address => mapping(address => uint256)) private _promoQuickBonuses; //user won big promo bonuses per data contracts mapping(address => mapping(address => uint256)) private _promoBigBonuses; //user saldo between buys and sels in eth per data contracts mapping(address => mapping(address => uint256)) private _userEthVolumeSaldos; //bonuses per share per data contracts mapping(address => uint256) private _bonusesPerShare; //buy counts per data contracts mapping(address => uint256) private _buyCounts; //sell counts per data contracts mapping(address => uint256) private _sellCounts; //total volume eth per data contracts mapping(address => uint256) private _totalVolumeEth; //total volume tokens per data contracts mapping(address => uint256) private _totalVolumeToken; event onWithdrawUserBonus(address indexed userAddress, uint256 ethWithdrawn); modifier onlyController() { require(_controllerContracts[msg.sender]); _; } constructor(uint256 maxGasPrice) EtheramaGasPriceLimit(maxGasPrice) public { _initBlockNum = block.number; } function getInitBlockNum() public view returns (uint256) { return _initBlockNum; } function addControllerContract(address addr) onlyAdministrator public { _controllerContracts[addr] = true; _controllerIndexer[_controllerContractCount] = addr; _controllerContractCount = SafeMath.add(_controllerContractCount, 1); } function removeControllerContract(address addr) onlyAdministrator public { _controllerContracts[addr] = false; } function changeControllerContract(address oldAddr, address newAddress) onlyAdministrator public { _controllerContracts[oldAddr] = false; _controllerContracts[newAddress] = true; } function setBigPromoInterval(uint128 val) onlyAdministrator public { _bigPromoBlockInterval = val; } function setQuickPromoInterval(uint128 val) onlyAdministrator public { _quickPromoBlockInterval = val; } function addBigPromoBonus() onlyController payable public { _currentBigPromoBonus = SafeMath.add(_currentBigPromoBonus, msg.value); } function addQuickPromoBonus() onlyController payable public { _currentQuickPromoBonus = SafeMath.add(_currentQuickPromoBonus, msg.value); } function setPromoMinPurchaseEth(uint256 val) onlyAdministrator public { _promoMinPurchaseEth = val; } function setMinRefEthPurchase(uint256 val) onlyAdministrator public { _minRefEthPurchase = val; } function setTotalIncomeFeePercent(uint256 val) onlyController public { require(val > 0 && val <= 100 ether); _totalIncomeFeePercent = val; } // set reward persentages of buy/sell fee. Token owner cannot take more than 40%. function setRewardPercentages(uint256 tokenOwnerRewardPercent, uint256 shareRewardPercent, uint256 refBonusPercent, uint256 bigPromoPercent, uint256 quickPromoPercent) onlyAdministrator public { require(tokenOwnerRewardPercent <= 40 ether); require(shareRewardPercent <= 100 ether); require(refBonusPercent <= 100 ether); require(bigPromoPercent <= 100 ether); require(quickPromoPercent <= 100 ether); require(tokenOwnerRewardPercent + shareRewardPercent + refBonusPercent + _devRewardPercent + _bigPromoPercent + _quickPromoPercent == 100 ether); _tokenOwnerRewardPercent = tokenOwnerRewardPercent; _shareRewardPercent = shareRewardPercent; _refBonusPercent = refBonusPercent; _bigPromoPercent = bigPromoPercent; _quickPromoPercent = quickPromoPercent; } function payoutQuickBonus(address userAddress) onlyController public { address dataContractAddress = Etherama(msg.sender).getDataContractAddress(); _promoQuickBonuses[dataContractAddress][userAddress] = SafeMath.add(_promoQuickBonuses[dataContractAddress][userAddress], _currentQuickPromoBonus); _currentQuickPromoBonus = 0; } function payoutBigBonus(address userAddress) onlyController public { address dataContractAddress = Etherama(msg.sender).getDataContractAddress(); _promoBigBonuses[dataContractAddress][userAddress] = SafeMath.add(_promoBigBonuses[dataContractAddress][userAddress], _currentBigPromoBonus); _currentBigPromoBonus = 0; } function addDevReward() onlyController payable public { _devReward = SafeMath.add(_devReward, msg.value); } function withdrawDevReward() onlyAdministrator public { uint256 reward = _devReward; _devReward = 0; msg.sender.transfer(reward); } function getBlockNumSinceInit() public view returns(uint256) { return block.number - getInitBlockNum(); } function getQuickPromoRemainingBlocks() public view returns(uint256) { uint256 d = getBlockNumSinceInit() % _quickPromoBlockInterval; d = d == 0 ? _quickPromoBlockInterval : d; return _quickPromoBlockInterval - d; } function getBigPromoRemainingBlocks() public view returns(uint256) { uint256 d = getBlockNumSinceInit() % _bigPromoBlockInterval; d = d == 0 ? _bigPromoBlockInterval : d; return _bigPromoBlockInterval - d; } function getBonusPerShare(address dataContractAddress) public view returns(uint256) { return _bonusesPerShare[dataContractAddress]; } function getTotalBonusPerShare() public view returns (uint256 res) { for (uint256 i = 0; i < _controllerContractCount; i++) { res = SafeMath.add(res, _bonusesPerShare[Etherama(_controllerIndexer[i]).getDataContractAddress()]); } } function addBonusPerShare() onlyController payable public { EtheramaData data = Etherama(msg.sender)._data(); uint256 shareBonus = (msg.value * MAGNITUDE) / data.getTotalTokenSold(); _bonusesPerShare[address(data)] = SafeMath.add(_bonusesPerShare[address(data)], shareBonus); } function getUserRefBalance(address dataContractAddress, address userAddress) public view returns(uint256) { return _refBalances[dataContractAddress][userAddress]; } function getUserRewardPayouts(address dataContractAddress, address userAddress) public view returns(uint256) { return _rewardPayouts[dataContractAddress][userAddress]; } function resetUserRefBalance(address userAddress) onlyController public { resetUserRefBalance(Etherama(msg.sender).getDataContractAddress(), userAddress); } function resetUserRefBalance(address dataContractAddress, address userAddress) internal { _refBalances[dataContractAddress][userAddress] = 0; } function addUserRefBalance(address userAddress) onlyController payable public { address dataContractAddress = Etherama(msg.sender).getDataContractAddress(); _refBalances[dataContractAddress][userAddress] = SafeMath.add(_refBalances[dataContractAddress][userAddress], msg.value); } function addUserRewardPayouts(address userAddress, uint256 val) onlyController public { addUserRewardPayouts(Etherama(msg.sender).getDataContractAddress(), userAddress, val); } function addUserRewardPayouts(address dataContractAddress, address userAddress, uint256 val) internal { _rewardPayouts[dataContractAddress][userAddress] = SafeMath.add(_rewardPayouts[dataContractAddress][userAddress], val); } function resetUserPromoBonus(address userAddress) onlyController public { resetUserPromoBonus(Etherama(msg.sender).getDataContractAddress(), userAddress); } function resetUserPromoBonus(address dataContractAddress, address userAddress) internal { _promoQuickBonuses[dataContractAddress][userAddress] = 0; _promoBigBonuses[dataContractAddress][userAddress] = 0; } function trackBuy(address userAddress, uint256 volEth, uint256 volToken) onlyController public { address dataContractAddress = Etherama(msg.sender).getDataContractAddress(); _buyCounts[dataContractAddress] = SafeMath.add(_buyCounts[dataContractAddress], 1); _userEthVolumeSaldos[dataContractAddress][userAddress] = SafeMath.add(_userEthVolumeSaldos[dataContractAddress][userAddress], volEth); trackTotalVolume(dataContractAddress, volEth, volToken); } function trackSell(address userAddress, uint256 volEth, uint256 volToken) onlyController public { address dataContractAddress = Etherama(msg.sender).getDataContractAddress(); _sellCounts[dataContractAddress] = SafeMath.add(_sellCounts[dataContractAddress], 1); _userEthVolumeSaldos[dataContractAddress][userAddress] = SafeMath.sub(_userEthVolumeSaldos[dataContractAddress][userAddress], volEth); trackTotalVolume(dataContractAddress, volEth, volToken); } function trackTotalVolume(address dataContractAddress, uint256 volEth, uint256 volToken) internal { _totalVolumeEth[dataContractAddress] = SafeMath.add(_totalVolumeEth[dataContractAddress], volEth); _totalVolumeToken[dataContractAddress] = SafeMath.add(_totalVolumeToken[dataContractAddress], volToken); } function getBuyCount(address dataContractAddress) public view returns (uint256) { return _buyCounts[dataContractAddress]; } function getTotalBuyCount() public view returns (uint256 res) { for (uint256 i = 0; i < _controllerContractCount; i++) { res = SafeMath.add(res, _buyCounts[Etherama(_controllerIndexer[i]).getDataContractAddress()]); } } function getSellCount(address dataContractAddress) public view returns (uint256) { return _sellCounts[dataContractAddress]; } function getTotalSellCount() public view returns (uint256 res) { for (uint256 i = 0; i < _controllerContractCount; i++) { res = SafeMath.add(res, _sellCounts[Etherama(_controllerIndexer[i]).getDataContractAddress()]); } } function getTotalVolumeEth(address dataContractAddress) public view returns (uint256) { return _totalVolumeEth[dataContractAddress]; } function getTotalVolumeToken(address dataContractAddress) public view returns (uint256) { return _totalVolumeToken[dataContractAddress]; } function getUserEthVolumeSaldo(address dataContractAddress, address userAddress) public view returns (uint256) { return _userEthVolumeSaldos[dataContractAddress][userAddress]; } function getUserTotalEthVolumeSaldo(address userAddress) public view returns (uint256 res) { for (uint256 i = 0; i < _controllerContractCount; i++) { res = SafeMath.add(res, _userEthVolumeSaldos[Etherama(_controllerIndexer[i]).getDataContractAddress()][userAddress]); } } function getTotalCollectedPromoBonus() public view returns (uint256) { return SafeMath.add(_currentBigPromoBonus, _currentQuickPromoBonus); } function getUserTotalPromoBonus(address dataContractAddress, address userAddress) public view returns (uint256) { return SafeMath.add(_promoQuickBonuses[dataContractAddress][userAddress], _promoBigBonuses[dataContractAddress][userAddress]); } function getUserQuickPromoBonus(address dataContractAddress, address userAddress) public view returns (uint256) { return _promoQuickBonuses[dataContractAddress][userAddress]; } function getUserBigPromoBonus(address dataContractAddress, address userAddress) public view returns (uint256) { return _promoBigBonuses[dataContractAddress][userAddress]; } function getUserTokenLocalBalance(address dataContractAddress, address userAddress) public view returns(uint256) { return _userTokenLocalBalances[dataContractAddress][userAddress]; } function addUserTokenLocalBalance(address userAddress, uint256 val) onlyController public { address dataContractAddress = Etherama(msg.sender).getDataContractAddress(); _userTokenLocalBalances[dataContractAddress][userAddress] = SafeMath.add(_userTokenLocalBalances[dataContractAddress][userAddress], val); } function subUserTokenLocalBalance(address userAddress, uint256 val) onlyController public { address dataContractAddress = Etherama(msg.sender).getDataContractAddress(); _userTokenLocalBalances[dataContractAddress][userAddress] = SafeMath.sub(_userTokenLocalBalances[dataContractAddress][userAddress], val); } function getUserReward(address dataContractAddress, address userAddress, bool incShareBonus, bool incRefBonus, bool incPromoBonus) public view returns(uint256 reward) { EtheramaData data = EtheramaData(dataContractAddress); if (incShareBonus) { reward = data.getBonusPerShare() * data.getActualUserTokenBalance(userAddress); reward = ((reward < data.getUserRewardPayouts(userAddress)) ? 0 : SafeMath.sub(reward, data.getUserRewardPayouts(userAddress))) / MAGNITUDE; } if (incRefBonus) reward = SafeMath.add(reward, data.getUserRefBalance(userAddress)); if (incPromoBonus) reward = SafeMath.add(reward, data.getUserTotalPromoBonus(userAddress)); return reward; } //user's total reward from all the tokens on the table. includes share reward + referal bonus + promo bonus function getUserTotalReward(address userAddress, bool incShareBonus, bool incRefBonus, bool incPromoBonus) public view returns(uint256 res) { for (uint256 i = 0; i < _controllerContractCount; i++) { address dataContractAddress = Etherama(_controllerIndexer[i]).getDataContractAddress(); res = SafeMath.add(res, getUserReward(dataContractAddress, userAddress, incShareBonus, incRefBonus, incPromoBonus)); } } //current user's reward function getCurrentUserReward(bool incRefBonus, bool incPromoBonus) public view returns(uint256) { return getUserTotalReward(msg.sender, true, incRefBonus, incPromoBonus); } //current user's total reward from all the tokens on the table function getCurrentUserTotalReward() public view returns(uint256) { return getUserTotalReward(msg.sender, true, true, true); } //user's share bonus from all the tokens on the table function getCurrentUserShareBonus() public view returns(uint256) { return getUserTotalReward(msg.sender, true, false, false); } //current user's ref bonus from all the tokens on the table function getCurrentUserRefBonus() public view returns(uint256) { return getUserTotalReward(msg.sender, false, true, false); } //current user's promo bonus from all the tokens on the table function getCurrentUserPromoBonus() public view returns(uint256) { return getUserTotalReward(msg.sender, false, false, true); } //is ref link available for the user function isRefAvailable(address refAddress) public view returns(bool) { return getUserTotalEthVolumeSaldo(refAddress) >= _minRefEthPurchase; } //is ref link available for the current user function isRefAvailable() public view returns(bool) { return isRefAvailable(msg.sender); } //Withdraws all of the user earnings. function withdrawUserReward() public { uint256 reward = getRewardAndPrepareWithdraw(); require(reward > 0); msg.sender.transfer(reward); emit onWithdrawUserBonus(msg.sender, reward); } //gather all the user's reward and prepare it to withdaw function getRewardAndPrepareWithdraw() internal returns(uint256 reward) { for (uint256 i = 0; i < _controllerContractCount; i++) { address dataContractAddress = Etherama(_controllerIndexer[i]).getDataContractAddress(); reward = SafeMath.add(reward, getUserReward(dataContractAddress, msg.sender, true, false, false)); // add share reward to payouts addUserRewardPayouts(dataContractAddress, msg.sender, reward * MAGNITUDE); // add ref bonus reward = SafeMath.add(reward, getUserRefBalance(dataContractAddress, msg.sender)); resetUserRefBalance(dataContractAddress, msg.sender); // add promo bonus reward = SafeMath.add(reward, getUserTotalPromoBonus(dataContractAddress, msg.sender)); resetUserPromoBonus(dataContractAddress, msg.sender); } return reward; } //withdaw all the remamining ETH if there is no one active contract. We don't want to leave them here forever function withdrawRemainingEthAfterAll() onlyAdministrator public { for (uint256 i = 0; i < _controllerContractCount; i++) { if (Etherama(_controllerIndexer[i]).isActive()) revert(); } msg.sender.transfer(address(this).balance); } function calcPercent(uint256 amount, uint256 percent) public pure returns(uint256) { return SafeMath.div(SafeMath.mul(SafeMath.div(amount, 100), percent), 1 ether); } //Converts real num to uint256. Works only with positive numbers. function convertRealTo256(int128 realVal) public pure returns(uint256) { int128 roundedVal = RealMath.fromReal(RealMath.mul(realVal, RealMath.toReal(1e12))); return SafeMath.mul(uint256(roundedVal), uint256(1e6)); } //Converts uint256 to real num. Possible a little loose of precision function convert256ToReal(uint256 val) public pure returns(int128) { uint256 intVal = SafeMath.div(val, 1e6); require(RealMath.isUInt256ValidIn64(intVal)); return RealMath.fraction(int64(intVal), 1e12); } } // Data contract for Etherama contract controller. Data contract cannot be changed so no data can be lost. On the other hand Etherama controller can be replaced if some error is found. contract EtheramaData { address public _tokenContractAddress; // token price in the begining uint256 constant public TOKEN_PRICE_INITIAL = 0.001 ether; // a percent of the token price which adds/subs each _priceSpeedInterval tokens uint64 constant public PRICE_SPEED_PERCENT = 5; // Token price speed interval. For instance, if PRICE_SPEED_PERCENT = 5 and PRICE_SPEED_INTERVAL = 10000 it means that after 10000 tokens are bought/sold token price will increase/decrease for 5%. uint64 constant public PRICE_SPEED_INTERVAL = 10000; // lock-up period in days. Until this period is expeired nobody can close the contract or withdraw users' funds uint64 constant public EXP_PERIOD_DAYS = 7; mapping(address => bool) private _administrators; uint256 private _administratorCount; uint64 public _initTime; uint64 public _expirationTime; uint256 public _tokenOwnerReward; uint256 public _totalSupply; int128 public _realTokenPrice; address public _controllerAddress = address(0x0); EtheramaCore public _core; uint256 public _initBlockNum; bool public _hasMaxPurchaseLimit = false; IStdToken public _token; //only main contract modifier onlyController() { require(msg.sender == _controllerAddress); _; } constructor(address coreAddress) public { require(coreAddress != address(0x0)); _core = EtheramaCore(coreAddress); _initBlockNum = block.number; } function init(address tokenContractAddress) public { require(_controllerAddress == address(0x0)); require(tokenContractAddress != address(0x0)); require(EXP_PERIOD_DAYS > 0); require(RealMath.isUInt64ValidIn64(PRICE_SPEED_PERCENT) && PRICE_SPEED_PERCENT > 0); require(RealMath.isUInt64ValidIn64(PRICE_SPEED_INTERVAL) && PRICE_SPEED_INTERVAL > 0); _controllerAddress = msg.sender; _token = IStdToken(tokenContractAddress); _initTime = uint64(now); _expirationTime = _initTime + EXP_PERIOD_DAYS * 1 days; _realTokenPrice = _core.convert256ToReal(TOKEN_PRICE_INITIAL); } function isInited() public view returns(bool) { return (_controllerAddress != address(0x0)); } function getCoreAddress() public view returns(address) { return address(_core); } function setNewControllerAddress(address newAddress) onlyController public { _controllerAddress = newAddress; } function getPromoMinPurchaseEth() public view returns(uint256) { return _core._promoMinPurchaseEth(); } function addAdministator(address addr) onlyController public { _administrators[addr] = true; _administratorCount = SafeMath.add(_administratorCount, 1); } function removeAdministator(address addr) onlyController public { _administrators[addr] = false; _administratorCount = SafeMath.sub(_administratorCount, 1); } function getAdministratorCount() public view returns(uint256) { return _administratorCount; } function isAdministrator(address addr) public view returns(bool) { return _administrators[addr]; } function getCommonInitBlockNum() public view returns (uint256) { return _core.getInitBlockNum(); } function resetTokenOwnerReward() onlyController public { _tokenOwnerReward = 0; } function addTokenOwnerReward(uint256 val) onlyController public { _tokenOwnerReward = SafeMath.add(_tokenOwnerReward, val); } function getCurrentBigPromoBonus() public view returns (uint256) { return _core._currentBigPromoBonus(); } function getCurrentQuickPromoBonus() public view returns (uint256) { return _core._currentQuickPromoBonus(); } function getTotalCollectedPromoBonus() public view returns (uint256) { return _core.getTotalCollectedPromoBonus(); } function setTotalSupply(uint256 val) onlyController public { _totalSupply = val; } function setRealTokenPrice(int128 val) onlyController public { _realTokenPrice = val; } function setHasMaxPurchaseLimit(bool val) onlyController public { _hasMaxPurchaseLimit = val; } function getUserTokenLocalBalance(address userAddress) public view returns(uint256) { return _core.getUserTokenLocalBalance(address(this), userAddress); } function getActualUserTokenBalance(address userAddress) public view returns(uint256) { return SafeMath.min(getUserTokenLocalBalance(userAddress), _token.balanceOf(userAddress)); } function getBonusPerShare() public view returns(uint256) { return _core.getBonusPerShare(address(this)); } function getUserRewardPayouts(address userAddress) public view returns(uint256) { return _core.getUserRewardPayouts(address(this), userAddress); } function getUserRefBalance(address userAddress) public view returns(uint256) { return _core.getUserRefBalance(address(this), userAddress); } function getUserReward(address userAddress, bool incRefBonus, bool incPromoBonus) public view returns(uint256) { return _core.getUserReward(address(this), userAddress, true, incRefBonus, incPromoBonus); } function getUserTotalPromoBonus(address userAddress) public view returns(uint256) { return _core.getUserTotalPromoBonus(address(this), userAddress); } function getUserBigPromoBonus(address userAddress) public view returns(uint256) { return _core.getUserBigPromoBonus(address(this), userAddress); } function getUserQuickPromoBonus(address userAddress) public view returns(uint256) { return _core.getUserQuickPromoBonus(address(this), userAddress); } function getRemainingTokenAmount() public view returns(uint256) { return _token.balanceOf(_controllerAddress); } function getTotalTokenSold() public view returns(uint256) { return _totalSupply - getRemainingTokenAmount(); } function getUserEthVolumeSaldo(address userAddress) public view returns(uint256) { return _core.getUserEthVolumeSaldo(address(this), userAddress); } } contract Etherama { IStdToken public _token; EtheramaData public _data; EtheramaCore public _core; bool public isActive = false; bool public isMigrationToNewControllerInProgress = false; bool public isActualContractVer = true; address public migrationContractAddress = address(0x0); bool public isMigrationApproved = false; address private _creator = address(0x0); event onTokenPurchase(address indexed userAddress, uint256 incomingEth, uint256 tokensMinted, address indexed referredBy); event onTokenSell(address indexed userAddress, uint256 tokensBurned, uint256 ethEarned); event onReinvestment(address indexed userAddress, uint256 ethReinvested, uint256 tokensMinted); event onWithdrawTokenOwnerReward(address indexed toAddress, uint256 ethWithdrawn); event onWinQuickPromo(address indexed userAddress, uint256 ethWon); event onWinBigPromo(address indexed userAddress, uint256 ethWon); // only people with tokens modifier onlyContractUsers() { require(getUserLocalTokenBalance(msg.sender) > 0); _; } // administrators can: // -> change minimal amout of tokens to get a ref link. // administrators CANNOT: // -> take funds // -> disable withdrawals // -> kill the contract // -> change the price of tokens // -> suspend the contract modifier onlyAdministrator() { require(isCurrentUserAdministrator()); _; } //core administrator can only approve contract migration after its code review modifier onlyCoreAdministrator() { require(_core.isAdministrator(msg.sender)); _; } // only active state of the contract. Administator can activate it, but canncon deactive untill lock-up period is expired. modifier onlyActive() { require(isActive); _; } // maximum gas price for buy/sell transactions to avoid "front runner" vulnerability. modifier validGasPrice() { require(tx.gasprice <= _core.MAX_GAS_PRICE()); _; } // eth value must be greater than 0 for purchase transactions modifier validPayableValue() { require(msg.value > 0); _; } modifier onlyCoreContract() { require(msg.sender == _data.getCoreAddress()); _; } // tokenContractAddress - tranding token address // dataContractAddress - data contract address where all the data is collected and separated from the controller constructor(address tokenContractAddress, address dataContractAddress) public { require(dataContractAddress != address(0x0)); _data = EtheramaData(dataContractAddress); if (!_data.isInited()) { _data.init(tokenContractAddress); _data.addAdministator(msg.sender); _creator = msg.sender; } _token = _data._token(); _core = _data._core(); } function addAdministator(address addr) onlyAdministrator public { _data.addAdministator(addr); } function removeAdministator(address addr) onlyAdministrator public { _data.removeAdministator(addr); } // transfer ownership request of the contract to token owner from contract creator. The new administator has to accept ownership to finish the transferring. function transferOwnershipRequest(address addr) onlyAdministrator public { addAdministator(addr); } // accept transfer ownership. function acceptOwnership() onlyAdministrator public { require(_creator != address(0x0)); removeAdministator(_creator); require(_data.getAdministratorCount() == 1); } // if there is a maximim purchase limit then a user can buy only amount of tokens which he had before, not more. function setHasMaxPurchaseLimit(bool val) onlyAdministrator public { _data.setHasMaxPurchaseLimit(val); } // activate the controller contract. After calling this function anybody can start trading the contrant's tokens function activate() onlyAdministrator public { require(!isActive); if (getTotalTokenSupply() == 0) setTotalSupply(); require(getTotalTokenSupply() > 0); isActive = true; isMigrationToNewControllerInProgress = false; } // Close the contract and withdraw all the funds. The contract cannot be closed before lock up period is expired. function finish() onlyActive onlyAdministrator public { require(uint64(now) >= _data._expirationTime()); _token.transfer(msg.sender, getRemainingTokenAmount()); msg.sender.transfer(getTotalEthBalance()); isActive = false; } //Converts incoming eth to tokens function buy(address refAddress, uint256 minReturn) onlyActive validGasPrice validPayableValue public payable returns(uint256) { return purchaseTokens(msg.value, refAddress, minReturn); } //sell tokens for eth. before call this func you have to call "approve" in the ERC20 token contract function sell(uint256 tokenAmount, uint256 minReturn) onlyActive onlyContractUsers validGasPrice public returns(uint256) { if (tokenAmount > getCurrentUserLocalTokenBalance() || tokenAmount == 0) return 0; uint256 ethAmount = 0; uint256 totalFeeEth = 0; uint256 tokenPrice = 0; (ethAmount, totalFeeEth, tokenPrice) = estimateSellOrder(tokenAmount, true); require(ethAmount >= minReturn); subUserTokens(msg.sender, tokenAmount); msg.sender.transfer(ethAmount); updateTokenPrice(-_core.convert256ToReal(tokenAmount)); distributeFee(totalFeeEth, address(0x0)); _core.trackSell(msg.sender, ethAmount, tokenAmount); emit onTokenSell(msg.sender, tokenAmount, ethAmount); return ethAmount; } //Fallback function to handle eth that was sent straight to the contract function() onlyActive validGasPrice validPayableValue payable external { purchaseTokens(msg.value, address(0x0), 1); } // withdraw token owner's reward function withdrawTokenOwnerReward() onlyAdministrator public { uint256 reward = getTokenOwnerReward(); require(reward > 0); _data.resetTokenOwnerReward(); msg.sender.transfer(reward); emit onWithdrawTokenOwnerReward(msg.sender, reward); } // prepare the contract for migration to another one in case of some errors or refining function prepareForMigration() onlyAdministrator public { require(!isMigrationToNewControllerInProgress); isMigrationToNewControllerInProgress = true; } // accept funds transfer to a new controller during a migration. function migrateFunds() payable public { require(isMigrationToNewControllerInProgress); } //HELPERS // max gas price for buy/sell transactions function getMaxGasPrice() public view returns(uint256) { return _core.MAX_GAS_PRICE(); } // max gas price for buy/sell transactions function getExpirationTime() public view returns (uint256) { return _data._expirationTime(); } // time till lock-up period is expired function getRemainingTimeTillExpiration() public view returns (uint256) { if (_data._expirationTime() <= uint64(now)) return 0; return _data._expirationTime() - uint64(now); } function isCurrentUserAdministrator() public view returns(bool) { return _data.isAdministrator(msg.sender); } //data contract address where all the data is holded function getDataContractAddress() public view returns(address) { return address(_data); } // get trading token contract address function getTokenAddress() public view returns(address) { return address(_token); } // request migration to new contract. After request Etherama dev team should review its code and approve it if it is OK function requestControllerContractMigration(address newControllerAddr) onlyAdministrator public { require(!isMigrationApproved); migrationContractAddress = newControllerAddr; } // Dev team gives a pervission to updagrade the contract after code review, transfer all the funds, activate new abilities or fix some errors. function approveControllerContractMigration() onlyCoreAdministrator public { isMigrationApproved = true; } //migrate to new controller contract in case of some mistake in the contract and transfer there all the tokens and eth. It can be done only after code review by Etherama developers. function migrateToNewNewControllerContract() onlyAdministrator public { require(isMigrationApproved && migrationContractAddress != address(0x0) && isActualContractVer); isActive = false; Etherama newController = Etherama(address(migrationContractAddress)); _data.setNewControllerAddress(migrationContractAddress); uint256 remainingTokenAmount = getRemainingTokenAmount(); uint256 ethBalance = getTotalEthBalance(); if (remainingTokenAmount > 0) _token.transfer(migrationContractAddress, remainingTokenAmount); if (ethBalance > 0) newController.migrateFunds.value(ethBalance)(); isActualContractVer = false; } //total buy count function getBuyCount() public view returns(uint256) { return _core.getBuyCount(address(this)); } //total sell count function getSellCount() public view returns(uint256) { return _core.getSellCount(address(this)); } //total eth volume function getTotalVolumeEth() public view returns(uint256) { return _core.getTotalVolumeEth(address(this)); } //total token volume function getTotalVolumeToken() public view returns(uint256) { return _core.getTotalVolumeToken(address(this)); } //current bonus per 1 token in ETH function getBonusPerShare() public view returns (uint256) { return SafeMath.div(SafeMath.mul(_data.getBonusPerShare(), 1 ether), _core.MAGNITUDE()); } //token initial price in ETH function getTokenInitialPrice() public view returns(uint256) { return _data.TOKEN_PRICE_INITIAL(); } function getDevRewardPercent() public view returns(uint256) { return _core._devRewardPercent(); } function getTokenOwnerRewardPercent() public view returns(uint256) { return _core._tokenOwnerRewardPercent(); } function getShareRewardPercent() public view returns(uint256) { return _core._shareRewardPercent(); } function getRefBonusPercent() public view returns(uint256) { return _core._refBonusPercent(); } function getBigPromoPercent() public view returns(uint256) { return _core._bigPromoPercent(); } function getQuickPromoPercent() public view returns(uint256) { return _core._quickPromoPercent(); } function getBigPromoBlockInterval() public view returns(uint256) { return _core._bigPromoBlockInterval(); } function getQuickPromoBlockInterval() public view returns(uint256) { return _core._quickPromoBlockInterval(); } function getPromoMinPurchaseEth() public view returns(uint256) { return _core._promoMinPurchaseEth(); } function getPriceSpeedPercent() public view returns(uint64) { return _data.PRICE_SPEED_PERCENT(); } function getPriceSpeedTokenBlock() public view returns(uint64) { return _data.PRICE_SPEED_INTERVAL(); } function getMinRefEthPurchase() public view returns (uint256) { return _core._minRefEthPurchase(); } function getTotalCollectedPromoBonus() public view returns (uint256) { return _data.getTotalCollectedPromoBonus(); } function getCurrentBigPromoBonus() public view returns (uint256) { return _data.getCurrentBigPromoBonus(); } function getCurrentQuickPromoBonus() public view returns (uint256) { return _data.getCurrentQuickPromoBonus(); } //current token price function getCurrentTokenPrice() public view returns(uint256) { return _core.convertRealTo256(_data._realTokenPrice()); } //contract's eth balance function getTotalEthBalance() public view returns(uint256) { return address(this).balance; } //amount of tokens which were funded to the contract initially function getTotalTokenSupply() public view returns(uint256) { return _data._totalSupply(); } //amount of tokens which are still available for selling on the contract function getRemainingTokenAmount() public view returns(uint256) { return _token.balanceOf(address(this)); } //amount of tokens which where sold by the contract function getTotalTokenSold() public view returns(uint256) { return getTotalTokenSupply() - getRemainingTokenAmount(); } //user's token amount which were bought from the contract function getUserLocalTokenBalance(address userAddress) public view returns(uint256) { return _data.getUserTokenLocalBalance(userAddress); } //current user's token amount which were bought from the contract function getCurrentUserLocalTokenBalance() public view returns(uint256) { return getUserLocalTokenBalance(msg.sender); } //is referal link available for the current user function isCurrentUserRefAvailable() public view returns(bool) { return _core.isRefAvailable(); } function getCurrentUserRefBonus() public view returns(uint256) { return _data.getUserRefBalance(msg.sender); } function getCurrentUserPromoBonus() public view returns(uint256) { return _data.getUserTotalPromoBonus(msg.sender); } //max and min values of a deal in tokens function getTokenDealRange() public view returns(uint256, uint256) { return (_core.MIN_TOKEN_DEAL_VAL(), _core.MAX_TOKEN_DEAL_VAL()); } //max and min values of a deal in ETH function getEthDealRange() public view returns(uint256, uint256) { uint256 minTokenVal; uint256 maxTokenVal; (minTokenVal, maxTokenVal) = getTokenDealRange(); return ( SafeMath.max(_core.MIN_ETH_DEAL_VAL(), tokensToEth(minTokenVal, true)), SafeMath.min(_core.MAX_ETH_DEAL_VAL(), tokensToEth(maxTokenVal, true)) ); } //user's total reward from all the tokens on the table. includes share reward + referal bonus + promo bonus function getUserReward(address userAddress, bool isTotal) public view returns(uint256) { return isTotal ? _core.getUserTotalReward(userAddress, true, true, true) : _data.getUserReward(userAddress, true, true); } //price for selling 1 token. mostly useful only for frontend function get1TokenSellPrice() public view returns(uint256) { uint256 tokenAmount = 1 ether; uint256 ethAmount = 0; uint256 totalFeeEth = 0; uint256 tokenPrice = 0; (ethAmount, totalFeeEth, tokenPrice) = estimateSellOrder(tokenAmount, true); return ethAmount; } //price for buying 1 token. mostly useful only for frontend function get1TokenBuyPrice() public view returns(uint256) { uint256 ethAmount = 1 ether; uint256 tokenAmount = 0; uint256 totalFeeEth = 0; uint256 tokenPrice = 0; (tokenAmount, totalFeeEth, tokenPrice) = estimateBuyOrder(ethAmount, true); return SafeMath.div(ethAmount * 1 ether, tokenAmount); } //calc current reward for holding @tokenAmount tokens function calcReward(uint256 tokenAmount) public view returns(uint256) { return (uint256) ((int256)(_data.getBonusPerShare() * tokenAmount)) / _core.MAGNITUDE(); } //esimate buy order by amount of ETH/tokens. returns tokens/eth amount after the deal, total fee in ETH and average token price function estimateBuyOrder(uint256 amount, bool fromEth) public view returns(uint256, uint256, uint256) { uint256 minAmount; uint256 maxAmount; (minAmount, maxAmount) = fromEth ? getEthDealRange() : getTokenDealRange(); //require(amount >= minAmount && amount <= maxAmount); uint256 ethAmount = fromEth ? amount : tokensToEth(amount, true); require(ethAmount > 0); uint256 tokenAmount = fromEth ? ethToTokens(amount, true) : amount; uint256 totalFeeEth = calcTotalFee(tokenAmount, true); require(ethAmount > totalFeeEth); uint256 tokenPrice = SafeMath.div(ethAmount * 1 ether, tokenAmount); return (fromEth ? tokenAmount : SafeMath.add(ethAmount, totalFeeEth), totalFeeEth, tokenPrice); } //esimate sell order by amount of tokens/ETH. returns eth/tokens amount after the deal, total fee in ETH and average token price function estimateSellOrder(uint256 amount, bool fromToken) public view returns(uint256, uint256, uint256) { uint256 minAmount; uint256 maxAmount; (minAmount, maxAmount) = fromToken ? getTokenDealRange() : getEthDealRange(); //require(amount >= minAmount && amount <= maxAmount); uint256 tokenAmount = fromToken ? amount : ethToTokens(amount, false); require(tokenAmount > 0); uint256 ethAmount = fromToken ? tokensToEth(tokenAmount, false) : amount; uint256 totalFeeEth = calcTotalFee(tokenAmount, false); require(ethAmount > totalFeeEth); uint256 tokenPrice = SafeMath.div(ethAmount * 1 ether, tokenAmount); return (fromToken ? ethAmount : tokenAmount, totalFeeEth, tokenPrice); } //returns max user's purchase limit in tokens if _hasMaxPurchaseLimit pamam is set true. If it is a user cannot by more tokens that hs already bought on some other exchange function getUserMaxPurchase(address userAddress) public view returns(uint256) { return _token.balanceOf(userAddress) - SafeMath.mul(getUserLocalTokenBalance(userAddress), 2); } //current urser's max purchase limit in tokens function getCurrentUserMaxPurchase() public view returns(uint256) { return getUserMaxPurchase(msg.sender); } //token owener collected reward function getTokenOwnerReward() public view returns(uint256) { return _data._tokenOwnerReward(); } //current user's won promo bonuses function getCurrentUserTotalPromoBonus() public view returns(uint256) { return _data.getUserTotalPromoBonus(msg.sender); } //current user's won big promo bonuses function getCurrentUserBigPromoBonus() public view returns(uint256) { return _data.getUserBigPromoBonus(msg.sender); } //current user's won quick promo bonuses function getCurrentUserQuickPromoBonus() public view returns(uint256) { return _data.getUserQuickPromoBonus(msg.sender); } //amount of block since core contract is deployed function getBlockNumSinceInit() public view returns(uint256) { return _core.getBlockNumSinceInit(); } //remaing amount of blocks to win a quick promo bonus function getQuickPromoRemainingBlocks() public view returns(uint256) { return _core.getQuickPromoRemainingBlocks(); } //remaing amount of blocks to win a big promo bonus function getBigPromoRemainingBlocks() public view returns(uint256) { return _core.getBigPromoRemainingBlocks(); } // INTERNAL FUNCTIONS function purchaseTokens(uint256 ethAmount, address refAddress, uint256 minReturn) internal returns(uint256) { uint256 tokenAmount = 0; uint256 totalFeeEth = 0; uint256 tokenPrice = 0; (tokenAmount, totalFeeEth, tokenPrice) = estimateBuyOrder(ethAmount, true); require(tokenAmount >= minReturn); if (_data._hasMaxPurchaseLimit()) { //user has to have at least equal amount of tokens which he's willing to buy require(getCurrentUserMaxPurchase() >= tokenAmount); } require(tokenAmount > 0 && (SafeMath.add(tokenAmount, getTotalTokenSold()) > getTotalTokenSold())); if (refAddress == msg.sender || !_core.isRefAvailable(refAddress)) refAddress = address(0x0); distributeFee(totalFeeEth, refAddress); addUserTokens(msg.sender, tokenAmount); // the user is not going to receive any reward for the current purchase _core.addUserRewardPayouts(msg.sender, _data.getBonusPerShare() * tokenAmount); checkAndSendPromoBonus(ethAmount); updateTokenPrice(_core.convert256ToReal(tokenAmount)); _core.trackBuy(msg.sender, ethAmount, tokenAmount); emit onTokenPurchase(msg.sender, ethAmount, tokenAmount, refAddress); return tokenAmount; } function setTotalSupply() internal { require(_data._totalSupply() == 0); uint256 tokenAmount = _token.balanceOf(address(this)); _data.setTotalSupply(tokenAmount); } function checkAndSendPromoBonus(uint256 purchaseAmountEth) internal { if (purchaseAmountEth < _data.getPromoMinPurchaseEth()) return; if (getQuickPromoRemainingBlocks() == 0) sendQuickPromoBonus(); if (getBigPromoRemainingBlocks() == 0) sendBigPromoBonus(); } function sendQuickPromoBonus() internal { _core.payoutQuickBonus(msg.sender); emit onWinQuickPromo(msg.sender, _data.getCurrentQuickPromoBonus()); } function sendBigPromoBonus() internal { _core.payoutBigBonus(msg.sender); emit onWinBigPromo(msg.sender, _data.getCurrentBigPromoBonus()); } function distributeFee(uint256 totalFeeEth, address refAddress) internal { addProfitPerShare(totalFeeEth, refAddress); addDevReward(totalFeeEth); addTokenOwnerReward(totalFeeEth); addBigPromoBonus(totalFeeEth); addQuickPromoBonus(totalFeeEth); } function addProfitPerShare(uint256 totalFeeEth, address refAddress) internal { uint256 refBonus = calcRefBonus(totalFeeEth); uint256 totalShareReward = calcTotalShareRewardFee(totalFeeEth); if (refAddress != address(0x0)) { _core.addUserRefBalance.value(refBonus)(refAddress); } else { totalShareReward = SafeMath.add(totalShareReward, refBonus); } if (getTotalTokenSold() == 0) { _data.addTokenOwnerReward(totalShareReward); } else { _core.addBonusPerShare.value(totalShareReward)(); } } function addDevReward(uint256 totalFeeEth) internal { _core.addDevReward.value(calcDevReward(totalFeeEth))(); } function addTokenOwnerReward(uint256 totalFeeEth) internal { _data.addTokenOwnerReward(calcTokenOwnerReward(totalFeeEth)); } function addBigPromoBonus(uint256 totalFeeEth) internal { _core.addBigPromoBonus.value(calcBigPromoBonus(totalFeeEth))(); } function addQuickPromoBonus(uint256 totalFeeEth) internal { _core.addQuickPromoBonus.value(calcQuickPromoBonus(totalFeeEth))(); } function addUserTokens(address user, uint256 tokenAmount) internal { _core.addUserTokenLocalBalance(user, tokenAmount); _token.transfer(msg.sender, tokenAmount); } function subUserTokens(address user, uint256 tokenAmount) internal { _core.subUserTokenLocalBalance(user, tokenAmount); _token.transferFrom(user, address(this), tokenAmount); } function updateTokenPrice(int128 realTokenAmount) public { _data.setRealTokenPrice(calc1RealTokenRateFromRealTokens(realTokenAmount)); } function ethToTokens(uint256 ethAmount, bool isBuy) internal view returns(uint256) { int128 realEthAmount = _core.convert256ToReal(ethAmount); int128 t0 = RealMath.div(realEthAmount, _data._realTokenPrice()); int128 s = getRealPriceSpeed(); int128 tn = RealMath.div(t0, RealMath.toReal(100)); for (uint i = 0; i < 100; i++) { int128 tns = RealMath.mul(tn, s); int128 exptns = RealMath.exp( RealMath.mul(tns, RealMath.toReal(isBuy ? int64(1) : int64(-1))) ); int128 tn1 = RealMath.div( RealMath.mul( RealMath.mul(tns, tn), exptns ) + t0, RealMath.mul( exptns, RealMath.toReal(1) + tns ) ); if (RealMath.abs(tn-tn1) < RealMath.fraction(1, 1e18)) break; tn = tn1; } return _core.convertRealTo256(tn); } function tokensToEth(uint256 tokenAmount, bool isBuy) internal view returns(uint256) { int128 realTokenAmount = _core.convert256ToReal(tokenAmount); int128 s = getRealPriceSpeed(); int128 expArg = RealMath.mul(RealMath.mul(realTokenAmount, s), RealMath.toReal(isBuy ? int64(1) : int64(-1))); int128 realEthAmountFor1Token = RealMath.mul(_data._realTokenPrice(), RealMath.exp(expArg)); int128 realEthAmount = RealMath.mul(realTokenAmount, realEthAmountFor1Token); return _core.convertRealTo256(realEthAmount); } function calcTotalFee(uint256 tokenAmount, bool isBuy) internal view returns(uint256) { int128 realTokenAmount = _core.convert256ToReal(tokenAmount); int128 factor = RealMath.toReal(isBuy ? int64(1) : int64(-1)); int128 rateAfterDeal = calc1RealTokenRateFromRealTokens(RealMath.mul(realTokenAmount, factor)); int128 delta = RealMath.div(rateAfterDeal - _data._realTokenPrice(), RealMath.toReal(2)); int128 fee = RealMath.mul(realTokenAmount, delta); //commission for sells is a bit lower due to rounding error if (!isBuy) fee = RealMath.mul(fee, RealMath.fraction(95, 100)); return _core.calcPercent(_core.convertRealTo256(RealMath.mul(fee, factor)), _core._totalIncomeFeePercent()); } function calc1RealTokenRateFromRealTokens(int128 realTokenAmount) internal view returns(int128) { int128 expArg = RealMath.mul(realTokenAmount, getRealPriceSpeed()); return RealMath.mul(_data._realTokenPrice(), RealMath.exp(expArg)); } function getRealPriceSpeed() internal view returns(int128) { require(RealMath.isUInt64ValidIn64(_data.PRICE_SPEED_PERCENT())); require(RealMath.isUInt64ValidIn64(_data.PRICE_SPEED_INTERVAL())); return RealMath.div(RealMath.fraction(int64(_data.PRICE_SPEED_PERCENT()), 100), RealMath.toReal(int64(_data.PRICE_SPEED_INTERVAL()))); } function calcTotalShareRewardFee(uint256 totalFee) internal view returns(uint256) { return _core.calcPercent(totalFee, _core._shareRewardPercent()); } function calcRefBonus(uint256 totalFee) internal view returns(uint256) { return _core.calcPercent(totalFee, _core._refBonusPercent()); } function calcTokenOwnerReward(uint256 totalFee) internal view returns(uint256) { return _core.calcPercent(totalFee, _core._tokenOwnerRewardPercent()); } function calcDevReward(uint256 totalFee) internal view returns(uint256) { return _core.calcPercent(totalFee, _core._devRewardPercent()); } function calcQuickPromoBonus(uint256 totalFee) internal view returns(uint256) { return _core.calcPercent(totalFee, _core._quickPromoPercent()); } function calcBigPromoBonus(uint256 totalFee) internal view returns(uint256) { return _core.calcPercent(totalFee, _core._bigPromoPercent()); } } library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ 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; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function max(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? b : a; } } //taken from https://github.com/NovakDistributed/macroverse/blob/master/contracts/RealMath.sol and a bit modified library RealMath { int64 constant MIN_INT64 = int64((uint64(1) << 63)); int64 constant MAX_INT64 = int64(~((uint64(1) << 63))); /** * How many total bits are there? */ int256 constant REAL_BITS = 128; /** * How many fractional bits are there? */ int256 constant REAL_FBITS = 64; /** * How many integer bits are there? */ int256 constant REAL_IBITS = REAL_BITS - REAL_FBITS; /** * What's the first non-fractional bit */ int128 constant REAL_ONE = int128(1) << REAL_FBITS; /** * What's the last fractional bit? */ int128 constant REAL_HALF = REAL_ONE >> 1; /** * What's two? Two is pretty useful. */ int128 constant REAL_TWO = REAL_ONE << 1; /** * And our logarithms are based on ln(2). */ int128 constant REAL_LN_TWO = 762123384786; /** * It is also useful to have Pi around. */ int128 constant REAL_PI = 3454217652358; /** * And half Pi, to save on divides. * TODO: That might not be how the compiler handles constants. */ int128 constant REAL_HALF_PI = 1727108826179; /** * And two pi, which happens to be odd in its most accurate representation. */ int128 constant REAL_TWO_PI = 6908435304715; /** * What's the sign bit? */ int128 constant SIGN_MASK = int128(1) << 127; function getMinInt64() internal pure returns (int64) { return MIN_INT64; } function getMaxInt64() internal pure returns (int64) { return MAX_INT64; } function isUInt256ValidIn64(uint256 val) internal pure returns (bool) { return val >= 0 && val <= uint256(getMaxInt64()); } function isInt256ValidIn64(int256 val) internal pure returns (bool) { return val >= int256(getMinInt64()) && val <= int256(getMaxInt64()); } function isUInt64ValidIn64(uint64 val) internal pure returns (bool) { return val >= 0 && val <= uint64(getMaxInt64()); } function isInt128ValidIn64(int128 val) internal pure returns (bool) { return val >= int128(getMinInt64()) && val <= int128(getMaxInt64()); } /** * Convert an integer to a real. Preserves sign. */ function toReal(int64 ipart) internal pure returns (int128) { return int128(ipart) * REAL_ONE; } /** * Convert a real to an integer. Preserves sign. */ function fromReal(int128 real_value) internal pure returns (int64) { int128 intVal = real_value / REAL_ONE; require(isInt128ValidIn64(intVal)); return int64(intVal); } /** * Get the absolute value of a real. Just the same as abs on a normal int128. */ function abs(int128 real_value) internal pure returns (int128) { if (real_value > 0) { return real_value; } else { return -real_value; } } /** * Get the fractional part of a real, as a real. Ignores sign (so fpart(-0.5) is 0.5). */ function fpart(int128 real_value) internal pure returns (int128) { // This gets the fractional part but strips the sign return abs(real_value) % REAL_ONE; } /** * Get the fractional part of a real, as a real. Respects sign (so fpartSigned(-0.5) is -0.5). */ function fpartSigned(int128 real_value) internal pure returns (int128) { // This gets the fractional part but strips the sign int128 fractional = fpart(real_value); return real_value < 0 ? -fractional : fractional; } /** * Get the integer part of a fixed point value. */ function ipart(int128 real_value) internal pure returns (int128) { // Subtract out the fractional part to get the real part. return real_value - fpartSigned(real_value); } /** * Multiply one real by another. Truncates overflows. */ function mul(int128 real_a, int128 real_b) internal pure returns (int128) { // When multiplying fixed point in x.y and z.w formats we get (x+z).(y+w) format. // So we just have to clip off the extra REAL_FBITS fractional bits. return int128((int256(real_a) * int256(real_b)) >> REAL_FBITS); } /** * Divide one real by another real. Truncates overflows. */ function div(int128 real_numerator, int128 real_denominator) internal pure returns (int128) { // We use the reverse of the multiplication trick: convert numerator from // x.y to (x+z).(y+w) fixed point, then divide by denom in z.w fixed point. return int128((int256(real_numerator) * REAL_ONE) / int256(real_denominator)); } /** * Create a real from a rational fraction. */ function fraction(int64 numerator, int64 denominator) internal pure returns (int128) { return div(toReal(numerator), toReal(denominator)); } // Now we have some fancy math things (like pow and trig stuff). This isn't // in the RealMath that was deployed with the original Macroverse // deployment, so it needs to be linked into your contract statically. /** * Raise a number to a positive integer power in O(log power) time. * See <https://stackoverflow.com/a/101613> */ function ipow(int128 real_base, int64 exponent) internal pure returns (int128) { if (exponent < 0) { // Negative powers are not allowed here. revert(); } // Start with the 0th power int128 real_result = REAL_ONE; while (exponent != 0) { // While there are still bits set if ((exponent & 0x1) == 0x1) { // If the low bit is set, multiply in the (many-times-squared) base real_result = mul(real_result, real_base); } // Shift off the low bit exponent = exponent >> 1; // Do the squaring real_base = mul(real_base, real_base); } // Return the final result. return real_result; } /** * Zero all but the highest set bit of a number. * See <https://stackoverflow.com/a/53184> */ function hibit(uint256 val) internal pure returns (uint256) { // Set all the bits below the highest set bit val |= (val >> 1); val |= (val >> 2); val |= (val >> 4); val |= (val >> 8); val |= (val >> 16); val |= (val >> 32); val |= (val >> 64); val |= (val >> 128); return val ^ (val >> 1); } /** * Given a number with one bit set, finds the index of that bit. */ function findbit(uint256 val) internal pure returns (uint8 index) { index = 0; // We and the value with alternating bit patters of various pitches to find it. if (val & 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA != 0) { // Picth 1 index |= 1; } if (val & 0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC != 0) { // Pitch 2 index |= 2; } if (val & 0xF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 != 0) { // Pitch 4 index |= 4; } if (val & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00 != 0) { // Pitch 8 index |= 8; } if (val & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 != 0) { // Pitch 16 index |= 16; } if (val & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000 != 0) { // Pitch 32 index |= 32; } if (val & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000 != 0) { // Pitch 64 index |= 64; } if (val & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 != 0) { // Pitch 128 index |= 128; } } /** * Shift real_arg left or right until it is between 1 and 2. Return the * rescaled value, and the number of bits of right shift applied. Shift may be negative. * * Expresses real_arg as real_scaled * 2^shift, setting shift to put real_arg between [1 and 2). * * Rejects 0 or negative arguments. */ function rescale(int128 real_arg) internal pure returns (int128 real_scaled, int64 shift) { if (real_arg <= 0) { // Not in domain! revert(); } require(isInt256ValidIn64(REAL_FBITS)); // Find the high bit int64 high_bit = findbit(hibit(uint256(real_arg))); // We'll shift so the high bit is the lowest non-fractional bit. shift = high_bit - int64(REAL_FBITS); if (shift < 0) { // Shift left real_scaled = real_arg << -shift; } else if (shift >= 0) { // Shift right real_scaled = real_arg >> shift; } } /** * Calculate the natural log of a number. Rescales the input value and uses * the algorithm outlined at <https://math.stackexchange.com/a/977836> and * the ipow implementation. * * Lets you artificially limit the number of iterations. * * Note that it is potentially possible to get an un-converged value; lack * of convergence does not throw. */ function lnLimited(int128 real_arg, int max_iterations) internal pure returns (int128) { if (real_arg <= 0) { // Outside of acceptable domain revert(); } if (real_arg == REAL_ONE) { // Handle this case specially because people will want exactly 0 and // not ~2^-39 ish. return 0; } // We know it's positive, so rescale it to be between [1 and 2) int128 real_rescaled; int64 shift; (real_rescaled, shift) = rescale(real_arg); // Compute the argument to iterate on int128 real_series_arg = div(real_rescaled - REAL_ONE, real_rescaled + REAL_ONE); // We will accumulate the result here int128 real_series_result = 0; for (int64 n = 0; n < max_iterations; n++) { // Compute term n of the series int128 real_term = div(ipow(real_series_arg, 2 * n + 1), toReal(2 * n + 1)); // And add it in real_series_result += real_term; if (real_term == 0) { // We must have converged. Next term is too small to represent. break; } // If we somehow never converge I guess we will run out of gas } // Double it to account for the factor of 2 outside the sum real_series_result = mul(real_series_result, REAL_TWO); // Now compute and return the overall result return mul(toReal(shift), REAL_LN_TWO) + real_series_result; } /** * Calculate a natural logarithm with a sensible maximum iteration count to * wait until convergence. Note that it is potentially possible to get an * un-converged value; lack of convergence does not throw. */ function ln(int128 real_arg) internal pure returns (int128) { return lnLimited(real_arg, 100); } /** * Calculate e^x. Uses the series given at * <http://pages.mtu.edu/~shene/COURSES/cs201/NOTES/chap04/exp.html>. * * Lets you artificially limit the number of iterations. * * Note that it is potentially possible to get an un-converged value; lack * of convergence does not throw. */ function expLimited(int128 real_arg, int max_iterations) internal pure returns (int128) { // We will accumulate the result here int128 real_result = 0; // We use this to save work computing terms int128 real_term = REAL_ONE; for (int64 n = 0; n < max_iterations; n++) { // Add in the term real_result += real_term; // Compute the next term real_term = mul(real_term, div(real_arg, toReal(n + 1))); if (real_term == 0) { // We must have converged. Next term is too small to represent. break; } // If we somehow never converge I guess we will run out of gas } // Return the result return real_result; } function expLimited(int128 real_arg, int max_iterations, int k) internal pure returns (int128) { // We will accumulate the result here int128 real_result = 0; // We use this to save work computing terms int128 real_term = REAL_ONE; for (int64 n = 0; n < max_iterations; n++) { // Add in the term real_result += real_term; // Compute the next term real_term = mul(real_term, div(real_arg, toReal(n + 1))); if (real_term == 0) { // We must have converged. Next term is too small to represent. break; } if (n == k) return real_term; // If we somehow never converge I guess we will run out of gas } // Return the result return real_result; } /** * Calculate e^x with a sensible maximum iteration count to wait until * convergence. Note that it is potentially possible to get an un-converged * value; lack of convergence does not throw. */ function exp(int128 real_arg) internal pure returns (int128) { return expLimited(real_arg, 100); } /** * Raise any number to any power, except for negative bases to fractional powers. */ function pow(int128 real_base, int128 real_exponent) internal pure returns (int128) { if (real_exponent == 0) { // Anything to the 0 is 1 return REAL_ONE; } if (real_base == 0) { if (real_exponent < 0) { // Outside of domain! revert(); } // Otherwise it's 0 return 0; } if (fpart(real_exponent) == 0) { // Anything (even a negative base) is super easy to do to an integer power. if (real_exponent > 0) { // Positive integer power is easy return ipow(real_base, fromReal(real_exponent)); } else { // Negative integer power is harder return div(REAL_ONE, ipow(real_base, fromReal(-real_exponent))); } } if (real_base < 0) { // It's a negative base to a non-integer power. // In general pow(-x^y) is undefined, unless y is an int or some // weird rational-number-based relationship holds. revert(); } // If it's not a special case, actually do it. return exp(mul(real_exponent, ln(real_base))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"isAdministrator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"addBonusPerShare","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"_refBonusPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBlockNumSinceInit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"amount","type":"uint256"},{"name":"percent","type":"uint256"}],"name":"calcPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"addBigPromoBonus","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"_shareRewardPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"val","type":"uint256"}],"name":"convert256ToReal","outputs":[{"name":"","type":"int128"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"_initBlockNum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalBuyCount","outputs":[{"name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitBlockNum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"}],"name":"payoutBigBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"addManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"addControllerContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_devReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"}],"name":"payoutQuickBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setPromoMinPurchaseEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"},{"name":"userAddress","type":"address"}],"name":"getUserTotalPromoBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"},{"name":"userAddress","type":"address"}],"name":"getUserTokenLocalBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"addAdministator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentUserPromoBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_tokenOwnerRewardPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBigPromoRemainingBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawUserReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentUserShareBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_devRewardPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint128"}],"name":"setQuickPromoInterval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MIN_TOKEN_DEAL_VAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"},{"name":"userAddress","type":"address"}],"name":"getUserRewardPayouts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalCollectedPromoBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_currentBigPromoBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isRefAvailable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalSellCount","outputs":[{"name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_quickPromoPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAGNITUDE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"}],"name":"resetUserRefBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_bigPromoBlockInterval","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"},{"name":"val","type":"uint256"}],"name":"subUserTokenLocalBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"},{"name":"userAddress","type":"address"}],"name":"getUserQuickPromoBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"},{"name":"volEth","type":"uint256"},{"name":"volToken","type":"uint256"}],"name":"trackBuy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MIN_ETH_DEAL_VAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_minRefEthPurchase","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"},{"name":"incShareBonus","type":"bool"},{"name":"incRefBonus","type":"bool"},{"name":"incPromoBonus","type":"bool"}],"name":"getUserTotalReward","outputs":[{"name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"addQuickPromoBonus","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setMinRefEthPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"removeAdministator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_totalIncomeFeePercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint128"}],"name":"setBigPromoInterval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"}],"name":"addUserRefBalance","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"}],"name":"getTotalVolumeToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"}],"name":"getTotalVolumeEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"oldAddr","type":"address"},{"name":"newAddress","type":"address"}],"name":"changeControllerContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_bigPromoPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawRemainingEthAfterAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"addDevReward","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOKEN_DEAL_VAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"},{"name":"val","type":"uint256"}],"name":"addUserTokenLocalBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenOwnerRewardPercent","type":"uint256"},{"name":"shareRewardPercent","type":"uint256"},{"name":"refBonusPercent","type":"uint256"},{"name":"bigPromoPercent","type":"uint256"},{"name":"quickPromoPercent","type":"uint256"}],"name":"setRewardPercentages","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"removeManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"},{"name":"volEth","type":"uint256"},{"name":"volToken","type":"uint256"}],"name":"trackSell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_ETH_DEAL_VAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentUserRefBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"}],"name":"getUserTotalEthVolumeSaldo","outputs":[{"name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"},{"name":"userAddress","type":"address"}],"name":"getUserEthVolumeSaldo","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalBonusPerShare","outputs":[{"name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentUserTotalReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"}],"name":"getSellCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"},{"name":"userAddress","type":"address"},{"name":"incShareBonus","type":"bool"},{"name":"incRefBonus","type":"bool"},{"name":"incPromoBonus","type":"bool"}],"name":"getUserReward","outputs":[{"name":"reward","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setMaxGasPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"}],"name":"resetUserPromoBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"}],"name":"getBuyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"}],"name":"getBonusPerShare","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"realVal","type":"int128"}],"name":"convertRealTo256","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"_quickPromoBlockInterval","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_GAS_PRICE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"incRefBonus","type":"bool"},{"name":"incPromoBonus","type":"bool"}],"name":"getCurrentUserReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"removeControllerContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_currentQuickPromoBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawDevReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getQuickPromoRemainingBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"isManager","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setTotalIncomeFeePercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_promoMinPurchaseEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"userAddress","type":"address"},{"name":"val","type":"uint256"}],"name":"addUserRewardPayouts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"refAddress","type":"address"}],"name":"isRefAvailable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"},{"name":"userAddress","type":"address"}],"name":"getUserRefBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"dataContractAddress","type":"address"},{"name":"userAddress","type":"address"}],"name":"getUserBigPromoBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"maxGasPrice","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"userAddress","type":"address"},{"indexed":false,"name":"ethWithdrawn","type":"uint256"}],"name":"onWithdrawUserBonus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"val","type":"uint256"}],"name":"onSetMaxGasPrice","type":"event"}]
Contract Creation Code
60806040526000600255674563918244f40000600381905560045567d02ab486cedc00006005556801a055690d9db8000060065568015af1d78b58c400006007556801158e460913d00000600855600980547064000000000000000000000000000000006001608060020a031990911661270f176001608060020a0316179055670de0b6b3a7640000600a556706f05b59d3b20000600b5568056bc75e2d63100000600c55348015620000b157600080fd5b5060405160208062002f2283398101604090815290513360009081526020819052918220805460ff1916600117905590819081908111620000f157600080fd5b620001058264010000000062000112810204565b5050436010555062000197565b80600081116200012157600080fd5b3360009081526020819052604090205460ff16806200014f57503360009081526001602052604090205460ff165b15156200015b57600080fd5b60028290556040805183815290517f9b105d64420eb156c9cf6f732d45a844ac6df11f50e696d64c8c4e3a5ed5be999181900360200190a15050565b612d7b80620001a76000396000f3006080604052600436106103d95763ffffffff60e060020a6000350416630a2eb30181146103de5780630f90058714610413578063111081f81461041d57806311a153df146104445780631500214e14610459578063195d06ff146104745780631bde12481461047c5780631e2273a71461049157806321fdb91a146104c257806326b7d803146104d75780632797e0c3146104ec5780632ab6a50e146105015780632d06177a146105225780632e2bac04146105435780632feb7c0b14610564578063312220bc14610579578063320bebaa1461059a578063361cc3ab146105b25780633be4ee30146105d95780633dc19db8146106005780633f8a04aa1461062157806344c403671461063657806345a48de61461064b5780634fe71e951461066057806352441d7d14610675578063584451f21461068a5780635e7051cd1461069f578063627e25b1146106c057806364adc403146106d557806365863b24146106fc57806366dec260146107115780636860dc1f1461072657806368faaa6f1461073b57806369ae4de0146107505780636d3036a7146107655780636f62cba31461077a578063707c5c4c1461079b5780637442f427146107cc5780637eee6d1f146107f057806380870bc11461081757806384ad50241461083e57806384e221c614610853578063854772ea1461086857806387451d521461089857806387d87090146108a057806389c7abfd146108b857806390cc5564146108d957806391e863ca146108ee57806392093e7d1461090f5780639455924f1461092357806398163597146109445780639e985ea614610965578063a37fdf7f1461098c578063a545ff0c146109a1578063a64b0b62146109b6578063a66be478146109be578063a731c4ec146109d3578063a76188b9146109f7578063ac18de4314610a1b578063aff7bd4914610a3c578063b1b6f19e14610a63578063c0a843a114610a78578063c36a7b4514610a8d578063c6c332f214610aae578063cc361cc414610ad5578063cf69443c14610aea578063cfc5e7c814610aff578063d1042e3114610b20578063d2fa635e14610b56578063d3bd5a4b14610b6e578063d489c0bf14610b8f578063d71db8aa14610bb0578063d8fcfd6b14610bd1578063e2c0d1dc14610bec578063e3bbb4f114610c01578063e68e64cb14610c16578063ed0e92e514610c35578063f039c3b614610c56578063f12a158014610c6b578063f34d22d014610c80578063f3ae241514610c95578063f47073f414610cb6578063f7c5615914610cce578063f8a0cdee14610ce3578063f8ab02dd14610d07578063f9e9d34a14610d28578063ff82b17414610d4f575b600080fd5b3480156103ea57600080fd5b506103ff600160a060020a0360043516610d76565b604080519115158252519081900360200190f35b61041b610d94565b005b34801561042957600080fd5b50610432610f06565b60408051918252519081900360200190f35b34801561045057600080fd5b50610432610f0c565b34801561046557600080fd5b50610432600435602435610f1d565b61041b610f4b565b34801561048857600080fd5b50610432610f7a565b34801561049d57600080fd5b506104a9600435610f80565b60408051600f92830b90920b8252519081900360200190f35b3480156104ce57600080fd5b50610432610fbe565b3480156104e357600080fd5b50610432610fc4565b3480156104f857600080fd5b50610432611086565b34801561050d57600080fd5b5061041b600160a060020a036004351661108c565b34801561052e57600080fd5b5061041b600160a060020a0360043516611178565b34801561054f57600080fd5b5061041b600160a060020a03600435166111bd565b34801561057057600080fd5b50610432611241565b34801561058557600080fd5b5061041b600160a060020a0360043516611247565b3480156105a657600080fd5b5061041b600435611333565b3480156105be57600080fd5b50610432600160a060020a0360043581169060243516611356565b3480156105e557600080fd5b50610432600160a060020a036004358116906024351661139d565b34801561060c57600080fd5b5061041b600160a060020a03600435166113c8565b34801561062d57600080fd5b5061043261140a565b34801561064257600080fd5b5061043261141f565b34801561065757600080fd5b50610432611425565b34801561066c57600080fd5b5061041b611476565b34801561068157600080fd5b506104326114f6565b34801561069657600080fd5b50610432611506565b3480156106ab57600080fd5b5061041b6001608060020a036004351661150c565b3480156106cc57600080fd5b50610432611556565b3480156106e157600080fd5b50610432600160a060020a0360043581169060243516611562565b34801561070857600080fd5b5061043261158d565b34801561071d57600080fd5b5061043261159d565b34801561073257600080fd5b506103ff6115a3565b34801561074757600080fd5b506104326115ae565b34801561075c57600080fd5b50610432611621565b34801561077157600080fd5b50610432611627565b34801561078657600080fd5b5061041b600160a060020a0360043516611634565b3480156107a757600080fd5b506107b06116c8565b604080516001608060020a039092168252519081900360200190f35b3480156107d857600080fd5b5061041b600160a060020a03600435166024356116d7565b3480156107fc57600080fd5b50610432600160a060020a03600435811690602435166117c1565b34801561082357600080fd5b5061041b600160a060020a03600435166024356044356117ec565b34801561084a57600080fd5b5061043261190e565b34801561085f57600080fd5b50610432611919565b34801561087457600080fd5b50610432600160a060020a036004351660243515156044351515606435151561191f565b61041b6119de565b3480156108ac57600080fd5b5061041b600435611a0d565b3480156108c457600080fd5b5061041b600160a060020a0360043516611a30565b3480156108e557600080fd5b50610432611a6f565b3480156108fa57600080fd5b5061041b6001608060020a0360043516611a75565b61041b600160a060020a0360043516611abe565b34801561092f57600080fd5b50610432600160a060020a0360043516611ba4565b34801561095057600080fd5b50610432600160a060020a0360043516611bbf565b34801561097157600080fd5b5061041b600160a060020a0360043581169060243516611bda565b34801561099857600080fd5b50610432611c33565b3480156109ad57600080fd5b5061041b611c39565b61041b611d3f565b3480156109ca57600080fd5b50610432611d6e565b3480156109df57600080fd5b5061041b600160a060020a0360043516602435611d7c565b348015610a0357600080fd5b5061041b600435602435604435606435608435611e37565b348015610a2757600080fd5b5061041b600160a060020a0360043516611f01565b348015610a4857600080fd5b5061041b600160a060020a0360043516602435604435611f40565b348015610a6f57600080fd5b5061043261202b565b348015610a8457600080fd5b50610432612039565b348015610a9957600080fd5b50610432600160a060020a036004351661204a565b348015610aba57600080fd5b50610432600160a060020a0360043581169060243516612118565b348015610ae157600080fd5b50610432612143565b348015610af657600080fd5b506104326121b6565b348015610b0b57600080fd5b50610432600160a060020a03600435166121c6565b348015610b2c57600080fd5b50610432600160a060020a03600435811690602435166044351515606435151560843515156121e1565b348015610b6257600080fd5b5061041b60043561254f565b348015610b7a57600080fd5b5061041b600160a060020a03600435166125d1565b348015610b9b57600080fd5b50610432600160a060020a0360043516612662565b348015610bbc57600080fd5b50610432600160a060020a036004351661267d565b348015610bdd57600080fd5b50610432600435600f0b612698565b348015610bf857600080fd5b506107b06126cf565b348015610c0d57600080fd5b506104326126f2565b348015610c2257600080fd5b50610432600435151560243515156126f8565b348015610c4157600080fd5b5061041b600160a060020a0360043516612707565b348015610c6257600080fd5b50610432612746565b348015610c7757600080fd5b5061041b61274c565b348015610c8c57600080fd5b506104326127a3565b348015610ca157600080fd5b506103ff600160a060020a0360043516612830565b348015610cc257600080fd5b5061041b60043561284e565b348015610cda57600080fd5b50610432612895565b348015610cef57600080fd5b5061041b600160a060020a036004351660243561289b565b348015610d1357600080fd5b506103ff600160a060020a036004351661292d565b348015610d3457600080fd5b50610432600160a060020a0360043581169060243516612943565b348015610d5b57600080fd5b50610432600160a060020a036004358116906024351661296e565b600160a060020a031660009081526020819052604090205460ff1690565b33600090815260116020526040812054819060ff161515610db457600080fd5b33600160a060020a03166368beab3f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b505050506040513d6020811015610e1c57600080fd5b5051604080517f2ecd70200000000000000000000000000000000000000000000000000000000081529051919350600160a060020a03841691632ecd7020916004808201926020929091908290030181600087803b158015610e7d57600080fd5b505af1158015610e91573d6000803e3d6000fd5b505050506040513d6020811015610ea757600080fd5b5051346801000000000000000002811515610ebe57fe5b600160a060020a0384166000908152601a60205260409020549190049150610ee69082612999565b600160a060020a039092166000908152601a602052604090209190915550565b60085481565b6000610f16611086565b4303905090565b6000610f44610f36610f308560646129b3565b846129ca565b670de0b6b3a76400006129b3565b9392505050565b3360009081526011602052604090205460ff161515610f6957600080fd5b610f75600d5434612999565b600d55565b60075481565b600080610f9083620f42406129b3565b9050610f9b816129f5565b1515610fa657600080fd5b610fb58164e8d4a51000612a17565b91505b50919050565b60105481565b6000805b60135481101561108257600081815260126020908152604080832054815160e060020a6361e91ea10281529151611078948794601b949193600160a060020a0316926361e91ea192600480820193929182900301818787803b15801561102d57600080fd5b505af1158015611041573d6000803e3d6000fd5b505050506040513d602081101561105757600080fd5b5051600160a060020a03168152602081019190915260400160002054612999565b9150600101610fc8565b5090565b60105490565b3360009081526011602052604081205460ff1615156110aa57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110e857600080fd5b505af11580156110fc573d6000803e3d6000fd5b505050506040513d602081101561111257600080fd5b5051600160a060020a03808216600090815260186020908152604080832093871683529290522054600d5491925061114991612999565b600160a060020a0391821660009081526018602090815260408083209590941682529390935290822055600d55565b3360009081526020819052604090205460ff16151561119657600080fd5b600160a060020a03166000908152600160208190526040909120805460ff19169091179055565b3360009081526020819052604090205460ff1615156111db57600080fd5b600160a060020a0381166000818152601160209081526040808320805460ff1916600190811790915560138054855260129093529220805473ffffffffffffffffffffffffffffffffffffffff1916909317909255905461123b91612999565b60135550565b600f5481565b3360009081526011602052604081205460ff16151561126557600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156112a357600080fd5b505af11580156112b7573d6000803e3d6000fd5b505050506040513d60208110156112cd57600080fd5b5051600160a060020a03808216600090815260176020908152604080832093871683529290522054600e5491925061130491612999565b600160a060020a0391821660009081526017602090815260408083209590941682529390935290822055600e55565b3360009081526020819052604090205460ff16151561135157600080fd5b600a55565b600160a060020a038083166000818152601760209081526040808320948616808452948252808320549383526018825280832094835293905291822054610f449190612999565b600160a060020a03918216600090815260146020908152604080832093909416825291909152205490565b3360009081526020819052604090205460ff1615156113e657600080fd5b600160a060020a03166000908152602081905260409020805460ff19166001179055565b600061141a33600080600161191f565b905090565b60065481565b60095460009081906001608060020a031661143e610f0c565b81151561144757fe5b06905080156114565780611463565b6009546001608060020a03165b6009546001608060020a03160392915050565b6000611480612a33565b90506000811161148f57600080fd5b604051339082156108fc029083906000818181858888f193505050501580156114bc573d6000803e3d6000fd5b5060408051828152905133917f1ecd44a58dbf0e65ca0f30fb71142a15dc0df81e3c74e25f19405b616cf75d3c919081900360200190a250565b600061141a33600160008061191f565b60055481565b3360009081526020819052604090205460ff16151561152a57600080fd5b600980546001608060020a03928316700100000000000000000000000000000000029216919091179055565b67016345785d8a000081565b600160a060020a03918216600090815260156020908152604080832093909416825291909152205490565b600061141a600d54600e54612999565b600d5481565b600061141a3361292d565b6000805b60135481101561108257600081815260126020908152604080832054815160e060020a6361e91ea10281529151611617948794601c949193600160a060020a0316926361e91ea192600480820193929182900301818787803b15801561102d57600080fd5b91506001016115b2565b60045481565b6801000000000000000081565b3360009081526011602052604090205460ff16151561165257600080fd5b6116c533600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561169357600080fd5b505af11580156116a7573d6000803e3d6000fd5b505050506040513d60208110156116bd57600080fd5b505182612b34565b50565b6009546001608060020a031681565b3360009081526011602052604081205460ff1615156116f557600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561173357600080fd5b505af1158015611747573d6000803e3d6000fd5b505050506040513d602081101561175d57600080fd5b5051600160a060020a038082166000908152601460209081526040808320938816835292905220549091506117929083612b60565b600160a060020a0391821660009081526014602090815260408083209690941682529490945292209190915550565b600160a060020a03918216600090815260176020908152604080832093909416825291909152205490565b3360009081526011602052604081205460ff16151561180a57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b505050506040513d602081101561187257600080fd5b5051600160a060020a0381166000908152601b602052604090205490915061189b906001612999565b600160a060020a038083166000908152601b60209081526040808320949094556019815283822092881682529190915220546118d79084612999565b600160a060020a03808316600090815260196020908152604080832093891683529290522055611908818484612b72565b50505050565b66038d7ea4c6800081565b600b5481565b600080805b6013548210156119d457600082815260126020908152604080832054815160e060020a6361e91ea10281529151600160a060020a03909116936361e91ea193600480850194919392918390030190829087803b15801561198357600080fd5b505af1158015611997573d6000803e3d6000fd5b505050506040513d60208110156119ad57600080fd5b505190506119c7836119c2838a8a8a8a6121e1565b612999565b9250600190910190611924565b5050949350505050565b3360009081526011602052604090205460ff1615156119fc57600080fd5b611a08600e5434612999565b600e55565b3360009081526020819052604090205460ff161515611a2b57600080fd5b600b55565b3360009081526020819052604090205460ff161515611a4e57600080fd5b600160a060020a03166000908152602081905260409020805460ff19169055565b600c5481565b3360009081526020819052604090205460ff161515611a9357600080fd5b600980546fffffffffffffffffffffffffffffffff19166001608060020a0392909216919091179055565b3360009081526011602052604081205460ff161515611adc57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611b1a57600080fd5b505af1158015611b2e573d6000803e3d6000fd5b505050506040513d6020811015611b4457600080fd5b5051600160a060020a03808216600090815260166020908152604080832093871683529290522054909150611b799034612999565b600160a060020a03918216600090815260166020908152604080832095909416825293909352912055565b600160a060020a03166000908152601e602052604090205490565b600160a060020a03166000908152601d602052604090205490565b3360009081526020819052604090205460ff161515611bf857600080fd5b600160a060020a03918216600090815260116020526040808220805460ff199081169091559290931681529190912080549091166001179055565b60035481565b3360009081526020819052604081205460ff161515611c5757600080fd5b5060005b601354811015611d0e5760008181526012602090815260408083205481517f22f3e2d40000000000000000000000000000000000000000000000000000000081529151600160a060020a03909116936322f3e2d493600480850194919392918390030190829087803b158015611cd057600080fd5b505af1158015611ce4573d6000803e3d6000fd5b505050506040513d6020811015611cfa57600080fd5b505115611d0657600080fd5b600101611c5b565b6040513390303180156108fc02916000818181858888f19350505050158015611d3b573d6000803e3d6000fd5b5050565b3360009081526011602052604090205460ff161515611d5d57600080fd5b611d69600f5434612999565b600f55565b69d3c21bcecceda100000081565b3360009081526011602052604081205460ff161515611d9a57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611dd857600080fd5b505af1158015611dec573d6000803e3d6000fd5b505050506040513d6020811015611e0257600080fd5b5051600160a060020a038082166000908152601460209081526040808320938816835292905220549091506117929083612999565b3360009081526020819052604090205460ff161515611e5557600080fd5b68022b1c8c1227a00000851115611e6b57600080fd5b68056bc75e2d63100000841115611e8157600080fd5b68056bc75e2d63100000831115611e9757600080fd5b68056bc75e2d63100000821115611ead57600080fd5b68056bc75e2d63100000811115611ec357600080fd5b600454600354600554858789010101010168056bc75e2d63100000141515611eea57600080fd5b600694909455600792909255600855600355600455565b3360009081526020819052604090205460ff161515611f1f57600080fd5b600160a060020a03166000908152600160205260409020805460ff19169055565b3360009081526011602052604081205460ff161515611f5e57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611f9c57600080fd5b505af1158015611fb0573d6000803e3d6000fd5b505050506040513d6020811015611fc657600080fd5b5051600160a060020a0381166000908152601c6020526040902054909150611fef906001612999565b600160a060020a038083166000908152601c60209081526040808320949094556019815283822092881682529190915220546118d79084612b60565b692a5a058fc295ed00000081565b600061141a3360006001600061191f565b6000805b601354811015610fb857600081815260126020908152604080832054815160e060020a6361e91ea1028152915161210e9487946019949193600160a060020a0316926361e91ea192600480820193929182900301818787803b1580156120b357600080fd5b505af11580156120c7573d6000803e3d6000fd5b505050506040513d60208110156120dd57600080fd5b5051600160a060020a0390811682526020828101939093526040918201600090812091891681529252902054612999565b915060010161204e565b600160a060020a03918216600090815260196020908152604080832093909416825291909152205490565b6000805b60135481101561108257600081815260126020908152604080832054815160e060020a6361e91ea102815291516121ac948794601a949193600160a060020a0316926361e91ea192600480820193929182900301818787803b15801561102d57600080fd5b9150600101612147565b600061141a33600180600161191f565b600160a060020a03166000908152601c602052604090205490565b60008584156124445780600160a060020a03166355eb27c8876040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b505050506040513d602081101561226f57600080fd5b5051604080517fa67c27300000000000000000000000000000000000000000000000000000000081529051600160a060020a0384169163a67c27309160048083019260209291908290030181600087803b1580156122cc57600080fd5b505af11580156122e0573d6000803e3d6000fd5b505050506040513d60208110156122f657600080fd5b5051604080517f2865dc2e000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301529151939092029450680100000000000000009290841691632865dc2e9160248083019260209291908290030181600087803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b505050506040513d602081101561239757600080fd5b505183106124345761242f8383600160a060020a0316632865dc2e8a6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050506040513d602081101561242857600080fd5b5051612b60565b612437565b60005b81151561244057fe5b0491505b83156124dd576124da8282600160a060020a03166324bdf96a896040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156124a957600080fd5b505af11580156124bd573d6000803e3d6000fd5b505050506040513d60208110156124d357600080fd5b5051612999565b91505b8215612545576125428282600160a060020a03166364004ea5896040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156124a957600080fd5b91505b5095945050505050565b806000811161255d57600080fd5b3360009081526020819052604090205460ff168061258a57503360009081526001602052604090205460ff165b151561259557600080fd5b60028290556040805183815290517f9b105d64420eb156c9cf6f732d45a844ac6df11f50e696d64c8c4e3a5ed5be999181900360200190a15050565b3360009081526011602052604090205460ff1615156125ef57600080fd5b6116c533600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561263057600080fd5b505af1158015612644573d6000803e3d6000fd5b505050506040513d602081101561265a57600080fd5b505182612be5565b600160a060020a03166000908152601b602052604090205490565b600160a060020a03166000908152601a602052604090205490565b6000806126ba6126b5846126b064e8d4a51000612c27565b612c38565b612c50565b60070b9050610fb581600f0b620f42406129ca565b60095470010000000000000000000000000000000090046001608060020a031681565b60025481565b6000610f44336001858561191f565b3360009081526020819052604090205460ff16151561272557600080fd5b600160a060020a03166000908152601160205260409020805460ff19169055565b600e5481565b3360009081526020819052604081205460ff16151561276a57600080fd5b50600f80546000918290556040519091339183156108fc0291849190818181858888f19350505050158015611d3b573d6000803e3d6000fd5b600954600090819070010000000000000000000000000000000090046001608060020a03166127d0610f0c565b8115156127d957fe5b06905080156127e85780612809565b60095470010000000000000000000000000000000090046001608060020a03165b60095470010000000000000000000000000000000090046001608060020a03160392915050565b600160a060020a031660009081526001602052604090205460ff1690565b3360009081526011602052604090205460ff16151561286c57600080fd5b600081118015612885575068056bc75e2d631000008111155b151561289057600080fd5b600c55565b600a5481565b3360009081526011602052604090205460ff1615156128b957600080fd5b611d3b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156128fa57600080fd5b505af115801561290e573d6000803e3d6000fd5b505050506040513d602081101561292457600080fd5b50518383612c76565b6000600b5461293b8361204a565b101592915050565b600160a060020a03918216600090815260166020908152604080832093909416825291909152205490565b600160a060020a03918216600090815260186020908152604080832093909416825291909152205490565b6000828201838110156129a857fe5b8091505b5092915050565b60008082848115156129c157fe5b04949350505050565b6000808315156129dd57600091506129ac565b508282028284828115156129ed57fe5b04146129a857fe5b6000808210158015612a115750612a0a612cd7565b60070b8211155b92915050565b6000610f44612a2584612c27565b612a2e84612c27565b612ce4565b600080805b601354821015612b2f57600082815260126020908152604080832054815160e060020a6361e91ea10281529151600160a060020a03909116936361e91ea193600480850194919392918390030190829087803b158015612a9757600080fd5b505af1158015612aab573d6000803e3d6000fd5b505050506040513d6020811015612ac157600080fd5b50519050612ad8836119c2833360016000806121e1565b9250612af08133680100000000000000008602612c76565b612afe836119c28333612943565b9250612b0a8133612b34565b612b18836119c28333611356565b9250612b248133612be5565b600190910190612a38565b505090565b600160a060020a0391821660009081526016602090815260408083209390941682529190915290812055565b600082821115612b6c57fe5b50900390565b600160a060020a0383166000908152601d6020526040902054612b959083612999565b600160a060020a0384166000908152601d6020908152604080832093909355601e90522054612bc49082612999565b600160a060020a039093166000908152601e60205260409020929092555050565b600160a060020a039182166000818152601760209081526040808320949095168083529381528482208290559181526018825283812092815291905290812055565b60070b680100000000000000000290565b68010000000000000000600f92830b9190920b020590565b600068010000000000000000600f83900b05612c6b81612d0b565b1515612a1157600080fd5b600160a060020a03808416600090815260156020908152604080832093861683529290522054612ca69082612999565b600160a060020a03938416600090815260156020908152604080832095909616825293909352929091209190915550565b6780000000000000001990565b6000600f82810b9084900b6801000000000000000002811515612d0357fe5b059392505050565b6000612d15612d43565b60070b600f0b82600f0b12158015612a115750612d30612cd7565b60070b600f0b82600f0b13159050919050565b678000000000000000905600a165627a7a72305820e6ece63446690cb1313e69c66adc2bae471df4e7c43c31153e6a80edb9a922620029000000000000000000000000000000000000000000000000000000037e11d600
Deployed Bytecode
0x6080604052600436106103d95763ffffffff60e060020a6000350416630a2eb30181146103de5780630f90058714610413578063111081f81461041d57806311a153df146104445780631500214e14610459578063195d06ff146104745780631bde12481461047c5780631e2273a71461049157806321fdb91a146104c257806326b7d803146104d75780632797e0c3146104ec5780632ab6a50e146105015780632d06177a146105225780632e2bac04146105435780632feb7c0b14610564578063312220bc14610579578063320bebaa1461059a578063361cc3ab146105b25780633be4ee30146105d95780633dc19db8146106005780633f8a04aa1461062157806344c403671461063657806345a48de61461064b5780634fe71e951461066057806352441d7d14610675578063584451f21461068a5780635e7051cd1461069f578063627e25b1146106c057806364adc403146106d557806365863b24146106fc57806366dec260146107115780636860dc1f1461072657806368faaa6f1461073b57806369ae4de0146107505780636d3036a7146107655780636f62cba31461077a578063707c5c4c1461079b5780637442f427146107cc5780637eee6d1f146107f057806380870bc11461081757806384ad50241461083e57806384e221c614610853578063854772ea1461086857806387451d521461089857806387d87090146108a057806389c7abfd146108b857806390cc5564146108d957806391e863ca146108ee57806392093e7d1461090f5780639455924f1461092357806398163597146109445780639e985ea614610965578063a37fdf7f1461098c578063a545ff0c146109a1578063a64b0b62146109b6578063a66be478146109be578063a731c4ec146109d3578063a76188b9146109f7578063ac18de4314610a1b578063aff7bd4914610a3c578063b1b6f19e14610a63578063c0a843a114610a78578063c36a7b4514610a8d578063c6c332f214610aae578063cc361cc414610ad5578063cf69443c14610aea578063cfc5e7c814610aff578063d1042e3114610b20578063d2fa635e14610b56578063d3bd5a4b14610b6e578063d489c0bf14610b8f578063d71db8aa14610bb0578063d8fcfd6b14610bd1578063e2c0d1dc14610bec578063e3bbb4f114610c01578063e68e64cb14610c16578063ed0e92e514610c35578063f039c3b614610c56578063f12a158014610c6b578063f34d22d014610c80578063f3ae241514610c95578063f47073f414610cb6578063f7c5615914610cce578063f8a0cdee14610ce3578063f8ab02dd14610d07578063f9e9d34a14610d28578063ff82b17414610d4f575b600080fd5b3480156103ea57600080fd5b506103ff600160a060020a0360043516610d76565b604080519115158252519081900360200190f35b61041b610d94565b005b34801561042957600080fd5b50610432610f06565b60408051918252519081900360200190f35b34801561045057600080fd5b50610432610f0c565b34801561046557600080fd5b50610432600435602435610f1d565b61041b610f4b565b34801561048857600080fd5b50610432610f7a565b34801561049d57600080fd5b506104a9600435610f80565b60408051600f92830b90920b8252519081900360200190f35b3480156104ce57600080fd5b50610432610fbe565b3480156104e357600080fd5b50610432610fc4565b3480156104f857600080fd5b50610432611086565b34801561050d57600080fd5b5061041b600160a060020a036004351661108c565b34801561052e57600080fd5b5061041b600160a060020a0360043516611178565b34801561054f57600080fd5b5061041b600160a060020a03600435166111bd565b34801561057057600080fd5b50610432611241565b34801561058557600080fd5b5061041b600160a060020a0360043516611247565b3480156105a657600080fd5b5061041b600435611333565b3480156105be57600080fd5b50610432600160a060020a0360043581169060243516611356565b3480156105e557600080fd5b50610432600160a060020a036004358116906024351661139d565b34801561060c57600080fd5b5061041b600160a060020a03600435166113c8565b34801561062d57600080fd5b5061043261140a565b34801561064257600080fd5b5061043261141f565b34801561065757600080fd5b50610432611425565b34801561066c57600080fd5b5061041b611476565b34801561068157600080fd5b506104326114f6565b34801561069657600080fd5b50610432611506565b3480156106ab57600080fd5b5061041b6001608060020a036004351661150c565b3480156106cc57600080fd5b50610432611556565b3480156106e157600080fd5b50610432600160a060020a0360043581169060243516611562565b34801561070857600080fd5b5061043261158d565b34801561071d57600080fd5b5061043261159d565b34801561073257600080fd5b506103ff6115a3565b34801561074757600080fd5b506104326115ae565b34801561075c57600080fd5b50610432611621565b34801561077157600080fd5b50610432611627565b34801561078657600080fd5b5061041b600160a060020a0360043516611634565b3480156107a757600080fd5b506107b06116c8565b604080516001608060020a039092168252519081900360200190f35b3480156107d857600080fd5b5061041b600160a060020a03600435166024356116d7565b3480156107fc57600080fd5b50610432600160a060020a03600435811690602435166117c1565b34801561082357600080fd5b5061041b600160a060020a03600435166024356044356117ec565b34801561084a57600080fd5b5061043261190e565b34801561085f57600080fd5b50610432611919565b34801561087457600080fd5b50610432600160a060020a036004351660243515156044351515606435151561191f565b61041b6119de565b3480156108ac57600080fd5b5061041b600435611a0d565b3480156108c457600080fd5b5061041b600160a060020a0360043516611a30565b3480156108e557600080fd5b50610432611a6f565b3480156108fa57600080fd5b5061041b6001608060020a0360043516611a75565b61041b600160a060020a0360043516611abe565b34801561092f57600080fd5b50610432600160a060020a0360043516611ba4565b34801561095057600080fd5b50610432600160a060020a0360043516611bbf565b34801561097157600080fd5b5061041b600160a060020a0360043581169060243516611bda565b34801561099857600080fd5b50610432611c33565b3480156109ad57600080fd5b5061041b611c39565b61041b611d3f565b3480156109ca57600080fd5b50610432611d6e565b3480156109df57600080fd5b5061041b600160a060020a0360043516602435611d7c565b348015610a0357600080fd5b5061041b600435602435604435606435608435611e37565b348015610a2757600080fd5b5061041b600160a060020a0360043516611f01565b348015610a4857600080fd5b5061041b600160a060020a0360043516602435604435611f40565b348015610a6f57600080fd5b5061043261202b565b348015610a8457600080fd5b50610432612039565b348015610a9957600080fd5b50610432600160a060020a036004351661204a565b348015610aba57600080fd5b50610432600160a060020a0360043581169060243516612118565b348015610ae157600080fd5b50610432612143565b348015610af657600080fd5b506104326121b6565b348015610b0b57600080fd5b50610432600160a060020a03600435166121c6565b348015610b2c57600080fd5b50610432600160a060020a03600435811690602435166044351515606435151560843515156121e1565b348015610b6257600080fd5b5061041b60043561254f565b348015610b7a57600080fd5b5061041b600160a060020a03600435166125d1565b348015610b9b57600080fd5b50610432600160a060020a0360043516612662565b348015610bbc57600080fd5b50610432600160a060020a036004351661267d565b348015610bdd57600080fd5b50610432600435600f0b612698565b348015610bf857600080fd5b506107b06126cf565b348015610c0d57600080fd5b506104326126f2565b348015610c2257600080fd5b50610432600435151560243515156126f8565b348015610c4157600080fd5b5061041b600160a060020a0360043516612707565b348015610c6257600080fd5b50610432612746565b348015610c7757600080fd5b5061041b61274c565b348015610c8c57600080fd5b506104326127a3565b348015610ca157600080fd5b506103ff600160a060020a0360043516612830565b348015610cc257600080fd5b5061041b60043561284e565b348015610cda57600080fd5b50610432612895565b348015610cef57600080fd5b5061041b600160a060020a036004351660243561289b565b348015610d1357600080fd5b506103ff600160a060020a036004351661292d565b348015610d3457600080fd5b50610432600160a060020a0360043581169060243516612943565b348015610d5b57600080fd5b50610432600160a060020a036004358116906024351661296e565b600160a060020a031660009081526020819052604090205460ff1690565b33600090815260116020526040812054819060ff161515610db457600080fd5b33600160a060020a03166368beab3f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b505050506040513d6020811015610e1c57600080fd5b5051604080517f2ecd70200000000000000000000000000000000000000000000000000000000081529051919350600160a060020a03841691632ecd7020916004808201926020929091908290030181600087803b158015610e7d57600080fd5b505af1158015610e91573d6000803e3d6000fd5b505050506040513d6020811015610ea757600080fd5b5051346801000000000000000002811515610ebe57fe5b600160a060020a0384166000908152601a60205260409020549190049150610ee69082612999565b600160a060020a039092166000908152601a602052604090209190915550565b60085481565b6000610f16611086565b4303905090565b6000610f44610f36610f308560646129b3565b846129ca565b670de0b6b3a76400006129b3565b9392505050565b3360009081526011602052604090205460ff161515610f6957600080fd5b610f75600d5434612999565b600d55565b60075481565b600080610f9083620f42406129b3565b9050610f9b816129f5565b1515610fa657600080fd5b610fb58164e8d4a51000612a17565b91505b50919050565b60105481565b6000805b60135481101561108257600081815260126020908152604080832054815160e060020a6361e91ea10281529151611078948794601b949193600160a060020a0316926361e91ea192600480820193929182900301818787803b15801561102d57600080fd5b505af1158015611041573d6000803e3d6000fd5b505050506040513d602081101561105757600080fd5b5051600160a060020a03168152602081019190915260400160002054612999565b9150600101610fc8565b5090565b60105490565b3360009081526011602052604081205460ff1615156110aa57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110e857600080fd5b505af11580156110fc573d6000803e3d6000fd5b505050506040513d602081101561111257600080fd5b5051600160a060020a03808216600090815260186020908152604080832093871683529290522054600d5491925061114991612999565b600160a060020a0391821660009081526018602090815260408083209590941682529390935290822055600d55565b3360009081526020819052604090205460ff16151561119657600080fd5b600160a060020a03166000908152600160208190526040909120805460ff19169091179055565b3360009081526020819052604090205460ff1615156111db57600080fd5b600160a060020a0381166000818152601160209081526040808320805460ff1916600190811790915560138054855260129093529220805473ffffffffffffffffffffffffffffffffffffffff1916909317909255905461123b91612999565b60135550565b600f5481565b3360009081526011602052604081205460ff16151561126557600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156112a357600080fd5b505af11580156112b7573d6000803e3d6000fd5b505050506040513d60208110156112cd57600080fd5b5051600160a060020a03808216600090815260176020908152604080832093871683529290522054600e5491925061130491612999565b600160a060020a0391821660009081526017602090815260408083209590941682529390935290822055600e55565b3360009081526020819052604090205460ff16151561135157600080fd5b600a55565b600160a060020a038083166000818152601760209081526040808320948616808452948252808320549383526018825280832094835293905291822054610f449190612999565b600160a060020a03918216600090815260146020908152604080832093909416825291909152205490565b3360009081526020819052604090205460ff1615156113e657600080fd5b600160a060020a03166000908152602081905260409020805460ff19166001179055565b600061141a33600080600161191f565b905090565b60065481565b60095460009081906001608060020a031661143e610f0c565b81151561144757fe5b06905080156114565780611463565b6009546001608060020a03165b6009546001608060020a03160392915050565b6000611480612a33565b90506000811161148f57600080fd5b604051339082156108fc029083906000818181858888f193505050501580156114bc573d6000803e3d6000fd5b5060408051828152905133917f1ecd44a58dbf0e65ca0f30fb71142a15dc0df81e3c74e25f19405b616cf75d3c919081900360200190a250565b600061141a33600160008061191f565b60055481565b3360009081526020819052604090205460ff16151561152a57600080fd5b600980546001608060020a03928316700100000000000000000000000000000000029216919091179055565b67016345785d8a000081565b600160a060020a03918216600090815260156020908152604080832093909416825291909152205490565b600061141a600d54600e54612999565b600d5481565b600061141a3361292d565b6000805b60135481101561108257600081815260126020908152604080832054815160e060020a6361e91ea10281529151611617948794601c949193600160a060020a0316926361e91ea192600480820193929182900301818787803b15801561102d57600080fd5b91506001016115b2565b60045481565b6801000000000000000081565b3360009081526011602052604090205460ff16151561165257600080fd5b6116c533600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561169357600080fd5b505af11580156116a7573d6000803e3d6000fd5b505050506040513d60208110156116bd57600080fd5b505182612b34565b50565b6009546001608060020a031681565b3360009081526011602052604081205460ff1615156116f557600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561173357600080fd5b505af1158015611747573d6000803e3d6000fd5b505050506040513d602081101561175d57600080fd5b5051600160a060020a038082166000908152601460209081526040808320938816835292905220549091506117929083612b60565b600160a060020a0391821660009081526014602090815260408083209690941682529490945292209190915550565b600160a060020a03918216600090815260176020908152604080832093909416825291909152205490565b3360009081526011602052604081205460ff16151561180a57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b505050506040513d602081101561187257600080fd5b5051600160a060020a0381166000908152601b602052604090205490915061189b906001612999565b600160a060020a038083166000908152601b60209081526040808320949094556019815283822092881682529190915220546118d79084612999565b600160a060020a03808316600090815260196020908152604080832093891683529290522055611908818484612b72565b50505050565b66038d7ea4c6800081565b600b5481565b600080805b6013548210156119d457600082815260126020908152604080832054815160e060020a6361e91ea10281529151600160a060020a03909116936361e91ea193600480850194919392918390030190829087803b15801561198357600080fd5b505af1158015611997573d6000803e3d6000fd5b505050506040513d60208110156119ad57600080fd5b505190506119c7836119c2838a8a8a8a6121e1565b612999565b9250600190910190611924565b5050949350505050565b3360009081526011602052604090205460ff1615156119fc57600080fd5b611a08600e5434612999565b600e55565b3360009081526020819052604090205460ff161515611a2b57600080fd5b600b55565b3360009081526020819052604090205460ff161515611a4e57600080fd5b600160a060020a03166000908152602081905260409020805460ff19169055565b600c5481565b3360009081526020819052604090205460ff161515611a9357600080fd5b600980546fffffffffffffffffffffffffffffffff19166001608060020a0392909216919091179055565b3360009081526011602052604081205460ff161515611adc57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611b1a57600080fd5b505af1158015611b2e573d6000803e3d6000fd5b505050506040513d6020811015611b4457600080fd5b5051600160a060020a03808216600090815260166020908152604080832093871683529290522054909150611b799034612999565b600160a060020a03918216600090815260166020908152604080832095909416825293909352912055565b600160a060020a03166000908152601e602052604090205490565b600160a060020a03166000908152601d602052604090205490565b3360009081526020819052604090205460ff161515611bf857600080fd5b600160a060020a03918216600090815260116020526040808220805460ff199081169091559290931681529190912080549091166001179055565b60035481565b3360009081526020819052604081205460ff161515611c5757600080fd5b5060005b601354811015611d0e5760008181526012602090815260408083205481517f22f3e2d40000000000000000000000000000000000000000000000000000000081529151600160a060020a03909116936322f3e2d493600480850194919392918390030190829087803b158015611cd057600080fd5b505af1158015611ce4573d6000803e3d6000fd5b505050506040513d6020811015611cfa57600080fd5b505115611d0657600080fd5b600101611c5b565b6040513390303180156108fc02916000818181858888f19350505050158015611d3b573d6000803e3d6000fd5b5050565b3360009081526011602052604090205460ff161515611d5d57600080fd5b611d69600f5434612999565b600f55565b69d3c21bcecceda100000081565b3360009081526011602052604081205460ff161515611d9a57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611dd857600080fd5b505af1158015611dec573d6000803e3d6000fd5b505050506040513d6020811015611e0257600080fd5b5051600160a060020a038082166000908152601460209081526040808320938816835292905220549091506117929083612999565b3360009081526020819052604090205460ff161515611e5557600080fd5b68022b1c8c1227a00000851115611e6b57600080fd5b68056bc75e2d63100000841115611e8157600080fd5b68056bc75e2d63100000831115611e9757600080fd5b68056bc75e2d63100000821115611ead57600080fd5b68056bc75e2d63100000811115611ec357600080fd5b600454600354600554858789010101010168056bc75e2d63100000141515611eea57600080fd5b600694909455600792909255600855600355600455565b3360009081526020819052604090205460ff161515611f1f57600080fd5b600160a060020a03166000908152600160205260409020805460ff19169055565b3360009081526011602052604081205460ff161515611f5e57600080fd5b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611f9c57600080fd5b505af1158015611fb0573d6000803e3d6000fd5b505050506040513d6020811015611fc657600080fd5b5051600160a060020a0381166000908152601c6020526040902054909150611fef906001612999565b600160a060020a038083166000908152601c60209081526040808320949094556019815283822092881682529190915220546118d79084612b60565b692a5a058fc295ed00000081565b600061141a3360006001600061191f565b6000805b601354811015610fb857600081815260126020908152604080832054815160e060020a6361e91ea1028152915161210e9487946019949193600160a060020a0316926361e91ea192600480820193929182900301818787803b1580156120b357600080fd5b505af11580156120c7573d6000803e3d6000fd5b505050506040513d60208110156120dd57600080fd5b5051600160a060020a0390811682526020828101939093526040918201600090812091891681529252902054612999565b915060010161204e565b600160a060020a03918216600090815260196020908152604080832093909416825291909152205490565b6000805b60135481101561108257600081815260126020908152604080832054815160e060020a6361e91ea102815291516121ac948794601a949193600160a060020a0316926361e91ea192600480820193929182900301818787803b15801561102d57600080fd5b9150600101612147565b600061141a33600180600161191f565b600160a060020a03166000908152601c602052604090205490565b60008584156124445780600160a060020a03166355eb27c8876040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b505050506040513d602081101561226f57600080fd5b5051604080517fa67c27300000000000000000000000000000000000000000000000000000000081529051600160a060020a0384169163a67c27309160048083019260209291908290030181600087803b1580156122cc57600080fd5b505af11580156122e0573d6000803e3d6000fd5b505050506040513d60208110156122f657600080fd5b5051604080517f2865dc2e000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301529151939092029450680100000000000000009290841691632865dc2e9160248083019260209291908290030181600087803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b505050506040513d602081101561239757600080fd5b505183106124345761242f8383600160a060020a0316632865dc2e8a6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050506040513d602081101561242857600080fd5b5051612b60565b612437565b60005b81151561244057fe5b0491505b83156124dd576124da8282600160a060020a03166324bdf96a896040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156124a957600080fd5b505af11580156124bd573d6000803e3d6000fd5b505050506040513d60208110156124d357600080fd5b5051612999565b91505b8215612545576125428282600160a060020a03166364004ea5896040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156124a957600080fd5b91505b5095945050505050565b806000811161255d57600080fd5b3360009081526020819052604090205460ff168061258a57503360009081526001602052604090205460ff165b151561259557600080fd5b60028290556040805183815290517f9b105d64420eb156c9cf6f732d45a844ac6df11f50e696d64c8c4e3a5ed5be999181900360200190a15050565b3360009081526011602052604090205460ff1615156125ef57600080fd5b6116c533600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561263057600080fd5b505af1158015612644573d6000803e3d6000fd5b505050506040513d602081101561265a57600080fd5b505182612be5565b600160a060020a03166000908152601b602052604090205490565b600160a060020a03166000908152601a602052604090205490565b6000806126ba6126b5846126b064e8d4a51000612c27565b612c38565b612c50565b60070b9050610fb581600f0b620f42406129ca565b60095470010000000000000000000000000000000090046001608060020a031681565b60025481565b6000610f44336001858561191f565b3360009081526020819052604090205460ff16151561272557600080fd5b600160a060020a03166000908152601160205260409020805460ff19169055565b600e5481565b3360009081526020819052604081205460ff16151561276a57600080fd5b50600f80546000918290556040519091339183156108fc0291849190818181858888f19350505050158015611d3b573d6000803e3d6000fd5b600954600090819070010000000000000000000000000000000090046001608060020a03166127d0610f0c565b8115156127d957fe5b06905080156127e85780612809565b60095470010000000000000000000000000000000090046001608060020a03165b60095470010000000000000000000000000000000090046001608060020a03160392915050565b600160a060020a031660009081526001602052604090205460ff1690565b3360009081526011602052604090205460ff16151561286c57600080fd5b600081118015612885575068056bc75e2d631000008111155b151561289057600080fd5b600c55565b600a5481565b3360009081526011602052604090205460ff1615156128b957600080fd5b611d3b33600160a060020a03166361e91ea16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156128fa57600080fd5b505af115801561290e573d6000803e3d6000fd5b505050506040513d602081101561292457600080fd5b50518383612c76565b6000600b5461293b8361204a565b101592915050565b600160a060020a03918216600090815260166020908152604080832093909416825291909152205490565b600160a060020a03918216600090815260186020908152604080832093909416825291909152205490565b6000828201838110156129a857fe5b8091505b5092915050565b60008082848115156129c157fe5b04949350505050565b6000808315156129dd57600091506129ac565b508282028284828115156129ed57fe5b04146129a857fe5b6000808210158015612a115750612a0a612cd7565b60070b8211155b92915050565b6000610f44612a2584612c27565b612a2e84612c27565b612ce4565b600080805b601354821015612b2f57600082815260126020908152604080832054815160e060020a6361e91ea10281529151600160a060020a03909116936361e91ea193600480850194919392918390030190829087803b158015612a9757600080fd5b505af1158015612aab573d6000803e3d6000fd5b505050506040513d6020811015612ac157600080fd5b50519050612ad8836119c2833360016000806121e1565b9250612af08133680100000000000000008602612c76565b612afe836119c28333612943565b9250612b0a8133612b34565b612b18836119c28333611356565b9250612b248133612be5565b600190910190612a38565b505090565b600160a060020a0391821660009081526016602090815260408083209390941682529190915290812055565b600082821115612b6c57fe5b50900390565b600160a060020a0383166000908152601d6020526040902054612b959083612999565b600160a060020a0384166000908152601d6020908152604080832093909355601e90522054612bc49082612999565b600160a060020a039093166000908152601e60205260409020929092555050565b600160a060020a039182166000818152601760209081526040808320949095168083529381528482208290559181526018825283812092815291905290812055565b60070b680100000000000000000290565b68010000000000000000600f92830b9190920b020590565b600068010000000000000000600f83900b05612c6b81612d0b565b1515612a1157600080fd5b600160a060020a03808416600090815260156020908152604080832093861683529290522054612ca69082612999565b600160a060020a03938416600090815260156020908152604080832095909616825293909352929091209190915550565b6780000000000000001990565b6000600f82810b9084900b6801000000000000000002811515612d0357fe5b059392505050565b6000612d15612d43565b60070b600f0b82600f0b12158015612a115750612d30612cd7565b60070b600f0b82600f0b13159050919050565b678000000000000000905600a165627a7a72305820e6ece63446690cb1313e69c66adc2bae471df4e7c43c31153e6a80edb9a922620029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000037e11d600
-----Decoded View---------------
Arg [0] : maxGasPrice (uint256): 15000000000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000037e11d600
Swarm Source
bzzr://e6ece63446690cb1313e69c66adc2bae471df4e7c43c31153e6a80edb9a92262
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,738.51 | 0.2049 | $561.09 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.