Transaction Hash:
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 | ||
---|---|---|---|---|---|
0x17884306...5ddE1A316 | |||||
0x48068743...E7f7fa6D4 | 0.01085058742835895 Eth | 0.03605058742835895 Eth | 0.0252 | ||
0x629dBB4e...43D7F5575 | (OpenAlexa.io: Deployer) | 10.2506515782 Eth | 10.2554515782 Eth | 0.0048 | |
0x80e9540c...0175b60FF | (OpenAlexa.io) | ||||
0xCCBaA86f...6500E660d |
0.05 Eth
Nonce: 0
|
0.01026812 Eth
Nonce: 1
| 0.03973188 | ||
0xD224cA0c...503B79f53
Miner
| (UUPool) | 314.024362275110844779 Eth | 314.034094155110844779 Eth | 0.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( )
-
regUser[OpenAlexalO (ln:105)]
findFreeReferrer[OpenAlexalO (ln:112)]
UserStruct[OpenAlexalO (ln:117)]
add[OpenAlexalO (ln:128)]
push[OpenAlexalO (ln:129)]
payForLevel[OpenAlexalO (ln:133)]
div[OpenAlexalO (ln:213)]
mul[OpenAlexalO (ln:213)]
send[OpenAlexalO (ln:215)]
sub[OpenAlexalO (ln:215)]
send[OpenAlexalO (ln:216)]
mint[OpenAlexalO (ln:217)]
add[OpenAlexalO (ln:219)]
add[OpenAlexalO (ln:220)]
getMoneyForLevelEvent[OpenAlexalO (ln:222)]
add[OpenAlexalO (ln:225)]
lostMoneyForLevelEvent[OpenAlexalO (ln:227)]
payForLevel[OpenAlexalO (ln:229)]
div[OpenAlexalO (ln:133)]
mul[OpenAlexalO (ln:133)]
regLevelEvent[OpenAlexalO (ln:135)]
File 1 of 2: OpenAlexalO
File 2 of 2: OpenAlexaProtocol
/** * * 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; } }