Transaction Hash:
Block:
6374013 at Sep-21-2018 06:38:12 PM +UTC
Transaction Fee:
0.00660264 ETH
$16.08
Gas Used:
161,040 Gas / 41 Gwei
Emitted Events:
13 |
Gorgona.Invest( addr=[Sender] 0x72e4b2eba757b20a227622445a09730acb9678f2, amount=43121060000000000, referrer=0x00000000...000000000 )
|
14 |
Gorgona.Payout( addr=0x180e1c26a331671d0977a66e41f728e658b60df0, amount=1293631800000000, eventType=killer, from=[Sender] 0x72e4b2eba757b20a227622445a09730acb9678f2 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x020e13fa...13ffCBdec | (Gorgona.io 2) | 143.267835105178600419 Eth | 143.301038321378600419 Eth | 0.0332032162 | |
0x180E1C26...658b60Df0 | 0.487752907370406288 Eth | 0.489046539170406288 Eth | 0.0012936318 | ||
0x52bc44d5...b7d7bE3b5
Miner
| (Nanopool) | 7,969.699785621505917452 Eth | 7,969.706388261505917452 Eth | 0.00660264 | |
0x72E4B2EB...aCb9678F2 |
0.0497237 Eth
Nonce: 0
|
0 Eth
Nonce: 1
| 0.0497237 | ||
0x7dC3Cc34...683eDBF80 | (Gorgona.io: Deployer) | 22.88365920144866261 Eth | 22.89228341344866261 Eth | 0.008624212 |
Execution Trace
ETH 0.04312106
Gorgona.CALL( )
-
0x72e4b2eba757b20a227622445a09730acb9678f2.CALL( )
- ETH 0.008624212
Gorgona.io: Deployer.CALL( )
- ETH 0.0012936318
0x180e1c26a331671d0977a66e41f728e658b60df0.CALL( )
[Gorgona (ln:69)]
payoutSelf[Gorgona (ln:75)]
getInvestorDividendsAmount[Gorgona (ln:167)]
transfer[Gorgona (ln:175)]
Payout[Gorgona (ln:176)]
transfer[Gorgona (ln:85)]
push[Gorgona (ln:86)]
bytesToAddress[Gorgona (ln:91)]
payoutSelf[Gorgona (ln:96)]
getInvestorDividendsAmount[Gorgona (ln:167)]
transfer[Gorgona (ln:175)]
Payout[Gorgona (ln:176)]
Invest[Gorgona (ln:103)]
transfer[Gorgona (ln:108)]
send[Gorgona (ln:112)]
Payout[Gorgona (ln:113)]
send[Gorgona (ln:117)]
Payout[Gorgona (ln:118)]
send[Gorgona (ln:122)]
Payout[Gorgona (ln:123)]
GorgonaKiller[Gorgona (ln:128)]
GorgonaKillerChanged[Gorgona (ln:129)]
pragma solidity ^0.4.24; contract Gorgona { address public owner; address public adminAddr; uint constant public MASS_TRANSACTION_LIMIT = 150; uint constant public MINIMUM_INVEST = 10000000000000000 wei; uint constant public INTEREST = 3; uint public depositAmount; uint public round; uint public lastPaymentDate; GorgonaKiller public gorgonaKiller; address[] public addresses; mapping(address => Investor) public investors; bool public pause; struct Investor { uint id; uint deposit; uint deposits; uint date; address referrer; } struct GorgonaKiller { address addr; uint deposit; } event Invest(address addr, uint amount, address referrer); event Payout(address addr, uint amount, string eventType, address from); event NextRoundStarted(uint round, uint date, uint deposit); event GorgonaKillerChanged(address addr, uint deposit); modifier onlyOwner {if (msg.sender == owner) _;} constructor() public { owner = msg.sender; adminAddr = msg.sender; addresses.length = 1; round = 1; } function transferOwnership(address addr) onlyOwner public { owner = addr; } function addInvestors(address[] _addr, uint[] _deposit, uint[] _date, address[] _referrer) onlyOwner public { // add initiated investors for (uint i = 0; i < _addr.length; i++) { uint id = addresses.length; if (investors[_addr[i]].deposit == 0) { addresses.push(_addr[i]); depositAmount += _deposit[i]; } investors[_addr[i]] = Investor(id, _deposit[i], 1, _date[i], _referrer[i]); emit Invest(_addr[i], _deposit [i], _referrer[i]); if (investors[_addr[i]].deposit > gorgonaKiller.deposit) { gorgonaKiller = GorgonaKiller(_addr[i], investors[_addr[i]].deposit); } } lastPaymentDate = now; } function() payable public { if (owner == msg.sender) { return; } if (0 == msg.value) { payoutSelf(); return; } require(false == pause, "Gorgona is restarting. Please wait."); require(msg.value >= MINIMUM_INVEST, "Too small amount, minimum 0.01 ether"); Investor storage user = investors[msg.sender]; if (user.id == 0) { // ensure that payment not from hacker contract msg.sender.transfer(0 wei); addresses.push(msg.sender); user.id = addresses.length; user.date = now; // referrer address referrer = bytesToAddress(msg.data); if (investors[referrer].deposit > 0 && referrer != msg.sender) { user.referrer = referrer; } } else { payoutSelf(); } // save investor user.deposit += msg.value; user.deposits += 1; emit Invest(msg.sender, msg.value, user.referrer); depositAmount += msg.value; lastPaymentDate = now; adminAddr.transfer(msg.value / 5); // project fee uint bonusAmount = (msg.value / 100) * INTEREST; // referrer commission for all deposits if (user.referrer > 0x0) { if (user.referrer.send(bonusAmount)) { emit Payout(user.referrer, bonusAmount, "referral", msg.sender); } if (user.deposits == 1) { // cashback only for the first deposit if (msg.sender.send(bonusAmount)) { emit Payout(msg.sender, bonusAmount, "cash-back", 0); } } } else if (gorgonaKiller.addr > 0x0) { if (gorgonaKiller.addr.send(bonusAmount)) { emit Payout(gorgonaKiller.addr, bonusAmount, "killer", msg.sender); } } if (user.deposit > gorgonaKiller.deposit) { gorgonaKiller = GorgonaKiller(msg.sender, user.deposit); emit GorgonaKillerChanged(msg.sender, user.deposit); } } function payout(uint offset) public { if (pause == true) { doRestart(); return; } uint txs; uint amount; for (uint idx = addresses.length - offset - 1; idx >= 1 && txs < MASS_TRANSACTION_LIMIT; idx--) { address addr = addresses[idx]; if (investors[addr].date + 20 hours > now) { continue; } amount = getInvestorDividendsAmount(addr); investors[addr].date = now; if (address(this).balance < amount) { pause = true; return; } if (addr.send(amount)) { emit Payout(addr, amount, "bulk-payout", 0); } txs++; } } function payoutSelf() private { require(investors[msg.sender].id > 0, "Investor not found."); uint amount = getInvestorDividendsAmount(msg.sender); investors[msg.sender].date = now; if (address(this).balance < amount) { pause = true; return; } msg.sender.transfer(amount); emit Payout(msg.sender, amount, "self-payout", 0); } function doRestart() private { uint txs; address addr; for (uint i = addresses.length - 1; i > 0; i--) { addr = addresses[i]; addresses.length -= 1; delete investors[addr]; if (txs++ == MASS_TRANSACTION_LIMIT) { return; } } emit NextRoundStarted(round, now, depositAmount); pause = false; round += 1; depositAmount = 0; lastPaymentDate = now; delete gorgonaKiller; } function getInvestorCount() public view returns (uint) { return addresses.length - 1; } function getInvestorDividendsAmount(address addr) public view returns (uint) { return investors[addr].deposit / 100 * INTEREST * (now - investors[addr].date) / 1 days; } function bytesToAddress(bytes bys) private pure returns (address addr) { assembly { addr := mload(add(bys, 20)) } } }