ETH Price: $1,820.14 (-3.43%)

Transaction Decoder

Block:
10427258 at Jul-09-2020 07:49:11 PM +UTC
Transaction Fee:
0.00973188 ETH $17.71
Gas Used:
360,440 Gas / 27 Gwei

Emitted Events:

170 OpenAlexaProtocol.Transfer( from=0x0000000000000000000000000000000000000000, to=[Sender] 0xccbaa86f07d90601a4bef6d6e1e7cf66500e660d, value=3000000000000000000 )
171 OpenAlexalO.getMoneyForLevelEvent( UserAddress=[Sender] 0xccbaa86f07d90601a4bef6d6e1e7cf66500e660d, UserId=18124, ReferrerAddress=0x480687435273e8b2aa78af42d43a784e7f7fa6d4, ReferrerId=17482, Levelno=1, LevelPrice=30000000000000000, Time=1594324151 )
172 OpenAlexalO.regLevelEvent( UserAddress=[Sender] 0xccbaa86f07d90601a4bef6d6e1e7cf66500e660d, ReferrerAddress=0x480687435273e8b2aa78af42d43a784e7f7fa6d4, Time=1594324151 )

Account State Difference:

  Address   Before After State Difference Code
0x17884306...5ddE1A316
0x48068743...E7f7fa6D4 0.01085058742835895 Eth0.03605058742835895 Eth0.0252
0x629dBB4e...43D7F5575
(OpenAlexa.io: Deployer)
10.2506515782 Eth10.2554515782 Eth0.0048
0x80e9540c...0175b60FF
(OpenAlexa.io)
0xCCBaA86f...6500E660d
0.05 Eth
Nonce: 0
0.01026812 Eth
Nonce: 1
0.03973188
(UUPool)
314.024362275110844779 Eth314.034094155110844779 Eth0.00973188

Execution Trace

ETH 0.03 OpenAlexalO.regUser( _referrerID=17482, _mrs=[u5qv37SXcZt7eem2G/rp+rxjdFspCuN00YHNnmNGj7Q=, 1WCiDmG3psXHLoNNktytxO5gQCiingvmQKxTrYQJBS8=, R1L7cgyqXmKWlMyQqm5pNVzKaPUU6z+cn+inhgr9P/w=], _v=28 )
  • ETH 0.0252 0x480687435273e8b2aa78af42d43a784e7f7fa6d4.CALL( )
  • ETH 0.0048 OpenAlexa.io: Deployer.CALL( )
  • OpenAlexaProtocol.mint( _receiver=0xCCBaA86f07D90601a4bEF6D6E1e7Cf66500E660d, _amount=3000000000000000000, _mrs=[u5qv37SXcZt7eem2G/rp+rxjdFspCuN00YHNnmNGj7Q=, 1WCiDmG3psXHLoNNktytxO5gQCiingvmQKxTrYQJBS8=, R1L7cgyqXmKWlMyQqm5pNVzKaPUU6z+cn+inhgr9P/w=], _v=28 ) => ( True )
    • Null: 0x000...001.bb9aafdf( )
      File 1 of 2: OpenAlexalO
      /**
       *
       * Updated OpenAlexa v1.2 (Fixed)
       * URL: https://openalexa.io 
       *
      */
      
      pragma solidity 0.5.14;
      
      
      library SafeMath {
      
          function add(uint256 a, uint256 b) internal pure returns (uint256) {
              uint256 c = a + b;
              require(c >= a, "SafeMath: addition overflow");
              return c;
          }
      
          function sub(uint256 a, uint256 b) internal pure returns (uint256) {
              require(b <= a, "SafeMath: subtraction overflow");
              uint256 c = a - b;
              return c;
          }
      
          function mul(uint256 a, uint256 b) internal pure returns (uint256) {
              if (a == 0) {
                  return 0;
              }
              uint256 c = a * b;
              require(c / a == b, "SafeMath: multiplication overflow");
              return c;
          }
      
          function div(uint256 a, uint256 b) internal pure returns (uint256) {
              require(b > 0, "SafeMath: division by zero");
              uint256 c = a / b;
              return c;
          }
      }
      
      
      contract ERC20 {
          function mint(address reciever, uint256 value, bytes32[3] memory _mrs, uint8 _v) public returns(bool);
          function transfer(address to, uint256 value) public returns(bool);
      }
      
      
      contract OpenAlexalO {
          using SafeMath for uint256;
      
          struct UserStruct {
              bool isExist;
              uint id;
              uint referrerID;
              uint currentLevel;
              uint totalEarningEth;
              address[] referral;
              mapping(uint => uint) levelExpired;
          }
          
          ERC20 Token;
          OpenAlexalO public oldAlexa;
          address public ownerAddress;
          uint public adminFee = 16 ether;
          uint public currentId = 0;
          uint public oldAlexaId = 1;
          uint public PERIOD_LENGTH = 60 days;
          uint referrer1Limit = 2;
          bool public lockStatus;
          
          mapping (uint => uint) public LEVEL_PRICE;
          mapping (address => UserStruct) public users;
          mapping (uint => address) public userList;
          mapping (address => mapping (uint => uint)) public EarnedEth;
          mapping (address => uint) public loopCheck;
          mapping (address => uint) public createdDate;
          
          event regLevelEvent(address indexed UserAddress, address indexed ReferrerAddress, uint Time);
          event buyLevelEvent(address indexed UserAddress, uint Levelno, uint Time);
          event getMoneyForLevelEvent(address indexed UserAddress, uint UserId, address indexed ReferrerAddress, uint ReferrerId, uint Levelno, uint LevelPrice, uint Time);
          event lostMoneyForLevelEvent(address indexed UserAddress, uint UserId, address indexed ReferrerAddress, uint ReferrerId, uint Levelno, uint LevelPrice, uint Time);    
          
          constructor() public {
              ownerAddress = msg.sender;
              Token = ERC20(0x1788430620960F9a70e3DC14202a3A35ddE1A316);
              oldAlexa = OpenAlexalO(0xaB3FB81f8660788997CFD379f7A87e9527F1301b);
      
              LEVEL_PRICE[1] = 0.03 ether;
              LEVEL_PRICE[2] = 0.05 ether;
              LEVEL_PRICE[3] = 0.1 ether;
              LEVEL_PRICE[4] = 0.5 ether;
              LEVEL_PRICE[5] = 1 ether;
              LEVEL_PRICE[6] = 3 ether;
              LEVEL_PRICE[7] = 7 ether;
              LEVEL_PRICE[8] = 12 ether;
              LEVEL_PRICE[9] = 15 ether;
              LEVEL_PRICE[10] = 25 ether;
              LEVEL_PRICE[11] = 30 ether;
              LEVEL_PRICE[12] = 39 ether;
          } 
      
          /**
           * @dev User registration
           */ 
          function regUser(uint _referrerID, bytes32[3] calldata _mrs, uint8 _v) external payable {
              require(lockStatus == false, "Contract Locked");
              require(users[msg.sender].isExist == false, "User exist");
              require(_referrerID > 0 && _referrerID <= currentId, "Incorrect referrer Id");
              require(msg.value == LEVEL_PRICE[1], "Incorrect Value");
              
              if (users[userList[_referrerID]].referral.length >= referrer1Limit) 
                  _referrerID = users[findFreeReferrer(userList[_referrerID])].id;
      
              UserStruct memory userStruct;
              currentId++;
              
              userStruct = UserStruct({
                  isExist: true,
                  id: currentId,
                  referrerID: _referrerID,
                  currentLevel: 1,
                  totalEarningEth:0,
                  referral: new address[](0)
              });
      
              users[msg.sender] = userStruct;
              userList[currentId] = msg.sender;
              users[msg.sender].levelExpired[1] = now.add(PERIOD_LENGTH);
              users[userList[_referrerID]].referral.push(msg.sender);
              loopCheck[msg.sender] = 0;
              createdDate[msg.sender] = now;
      
              payForLevel(0, 1, msg.sender, ((LEVEL_PRICE[1].mul(adminFee)).div(10**20)), _mrs, _v, msg.value);
      
              emit regLevelEvent(msg.sender, userList[_referrerID], now);
          }
          
          /**
           * @dev To buy the next level by User
           */ 
          function buyLevel(uint256 _level, bytes32[3] calldata _mrs, uint8 _v) external payable {
              require(lockStatus == false, "Contract Locked");
              require(users[msg.sender].isExist, "User not exist"); 
              require(_level > 0 && _level <= 12, "Incorrect level");
      
              if (_level == 1) {
                  require(msg.value == LEVEL_PRICE[1], "Incorrect Value");
                  users[msg.sender].levelExpired[1] = users[msg.sender].levelExpired[1].add(PERIOD_LENGTH);
                  users[msg.sender].currentLevel = 1;
              } else {
                  require(msg.value == LEVEL_PRICE[_level], "Incorrect Value");
                  users[msg.sender].currentLevel = _level;
                  for (uint i = _level - 1; i > 0; i--) 
                      require(users[msg.sender].levelExpired[i] >= now, "Buy the previous level");
                  
                  if (users[msg.sender].levelExpired[_level] == 0)
                      users[msg.sender].levelExpired[_level] = now + PERIOD_LENGTH;
                  else 
                      users[msg.sender].levelExpired[_level] += PERIOD_LENGTH;
              }
              loopCheck[msg.sender] = 0;
             
              payForLevel(0, _level, msg.sender, ((LEVEL_PRICE[_level].mul(adminFee)).div(10**20)), _mrs, _v, msg.value);
      
              emit buyLevelEvent(msg.sender, _level, now);
          }
          
          /**
           * @dev Internal function for payment
           */ 
          function payForLevel(uint _flag, uint _level, address _userAddress, uint _adminPrice, bytes32[3] memory _mrs, uint8 _v, uint256 _amt) internal {
              address[6] memory referer;
              
              if (_flag == 0) {
                  if (_level == 1 || _level == 7) {
                      referer[0] = userList[users[_userAddress].referrerID];
                  } else if (_level == 2 || _level == 8) {
                      referer[1] = userList[users[_userAddress].referrerID];
                      referer[0] = userList[users[referer[1]].referrerID];
                  } else if (_level == 3 || _level == 9) {
                      referer[1] = userList[users[_userAddress].referrerID];
                      referer[2] = userList[users[referer[1]].referrerID];
                      referer[0] = userList[users[referer[2]].referrerID];
                  } else if (_level == 4 || _level == 10) {
                      referer[1] = userList[users[_userAddress].referrerID];
                      referer[2] = userList[users[referer[1]].referrerID];
                      referer[3] = userList[users[referer[2]].referrerID];
                      referer[0] = userList[users[referer[3]].referrerID];
                  } else if (_level == 5 || _level == 11) {
                      referer[1] = userList[users[_userAddress].referrerID];
                      referer[2] = userList[users[referer[1]].referrerID];
                      referer[3] = userList[users[referer[2]].referrerID];
                      referer[4] = userList[users[referer[3]].referrerID];
                      referer[0] = userList[users[referer[4]].referrerID];
                  } else if (_level == 6 || _level == 12) {
                      referer[1] = userList[users[_userAddress].referrerID];
                      referer[2] = userList[users[referer[1]].referrerID];
                      referer[3] = userList[users[referer[2]].referrerID];
                      referer[4] = userList[users[referer[3]].referrerID];
                      referer[5] = userList[users[referer[4]].referrerID];
                      referer[0] = userList[users[referer[5]].referrerID];
                  }
              } else if (_flag == 1) {
                  referer[0] = userList[users[_userAddress].referrerID];
              }
              if (!users[referer[0]].isExist) referer[0] = userList[1];
              
              if (loopCheck[msg.sender] >= 12) {
                  referer[0] = userList[1];
              }
              if (users[referer[0]].levelExpired[_level] >= now) {
                
                  uint256 tobeminted = ((_amt).mul(10**18)).div(0.01 ether);
                  // transactions 
                  require((address(uint160(referer[0])).send(LEVEL_PRICE[_level].sub(_adminPrice))) && 
                          (address(uint160(ownerAddress)).send(_adminPrice)) &&   
                          Token.mint(msg.sender, tobeminted, _mrs, _v), "Transaction Failure");
                 
                  users[referer[0]].totalEarningEth = users[referer[0]].totalEarningEth.add(LEVEL_PRICE[_level]);
                  EarnedEth[referer[0]][_level] = EarnedEth[referer[0]][_level].add(LEVEL_PRICE[_level]);
                
                  emit getMoneyForLevelEvent(msg.sender, users[msg.sender].id, referer[0], users[referer[0]].id, _level, LEVEL_PRICE[_level], now);
              } else {
                  if (loopCheck[msg.sender] < 12) {
                      loopCheck[msg.sender] = loopCheck[msg.sender].add(1);
      
                  emit lostMoneyForLevelEvent(msg.sender, users[msg.sender].id, referer[0], users[referer[0]].id, _level, LEVEL_PRICE[_level],now);
                      
                  payForLevel(1, _level, referer[0], _adminPrice, _mrs, _v, _amt);
                  }
              }
          }
      
          /**
           * @dev Update old contract data
           */ 
          function oldAlexaSync(uint limit) public {
              require(address(oldAlexa) != address(0), "Initialize closed");
              require(msg.sender == ownerAddress, "Access denied");
              
              for (uint i = 0; i <= limit; i++) {
                  UserStruct  memory olduser;
                  address oldusers = oldAlexa.userList(oldAlexaId);
                  (olduser.isExist, 
                  olduser.id, 
                  olduser.referrerID, 
                  olduser.currentLevel,  
                  olduser.totalEarningEth) = oldAlexa.users(oldusers);
                  address ref = oldAlexa.userList(olduser.referrerID);
      
                  if (olduser.isExist) {
                      if (!users[oldusers].isExist) {
                          users[oldusers].isExist = true;
                          users[oldusers].id = oldAlexaId;
                          users[oldusers].referrerID = olduser.referrerID;
                          users[oldusers].currentLevel = olduser.currentLevel;
                          users[oldusers].totalEarningEth = olduser.totalEarningEth;
                          userList[oldAlexaId] = oldusers;
                          users[ref].referral.push(oldusers);
                          createdDate[oldusers] = now;
                          
                          emit regLevelEvent(oldusers, ref, now);
                          
                          for (uint j = 1; j <= 12; j++) {
                              users[oldusers].levelExpired[j] = oldAlexa.viewUserLevelExpired(oldusers, j);
                              EarnedEth[oldusers][j] = oldAlexa.EarnedEth(oldusers, j);
                          } 
                      }
                      oldAlexaId++;
                  } else {
                      currentId = oldAlexaId.sub(1);
                      break;
                      
                  }
              }
          }
          
          /**
           * @dev Update old contract data
           */ 
          function setOldAlexaID(uint _id) public returns(bool) {
              require(ownerAddress == msg.sender, "Access Denied");
              
              oldAlexaId = _id;
              return true;
          }
      
          /**
           * @dev Close old contract interaction
           */ 
          function oldAlexaSyncClosed() external {
              require(address(oldAlexa) != address(0), "Initialize already closed");
              require(msg.sender == ownerAddress, "Access denied");
      
              oldAlexa = OpenAlexalO(0);
          }
          
          /**
           * @dev Contract balance withdraw
           */ 
          function failSafe(address payable _toUser, uint _amount) public returns (bool) {
              require(msg.sender == ownerAddress, "only Owner Wallet");
              require(_toUser != address(0), "Invalid Address");
              require(address(this).balance >= _amount, "Insufficient balance");
      
              (_toUser).transfer(_amount);
              return true;
          }
                  
          /**
           * @dev Update admin fee percentage
           */ 
          function updateFeePercentage(uint256 _adminFee) public returns (bool) {
              require(msg.sender == ownerAddress, "only OwnerWallet");
      
              adminFee = _adminFee;
              return true;  
          }
          
          /**
           * @dev Update level price
           */ 
          function updatePrice(uint _level, uint _price) public returns (bool) {
              require(msg.sender == ownerAddress, "only OwnerWallet");
      
              LEVEL_PRICE[_level] = _price;
              return true;
          }
      
          /**
           * @dev Update contract status
           */ 
          function contractLock(bool _lockStatus) public returns (bool) {
              require(msg.sender == ownerAddress, "Invalid User");
      
              lockStatus = _lockStatus;
              return true;
          }
          
          /**
          * @dev Update token contract
          */ 
          function updateToken(address _newToken) public returns (bool) {
              require(msg.sender == ownerAddress, "Invalid User");
              require(_newToken != address(0), "Invalid Token Address");
              
              Token = ERC20(_newToken);
              return true;
          }
              
          /**
           * @dev View free Referrer Address
           */ 
          function findFreeReferrer(address _userAddress) public view returns (address) {
              if (users[_userAddress].referral.length < referrer1Limit) 
                  return _userAddress;
      
              address[] memory referrals = new address[](254);
              referrals[0] = users[_userAddress].referral[0];
              referrals[1] = users[_userAddress].referral[1];
      
              address freeReferrer;
              bool noFreeReferrer = true;
      
              for (uint i = 0; i < 254; i++) { 
                  if (users[referrals[i]].referral.length == referrer1Limit) {
                      if (i < 126) {
                          referrals[(i+1)*2] = users[referrals[i]].referral[0];
                          referrals[(i+1)*2+1] = users[referrals[i]].referral[1];
                      }
                  } else {
                      noFreeReferrer = false;
                      freeReferrer = referrals[i];
                      break;
                  }
              }
              require(!noFreeReferrer, "No Free Referrer");
              return freeReferrer;
          }
          
          /**
           * @dev Total earned ETH
           */
          function getTotalEarnedEther() public view returns (uint) {
              uint totalEth;
              for (uint i = 1; i <= currentId; i++) {
                  totalEth = totalEth.add(users[userList[i]].totalEarningEth);
              }
              return totalEth;
          }
              
         /**
           * @dev View referrals
           */ 
          function viewUserReferral(address _userAddress) external view returns (address[] memory) {
              return users[_userAddress].referral;
          }
          
          /**
           * @dev View level expired time
           */ 
          function viewUserLevelExpired(address _userAddress,uint _level) external view returns (uint) {
              return users[_userAddress].levelExpired[_level];
          }
      
          // fallback
          function () external payable {
              revert("Invalid Transaction");
          }
      }

      File 2 of 2: OpenAlexaProtocol
      pragma solidity 0.5.14;
      
      
      library SafeMath {
      
          function add(uint256 a, uint256 b) internal pure returns (uint256) {
              uint256 c = a + b;
              require(c >= a, "SafeMath: Addition overflow");
              return c;
          }
      
          function sub(uint256 a, uint256 b) internal pure returns (uint256) {
              require(b <= a, "SafeMath: Subtraction overflow");
              uint256 c = a - b;
              return c;
          }
      
          function mul(uint256 a, uint256 b) internal pure returns (uint256) {
              if (a == 0) {
                  return 0;
              }
              
              uint256 c = a * b;
              require(c / a == b, "SafeMath: Multiplication overflow");
              return c;
          }
      
          function div(uint256 a, uint256 b) internal pure returns (uint256) {
              // Solidity only automatically asserts when divide by 0
              require(b > 0, "SafeMath: division by zero");
              uint256 c = a / b;
              // assert(a == b * c + a % b); // There is no case in which this doesn't hold
              return c;
          }
          
          function mod(uint256 a, uint256 b) internal pure returns (uint256) {
              require(b != 0, "SafeMath: Modulo by zero");
              return a % b;
          }
      }
      
      
      contract ERC20 {
          function transferFrom(address from, address to, uint256 value) public returns (bool);
          function approve(address spender, uint256 value) public returns (bool);
          function transfer(address to, uint256 value) public returns(bool);
          function allowance(address owner, address spender) public view returns (uint256);
          event Transfer(address indexed from, address indexed to, uint256 value);
          event Approval(address indexed owner, address indexed spender, uint256 value);
      }
      
      
      contract OpenAlexaProtocol is ERC20 {
          
          using SafeMath for uint256;
          
          string public name;
          string public symbol;
          uint8 public decimals;
          uint256 public totalSupply;
          address public burnAddress;
          address public owner;
          address public sigAddress;
          
          mapping (address => uint256) public balances;
          mapping (address => mapping (address => uint256)) public allowed;
          mapping (bytes32 => bool) private hashConfirmation;
      
          constructor (address _burnAddress, address _sigAddress) public {
              symbol = "OAP";
              name = "Open Alexa Protocol";
              decimals = 18;
              burnAddress = _burnAddress;
              owner = msg.sender;
              sigAddress = _sigAddress;
          }
          
          modifier onlyOwner() {
              require(msg.sender == owner, "Only owner");
              _;
          }
          
          /**
           * @dev Check balance of the holder
           * @param _owner Token holder address
           */ 
          function balanceOf(address _owner) public view returns (uint256) {
              return balances[_owner];
          }
      
          /**
           * @dev Transfer token to specified address
           * @param _to Receiver address
           * @param _value Amount of the tokens
           */
          function transfer(address _to, uint256 _value) public returns (bool) {
              require(_to != address(0), "Invalid address");
              require(_value <= balances[msg.sender], "Insufficient balance");
              
              balances[msg.sender] = balances[msg.sender].sub(_value);
              uint256 burnFee = (_value.mul(0.1 ether)).div(10**20);
              uint256 balanceFee = _value.sub(burnFee);
              balances[burnAddress] = balances[burnAddress].add(burnFee);
              balances[_to] = balances[_to].add(balanceFee);
              
              emit Transfer(msg.sender, _to, balanceFee);
              emit Transfer(msg.sender, burnAddress, burnFee);
              return true;
          }
      
          /**
           * @dev Transfer tokens from one address to another
           * @param _from  The holder address
           * @param _to  The Receiver address
           * @param _value  the amount of tokens to be transferred
           */
          function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
              require(_from != address(0), "Invalid from address");
              require(_to != address(0), "Invalid to address");
              require(_value <= balances[_from], "Invalid balance");
              require(_value <= allowed[_from][msg.sender], "Invalid allowance");
              
              balances[_from] = balances[_from].sub(_value);
              uint256 burnFee = (_value.mul(0.1 ether)).div(10**20);
              uint256 balanceFee = _value.sub(burnFee);
              balances[burnAddress] = balances[burnAddress].add(burnFee);
              balances[msg.sender] = balances[msg.sender].add(balanceFee);
              allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
              
              emit Transfer(_from, _to, balanceFee);
              emit Transfer(_from, burnAddress, burnFee);
              return true;
          }
          
          /**
           * @dev Approve respective tokens for spender
           * @param _spender Spender address
           * @param _value Amount of tokens to be allowed
           */
          function approve(address _spender, uint256 _value) public returns (bool) {
              require(_spender != address(0), "Null address");
              require(_value > 0, "Invalid value");
              allowed[msg.sender][_spender] = _value;
              emit Approval(msg.sender, _spender, _value);
              return true;
          }
      
          /**
           * @dev To view approved balance
           * @param _owner Holder address
           * @param _spender Spender address
           */ 
          function allowance(address _owner, address _spender) public view returns (uint256) {
              return allowed[_owner][_spender];
          }  
          
          /**
           * @dev To change burnt Address
           * @param _newOwner New owner address
           */ 
          function changeowner(address _newOwner) public onlyOwner returns(bool) {
              require(_newOwner != address(0), "Invalid Address");
              owner = _newOwner;
              return true;
          }
         
          
          /**
           * @dev To change burnt Address
           * @param _burnAddress New burn address
           */ 
          function changeburnt(address _burnAddress) public onlyOwner returns(bool) {
              require(_burnAddress != address(0), "Invalid Address");
              burnAddress = _burnAddress;
              return true;
          }
          
          /**
           * @dev To change signature Address
           * @param _newSigAddress New sigOwner address
           */ 
          function changesigAddress(address _newSigAddress) public onlyOwner returns(bool) {
              require(_newSigAddress != address(0), "Invalid Address");
              sigAddress = _newSigAddress;
              return true;
          }
          
          /**
           * @dev To mint OAP Tokens
           * @param _receiver Reciever address
           * @param _amount Amount to mint
           * @param _mrs _mrs[0] - message hash _mrs[1] - r of signature _mrs[2] - s of signature 
           * @param _v  v of signature
           */ 
          function mint(address _receiver, uint256 _amount,bytes32[3] memory _mrs, uint8 _v) public returns (bool) {
              require(_receiver != address(0), "Invalid address");
              require(_amount >= 0, "Invalid amount");
              require(hashConfirmation[_mrs[0]] != true, "Hash exists");
              require(ecrecover(_mrs[0], _v, _mrs[1], _mrs[2]) == sigAddress, "Invalid Signature");
              totalSupply = totalSupply.add(_amount);
              balances[_receiver] = balances[_receiver].add(_amount);
              hashConfirmation[_mrs[0]] = true;
              emit Transfer(address(0), _receiver, _amount);
              return true;
          }
          
          /**
           * @dev To mint OAP Tokens
           * @param _receiver Reciever address
           * @param _amount Amount to mint
           */ 
          function ownerMint(address _receiver, uint256 _amount) public onlyOwner returns (bool) {
              require(_receiver != address(0), "Invalid address");
              require(_amount >= 0, "Invalid amount");
              totalSupply = totalSupply.add(_amount);
              balances[_receiver] = balances[_receiver].add(_amount);
              emit Transfer(address(0), _receiver, _amount);
              return true;
          }
      }