Advertisement
Ex1easy

Untitled

Sep 30th, 2022
989
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // SPDX-License-Identifier: GPL-3.0
  2. pragma solidity >=0.7.0 <0.9.0;
  3.  
  4. // HELLPERS && LIB
  5. import "../shared/lib/SafeMath.sol"; // библиотека безопасного перевод средств
  6. import "../shared/lib/IERC20.sol";   // стандарт IERC20
  7.  
  8. // COMPONENT
  9. import "../shared/helpers/validateFuncs.sol";
  10. import "./PhaseSeed.sol";
  11. import "./PhasePrivate.sol";
  12. import "./PhasePublic.sol";
  13.  
  14. contract CryptoMonster is IERC20, validateFuncs, PhaseSeed, PhasePrivate, PhasePublic {
  15.     using SafeMath for uint256; // библиотека безопасных вычислений
  16.  
  17.     // COMMENT: Общие сведения по токену.
  18.     string public constant name = "CryptoMonster"; // название токена
  19.     string public constant symbol = "CMON";        // тикер токена
  20.     uint8 public constant decimals = 12;           // 1 000 000 000 000 == 1 CMON ; конвертация eth в wei: https://eth-converter.com/
  21.  
  22.     uint256 totalSupply_; // общее кол-во токенов при старте системы
  23.  
  24.     constructor(uint256 total) {
  25.         totalSupply_ = total; // кол-во токенов при старте
  26.  
  27.         structUsers_[ownerAdr] = structUser(Role.SYSTEM_OWNER ,"owner", get_keccak256("3412"), totalSupply_, 0, 0, 0);
  28.         whiteList.push(ownerAdr);
  29.  
  30.         structUsers_[privateProviderAdr] = structUser(Role.SYSTEM_PRIVATE, "Private provider", get_keccak256("1423"), 0, 0, 0, 0);
  31.         whiteList.push(privateProviderAdr);
  32.         allowed[ownerAdr][privateProviderAdr] = totalSupply_;
  33.         structPhases_[privateProviderAdr] = structPhase(false, false);
  34.  
  35.         structUsers_[publicProviderAdr] = structUser(Role.SYSTEM_PUBLIC, "Public provider", get_keccak256("2314"), 0, 0, 0, 0);
  36.         whiteList.push(publicProviderAdr);
  37.         allowed[ownerAdr][publicProviderAdr] = totalSupply_;
  38.         structPhases_[publicProviderAdr] = structPhase(false, false);
  39.  
  40.         // COMMENT: Перечесление средств инвесторам.
  41.         transfer(investorFirstAdr, 600000);  // Investor1
  42.         transfer(investorSecondAdr, 800000); // Investor2
  43.         transfer(bestFriendAdr, 400000);     // Best friend
  44.     }
  45.  
  46.     // COMMENT_FUNC: Функция покупки токена | например: покупатель хочет 1 токенов, для этого он должен отправить 5 вэй
  47.     function buy(uint256 _amount) external payable returns(bool, string memory) {
  48.         require(_amount <= tokenAmount_, "Too many tokens");
  49.         require(msg.value == _amount * tokenPrice_, "Need to send exact amount of wei");
  50.         if (validateOwner() == true) { // !: if пользователь админ
  51.             structUsers_[msg.sender].balance_overall = structUsers_[msg.sender].balance_overall.add(_amount);
  52.             return (true, "You bought a token");
  53.         // !: PRIVATE
  54.         } else if (structPhases_[privateProviderAdr].statusPhase == true) {
  55.             address _tempAdr;
  56.             for (uint i = 0; i < whiteList.length; i++) { // ?: перебор пользователей в белом листе
  57.                 _tempAdr = whiteList[i];
  58.                 if (_tempAdr == msg.sender) { // !: if пользователй находится в белом листе
  59.                     structUsers_[msg.sender].balance_private = structUsers_[msg.sender].balance_private.add(_amount);
  60.                     return (true, "You bought a token");
  61.                 }
  62.             }
  63.             return (false, "User not found in whitelist");
  64.         // !: PUBLIC
  65.         } else if (structPhases_[publicProviderAdr].statusPhase == true) {
  66.             structUsers_[msg.sender].balance_public = structUsers_[msg.sender].balance_public.add(_amount);
  67.             return (true, "You bought a token");
  68.         // !: SEED
  69.         } else {
  70.             return (true, "During the seed phase, only the owner can buy tokens");
  71.         }
  72.     }
  73.  
  74.     // COMMENT_FUNC: Функция вернет количество всех токенов, выделенных этим контрактом, независимо от владельца.
  75.     function totalSupply() public override view returns (uint256) {
  76.         return totalSupply_;
  77.     }
  78.  
  79.     // COMMENT_FUNC: Функция вернет текущий баланс токена учетной записи, идентифицированный по адресу его владельца.
  80.     function balanceOf(address _tokenOwner) public override view returns (uint256) {
  81.         if (validateOwner() == true) { // !: if пользователь админ
  82.             return structUsers_[_tokenOwner].balance_overall;
  83.         // !: PRIVATE
  84.         } else if (structPhases_[privateProviderAdr].statusPhase == true) {
  85.             return structUsers_[_tokenOwner].balance_private;
  86.         // !: PUBLIC
  87.         } else if (structPhases_[publicProviderAdr].statusPhase == true) {
  88.             return structUsers_[_tokenOwner].balance_public;
  89.         // !: SEED
  90.         } else {
  91.             return structUsers_[_tokenOwner].balance_seed;
  92.         }
  93.     }
  94.  
  95.     // COMMENT_FUNC: Функция перевода используется для перемещения количества токенов _numTokens с баланса владельца
  96.     // на баланс другого пользователя или получателя. Передающий владелец — msg.sender,
  97.     // то есть тот, кто выполняет функцию.
  98.     function transfer(address _receiver, uint256 _numTokens) public override returns (bool) {
  99.         if (validateOwner() == true) { // !: if пользователь владелец
  100.             require(_numTokens <= structUsers_[msg.sender].balance_overall);                                       // !: проверка баланса
  101.  
  102.             structUsers_[msg.sender].balance_overall = structUsers_[msg.sender].balance_overall.sub(_numTokens);   // ?: снятие токенов с баланса
  103.             // !: PRIVATE
  104.             if (structPhases_[privateProviderAdr].statusPhase == true) {
  105.                 structUsers_[_receiver].balance_private = structUsers_[_receiver].balance_private.add(_numTokens); // ?: начисление токенов на баланс
  106.             // !: PRIVATE
  107.             } else if (structPhases_[publicProviderAdr].statusPhase == true) {
  108.                 structUsers_[_receiver].balance_public = structUsers_[_receiver].balance_public.add(_numTokens);   // ?: начисление токенов на баланс
  109.             // !: SEED
  110.             } else {
  111.                 structUsers_[_receiver].balance_seed = structUsers_[_receiver].balance_seed.add(_numTokens);       // ?: начисление токенов на баланс
  112.             }
  113.             emit Transfer(msg.sender, _receiver, _numTokens);
  114.             return true;
  115.         } else { // !: if пользователь не владелец
  116.             if (structPhases_[privateProviderAdr].statusPhase == true) { // PRIVATE
  117.                 require(_numTokens <= structUsers_[msg.sender].balance_private);                                    // !: проверка баланса
  118.  
  119.                 structUsers_[msg.sender].balance_private = structUsers_[msg.sender].balance_private.sub(_numTokens); // ?: снятие токенов с баланса
  120.                 structUsers_[_receiver].balance_private = structUsers_[_receiver].balance_private.add(_numTokens);   // ?: начисление токенов на баланс
  121.             } else if (structPhases_[publicProviderAdr].statusPhase == true) { // PUBLIC
  122.                 require(_numTokens <= structUsers_[msg.sender].balance_public);// !: проверка баланса
  123.  
  124.                 structUsers_[msg.sender].balance_public = structUsers_[msg.sender].balance_public.sub(_numTokens); // ?: снятие токенов с баланса
  125.                 structUsers_[_receiver].balance_public = structUsers_[_receiver].balance_public.add(_numTokens);   // ?: начисление токенов на баланс
  126.             } else { // SEED
  127.                 require(_numTokens <= structUsers_[msg.sender].balance_seed);// !: проверка баланса
  128.                 require (structUsers_[msg.sender].role == Role.INVESTOR, "Your not investor");
  129.                 require (structUsers_[_receiver].role == Role.INVESTOR, "Your not investor");
  130.  
  131.                 structUsers_[msg.sender].balance_seed = structUsers_[msg.sender].balance_seed.sub(_numTokens); // ?: снятие токенов с баланса
  132.                 structUsers_[_receiver].balance_seed = structUsers_[_receiver].balance_seed.add(_numTokens);   // ?: начисление токенов на баланс
  133.             }
  134.             emit Transfer(msg.sender, _receiver, _numTokens);
  135.             return true;
  136.         }
  137.     }
  138.  
  139.     // COMMENT_FUNC: Функция TransferFrom является аналогом функции утверждения. Это позволяет делегату,
  140.     // одобренному для снятия средств, переводить средства владельца на сторонний счет.
  141.     function transferFrom(address _owner, address _buyer, uint256 _numTokens) public override returns (bool) {
  142.         if (structUsers_[_owner].role == Role.SYSTEM_OWNER) { // !: if пользователь, с которого снимают деньги владелец
  143.             require(_numTokens <= structUsers_[_owner].balance_overall);         // ?: проверка баланса
  144.             require(_numTokens <= allowed[_owner][msg.sender]);                  // ?: проверка баланса
  145.  
  146.             structUsers_[_owner].balance_overall = structUsers_[_owner].balance_overall.sub(_numTokens); // ?: снятие токенов с баланса
  147.             allowed[_owner][msg.sender] = allowed[_owner][msg.sender].sub(_numTokens);                   // ?: снятие токенов с баланса
  148.             // PRIVATE
  149.             if (structPhases_[privateProviderAdr].statusPhase == true) {
  150.                 structUsers_[_buyer].balance_private = structUsers_[_buyer].balance_private.add(_numTokens); // ?: начисление токенов на баланс
  151.             // PUBLIC
  152.             } else if (structPhases_[publicProviderAdr].statusPhase == true) {
  153.                 structUsers_[_buyer].balance_public = structUsers_[_buyer].balance_public.add(_numTokens);   // ?: начисление токенов на баланс
  154.             // SEED
  155.             } else {
  156.                 structUsers_[_buyer].balance_seed = structUsers_[_buyer].balance_seed.add(_numTokens);       // ?: начисление токенов на баланс
  157.             }
  158.             emit Transfer(_owner, _buyer, _numTokens);
  159.             return true;
  160.         } else { // !: if это обычны пользователь
  161.             // PRIVATE
  162.             if (structPhases_[privateProviderAdr].statusPhase == true) {
  163.                 require(_numTokens <= structUsers_[_owner].balance_private); // ?: проверка баланса
  164.                 require(_numTokens <= allowed[_owner][msg.sender]);          // ?: проверка баланса
  165.  
  166.                 structUsers_[_owner].balance_private = structUsers_[_owner].balance_private.sub(_numTokens); // ?: снятие токенов с баланса
  167.                 allowed[_owner][msg.sender] = allowed[_owner][msg.sender].sub(_numTokens);                   // ?: снятие токенов с баланса
  168.                 structUsers_[_buyer].balance_private = structUsers_[_buyer].balance_private.add(_numTokens); // ?: начисление токенов на баланс
  169.             // PUBLIC
  170.             } else if (structPhases_[publicProviderAdr].statusPhase == true) {
  171.                 require(_numTokens <= structUsers_[_owner].balance_public); // ?: проверка баланса
  172.                 require(_numTokens <= allowed[_owner][msg.sender]);         // ?: проверка баланса
  173.  
  174.                 structUsers_[_owner].balance_public = structUsers_[_owner].balance_public.sub(_numTokens); // ?: снятие токенов с баланса
  175.                 allowed[_owner][msg.sender] = allowed[_owner][msg.sender].sub(_numTokens);                 // ?: снятие токенов с баланса
  176.                 structUsers_[_buyer].balance_public = structUsers_[_buyer].balance_public.add(_numTokens); // ?: начисление токенов на баланс
  177.             // SEED
  178.             } else {
  179.                 require(_numTokens <= structUsers_[_owner].balance_seed); // ?: проверка баланса
  180.                 require(_numTokens <= allowed[_owner][msg.sender]);       // ?: проверка баланса
  181.  
  182.                 structUsers_[_owner].balance_seed = structUsers_[_owner].balance_seed.sub(_numTokens); // ?: снятие токенов с баланса
  183.                 allowed[_owner][msg.sender] = allowed[_owner][msg.sender].sub(_numTokens);             // ?: снятие токенов с баланса
  184.                 structUsers_[_buyer].balance_seed = structUsers_[_buyer].balance_seed.add(_numTokens); // ?: начисление токенов на баланс
  185.             }
  186.             emit Transfer(_owner, _buyer, _numTokens);
  187.             return true;
  188.         }
  189.     }
  190.  
  191.     // COMMENT_FUNC: Функция позволяет владельцу, т. е. msg.sender одобрить делегированную учетную запись
  192.     // для снятия токенов со своей учетной записи и передачи их на другие учетные записи.
  193.     function approve(address _delegate, uint256 _numTokens) public override returns (bool) {
  194.         allowed[msg.sender][_delegate] = _numTokens;      // установка разрешенной суммы для снятие токенов с определенного АДРЕСА
  195.         emit Approval(msg.sender, _delegate, _numTokens);
  196.         return true;
  197.     }
  198.  
  199.     // COMMENT_FUNC: Функци возвращает текущее утвержденное количество токенов владельцем
  200.     // конкретному делегату, как установлено в функции утверждения.
  201.     function allowance(address _owner, address _delegate) public override view returns (uint) {
  202.         return allowed[_owner][_delegate];
  203.     }
  204.  
  205.     // COMMENT_FUNC: Функция добавления адреса в черный лист.
  206.     function addBlackList (address _userAdr) public onlyOwner {
  207.         blackList.push(_userAdr); // ?: Добавление пользователя в черный список
  208.     }
  209. }
Tags: Contrat
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement