Реклама вашего контракта Кабинет инвестора
Меню
Появились вопросы или есть предложения?
Напишите нам в Telegram t.me/smartradar
ETH777

ETH777

Etherscan
0xdDFc21DF6f2556528b21574695c7b33f22e60A70
Следить за контрактом

Баланс

85.8928 ETH.

Динамика пополнений
от общего пополнения за день

2.086%

Ввод

За последний час
0 ETH.
Всего
457.05 ETH.

Выводы

За последний час
0 ETH.
Всего
371.157 ETH.

Условия

В день
-
В час
-

Инвесторов

171

Повторные пополнения

За последний час
0 ETH.
Всего
256.927 ETH.

Средняя оценка аудиторов

-

Контакты

  • Таймлайн:
  • час
  • день
  • неделя
  • месяц
Пополнения (2284)
Выводы (1901)
Аудит
Код
API
Комменторы
Дата Блок TxHash От кого Кому Сумма
19 фев. 18:46 7240919 0x677d29b22c812421c7326a3f87893c800726bb950aad81f4f16cd57051ed3616
Транзакция с ошибкой
0x6d4ca75fedaa65048bbe49ee008dba255cfada3f 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 16:44 7240556 0x33adbe055cd03639b6274bb7227bfff57f612841995f91760beb379699854588 0xfa87ee06d31cef5c369474e0e10004e79e973f8c 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 16:04 7240441 0x873d4c7646c440c1096014c51ed4dc10a6ae88f29355d712b32444a2c32f397d
Транзакция с ошибкой
0x69bd7f72b98aeecf78ac87823e9ad45ffa85b0c1 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 15:52 7240404 0xaa876a7adee73d7f584125506a1be15f0edffad10882fe9995d4a060fc18231d
Транзакция с ошибкой
0x6d4ca75fedaa65048bbe49ee008dba255cfada3f 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 15:40 7240371 0xce9d9a5bcb0c0c67350d9c9e2d918f676837abde5eefcab9819a316b131a0d4e
Транзакция с ошибкой
0x6d4ca75fedaa65048bbe49ee008dba255cfada3f 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 14:50 7240213 0x0fc96e5b05b13cc44b9976bfa242d40517460bc9fea15ade74a6c12a7148afcb
Транзакция с ошибкой
0x46e391f2fcf10d987293202b8a220ee8127c3ab2 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 14:40 7240177 0xdf571f00f2c717450bb3eec2b3ce9de66a7aa1ea9bc84f4c43f7762f5348284f
Транзакция с ошибкой
0x46e391f2fcf10d987293202b8a220ee8127c3ab2 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 14:32 7240152 0xf97b5018fae8cad7ff1ace06918dab40f5394f82d2f88901d66353a7a25f96e2 0xff172a72bbdcec54210516fbb8a21bfe109a9f75 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 13:30 7239949 0x148a3cd118ef8aeb4befcda92f5529c27234c1c07d3ed109c44fecf4c90b5c91
Транзакция с ошибкой
0xa55d0edebbfb43d150f2cb51fbdd572d32e6329a 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 12:43 7239821 0x43283adef08fa71b336a3e5ccd2ce6f1718e76ea2b553c33c4e5a32755e2a804 0xca0ce04a8f603915214ae7e17c61d26128fb370e 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 12:41 7239812 0x659e543a41d0bf0d12e5dc42e536c806ca9cc4117a2804777c215a7ef35a01c5
Транзакция с ошибкой
0xca0ce04a8f603915214ae7e17c61d26128fb370e 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 12:30 7239779 0x1dd148fada60138de62229bd8f3ca7aa4a31c1cb75e30bab46214860e9810a76 0xead697fcd7312b5cdff51be90f2c363d98cdc9b9 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 12:20 7239764 0x9e713a289ccc061b639ad44789bceafd747a0bd18ca73e7bdd939b0d749e7f56 0xfb7aca19ba5e01a410f6f864fb6b9e87ceb84548 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 11:17 7239563 0x8f1fa8fed2a3609e8bf8373dea2709c12ef40012a2b1ec39759d188a5f289631
Транзакция с ошибкой
0x60aef4e0bee8ac34f04c6a454122c68ccf65f4fa 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 08:50 7239137 0x7021ced281e482097564cb13b0f6f82cf1bee6ae23010fda5d701f91512199e4
Транзакция с ошибкой
0x60aef4e0bee8ac34f04c6a454122c68ccf65f4fa 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 08:18 7239038 0xd2c7f9a40546b9bd835903333c4c6725e6036f6f6e2c6ebe2f973c4ef36f82aa 0xa0a654c24e0a49bdb9d5d30afa09722ca4ff7b28 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 07:58 7238970 0x8767a662b030158bf3d75118d823e984054a0a66ad14dc4679e3b5c9df41a607
Транзакция с ошибкой
0xb32fe3830f8edac6d1be6769200d6739e334f4b3 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 07:56 7238958 0xa433ee3563350613953b06209cd2bdf38e2202a4dfe3603ee32e528465655249
Транзакция с ошибкой
0x60aef4e0bee8ac34f04c6a454122c68ccf65f4fa 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 07:52 7238943 0x58feeac309da88f717038257e588f0445ac8efc45baa71b4cf92b9bea58a7b45
Транзакция с ошибкой
0xa9f373eec9e2ebbbc855fca0460e7e929a1f06d6 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 07:49 7238927 0x7d392107bee9d05ce35275c0732ae8fa2230e490c4aec98706f803505e3330a7
Транзакция с ошибкой
0x60aef4e0bee8ac34f04c6a454122c68ccf65f4fa 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 07:22 7238852 0xc611ae690333f48c4300e417e3738b78a238957d1280cedadb5e44abb2ce23e0
Транзакция с ошибкой
0x46e391f2fcf10d987293202b8a220ee8127c3ab2 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 07:21 7238843 0xb6daadd1f3e18409ff0c585a96f27622c5fd77d5a7cb34cc6aaab5e8a4b6075d
Транзакция с ошибкой
0x46e391f2fcf10d987293202b8a220ee8127c3ab2 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 07:18 7238839 0x21546488a62b284fcab852deb0997944d58326ec4afd81dbe24854e71be9dac4
Транзакция с ошибкой
0x46e391f2fcf10d987293202b8a220ee8127c3ab2 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 07:16 7238833 0xfb57f1fd17ff9ff4790884bfeb6887392d8c29b40a3eb21d4ff2cf0eaf07aab7
Транзакция с ошибкой
0x46e391f2fcf10d987293202b8a220ee8127c3ab2 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
19 фев. 05:53 7238564 0xb2d6914d3a890762b2fdba32c38db0d102b861a343bf327a978ad44b001bc4f9
Транзакция с ошибкой
0x4a9fa4a4b9b92723b24e14b5c6921afb2c413609 0xddfc21df6f2556528b21574695c7b33f22e60a70 0 Ether
Дата Блок parentTxHash От кого Кому Сумма
Сегодня 17:54 7249229 0x30012e7812d8d4a0001a3236d7bf40d9d8748269e95a9389b4051389ae74c7d1 0xddfc21df6f2556528b21574695c7b33f22e60a70 0x0a760acf7711dfee36fe7cdac433018b9750cef2 0.12987919560185185 Ether
Сегодня 15:58 7248897 0xa1618f16c75c9ea5879418f96041ec834af5361bb43f4cfe0118b6d235658a64 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xead697fcd7312b5cdff51be90f2c363d98cdc9b9 0.027400063157406472 Ether
Сегодня 09:10 7247708 0x15cb9923dde90ce1743e6facb05894da6f2807d570f6ebc8fe5a9e261bc95fdc
Транзакция с ошибкой
0xddfc21df6f2556528b21574695c7b33f22e60a70 0xcfece32a154c1eb0827dbddb9d42123fd5714e56 0.00095 Ether
Сегодня 09:10 7247708 0x15cb9923dde90ce1743e6facb05894da6f2807d570f6ebc8fe5a9e261bc95fdc
Транзакция с ошибкой
0xddfc21df6f2556528b21574695c7b33f22e60a70 0xd141612964af8078b468715ba3ef1e79a1ae060a 0.00055 Ether
Сегодня 08:35 7247577 0xc1583f14bfc541e46ef8ac3d7873c0b2b33389a9490f93f42d81fd9ed4bd5361 0xddfc21df6f2556528b21574695c7b33f22e60a70 0x1478b6390fe3e89c95c17bc694502e466a87ccfc 0.002442708333333333 Ether
Сегодня 06:27 7247197 0x60c3a851f2bb55268fe4cfbe01cfdb043122013c84055f52324047f30fdcccba 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xfa87ee06d31cef5c369474e0e10004e79e973f8c 0.017263888888888888 Ether
Сегодня 05:31 7247033 0xa14e4876a4919bca600e08615559b657844153243a69f09d84e451e9c8bab3c5 0xddfc21df6f2556528b21574695c7b33f22e60a70 0x06152e06f4efe49303d716b1ce755739fece8392 0.002552021608339893 Ether
Сегодня 03:46 7246728 0x619598b8ba9704e47bb1cd6f81d5a17f246c9e20a4650c1e95296985eb4ea8c1 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xcfece32a154c1eb0827dbddb9d42123fd5714e56 0.00386555 Ether
Сегодня 03:46 7246728 0x619598b8ba9704e47bb1cd6f81d5a17f246c9e20a4650c1e95296985eb4ea8c1 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xd141612964af8078b468715ba3ef1e79a1ae060a 0.00223795 Ether
Сегодня 03:38 7246700 0x5222cca7c343afd4fdb6d1550d8c81188bf404b6f24cb93f8a80d8e811219203 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xcbf097b2224fe9bef04ab4ed369f8e26cbadfe3f 0.04069801762750474 Ether
Сегодня 02:07 7246447 0x842ddfac1786a7e98f90379fa13f268887410aa7d93ac6ba7b72d9bcfd3230c5 0xddfc21df6f2556528b21574695c7b33f22e60a70 0x06da272a981b634dea1ab8c66c71c81c6aa1692a 0.8922083333333334 Ether
Сегодня 01:46 7246391 0x16fbdb34eed50ea263b85d86194b3c23111827f143c04771a6573b7a27b596b1 0xddfc21df6f2556528b21574695c7b33f22e60a70 0x3f9afd6a8289ba697fd07154db5cfa4aa4be1a76 1.4395776204427084 Ether
Вчера 21:19 7245566 0x60b949b8f886ec6be1b01886c7e02b6aba52ffd2a58a6e7405a3750f5cb146f6 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xcfece32a154c1eb0827dbddb9d42123fd5714e56 0.00095 Ether
Вчера 21:19 7245566 0x60b949b8f886ec6be1b01886c7e02b6aba52ffd2a58a6e7405a3750f5cb146f6 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xd141612964af8078b468715ba3ef1e79a1ae060a 0.00055 Ether
Вчера 20:34 7245431 0x5752069739d5c4542a8de51045168000cb7ceb8fd854995598a4e0c2ac067032 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xce6296356968306d01bd83d4cff11d317e86147a 0.01267631172839506 Ether
Вчера 19:20 7245225 0x9fa8da19052f9106ad1f134543ae026e379a0c724db01357963ac8edc85bb631 0xddfc21df6f2556528b21574695c7b33f22e60a70 0x173054a462532d859237e9408dc4cbd8853ff7cf 0.002883486782644347 Ether
Вчера 18:29 7245064 0x41c856435f28ce956ecef266ca216f6c41486776c32457d306d91a5fdbe3c317 0xddfc21df6f2556528b21574695c7b33f22e60a70 0x017cc341a57891bebab97c9f4941fea8410c3354 0.030849283854166666 Ether
Вчера 17:03 7244826 0x194eca686832367ecbd16720c8dc274175ac82e53453ae75d1a3c9819c670848 0xddfc21df6f2556528b21574695c7b33f22e60a70 0x0a760acf7711dfee36fe7cdac433018b9750cef2 0.24842664930555555 Ether
Вчера 16:41 7244770 0x3f4d14ad5dc51b18a120ab904f4baa61410bae6a6c5c76cd1e4a0212299793bc 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xde7d023a93f3edd76a385c449839953a3c7c5ac4 1.37078125 Ether
Вчера 16:41 7244770 0x7c8ce10ca129e984fa13b3fcd168d5a24229b493e8b547683c2a6b42cb600ef9 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xe3f1d08b17d524b377e698f3ad27d8af178bc4a2 3.398922222222222 Ether
Вчера 16:30 7244737 0xc834e8d65f732f342743967b7ab2a06e56d1fa3b033d73ea908e2e00ed6ec224 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xcfece32a154c1eb0827dbddb9d42123fd5714e56 0.00285 Ether
Вчера 16:30 7244737 0xc834e8d65f732f342743967b7ab2a06e56d1fa3b033d73ea908e2e00ed6ec224 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xd141612964af8078b468715ba3ef1e79a1ae060a 0.00165 Ether
Вчера 16:22 7244718 0x9b3b5bfebaa05146e55b7ba53678b6ac64cf7d69741631664136773441b6a139
Транзакция с ошибкой
0xddfc21df6f2556528b21574695c7b33f22e60a70 0xcfece32a154c1eb0827dbddb9d42123fd5714e56 0.00285 Ether
Вчера 16:22 7244718 0x9b3b5bfebaa05146e55b7ba53678b6ac64cf7d69741631664136773441b6a139
Транзакция с ошибкой
0xddfc21df6f2556528b21574695c7b33f22e60a70 0xd141612964af8078b468715ba3ef1e79a1ae060a 0.00165 Ether
Вчера 15:59 7244653 0x25e6b432b25b4b91001e6ccd22c41fb7af136afae5fc1047e8a021404bae3a9f 0xddfc21df6f2556528b21574695c7b33f22e60a70 0xcfece32a154c1eb0827dbddb9d42123fd5714e56 0.057 Ether
Средняя оценка аудиторов -
Contract Source Code </>
pragma solidity 0.4.25;

/**
* Инновационный проект по распределению криптовалюты ETH с ежедневными выплатами до 12% в день!
* An innovative Blockchain Ethereum project with open source up to 12% per day! 
* ежедневные выплаты, навечно. инновационная надежность. до 12% в день, до 360% в месяц. 
* валюта вклада и выплаты — ETH, минимальный взнос — 0,01 ETH
* Daily payments forever. The innovative reliability. up to 12% per day, up to 360% per month. 
* Currency and payment — ETH. Minimal contribution 0.01 eth
* https://www.eth777.io/
*/ 


library Math {
  function min(uint a, uint b) internal pure returns(uint) {
    if (a > b) {
      return b;
    }
    return a;
  }
}


library Zero {
  function requireNotZero(address addr) internal pure {
    require(addr != address(0), "require not zero address");
  }

  function requireNotZero(uint val) internal pure {
    require(val != 0, "require not zero value");
  }

  function notZero(address addr) internal pure returns(bool) {
    return !(addr == address(0));
  }

  function isZero(address addr) internal pure returns(bool) {
    return addr == address(0);
  }

  function isZero(uint a) internal pure returns(bool) {
    return a == 0;
  }

  function notZero(uint a) internal pure returns(bool) {
    return a != 0;
  }
}


library Percent {
  struct percent {
    uint num;
    uint den;
  }
  
  function mul(percent storage p, uint a) internal view returns (uint) {
    if (a == 0) {
      return 0;
    }
    return a*p.num/p.den;
  }

  function div(percent storage p, uint a) internal view returns (uint) {
    return a/p.num*p.den;
  }

  function sub(percent storage p, uint a) internal view returns (uint) {
    uint b = mul(p, a);
    if (b >= a) {
      return 0;
    }
    return a - b;
  }

  function add(percent storage p, uint a) internal view returns (uint) {
    return a + mul(p, a);
  }

  function toMemory(percent storage p) internal view returns (Percent.percent memory) {
    return Percent.percent(p.num, p.den);
  }

  function mmul(percent memory p, uint a) internal pure returns (uint) {
    if (a == 0) {
      return 0;
    }
    return a*p.num/p.den;
  }

  function mdiv(percent memory p, uint a) internal pure returns (uint) {
    return a/p.num*p.den;
  }

  function msub(percent memory p, uint a) internal pure returns (uint) {
    uint b = mmul(p, a);
    if (b >= a) {
      return 0;
    }
    return a - b;
  }

  function madd(percent memory p, uint a) internal pure returns (uint) {
    return a + mmul(p, a);
  }
}


library Address {
  function toAddress(bytes source) internal pure returns(address addr) {
    assembly { addr := mload(add(source,0x14)) }
    return addr;
  }

  function isNotContract(address addr) internal view returns(bool) {
    uint length;
    assembly { length := extcodesize(addr) }
    return length == 0;
  }
}


/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256) {
    if (_a == 0) {
      return 0;
    }

    uint256 c = _a * _b;
    require(c / _a == _b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b > 0); // Solidity only automatically asserts 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 Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b <= _a);
    uint256 c = _a - _b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
    uint256 c = _a + _b;
    require(c >= _a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}


contract Accessibility {
  address private owner;
  modifier onlyOwner() {
    require(msg.sender == owner, "access denied");
    _;
  }

  constructor() public {
    owner = msg.sender;
  }

  function disown() internal {
    delete owner;
  }
}


contract Rev1Storage {
  function investorShortInfo(address addr) public view returns(uint value, uint refBonus); 
}


contract Rev2Storage {
  function investorInfo(address addr) public view returns(uint investment, uint paymentTime); 
}


library PrivateEntrance {
  using PrivateEntrance for privateEntrance;
  using Math for uint;
  struct privateEntrance {
    Rev1Storage rev1Storage;
    Rev2Storage rev2Storage;
    uint investorMaxInvestment;
    uint endTimestamp;
    mapping(address=>bool) hasAccess;
  }

  function isActive(privateEntrance storage pe) internal view returns(bool) {
    return pe.endTimestamp > now;
  }

  function maxInvestmentFor(privateEntrance storage pe, address investorAddr) internal view returns(uint) {
    if (!pe.hasAccess[investorAddr]) {
      return 0;
    }

    (uint maxInvestment, ) = pe.rev1Storage.investorShortInfo(investorAddr);
    if (maxInvestment == 0) {
      return 0;
    }
    maxInvestment = Math.min(maxInvestment, pe.investorMaxInvestment);

    (uint currInvestment, ) = pe.rev2Storage.investorInfo(investorAddr);
    
    if (currInvestment >= maxInvestment) {
      return 0;
    }

    return maxInvestment-currInvestment;
  }

  function provideAccessFor(privateEntrance storage pe, address[] addrs) internal {
    for (uint16 i; i < addrs.length; i++) {
      pe.hasAccess[addrs[i]] = true;
    }
  }
}


contract InvestorsStorage is Accessibility {
  struct Investor {
    uint investment;
    uint paymentTime;
  }
  uint public size;

  mapping (address => Investor) private investors;

  function isInvestor(address addr) public view returns (bool) {
    return investors[addr].investment > 0;
  }

  function investorInfo(address addr) public view returns(uint investment, uint paymentTime) {
    investment = investors[addr].investment;
    paymentTime = investors[addr].paymentTime;
  }

  function newInvestor(address addr, uint investment, uint paymentTime) public onlyOwner returns (bool) {
    Investor storage inv = investors[addr];
    if (inv.investment != 0 || investment == 0) {
      return false;
    }
    inv.investment = investment;
    inv.paymentTime = paymentTime;
    size++;
    return true;
  }

  function addInvestment(address addr, uint investment) public onlyOwner returns (bool) {
    if (investors[addr].investment == 0) {
      return false;
    }
    investors[addr].investment += investment;
    return true;
  }

  function setPaymentTime(address addr, uint paymentTime) public onlyOwner returns (bool) {
    if (investors[addr].investment == 0) {
      return false;
    }
    investors[addr].paymentTime = paymentTime;
    return true;
  }

  function disqalify(address addr) public onlyOwner returns (bool) {
    if (isInvestor(addr)) {
      investors[addr].investment = 0;
    }
  }
}


library RapidGrowthProtection {
  using RapidGrowthProtection for rapidGrowthProtection;
  
  struct rapidGrowthProtection {
    uint startTimestamp;
    uint maxDailyTotalInvestment;
    uint8 activityDays;
    mapping(uint8 => uint) dailyTotalInvestment;
  }

  function maxInvestmentAtNow(rapidGrowthProtection storage rgp) internal view returns(uint) {
    uint day = rgp.currDay();
    if (day == 0 || day > rgp.activityDays) {
      return 0;
    }
    if (rgp.dailyTotalInvestment[uint8(day)] >= rgp.maxDailyTotalInvestment) {
      return 0;
    }
    return rgp.maxDailyTotalInvestment - rgp.dailyTotalInvestment[uint8(day)];
  }

  function isActive(rapidGrowthProtection storage rgp) internal view returns(bool) {
    uint day = rgp.currDay();
    return day != 0 && day <= rgp.activityDays;
  }

  function saveInvestment(rapidGrowthProtection storage rgp, uint investment) internal returns(bool) {
    uint day = rgp.currDay();
    if (day == 0 || day > rgp.activityDays) {
      return false;
    }
    if (rgp.dailyTotalInvestment[uint8(day)] + investment > rgp.maxDailyTotalInvestment) {
      return false;
    }
    rgp.dailyTotalInvestment[uint8(day)] += investment;
    return true;
  }

  function startAt(rapidGrowthProtection storage rgp, uint timestamp) internal { 
    rgp.startTimestamp = timestamp;

    // restart
    for (uint8 i = 1; i <= rgp.activityDays; i++) {
      if (rgp.dailyTotalInvestment[i] != 0) {
        delete rgp.dailyTotalInvestment[i];
      }
    }
  }

  function currDay(rapidGrowthProtection storage rgp) internal view returns(uint day) {
    if (rgp.startTimestamp > now) {
      return 0;
    }
    day = (now - rgp.startTimestamp) / 24 hours + 1; 
  }
}

contract Revolution2 is Accessibility {
  using RapidGrowthProtection for RapidGrowthProtection.rapidGrowthProtection;
  using PrivateEntrance for PrivateEntrance.privateEntrance;
  using Percent for Percent.percent;
  using SafeMath for uint;
  using Math for uint;

  // easy read for investors
  using Address for *;
  using Zero for *; 
  
  RapidGrowthProtection.rapidGrowthProtection private m_rgp;
  PrivateEntrance.privateEntrance private m_privEnter;
  mapping(address => bool) private m_referrals;
  InvestorsStorage private m_investors;

  // automatically generates getters
  uint public constant minInvesment = 10 finney; 
  uint public constant maxBalance = 333e5 ether; 
  address public advertisingAddress;
  address public adminsAddress;
  uint public investmentsNumber;
  uint public waveStartup;

  // percents 
  Percent.percent private m_5_percent = Percent.percent(5,100);            // 5/100 *100% = 5%
  Percent.percent private m_6_percent = Percent.percent(6,100);            // 6/100 *100% = 6%
  Percent.percent private m_7_percent = Percent.percent(7,100);            // 7/100 *100% = 7%
  Percent.percent private m_8_percent = Percent.percent(8,100);            // 8/100 *100% = 8%
  Percent.percent private m_9_percent = Percent.percent(9,100);            // 9/100 *100% = 9%
  Percent.percent private m_10_percent = Percent.percent(10,100);          // 10/100 *100% = 10%
  Percent.percent private m_11_percent = Percent.percent(11,100);            // 11/100 *100% = 11%
  Percent.percent private m_12_percent = Percent.percent(12,100);            // 12/100 *100% = 12%
  Percent.percent private m_referal_percent = Percent.percent(5,100);        // 5/100 *100% = 5%
  Percent.percent private m_referrer_percent = Percent.percent(7,100);       // 7/100 *100% = 7%
  Percent.percent private m_referrer_percentMax = Percent.percent(10,100);   // 10/100 *100% = 10%
  Percent.percent private m_adminsPercent = Percent.percent(55, 1000);       //   55/100  *100% = 5.5%
  Percent.percent private m_advertisingPercent = Percent.percent(95, 1000);// 95/1000  *100% = 9.5%

  // more events for easy read from blockchain
  event LogPEInit(uint when, address rev1Storage, address rev2Storage, uint investorMaxInvestment, uint endTimestamp);
  event LogSendExcessOfEther(address indexed addr, uint when, uint value, uint investment, uint excess);
  event LogNewReferral(address indexed addr, address indexed referrerAddr, uint when, uint refBonus);
  event LogRGPInit(uint when, uint startTimestamp, uint maxDailyTotalInvestment, uint activityDays);
  event LogRGPInvestment(address indexed addr, uint when, uint investment, uint indexed day);
  event LogNewInvesment(address indexed addr, uint when, uint investment, uint value);
  event LogAutomaticReinvest(address indexed addr, uint when, uint investment);
  event LogPayDividends(address indexed addr, uint when, uint dividends);
  event LogNewInvestor(address indexed addr, uint when);
  event LogBalanceChanged(uint when, uint balance);
  event LogNextWave(uint when);
  event LogDisown(uint when);


  modifier balanceChanged {
    _;
    emit LogBalanceChanged(now, address(this).balance);
  }

  modifier notFromContract() {
    require(msg.sender.isNotContract(), "only externally accounts");
    _;
  }

  constructor() public {
    adminsAddress = msg.sender;
    advertisingAddress = msg.sender;
    nextWave();
  }

  function() public payable {
    // investor get him dividends
    if (msg.value.isZero()) {
      getMyDividends();
      return;
    }

    // sender do invest
    doInvest(msg.data.toAddress());
  }

  function disqualifyAddress(address addr) public onlyOwner {
    m_investors.disqalify(addr);
  }

  function doDisown() public onlyOwner {
    disown();
    emit LogDisown(now);
  }

  function init(address rev1StorageAddr, uint timestamp) public onlyOwner {
    // init Rapid Growth Protection
    m_rgp.startTimestamp = timestamp + 1;
    m_rgp.maxDailyTotalInvestment = 500 ether;
    m_rgp.activityDays = 21;
    emit LogRGPInit(
      now, 
      m_rgp.startTimestamp,
      m_rgp.maxDailyTotalInvestment,
      m_rgp.activityDays
    );


    // init Private Entrance
    m_privEnter.rev1Storage = Rev1Storage(rev1StorageAddr);
    m_privEnter.rev2Storage = Rev2Storage(address(m_investors));
    m_privEnter.investorMaxInvestment = 50 ether;
    m_privEnter.endTimestamp = timestamp;
    emit LogPEInit(
      now, 
      address(m_privEnter.rev1Storage), 
      address(m_privEnter.rev2Storage), 
      m_privEnter.investorMaxInvestment, 
      m_privEnter.endTimestamp
    );
  }

  function setAdvertisingAddress(address addr) public onlyOwner {
    addr.requireNotZero();
    advertisingAddress = addr;
  }

  function setAdminsAddress(address addr) public onlyOwner {
    addr.requireNotZero();
    adminsAddress = addr;
  }

  function privateEntranceProvideAccessFor(address[] addrs) public onlyOwner {
    m_privEnter.provideAccessFor(addrs);
  }

  function rapidGrowthProtectionmMaxInvestmentAtNow() public view returns(uint investment) {
    investment = m_rgp.maxInvestmentAtNow();
  }

  function investorsNumber() public view returns(uint) {
    return m_investors.size();
  }

  function balanceETH() public view returns(uint) {
    return address(this).balance;
  }

  function advertisingPercent() public view returns(uint numerator, uint denominator) {
    (numerator, denominator) = (m_advertisingPercent.num, m_advertisingPercent.den);
  }

  function adminsPercent() public view returns(uint numerator, uint denominator) {
    (numerator, denominator) = (m_adminsPercent.num, m_adminsPercent.den);
  }

  function investorInfo(address investorAddr) public view returns(uint investment, uint paymentTime, bool isReferral) {
    (investment, paymentTime) = m_investors.investorInfo(investorAddr);
    isReferral = m_referrals[investorAddr];
  }

  function investorDividendsAtNow(address investorAddr) public view returns(uint dividends) {
    dividends = calcDividends(investorAddr);
  }

  function dailyPercentAtNow() public view returns(uint numerator, uint denominator) {
    Percent.percent memory p = dailyPercent();
    (numerator, denominator) = (p.num, p.den);
  }

  function getMyDividends() public notFromContract balanceChanged {
    // calculate dividends
    
    //check if 1 day passed after last payment
    require(now.sub(getMemInvestor(msg.sender).paymentTime) > 24 hours);

    uint dividends = calcDividends(msg.sender);
    require (dividends.notZero(), "cannot to pay zero dividends");

    // update investor payment timestamp
    assert(m_investors.setPaymentTime(msg.sender, now));

    // check enough eth - goto next wave if needed
    if (address(this).balance <= dividends) {
      nextWave();
      dividends = address(this).balance;
    } 

    // transfer dividends to investor
    msg.sender.transfer(dividends);
    emit LogPayDividends(msg.sender, now, dividends);
  }

  function doInvest(address referrerAddr) public payable notFromContract balanceChanged {
    uint investment = msg.value;
    uint receivedEther = msg.value;
    require(investment >= minInvesment, "investment must be >= minInvesment");
    require(address(this).balance <= maxBalance, "the contract eth balance limit");

    if (m_rgp.isActive()) { 
      // use Rapid Growth Protection if needed
      uint rpgMaxInvest = m_rgp.maxInvestmentAtNow();
      rpgMaxInvest.requireNotZero();
      investment = Math.min(investment, rpgMaxInvest);
      assert(m_rgp.saveInvestment(investment));
      emit LogRGPInvestment(msg.sender, now, investment, m_rgp.currDay());
      
    } else if (m_privEnter.isActive()) {
      // use Private Entrance if needed
      uint peMaxInvest = m_privEnter.maxInvestmentFor(msg.sender);
      peMaxInvest.requireNotZero();
      investment = Math.min(investment, peMaxInvest);
    }

    // send excess of ether if needed
    if (receivedEther > investment) {
      uint excess = receivedEther - investment;
      msg.sender.transfer(excess);
      receivedEther = investment;
      emit LogSendExcessOfEther(msg.sender, now, msg.value, investment, excess);
    }

    // commission
    advertisingAddress.send(m_advertisingPercent.mul(receivedEther));
    adminsAddress.send(m_adminsPercent.mul(receivedEther));

    bool senderIsInvestor = m_investors.isInvestor(msg.sender);

    // ref system works only once and only on first invest
    if (referrerAddr.notZero() && !senderIsInvestor && !m_referrals[msg.sender] &&
      referrerAddr != msg.sender && m_investors.isInvestor(referrerAddr)) {
      
      m_referrals[msg.sender] = true;
      // add referral bonus to investor`s and referral`s investments
      uint referrerBonus = m_referrer_percent.mmul(investment);
      if (investment > 10 ether) {
        referrerBonus = m_referrer_percentMax.mmul(investment);
      }
      
      uint referalBonus = m_referal_percent.mmul(investment);
      assert(m_investors.addInvestment(referrerAddr, referrerBonus)); // add referrer bonus
      investment += referalBonus;                                    // add referral bonus
      emit LogNewReferral(msg.sender, referrerAddr, now, referalBonus);
    }

    // automatic reinvest - prevent burning dividends
    uint dividends = calcDividends(msg.sender);
    if (senderIsInvestor && dividends.notZero()) {
      investment += dividends;
      emit LogAutomaticReinvest(msg.sender, now, dividends);
    }

    if (senderIsInvestor) {
      // update existing investor
      assert(m_investors.addInvestment(msg.sender, investment));
      assert(m_investors.setPaymentTime(msg.sender, now));
    } else {
      // create new investor
      assert(m_investors.newInvestor(msg.sender, investment, now));
      emit LogNewInvestor(msg.sender, now);
    }

    investmentsNumber++;
    emit LogNewInvesment(msg.sender, now, investment, receivedEther);
  }

  function getMemInvestor(address investorAddr) internal view returns(InvestorsStorage.Investor memory) {
    (uint investment, uint paymentTime) = m_investors.investorInfo(investorAddr);
    return InvestorsStorage.Investor(investment, paymentTime);
  }

  function calcDividends(address investorAddr) internal view returns(uint dividends) {
    InvestorsStorage.Investor memory investor = getMemInvestor(investorAddr);

    // safe gas if dividends will be 0
    if (investor.investment.isZero() || now.sub(investor.paymentTime) < 10 minutes) {
      return 0;
    }
    
    // for prevent burning daily dividends if 24h did not pass - calculate it per 10 min interval
    Percent.percent memory p = dailyPercent();
    dividends = (now.sub(investor.paymentTime) / 10 minutes) * p.mmul(investor.investment) / 144;
  }

  function dailyPercent() internal view returns(Percent.percent memory p) {
    uint balance = address(this).balance;

    if (balance < 500 ether) { 
      p = m_5_percent.toMemory(); 
    } else if ( 500 ether <= balance && balance <= 1500 ether) {
      p = m_6_percent.toMemory();    
    } else if ( 1500 ether <= balance && balance <= 5000 ether) {
      p = m_7_percent.toMemory();   
    } else if ( 5000 ether <= balance && balance <= 10000 ether) {
      p = m_8_percent.toMemory();  
    } else if ( 10000 ether <= balance && balance <= 20000 ether) {
      p = m_9_percent.toMemory();    
    } else if ( 20000 ether <= balance && balance <= 30000 ether) {
      p = m_10_percent.toMemory();  
    } else if ( 30000 ether <= balance && balance <= 50000 ether) {
      p = m_11_percent.toMemory();   
    } else {
      p = m_12_percent.toMemory();    
    } 
  }

  function nextWave() private {
    m_investors = new InvestorsStorage();
    investmentsNumber = 0;
    waveStartup = now;
    m_rgp.startAt(now);
    emit LogRGPInit(now , m_rgp.startTimestamp, m_rgp.maxDailyTotalInvestment, m_rgp.activityDays);
    emit LogNextWave(now);
  }
}
Документация
Идейные соображения высшего порядка, а также дальнейшее развитие различных форм деятельности представляет собой интересный эксперимент проверки модели развития. Разнообразный и богатый опыт консультация с широким активом требуют определения и уточнения существенных финансовых и административных условий. Задача организации, в особенности же новая модель организационной деятельности требуют от нас анализа системы обучения кадров, соответствует насущным потребностям. Повседневная практика показывает, что дальнейшее развитие различных форм деятельности обеспечивает широкому кругу (специалистов) участие в формировании новых предложений. Разнообразный и богатый опыт дальнейшее развитие различных форм деятельности влечет за собой процесс внедрения и модернизации новых предложений.

Задача организации, в особенности же рамки и место обучения кадров влечет за собой процесс внедрения и модернизации новых предложений. Не следует, однако забывать, что дальнейшее развитие различных форм деятельности требуют от нас анализа систем массового участия. Значимость этих проблем настолько очевидна, что новая модель организационной деятельности влечет за собой процесс внедрения и модернизации модели развития. Повседневная практика показывает, что постоянное информационно-пропагандистское обеспечение нашей деятельности в значительной степени обуславливает создание существенных финансовых и административных условий.

Разнообразный и богатый опыт дальнейшее развитие различных форм деятельности требуют определения и уточнения соответствующий условий активизации. Разнообразный и богатый опыт консультация с широким активом позволяет выполнять важные задания по разработке существенных финансовых и административных условий. С другой стороны консультация с широким активом позволяет оценить значение системы обучения кадров, соответствует насущным потребностям. Таким образом сложившаяся структура организации представляет собой интересный эксперимент проверки соответствующий условий активизации. Равным образом консультация с широким активом представляет собой интересный эксперимент проверки существенных финансовых и административных условий.

Товарищи! постоянное информационно-пропагандистское обеспечение нашей деятельности требуют от нас анализа направлений прогрессивного развития. С другой стороны начало повседневной работы по формированию позиции позволяет оценить значение новых предложений.

Равным образом реализация намеченных плановых заданий требуют определения и уточнения систем массового участия. Разнообразный и богатый опыт постоянное информационно-пропагандистское обеспечение нашей деятельности требуют от нас анализа направлений прогрессивного развития. Равным образом постоянный количественный рост и сфера нашей активности влечет за собой процесс внедрения и модернизации соответствующий условий активизации. Повседневная практика показывает, что дальнейшее развитие различных форм деятельности влечет за собой процесс внедрения и модернизации модели развития.

Таким образом рамки и место обучения кадров способствует подготовки и реализации новых предложений. Равным образом укрепление и развитие структуры в значительной степени обуславливает создание существенных финансовых и административных условий. Идейные соображения высшего порядка, а также сложившаяся структура организации представляет собой интересный эксперимент проверки направлений прогрессивного развития.

Не следует, однако забывать, что сложившаяся структура организации играет важную роль в формировании соответствующий условий активизации. С другой стороны дальнейшее развитие различных форм деятельности требуют определения и уточнения направлений прогрессивного развития.

Повседневная практика показывает, что начало повседневной работы по формированию позиции представляет собой интересный эксперимент проверки систем массового участия. Идейные соображения высшего порядка, а также постоянный количественный рост и сфера нашей активности в значительной степени обуславливает создание систем массового участия.

Таким образом укрепление и развитие структуры представляет собой интересный эксперимент проверки существенных финансовых и административных условий. Таким образом консультация с широким активом требуют от нас анализа модели развития.

Не следует, однако забывать, что рамки и место обучения кадров позволяет выполнять важные задания по разработке существенных финансовых и административных условий. С другой стороны постоянное информационно-пропагандистское обеспечение нашей деятельности позволяет выполнять важные задания по разработке соответствующий условий активизации. Товарищи! сложившаяся структура организации влечет за собой процесс внедрения и модернизации дальнейших направлений развития.
Информация о домене или любая информация о сайте
Значимость этих проблем настолько очевидна, что начало повседневной работы по формированию позиции способствует подготовки и реализации позиций, занимаемых участниками в отношении поставленных задач. Товарищи! новая модель организационной деятельности позволяет оценить значение направлений прогрессивного развития. Равным образом дальнейшее развитие различных форм деятельности влечет за собой процесс внедрения и модернизации направлений прогрессивного развития. Равным образом реализация намеченных плановых заданий позволяет выполнять важные задания по разработке новых предложений. Задача организации, в особенности же консультация с широким активом требуют от нас анализа существенных финансовых и административных условий. Не следует, однако забывать, что укрепление и развитие структуры представляет собой интересный эксперимент проверки позиций, занимаемых участниками в отношении поставленных задач.

Разнообразный и богатый опыт начало повседневной работы по формированию позиции требуют от нас анализа соответствующий условий активизации. Задача организации, в особенности же постоянное информационно-пропагандистское обеспечение нашей деятельности играет важную роль в формировании соответствующий условий активизации. Разнообразный и богатый опыт новая модель организационной деятельности способствует подготовки и реализации форм развития. Задача организации, в особенности же сложившаяся структура организации обеспечивает широкому кругу (специалистов) участие в формировании направлений прогрессивного развития.

Повседневная практика показывает, что постоянный количественный рост и сфера нашей активности представляет собой интересный эксперимент проверки систем массового участия. Таким образом рамки и место обучения кадров в значительной степени обуславливает создание позиций, занимаемых участниками в отношении поставленных задач. Товарищи! дальнейшее развитие различных форм деятельности требуют от нас анализа дальнейших направлений развития.

Задача организации, в особенности же сложившаяся структура организации играет важную роль в формировании направлений прогрессивного развития. Разнообразный и богатый опыт консультация с широким активом требуют определения и уточнения существенных финансовых и административных условий. Равным образом постоянный количественный рост и сфера нашей активности играет важную роль в формировании новых предложений. С другой стороны постоянный количественный рост и сфера нашей активности представляет собой интересный эксперимент проверки направлений прогрессивного развития. Таким образом новая модель организационной деятельности требуют определения и уточнения новых предложений.

Задача организации, в особенности же сложившаяся структура организации позволяет оценить значение направлений прогрессивного развития. Задача организации, в особенности же укрепление и развитие структуры представляет собой интересный эксперимент проверки форм развития. Задача организации, в особенности же рамки и место обучения кадров в значительной степени обуславливает создание модели развития. Повседневная практика показывает, что постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения существенных финансовых и административных условий. Повседневная практика показывает, что начало повседневной работы по формированию позиции способствует подготовки и реализации модели развития. Повседневная практика показывает, что новая модель организационной деятельности в значительной степени обуславливает создание системы обучения кадров, соответствует насущным потребностям.

Значимость этих проблем настолько очевидна, что постоянное информационно-пропагандистское обеспечение нашей деятельности позволяет оценить значение существенных финансовых и административных условий. Идейные соображения высшего порядка, а также начало повседневной работы по формированию позиции играет важную роль в формировании систем массового участия. Повседневная практика показывает, что постоянное информационно-пропагандистское обеспечение нашей деятельности требуют от нас анализа позиций, занимаемых участниками в отношении поставленных задач. Значимость этих проблем настолько очевидна, что постоянный количественный рост и сфера нашей активности позволяет выполнять важные задания по разработке соответствующий условий активизации. Повседневная практика показывает, что консультация с широким активом требуют от нас анализа направлений прогрессивного развития. Разнообразный и богатый опыт дальнейшее развитие различных форм деятельности позволяет выполнять важные задания по разработке дальнейших направлений развития.

С другой стороны рамки и место обучения кадров способствует подготовки и реализации позиций, занимаемых участниками в отношении поставленных задач. Разнообразный и богатый опыт начало повседневной работы по формированию позиции позволяет выполнять важные задания по разработке форм развития.

Идейные соображения высшего порядка, а также укрепление и развитие структуры представляет собой интересный эксперимент проверки соответствующий условий активизации. Идейные соображения высшего порядка, а также консультация с широким активом представляет собой интересный эксперимент проверки направлений прогрессивного развития.

Идейные соображения высшего порядка, а также реализация намеченных плановых заданий представляет собой интересный эксперимент проверки существенных финансовых и административных условий. Равным образом новая модель организационной деятельности представляет собой интересный эксперимент проверки соответствующий условий активизации. Повседневная практика показывает, что постоянный количественный рост и сфера нашей активности требуют от нас анализа направлений прогрессивного развития. Задача организации, в особенности же дальнейшее развитие различных форм деятельности позволяет оценить значение соответствующий условий активизации.

Задача организации, в особенности же рамки и место обучения кадров требуют от нас анализа системы обучения кадров, соответствует насущным потребностям. Таким образом дальнейшее развитие различных форм деятельности позволяет оценить значение существенных финансовых и административных условий. Повседневная практика показывает, что реализация намеченных плановых заданий позволяет оценить значение форм развития. Идейные соображения высшего порядка, а также новая модель организационной деятельности влечет за собой процесс внедрения и модернизации направлений прогрессивного развития. Равным образом консультация с широким активом в значительной степени обуславливает создание дальнейших направлений развития. Товарищи! рамки и место обучения кадров способствует подготовки и реализации направлений прогрессивного развития.

Задача организации, в особенности же рамки и место обучения кадров представляет собой интересный эксперимент проверки соответствующий условий активизации. Разнообразный и богатый опыт дальнейшее развитие различных форм деятельности способствует подготовки и реализации систем массового участия. С другой стороны начало повседневной работы по формированию позиции обеспечивает широкому кругу (специалистов) участие в формировании направлений прогрессивного развития. Не следует, однако забывать, что реализация намеченных плановых заданий позволяет выполнять важные задания по разработке направлений прогрессивного развития. Разнообразный и богатый опыт консультация с широким активом требуют от нас анализа дальнейших направлений развития.

Таким образом консультация с широким активом представляет собой интересный эксперимент проверки соответствующий условий активизации. Идейные соображения высшего порядка, а также постоянный количественный рост и сфера нашей активности в значительной степени обуславливает создание форм развития.

Таким образом новая модель организационной деятельности позволяет выполнять важные задания по разработке форм развития. Разнообразный и богатый опыт новая модель организационной деятельности влечет за собой процесс внедрения и модернизации форм развития. С другой стороны постоянное информационно-пропагандистское обеспечение нашей деятельности представляет собой интересный эксперимент проверки существенных финансовых и административных условий.

Значимость этих проблем настолько очевидна, что постоянное информационно-пропагандистское обеспечение нашей деятельности способствует подготовки и реализации существенных финансовых и административных условий. Не следует, однако забывать, что постоянное информационно-пропагандистское обеспечение нашей деятельности способствует подготовки и реализации направлений прогрессивного развития. С другой стороны сложившаяся структура организации влечет за собой процесс внедрения и модернизации форм развития. Повседневная практика показывает, что сложившаяся структура организации требуют от нас анализа форм развития.

Товарищи! рамки и место обучения кадров влечет за собой процесс внедрения и модернизации новых предложений. Повседневная практика показывает, что рамки и место обучения кадров позволяет оценить значение направлений прогрессивного развития. Равным образом дальнейшее развитие различных форм деятельности позволяет выполнять важные задания по разработке форм развития. Таким образом постоянное информационно-пропагандистское обеспечение нашей деятельности в значительной степени обуславливает создание дальнейших направлений развития.