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

PantheonEcoSystem

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

Баланс

3178.14 ETH.

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

0%

Ввод

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

Выводы

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

Условия

В день
-
В час
-

Инвесторов

1545

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

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

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

8.5

Контакты

  • Таймлайн:
  • час
  • день
  • неделя
  • месяц
Пополнения (9304)
Выводы (2168)
Аудит
Код
API
Комменторы
Дата Блок TxHash От кого Кому Сумма
Сегодня 18:49 7249384 0x9775aaf1c28f35d430e7e20943197d61a7676e7d6b1a4bf67b3bc40122ed9bcb 0x707c980075c6c599596d19a9e90449a8fb7dfdb1 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 18:45 7249379 0x61b362c51704c5ca1dbf3529961b96d51242c88eca63cecaef90f019192896db 0xfef1a4260a13ba67c0effd8930c6b702aa04da34 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:41 7249196 0x4e94a8e41acce6f13e85247558961e914d1cf01b021de42be013c612d94e7796
Транзакция с ошибкой
0xb05a77c14ee58567b3b6f41802a013d0b266eea7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:40 7249194 0x5bbb5deb994fd4e281aa7a2177cbeeb804b9436618d2fca342b3f8610a47fb77
Транзакция с ошибкой
0xb05a77c14ee58567b3b6f41802a013d0b266eea7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:40 7249194 0xd8a3101874a3e425e343ca1631206a96e9daa656af4720359305f09fa0702308
Транзакция с ошибкой
0xb05a77c14ee58567b3b6f41802a013d0b266eea7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:40 7249194 0x88a98e376ae4f1965702ca1c054687880feb3b9d8fa787f9645021d49f9747ef
Транзакция с ошибкой
0xb05a77c14ee58567b3b6f41802a013d0b266eea7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:40 7249194 0x60c0d5eba9c0c3eb9d06a35cec208137a2310f50e6900889579c2910bc64b0cd
Транзакция с ошибкой
0xb05a77c14ee58567b3b6f41802a013d0b266eea7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:40 7249194 0x1de0b6b2bb35d5fb34a00e365ea40f2148f9e94cfa59f64a1995ebc9643f377f
Транзакция с ошибкой
0xb05a77c14ee58567b3b6f41802a013d0b266eea7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:40 7249194 0x7250ee92f8618d703bd6874502e855a4d542a9f8b861b8c484430f834a20e3e3
Транзакция с ошибкой
0xb05a77c14ee58567b3b6f41802a013d0b266eea7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:40 7249194 0xe907cfaf15e88265fed498f81a314cd0867c799f9ec64af063b3140e3f491441
Транзакция с ошибкой
0xb05a77c14ee58567b3b6f41802a013d0b266eea7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:15 7249110 0x3fd92bbb5605df44598464d455c558704b5979c3496725398945b8acf7ac634e 0x6503900bfec7178c4bc405775b8910313ee5dfce 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:13 7249105 0x68c568466afbf04c1db93b845d2056accf29776a40ead4b066aeb99da9a73518 0x6503900bfec7178c4bc405775b8910313ee5dfce 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:11 7249100 0x9b6aa43247d6ef44211d4df90333598311b106d91cf11b00e3627cdaf38ec9c3 0x6503900bfec7178c4bc405775b8910313ee5dfce 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:08 7249085 0xaa2c2e40d16eb663aa048959caa3adad2293998dad2c1ad59ca5a2eaa64c2f54 0x6503900bfec7178c4bc405775b8910313ee5dfce 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:07 7249080 0x33083d8a35b449f3caaefde76bc6fdc605f79caedef623f636374ccaf70673ca 0x6503900bfec7178c4bc405775b8910313ee5dfce 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:07 7249080 0x6ede7fb730380c2a2bac5e3e65f864807a100f5cbadcfe2c39c9a3cf0e1d4b39 0x6503900bfec7178c4bc405775b8910313ee5dfce 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:01 7249066 0xfd2e8ad0f168f86fd791af29dd8ebab594cb2b908c398549a55db23ccf551680 0x6503900bfec7178c4bc405775b8910313ee5dfce 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 17:00 7249063 0xdb26b53a11f5ae21b99f856d23f318c86c31eb0dee4447fcba86c803910659f9
Транзакция с ошибкой
0x6503900bfec7178c4bc405775b8910313ee5dfce 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 16:55 7249051 0x086b2aac78237216254eaeff0a0dc05541e790c09b912f81e340816358313c6b
Транзакция с ошибкой
0x6503900bfec7178c4bc405775b8910313ee5dfce 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 16:36 7249002 0x2b56f4435ad37f000ca74c6c5a64360154ac5db54df976b4790f9658ca62a2de 0xc2c4029e78558d04e9cd8e7648daf0e6de559452 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 16:33 7248991 0x9cb8874020498294d5db43d09f87fb14bae5398638cedd1d5cd0c60c94dba666 0xbe2c671bbfd15467023fd90f0022dba28979c09d 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 16:29 7248980 0x0d946a07529d6f8f516a4ee2b0990a7db01d844ac4b3f9c09550ad3a5715e39a 0x6b7217baddb2b178a909600e664c413979e0ddd6 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 15:06 7248747 0xcf4fbd87f8120b6016a14b06e8c4832d8a98ee88cb7ffc0e2ee960fca39f0a10 0x691a4e1d7e8aef2e74c0fb20100442c3abcda969 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 14:37 7248672 0x2efa72f219f3a42398b1fd553d7f28a7dd9edb8a80e7a4c5fd55e38970025996 0x8844f8233c15f853e8fcfe07025dd5abeafad4c4 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Сегодня 14:12 7248599 0x4375552e368f1e91958d710675ad7f527553296dfb6e54f9ff9bc8b03a0849df
Транзакция с ошибкой
0xb05a77c14ee58567b3b6f41802a013d0b266eea7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0 Ether
Дата Блок parentTxHash От кого Кому Сумма
19 фев. 15:09 7240273 0xbdc6b6b88225b57d309f16910c4c82277c3440084efea26a795bf4ffc94cd9a0 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0xf178c83b071710dcb4c49ec6925291663e589493 0.006081032543747874 Ether
19 фев. 14:32 7240151 0xc7d8892d735c259bf6a494186a90ac04e1284fec6aecbbc2c0666827174c6fc0 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0xfe2a12dfad83ade200a3322de94d98f444384a2a 1.4489970934496548 Ether
19 фев. 13:35 7239965 0x7717afa204ee5c4685bd2ef9d410e19bc888cc83a29a94c41b8f2f82cc673ea4 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x42b8d8004dfa442770a1721575ff3ff4354c18c0 13.146167609202958 Ether
19 фев. 12:11 7239741 0x27d949f88d2c83ae002ef45761c572e34cc53b2ffbb3cd32a7c05603886f8812 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x1db82c7b0917d80ba0c8dbbac29e04904c6ca7a0 1.0290518021287873 Ether
19 фев. 10:10 7239378 0x8e338a30414b223507dee3c09071221b9455854876a27ba82f71deabd56e4fd9 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0xd37195268a8b7678322cc3cf6a429c0f3e050fea 4.192056014765221 Ether
19 фев. 09:58 7239336 0x663f422fe9cc7253bbae607d08f65ef414ec53794f7fe23a4f34591e8311c9e1 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x4f7386e985f118ff40dc7bc63fac4c1508637506 0.000374807578615355 Ether
19 фев. 09:30 7239240 0xb27c7f337db3b6578822b88955cee86f3a3493f1d21c1e581b2744a12279cd9e 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x6ed3c871f905acaad159e9f23ce2dc47ed39c2c5 1.4499354022813193 Ether
18 фев. 23:30 7237456 0x407c21ec67182667c59255e5017fa7a18905f912153ffe5890e138d37de3c00f 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x188cc7286af105be6f7a11585e2f3ae2f23d27ca 0.5515095212655343 Ether
18 фев. 19:42 7236791 0xe4b14564f42dcf93a6b7ab9ecf45df091f3ce64d4c1b87f9243d61195795ee2b 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x3255db93b4f78950fa7be34a3013739d255db5e3 0.00811375608463645 Ether
18 фев. 18:10 7236543 0x9717532a55c60a791e191d919ef0592bd67446ee447c7058dce36efd1c62f425 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x9b48c98790f05a9c3a8808e1828a6d89e0a97109 13.379689683004637 Ether
18 фев. 16:49 7236320 0x2490940cbd9a2c4aaed447b6c0ea11237839b338738c1268ffacd35c9f26f8f4 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x6e0e66f846300a9e00062af27c3e190c95ccd2a6 0.10306938276976575 Ether
18 фев. 15:48 7236139 0xfe8e2ab477455ae8f86134ef647bcfc8e0b79c29d3c86acfa6308dd3f4e549fb 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x19b84c79fa69c3ccd8159fb1265cf0fe8d23f513 2.6005211427361066 Ether
18 фев. 11:19 7235320 0xaada47686d929f7296bc57ded2a0b74be3188b4858a6a426d8de1cea510475ae 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0xe193bbb83f65a1ed8e2235d0baf7de1fd0a89ff5 33.34012301116861 Ether
17 фев. 13:47 7231563 0xd8ce4699e4968e12a075ef9e12c30f3f148a0f36fa29f6ef479ae2c67752a8e7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x6193fb412e7349d48155eb20c53541adce24c934 0.05598636009429606 Ether
17 фев. 12:34 7231364 0x8c76f8880eac601d4f90ae2c9d7dafc7e298e09b89df091b57c66714604145de 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x29d3da5feb053db3933930f404c71753bca5297d 12.902052371508596 Ether
16 фев. 21:30 7228730 0x658b33d7f01fa367b54bbc4ad2807078f019614b3f9d78d999874af5617155e7 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x02c73d7c23800d61f1fecafa94b90f41ab95fef5 0.9619709815082331 Ether
16 фев. 20:05 7228498 0xfa7e1c90a5a2be5bd13cb2aaa50821cd590821a0353727d4774ba1932fe1d928 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0xd3205db794b05cbbbc7aff9c2a603d6f7be9e024 0.45460243567760694 Ether
16 фев. 15:24 7227672 0x4973f7f11213b412c0d4df895d1576b419731aa5e61064445c62a09f65ab4ede 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0xb37522063947c692de09821081bf19c51e4513b9 0.03685372249608364 Ether
16 фев. 15:20 7227661 0xeaae1d724ac9297a77cf88d3dcc84080e73775aeb46e92db424e60df1e926996 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0xb37522063947c692de09821081bf19c51e4513b9 2.470610431087428 Ether
16 фев. 14:14 7227432 0xb23b4681e1655707241c75ec6b19bc2e297ee25431e3ca36e19f959c272b961c 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0xb37522063947c692de09821081bf19c51e4513b9 0.004337940296615339 Ether
16 фев. 12:59 7227231 0x73fa8cb02228fc74c80c9ec79cff6ca755736cf6718715fbc86e0c869b5b27fa 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x16861ea2715129898542d789c4d4921d14582560 0.5724082574101541 Ether
15 фев. 19:52 7224278 0xcf1c1ad4e646c744d5a494953e4df65fcc231085014b68fd968892f580e61186 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x2da7cf0b36a01fdd16b201b0fac08a45bf09c40a 4.2183649128262495 Ether
15 фев. 18:08 7223974 0x2854854b25b8a6ee4d38c86bb2f46016e764b12650b6bc64dbc0208776b54fdf 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x49c3dd65dab49f9b0260e6aa503f7116c57e2913 0.025635494070665787 Ether
15 фев. 12:26 7222955 0x5d98bcdde9a76b0acca3d68456c7ffd0038867da779f65bd26e98e0eaf03dde9 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0x15517214b2ee748b001be7d3a12ca13e7c19682b 0.7260215352335117 Ether
15 фев. 04:56 7221684 0x226aa1fce041abb7e48008aaed760c63a5fb8fcd0d666b3737c142f4419d7e06 0xbd73e675e1fa3d60a302c797df5c82e558da7ce1 0xd85b640e93d5f5ecfd4798e44f57008024eb2146 2.8230307576454963 Ether
Средняя оценка аудиторов 8.5
Contract Source Code </>
pragma solidity 0.4.25;

contract PantheonEcoSystem {

    struct UserRecord {
        address referrer;
        uint tokens;
        uint gained_funds;
        uint ref_funds;
        // this field can be negative
        int funds_correction;
    }

    using SafeMath for uint;
    using SafeMathInt for int;
    using Fee for Fee.fee;
    using ToAddress for bytes;

    // ERC20
    string constant public name = "Pantheon Ecosystem";
    string constant public symbol = "PAN";
    uint8 constant public decimals = 18;

    // Fees
    Fee.fee private fee_purchase = Fee.fee(1, 10); // 10%
    Fee.fee private fee_selling  = Fee.fee(1, 20); // 5%
    Fee.fee private fee_transfer = Fee.fee(1, 100); // 1%
    Fee.fee private fee_referral = Fee.fee(33, 100); // 33%

    // Minimal amount of tokens to be an participant of referral program
    uint constant private minimal_stake = 10e18;

    // Factor for converting eth <-> tokens with required precision of calculations
    uint constant private precision_factor = 1e18;

    // Pricing policy
    //  - if user buy 1 token, price will be increased by "price_offset" value
    //  - if user sell 1 token, price will be decreased by "price_offset" value
    // For details see methods "fundsToTokens" and "tokensToFunds"
    uint private price = 1e29; // 100 Gwei * precision_factor
    uint constant private price_offset = 1e28; // 10 Gwei * precision_factor

    // Total amount of tokens
    uint private total_supply = 0;

    // Total profit shared between token's holders. It's not reflect exactly sum of funds because this parameter
    // can be modified to keep the real user's dividends when total supply is changed
    // For details see method "dividendsOf" and using "funds_correction" in the code
    uint private shared_profit = 0;

    // Map of the users data
    mapping(address => UserRecord) private user_data;

    // ==== Modifiers ==== //

    modifier onlyValidTokenAmount(uint tokens) {
        require(tokens > 0, "Amount of tokens must be greater than zero");
        require(tokens <= user_data[msg.sender].tokens, "You have not enough tokens");
        _;
    }

    // ==== Public API ==== //

    // ---- Write methods ---- //

    function () public payable {
        buy(msg.data.toAddr());
    }

    /*
    * @dev Buy tokens from incoming funds
    */
    function buy(address referrer) public payable {

        // apply fee
        (uint fee_funds, uint taxed_funds) = fee_purchase.split(msg.value);
        require(fee_funds != 0, "Incoming funds is too small");

        // update user's referrer
        //  - you cannot be a referrer for yourself
        //  - user and his referrer will be together all the life
        UserRecord storage user = user_data[msg.sender];
        if (referrer != 0x0 && referrer != msg.sender && user.referrer == 0x0) {
            user.referrer = referrer;
        }

        // apply referral bonus
        if (user.referrer != 0x0) {
            fee_funds = rewardReferrer(msg.sender, user.referrer, fee_funds, msg.value);
            require(fee_funds != 0, "Incoming funds is too small");
        }

        // calculate amount of tokens and change price
        (uint tokens, uint _price) = fundsToTokens(taxed_funds);
        require(tokens != 0, "Incoming funds is too small");
        price = _price;

        // mint tokens and increase shared profit
        mintTokens(msg.sender, tokens);
        shared_profit = shared_profit.add(fee_funds);

        emit Purchase(msg.sender, msg.value, tokens, price / precision_factor, now);
    }

    /*
    * @dev Sell given amount of tokens and get funds
    */
    function sell(uint tokens) public onlyValidTokenAmount(tokens) {

        // calculate amount of funds and change price
        (uint funds, uint _price) = tokensToFunds(tokens);
        require(funds != 0, "Insufficient tokens to do that");
        price = _price;

        // apply fee
        (uint fee_funds, uint taxed_funds) = fee_selling.split(funds);
        require(fee_funds != 0, "Insufficient tokens to do that");

        // burn tokens and add funds to user's dividends
        burnTokens(msg.sender, tokens);
        UserRecord storage user = user_data[msg.sender];
        user.gained_funds = user.gained_funds.add(taxed_funds);

        // increase shared profit
        shared_profit = shared_profit.add(fee_funds);

        emit Selling(msg.sender, tokens, funds, price / precision_factor, now);
    }

    /*
    * @dev Transfer given amount of tokens from sender to another user
    * ERC20
    */
    function transfer(address to_addr, uint tokens) public onlyValidTokenAmount(tokens) returns (bool success) {

        require(to_addr != msg.sender, "You cannot transfer tokens to yourself");

        // apply fee
        (uint fee_tokens, uint taxed_tokens) = fee_transfer.split(tokens);
        require(fee_tokens != 0, "Insufficient tokens to do that");

        // calculate amount of funds and change price
        (uint funds, uint _price) = tokensToFunds(fee_tokens);
        require(funds != 0, "Insufficient tokens to do that");
        price = _price;

        // burn and mint tokens excluding fee
        burnTokens(msg.sender, tokens);
        mintTokens(to_addr, taxed_tokens);

        // increase shared profit
        shared_profit = shared_profit.add(funds);

        emit Transfer(msg.sender, to_addr, tokens);
        return true;
    }

    /*
    * @dev Reinvest all dividends
    */
    function reinvest() public {

        // get all dividends
        uint funds = dividendsOf(msg.sender);
        require(funds > 0, "You have no dividends");

        // make correction, dividents will be 0 after that
        UserRecord storage user = user_data[msg.sender];
        user.funds_correction = user.funds_correction.add(int(funds));

        // apply fee
        (uint fee_funds, uint taxed_funds) = fee_purchase.split(funds);
        require(fee_funds != 0, "Insufficient dividends to do that");

        // apply referral bonus
        if (user.referrer != 0x0) {
            fee_funds = rewardReferrer(msg.sender, user.referrer, fee_funds, funds);
            require(fee_funds != 0, "Insufficient dividends to do that");
        }

        // calculate amount of tokens and change price
        (uint tokens, uint _price) = fundsToTokens(taxed_funds);
        require(tokens != 0, "Insufficient dividends to do that");
        price = _price;

        // mint tokens and increase shared profit
        mintTokens(msg.sender, tokens);
        shared_profit = shared_profit.add(fee_funds);

        emit Reinvestment(msg.sender, funds, tokens, price / precision_factor, now);
    }

    /*
    * @dev Withdraw all dividends
    */
    function withdraw() public {

        // get all dividends
        uint funds = dividendsOf(msg.sender);
        require(funds > 0, "You have no dividends");

        // make correction, dividents will be 0 after that
        UserRecord storage user = user_data[msg.sender];
        user.funds_correction = user.funds_correction.add(int(funds));

        // send funds
        msg.sender.transfer(funds);

        emit Withdrawal(msg.sender, funds, now);
    }

    /*
    * @dev Sell all tokens and withraw dividends
    */
    function exit() public {

        // sell all tokens
        uint tokens = user_data[msg.sender].tokens;
        if (tokens > 0) {
            sell(tokens);
        }

        withdraw();
    }

    /*
    * @dev CAUTION! This method distributes all incoming funds between token's holders and gives you nothing
    * It will be used by another contracts/addresses from our ecosystem in future
    * But if you want to donate, you're welcome :)
    */
    function donate() public payable {
        shared_profit = shared_profit.add(msg.value);
        emit Donation(msg.sender, msg.value, now);
    }

    // ---- Read methods ---- //

    /*
    * @dev Total amount of tokens
    * ERC20
    */
    function totalSupply() public view returns (uint) {
        return total_supply;
    }

    /*
    * @dev Amount of user's tokens
    * ERC20
    */
    function balanceOf(address addr) public view returns (uint) {
        return user_data[addr].tokens;
    }

    /*
    * @dev Amount of user's dividends
    */
    function dividendsOf(address addr) public view returns (uint) {

        UserRecord memory user = user_data[addr];

        // gained funds from selling tokens + bonus funds from referrals
        // int because "user.funds_correction" can be negative
        int d = int(user.gained_funds.add(user.ref_funds));
        require(d >= 0);

        // avoid zero divizion
        if (total_supply > 0) {
            // profit is proportional to stake
            d = d.add(int(shared_profit.mul(user.tokens) / total_supply));
        }

        // correction
        // d -= user.funds_correction
        if (user.funds_correction > 0) {
            d = d.sub(user.funds_correction);
        }
        else if (user.funds_correction < 0) {
            d = d.add(-user.funds_correction);
        }

        // just in case
        require(d >= 0);

        // total sum must be positive uint
        return uint(d);
    }

    /*
    * @dev Amount of tokens can be gained from given amount of funds
    */
    function expectedTokens(uint funds, bool apply_fee) public view returns (uint) {
        if (funds == 0) {
            return 0;
        }
        if (apply_fee) {
            (,uint _funds) = fee_purchase.split(funds);
            funds = _funds;
        }
        (uint tokens,) = fundsToTokens(funds);
        return tokens;
    }

    /*
    * @dev Amount of funds can be gained from given amount of tokens
    */
    function expectedFunds(uint tokens, bool apply_fee) public view returns (uint) {
        // empty tokens in total OR no tokens was sold
        if (tokens == 0 || total_supply == 0) {
            return 0;
        }
        // more tokens than were mined in total, just exclude unnecessary tokens from calculating
        else if (tokens > total_supply) {
            tokens = total_supply;
        }
        (uint funds,) = tokensToFunds(tokens);
        if (apply_fee) {
            (,uint _funds) = fee_selling.split(funds);
            funds = _funds;
        }
        return funds;
    }

    /*
    * @dev Purchase price of next 1 token
    */
    function buyPrice() public view returns (uint) {
        return price / precision_factor;
    }

    /*
    * @dev Selling price of next 1 token
    */
    function sellPrice() public view returns (uint) {
        return price.sub(price_offset) / precision_factor;
    }

    // ==== Private API ==== //

    /*
    * @dev Mint given amount of tokens to given user
    */
    function mintTokens(address addr, uint tokens) internal {

        UserRecord storage user = user_data[addr];

        bool not_first_minting = total_supply > 0;

        // make correction to keep dividends the rest of the users
        if (not_first_minting) {
            shared_profit = shared_profit.mul(total_supply.add(tokens)) / total_supply;
        }

        // add tokens
        total_supply = total_supply.add(tokens);
        user.tokens = user.tokens.add(tokens);

        // make correction to keep dividends of user
        if (not_first_minting) {
            user.funds_correction = user.funds_correction.add(int(tokens.mul(shared_profit) / total_supply));
        }
    }

    /*
    * @dev Burn given amout of tokens from given user
    */
    function burnTokens(address addr, uint tokens) internal {

        UserRecord storage user = user_data[addr];

        // keep current dividents of user if last tokens will be burned
        uint dividends_from_tokens = 0;
        if (total_supply == tokens) {
            dividends_from_tokens = shared_profit.mul(user.tokens) / total_supply;
        }

        // make correction to keep dividends the rest of the users
        shared_profit = shared_profit.mul(total_supply.sub(tokens)) / total_supply;

        // sub tokens
        total_supply = total_supply.sub(tokens);
        user.tokens = user.tokens.sub(tokens);

        // make correction to keep dividends of the user
        // if burned not last tokens
        if (total_supply > 0) {
            user.funds_correction = user.funds_correction.sub(int(tokens.mul(shared_profit) / total_supply));
        }
        // if burned last tokens
        else if (dividends_from_tokens != 0) {
            user.funds_correction = user.funds_correction.sub(int(dividends_from_tokens));
        }
    }

    /*
     * @dev Rewards the referrer from given amount of funds
     */
    function rewardReferrer(address addr, address referrer_addr, uint funds, uint full_funds) internal returns (uint funds_after_reward) {
        UserRecord storage referrer = user_data[referrer_addr];
        if (referrer.tokens >= minimal_stake) {
            (uint reward_funds, uint taxed_funds) = fee_referral.split(funds);
            referrer.ref_funds = referrer.ref_funds.add(reward_funds);
            emit ReferralReward(addr, referrer_addr, full_funds, reward_funds, now);
            return taxed_funds;
        }
        else {
            return funds;
        }
    }

    /*
    * @dev Calculate tokens from funds
    *
    * Given:
    *   a[1] = price
    *   d = price_offset
    *   sum(n) = funds
    * Here is used arithmetic progression's equation transformed to a quadratic equation:
    *   a * n^2 + b * n + c = 0
    * Where:
    *   a = d
    *   b = 2 * a[1] - d
    *   c = -2 * sum(n)
    * Solve it and first root is what we need - amount of tokens
    * So:
    *   tokens = n
    *   price = a[n+1]
    *
    * For details see method below
    */
    function fundsToTokens(uint funds) internal view returns (uint tokens, uint _price) {
        uint b = price.mul(2).sub(price_offset);
        uint D = b.mul(b).add(price_offset.mul(8).mul(funds).mul(precision_factor));
        uint n = D.sqrt().sub(b).mul(precision_factor) / price_offset.mul(2);
        uint anp1 = price.add(price_offset.mul(n) / precision_factor);
        return (n, anp1);
    }

    /*
    * @dev Calculate funds from tokens
    *
    * Given:
    *   a[1] = sell_price
    *   d = price_offset
    *   n = tokens
    * Here is used arithmetic progression's equation (-d because of d must be negative to reduce price):
    *   a[n] = a[1] - d * (n - 1)
    *   sum(n) = (a[1] + a[n]) * n / 2
    * So:
    *   funds = sum(n)
    *   price = a[n]
    *
    * For details see method above
    */
    function tokensToFunds(uint tokens) internal view returns (uint funds, uint _price) {
        uint sell_price = price.sub(price_offset);
        uint an = sell_price.add(price_offset).sub(price_offset.mul(tokens) / precision_factor);
        uint sn = sell_price.add(an).mul(tokens) / precision_factor.mul(2);
        return (sn / precision_factor, an);
    }

    // ==== Events ==== //

    event Purchase(address indexed addr, uint funds, uint tokens, uint price, uint time);
    event Selling(address indexed addr, uint tokens, uint funds, uint price, uint time);
    event Reinvestment(address indexed addr, uint funds, uint tokens, uint price, uint time);
    event Withdrawal(address indexed addr, uint funds, uint time);
    event Donation(address indexed addr, uint funds, uint time);
    event ReferralReward(address indexed referral_addr, address indexed referrer_addr, uint funds, uint reward_funds, uint time);

    //ERC20
    event Transfer(address indexed from_addr, address indexed to_addr, uint tokens);

}

library SafeMath {

    /**
    * @dev Multiplies two numbers
    */
    function mul(uint a, uint b) internal pure returns (uint) {
        if (a == 0) {
            return 0;
        }
        uint c = a * b;
        require(c / a == b, "mul failed");
        return c;
    }

    /**
    * @dev Subtracts two numbers
    */
    function sub(uint a, uint b) internal pure returns (uint) {
        require(b <= a, "sub failed");
        return a - b;
    }

    /**
    * @dev Adds two numbers
    */
    function add(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "add failed");
        return c;
    }

    /**
     * @dev Gives square root from number
     */
    function sqrt(uint x) internal pure returns (uint y) {
        uint z = add(x, 1) / 2;
        y = x;
        while (z < y) {
            y = z;
            z = add(x / z, z) / 2;
        }
    }
}

library SafeMathInt {

    /**
    * @dev Subtracts two numbers
    */
    function sub(int a, int b) internal pure returns (int) {
        int c = a - b;
        require(c <= a, "sub failed");
        return c;
    }

    /**
    * @dev Adds two numbers
    */
    function add(int a, int b) internal pure returns (int) {
        int c = a + b;
        require(c >= a, "add failed");
        return c;
    }
}

library Fee {

    using SafeMath for uint;

    struct fee {
        uint num;
        uint den;
    }

    /*
    * @dev Splits given value to two parts: tax itself and taxed value
    */
    function split(fee memory f, uint value) internal pure returns (uint tax, uint taxed_value) {
        if (value == 0) {
            return (0, 0);
        }
        tax = value.mul(f.num) / f.den;
        taxed_value = value.sub(tax);
    }

    /*
    * @dev Returns only tax part
    */
    function get_tax(fee memory f, uint value) internal pure returns (uint tax) {
        if (value == 0) {
            return 0;
        }
        tax = value.mul(f.num) / f.den;
    }
}

library ToAddress {

    /*
    * @dev Transforms bytes to address
    */
    function toAddr(bytes source) internal pure returns (address addr) {
        assembly {
            addr := mload(add(source, 0x14))
        }
        return addr;
    }
}
Документация
Идейные соображения высшего порядка, а также дальнейшее развитие различных форм деятельности представляет собой интересный эксперимент проверки модели развития. Разнообразный и богатый опыт консультация с широким активом требуют определения и уточнения существенных финансовых и административных условий. Задача организации, в особенности же новая модель организационной деятельности требуют от нас анализа системы обучения кадров, соответствует насущным потребностям. Повседневная практика показывает, что дальнейшее развитие различных форм деятельности обеспечивает широкому кругу (специалистов) участие в формировании новых предложений. Разнообразный и богатый опыт дальнейшее развитие различных форм деятельности влечет за собой процесс внедрения и модернизации новых предложений.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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