ETH Price: $3,201.43 (-3.62%)

Contract

0xD5c5c41248F949Fce678A7F1619BCea7872c93eF
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Leftover Share V...163670722023-01-09 5:12:23741 days ago1673241143IN
0xD5c5c412...7872c93eF
0 ETH0.0011656816.59885218
Leftover Share V...162583692022-12-25 1:06:35756 days ago1671930395IN
0xD5c5c412...7872c93eF
0 ETH0.0007943712
Leftover Share V...162470372022-12-23 11:11:23758 days ago1671793883IN
0xD5c5c412...7872c93eF
0 ETH0.0008437412.01460371
Leftover Share V...162428422022-12-22 21:09:59758 days ago1671743399IN
0xD5c5c412...7872c93eF
0 ETH0.0012354118.6624578
Leftover Share V...162343032022-12-21 16:34:59759 days ago1671640499IN
0xD5c5c412...7872c93eF
0 ETH0.0015129921.54429611
Leftover Share V...162331462022-12-21 12:42:23760 days ago1671626543IN
0xD5c5c412...7872c93eF
0 ETH0.0008700513.14319629
Leftover Share V...162247412022-12-20 8:34:11761 days ago1671525251IN
0xD5c5c412...7872c93eF
0 ETH0.0008110411.54895441
Leftover Share V...162218612022-12-19 22:55:35761 days ago1671490535IN
0xD5c5c412...7872c93eF
0 ETH0.0011483817.34779365
Discard Leftover...162106172022-12-18 9:16:11763 days ago1671354971IN
0xD5c5c412...7872c93eF
0 ETH0.0005267513.27878854
Leftover Share V...162084302022-12-18 1:55:23763 days ago1671328523IN
0xD5c5c412...7872c93eF
0 ETH0.0007994511.38382458
Leftover Share V...162066512022-12-17 19:56:59763 days ago1671307019IN
0xD5c5c412...7872c93eF
0 ETH0.0008932212.71908612
Discard Leftover...161909482022-12-15 15:19:59765 days ago1671117599IN
0xD5c5c412...7872c93eF
0 ETH0.0008915622.4751595
Leftover Share V...161851702022-12-14 19:57:47766 days ago1671047867IN
0xD5c5c412...7872c93eF
0 ETH0.0011210227.69329534
Leftover Share V...161849602022-12-14 19:15:35766 days ago1671045335IN
0xD5c5c412...7872c93eF
0 ETH0.0016718825.25587759
Leftover Share V...161700632022-12-12 17:18:35768 days ago1670865515IN
0xD5c5c412...7872c93eF
0 ETH0.0057610187.02697263
Leftover Share V...161688422022-12-12 13:11:35769 days ago1670850695IN
0xD5c5c412...7872c93eF
0 ETH0.0010589515.07898509
Leftover Share V...161654052022-12-12 1:40:11769 days ago1670809211IN
0xD5c5c412...7872c93eF
0 ETH0.000817812.35386829
Leftover Share V...161130382022-12-04 17:49:35776 days ago1670176175IN
0xD5c5c412...7872c93eF
0 ETH0.0007409811.19339587
Leftover Share V...160971242022-12-02 12:28:23779 days ago1669984103IN
0xD5c5c412...7872c93eF
0 ETH0.0007289111.01120746
Leftover Share V...160906852022-12-01 14:55:11779 days ago1669906511IN
0xD5c5c412...7872c93eF
0 ETH0.0006196212.29003841
Leftover Share V...160894952022-12-01 10:55:47780 days ago1669892147IN
0xD5c5c412...7872c93eF
0 ETH0.0005481810.87295092
Leftover Share V...160750472022-11-29 10:27:35782 days ago1669717655IN
0xD5c5c412...7872c93eF
0 ETH0.0007944711.31297349
Leftover Share V...160635192022-11-27 19:50:35783 days ago1669578635IN
0xD5c5c412...7872c93eF
0 ETH0.0007026810.61482923
Leftover Share V...160555432022-11-26 17:06:35784 days ago1669482395IN
0xD5c5c412...7872c93eF
0 ETH0.000695099.89781277
Leftover Share V...160542772022-11-26 12:51:47785 days ago1669467107IN
0xD5c5c412...7872c93eF
0 ETH0.000675039.61216994
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ExchangeGovernance

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 11 : ExchangeGovernance.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "../libraries/ExchangeConstants.sol";
import "../libraries/LiquidVoting.sol";
import "../libraries/SafeCast.sol";
import "../utils/BalanceAccounting.sol";
import "./BaseGovernanceModule.sol";


contract ExchangeGovernance is BaseGovernanceModule, BalanceAccounting {
    using Vote for Vote.Data;
    using LiquidVoting for LiquidVoting.Data;
    using VirtualVote for VirtualVote.Data;
    using SafeCast for uint256;

    event LeftoverGovernanceShareUpdate(address indexed user, uint256 vote, bool isDefault, uint256 amount);
    event LeftoverReferralShareUpdate(address indexed user, uint256 vote, bool isDefault, uint256 amount);

    LiquidVoting.Data private _leftoverGovernanceShare;

    constructor(address _mothership) public BaseGovernanceModule(_mothership) {
        _leftoverGovernanceShare.data.result = ExchangeConstants._DEFAULT_LEFTOVER_GOV_SHARE.toUint104();
    }

    function parameters() external view returns(uint256 govShare, uint256 refShare) {
        govShare = _leftoverGovernanceShare.data.current();
        refShare = ExchangeConstants._LEFTOVER_TOTAL_SHARE.sub(govShare);
    }

    function leftoverGovernanceShare() external view returns(uint256) {
        return _leftoverGovernanceShare.data.current();
    }

    function leftoverGovernanceShareVotes(address user) external view returns(uint256) {
        return _leftoverGovernanceShare.votes[user].get(ExchangeConstants._DEFAULT_LEFTOVER_GOV_SHARE);
    }

    function virtualLeftoverGovernanceShare() external view returns(uint104, uint104, uint48) {
        return (_leftoverGovernanceShare.data.oldResult, _leftoverGovernanceShare.data.result, _leftoverGovernanceShare.data.time);
    }

    //

    function leftoverReferralShare() external view returns(uint256) {
        return ExchangeConstants._LEFTOVER_TOTAL_SHARE.sub(_leftoverGovernanceShare.data.current());
    }

    function leftoverReferralShareVotes(address user) external view returns(uint256) {
        return ExchangeConstants._LEFTOVER_TOTAL_SHARE.sub(_leftoverGovernanceShare.votes[user].get(ExchangeConstants._DEFAULT_LEFTOVER_GOV_SHARE));
    }

    function virtualLeftoverReferralShare() external view returns(uint104, uint104, uint48) {
        return (
            ExchangeConstants._LEFTOVER_TOTAL_SHARE.sub(_leftoverGovernanceShare.data.oldResult).toUint104(),
            ExchangeConstants._LEFTOVER_TOTAL_SHARE.sub(_leftoverGovernanceShare.data.result).toUint104(),
            _leftoverGovernanceShare.data.time
        );
    }

    ///

    function leftoverShareVote(uint256 govShare) external {
        uint256 refShare = ExchangeConstants._LEFTOVER_TOTAL_SHARE.sub(govShare, "Governance share is too high");

        uint256 balance = balanceOf(msg.sender);
        uint256 supply = totalSupply();

        _leftoverGovernanceShare.updateVote(
            msg.sender,
            _leftoverGovernanceShare.votes[msg.sender],
            Vote.init(govShare),
            balance,
            supply,
            ExchangeConstants._DEFAULT_LEFTOVER_GOV_SHARE,
            _emitLeftoverGovernanceShareVoteUpdate
        );

        _emitLeftoverReferralShareVoteUpdate(msg.sender, refShare, false, balance);
    }

    function discardLeftoverShareVote() external {
        uint256 balance = balanceOf(msg.sender);
        uint256 supply = totalSupply();

        _leftoverGovernanceShare.updateVote(
           msg.sender,
           _leftoverGovernanceShare.votes[msg.sender],
           Vote.init(),
           balance,
           supply,
           ExchangeConstants._DEFAULT_LEFTOVER_GOV_SHARE,
           _emitLeftoverGovernanceShareVoteUpdate
        );

        _emitLeftoverReferralShareVoteUpdate(msg.sender, ExchangeConstants._DEFAULT_LEFTOVER_REF_SHARE, true, balance);
    }

    function _notifyStakeChanged(address account, uint256 newBalance) internal override {
        uint256 balance = _set(account, newBalance);
        if (newBalance == balance) {
            return;
        }

        Vote.Data memory govShareVote = _leftoverGovernanceShare.votes[account];
        uint256 refShare = ExchangeConstants._LEFTOVER_TOTAL_SHARE.sub(govShareVote.get(ExchangeConstants._DEFAULT_LEFTOVER_GOV_SHARE));
        uint256 supply = totalSupply();

        _leftoverGovernanceShare.updateBalance(
            account,
            govShareVote,
            balance,
            newBalance,
            supply,
            ExchangeConstants._DEFAULT_LEFTOVER_GOV_SHARE,
            _emitLeftoverGovernanceShareVoteUpdate
        );

        _emitLeftoverReferralShareVoteUpdate(
            account,
            refShare,
            govShareVote.isDefault(),
            newBalance
        );
    }

    function _emitLeftoverGovernanceShareVoteUpdate(address user, uint256 newDefaultShare, bool isDefault, uint256 balance) private {
        emit LeftoverGovernanceShareUpdate(user, newDefaultShare, isDefault, balance);
    }

    function _emitLeftoverReferralShareVoteUpdate(address user, uint256 newDefaultShare, bool isDefault, uint256 balance) private {
        emit LeftoverReferralShareUpdate(user, newDefaultShare, isDefault, balance);
    }
}

File 2 of 11 : ExchangeConstants.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;


library ExchangeConstants {
    uint256 internal constant _LEFTOVER_TOTAL_SHARE = 1e18;          // 100%
    uint256 internal constant _DEFAULT_LEFTOVER_GOV_SHARE = 0.8e18;  //  80%
    uint256 internal constant _DEFAULT_LEFTOVER_REF_SHARE = 0.2e18;  //  20%
}

File 3 of 11 : LiquidVoting.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

import "@openzeppelin/contracts/math/SafeMath.sol";
import "./SafeCast.sol";
import "./VirtualVote.sol";
import "./Vote.sol";


library LiquidVoting {
    using SafeMath for uint256;
    using SafeCast for uint256;
    using Vote for Vote.Data;
    using VirtualVote for VirtualVote.Data;

    struct Data {
        VirtualVote.Data data;
        uint256 _weightedSum;
        uint256 _defaultVotes;
        mapping(address => Vote.Data) votes;
    }

    function updateVote(
        LiquidVoting.Data storage self,
        address user,
        Vote.Data memory oldVote,
        Vote.Data memory newVote,
        uint256 balance,
        uint256 totalSupply,
        uint256 defaultVote,
        function(address, uint256, bool, uint256) emitEvent
    ) internal {
        return _update(self, user, oldVote, newVote, balance, balance, totalSupply, defaultVote, emitEvent);
    }

    function updateBalance(
        LiquidVoting.Data storage self,
        address user,
        Vote.Data memory oldVote,
        uint256 oldBalance,
        uint256 newBalance,
        uint256 newTotalSupply,
        uint256 defaultVote,
        function(address, uint256, bool, uint256) emitEvent
    ) internal {
        return _update(self, user, oldVote, newBalance == 0 ? Vote.init() : oldVote, oldBalance, newBalance, newTotalSupply, defaultVote, emitEvent);
    }

    function _update(
        LiquidVoting.Data storage self,
        address user,
        Vote.Data memory oldVote,
        Vote.Data memory newVote,
        uint256 oldBalance,
        uint256 newBalance,
        uint256 newTotalSupply,
        uint256 defaultVote,
        function(address, uint256, bool, uint256) emitEvent
    ) private {
        uint256 oldWeightedSum = self._weightedSum;
        uint256 newWeightedSum = oldWeightedSum;
        uint256 oldDefaultVotes = self._defaultVotes;
        uint256 newDefaultVotes = oldDefaultVotes;

        if (oldVote.isDefault()) {
            newDefaultVotes = newDefaultVotes.sub(oldBalance);
        } else {
            newWeightedSum = newWeightedSum.sub(oldBalance.mul(oldVote.get(defaultVote)));
        }

        if (newVote.isDefault()) {
            newDefaultVotes = newDefaultVotes.add(newBalance);
        } else {
            newWeightedSum = newWeightedSum.add(newBalance.mul(newVote.get(defaultVote)));
        }

        if (newWeightedSum != oldWeightedSum) {
            self._weightedSum = newWeightedSum;
        }

        if (newDefaultVotes != oldDefaultVotes) {
            self._defaultVotes = newDefaultVotes;
        }

        {
            uint256 newResult = newTotalSupply == 0 ? defaultVote : newWeightedSum.add(newDefaultVotes.mul(defaultVote)).div(newTotalSupply);
            VirtualVote.Data memory data = self.data;

            if (newResult != data.result) {
                VirtualVote.Data storage sdata = self.data;
                (sdata.oldResult, sdata.result, sdata.time) = (
                    data.current().toUint104(),
                    newResult.toUint104(),
                    block.timestamp.toUint48()
                );
            }
        }

        if (!newVote.eq(oldVote)) {
            self.votes[user] = newVote;
        }

        emitEvent(user, newVote.get(defaultVote), newVote.isDefault(), newBalance);
    }
}

File 4 of 11 : SafeCast.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

library SafeCast {
    function toUint216(uint256 value) internal pure returns (uint216) {
        require(value < 2**216, "value does not fit in 216 bits");
        return uint216(value);
    }

    function toUint104(uint256 value) internal pure returns (uint104) {
        require(value < 2**104, "value does not fit in 104 bits");
        return uint104(value);
    }

    function toUint48(uint256 value) internal pure returns (uint48) {
        require(value < 2**48, "value does not fit in 48 bits");
        return uint48(value);
    }

    function toUint40(uint256 value) internal pure returns (uint40) {
        require(value < 2**40, "value does not fit in 40 bits");
        return uint40(value);
    }
}

File 5 of 11 : BalanceAccounting.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "@openzeppelin/contracts/math/SafeMath.sol";


contract BalanceAccounting {
    using SafeMath for uint256;

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function _mint(address account, uint256 amount) internal virtual {
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        _balances[account] = _balances[account].sub(amount, "Burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
    }

    function _set(address account, uint256 amount) internal virtual returns(uint256 oldAmount) {
        oldAmount = _balances[account];
        if (oldAmount != amount) {
            _balances[account] = amount;
            _totalSupply = _totalSupply.add(amount).sub(oldAmount);
        }
    }
}

File 6 of 11 : BaseGovernanceModule.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "../interfaces/IGovernanceModule.sol";


abstract contract BaseGovernanceModule is IGovernanceModule {
    address public immutable mothership;

    modifier onlyMothership {
        require(msg.sender == mothership, "Access restricted to mothership");

        _;
    }

    constructor(address _mothership) public {
        mothership = _mothership;
    }

    function notifyStakesChanged(address[] calldata accounts, uint256[] calldata newBalances) external override onlyMothership {
        require(accounts.length == newBalances.length, "Arrays length should be equal");

        for(uint256 i = 0; i < accounts.length; ++i) {
            _notifyStakeChanged(accounts[i], newBalances[i]);
        }
    }

    function notifyStakeChanged(address account, uint256 newBalance) external override onlyMothership {
        _notifyStakeChanged(account, newBalance);
    }

    function _notifyStakeChanged(address account, uint256 newBalance) internal virtual;
}

File 7 of 11 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    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;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 8 of 11 : VirtualVote.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

import "@openzeppelin/contracts/math/Math.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";


library VirtualVote {
    using SafeMath for uint256;

    uint256 private constant _VOTE_DECAY_PERIOD = 1 days;

    struct Data {
        uint104 oldResult;
        uint104 result;
        uint48 time;
    }

    function current(VirtualVote.Data memory self) internal view returns(uint256) {
        uint256 timePassed = Math.min(_VOTE_DECAY_PERIOD, block.timestamp.sub(self.time));
        uint256 timeRemain = _VOTE_DECAY_PERIOD.sub(timePassed);
        return uint256(self.oldResult).mul(timeRemain).add(
            uint256(self.result).mul(timePassed)
        ).div(_VOTE_DECAY_PERIOD);
    }
}

File 9 of 11 : Vote.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;


library Vote {
    struct Data {
        uint256 value;
    }

    function eq(Vote.Data memory self, Vote.Data memory vote) internal pure returns(bool) {
        return self.value == vote.value;
    }

    function init() internal pure returns(Vote.Data memory data) {
        return Vote.Data({
            value: 0
        });
    }

    function init(uint256 vote) internal pure returns(Vote.Data memory data) {
        return Vote.Data({
            value: vote + 1
        });
    }

    function isDefault(Data memory self) internal pure returns(bool) {
        return self.value == 0;
    }

    function get(Data memory self, uint256 defaultVote) internal pure returns(uint256) {
        if (self.value > 0) {
            return self.value - 1;
        }
        return defaultVote;
    }

    function get(Data memory self, function() external view returns(uint256) defaultVoteFn) internal view returns(uint256) {
        if (self.value > 0) {
            return self.value - 1;
        }
        return defaultVoteFn();
    }
}

File 10 of 11 : Math.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

File 11 of 11 : IGovernanceModule.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;


interface IGovernanceModule {
    function notifyStakeChanged(address account, uint256 newBalance) external;
    function notifyStakesChanged(address[] calldata accounts, uint256[] calldata newBalances) external;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_mothership","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"vote","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isDefault","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LeftoverGovernanceShareUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"vote","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isDefault","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LeftoverReferralShareUpdate","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discardLeftoverShareVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"leftoverGovernanceShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"leftoverGovernanceShareVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leftoverReferralShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"leftoverReferralShareVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"govShare","type":"uint256"}],"name":"leftoverShareVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mothership","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"notifyStakeChanged","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"newBalances","type":"uint256[]"}],"name":"notifyStakesChanged","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"parameters","outputs":[{"internalType":"uint256","name":"govShare","type":"uint256"},{"internalType":"uint256","name":"refShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtualLeftoverGovernanceShare","outputs":[{"internalType":"uint104","name":"","type":"uint104"},{"internalType":"uint104","name":"","type":"uint104"},{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtualLeftoverReferralShare","outputs":[{"internalType":"uint104","name":"","type":"uint104"},{"internalType":"uint104","name":"","type":"uint104"},{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"}]

60a060405234801561001057600080fd5b506040516115293803806115298339818101604052602081101561003357600080fd5b5051606081901b6001600160601b031916608052610063670b1a2bc2ec500000610094602090811b610a1217901c565b600280546001600160681b0392909216600160681b02600160681b600160d01b0319909216919091179055506100f2565b6000600160681b82106100ee576040805162461bcd60e51b815260206004820152601e60248201527f76616c756520646f6573206e6f742066697420696e2031303420626974730000604482015290519081900360640190fd5b5090565b60805160601c61141061011960003980610430528061057d528061081b52506114106000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c57806394f4b1621161006657806394f4b16214610269578063ad33334814610271578063e44f53d314610333578063fa3f88ae14610366576100ea565b806370a08231146101f85780637bcf84c01461022b5780638903573014610248576100ea565b80632fce8dea116100c85780632fce8dea1461018457806331f866af1461018c5780634187b7d6146101bf5780634aded6ce146101f0576100ea565b806310d97a18146100ef57806318160ddd1461012f57806327a2743314610149575b600080fd5b6100f761036e565b604080516cffffffffffffffffffffffffff948516815292909316602083015265ffffffffffff168183015290519081900360600190f35b610137610412565b60408051918252519081900360200190f35b6101826004803603604081101561015f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610418565b005b6100f76104ca565b610137600480360360208110156101a257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661051d565b6101c761057b565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61013761059f565b6101376004803603602081101561020e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610618565b6101826004803603602081101561024157600080fd5b5035610640565b610250610707565b6040805192835260208301919091528051918290030190f35b610137610793565b6101826004803603604081101561028757600080fd5b8101906020810181356401000000008111156102a257600080fd5b8201836020820111156102b457600080fd5b803590602001918460208302840111640100000000831117156102d657600080fd5b9193909290916020810190356401000000008111156102f457600080fd5b82018360208201111561030657600080fd5b8035906020019184602083028401116401000000008311171561032857600080fd5b509092509050610803565b6101376004803603602081101561034957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610973565b6101826109b8565b600254600090819081906103a39061039e90670de0b6b3a7640000906cffffffffffffffffffffffffff16610a94565b610a12565b6002546103dd9061039e90670de0b6b3a7640000906d010000000000000000000000000090046cffffffffffffffffffffffffff16610a94565b60025491959094507a01000000000000000000000000000000000000000000000000000090910465ffffffffffff1692509050565b60005490565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416363657373207265737472696374656420746f206d6f746865727368697000604482015290519081900360640190fd5b6104c68282610b0b565b5050565b6002546cffffffffffffffffffffffffff808216926d01000000000000000000000000008304909116917a010000000000000000000000000000000000000000000000000000900465ffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832081519283019091525481526105759061056690670b1a2bc2ec500000610bbe565b670de0b6b3a764000090610a94565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b604080516060810182526002546cffffffffffffffffffffffffff80821683526d010000000000000000000000000082041660208301527a010000000000000000000000000000000000000000000000000000900465ffffffffffff16918101919091526000906106139061056690610bf8565b905090565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b6000610694826040518060400160405280601c81526020017f476f7665726e616e636520736861726520697320746f6f206869676800000000815250670de0b6b3a7640000610c989092919063ffffffff16565b905060006106a133610618565b905060006106ad610412565b336000818152600560209081526040918290208251918201909252905481529192506106f4916106dc87610d49565b60029291908686670b1a2bc2ec500000610d68610dc8565b6107013384600085610de3565b50505050565b604080516060810182526002546cffffffffffffffffffffffffff80821683526d010000000000000000000000000082041660208301527a010000000000000000000000000000000000000000000000000000900465ffffffffffff1691810191909152600090819061077990610bf8565b915061078d670de0b6b3a764000083610a94565b90509091565b604080516060810182526002546cffffffffffffffffffffffffff80821683526d010000000000000000000000000082041660208301527a010000000000000000000000000000000000000000000000000000900465ffffffffffff169181019190915260009061061390610bf8565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146108a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416363657373207265737472696374656420746f206d6f746865727368697000604482015290519081900360640190fd5b82811461091557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f417272617973206c656e6774682073686f756c6420626520657175616c000000604482015290519081900360640190fd5b60005b8381101561096c5761096485858381811061092f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1684848481811061095857fe5b90506020020135610b0b565b600101610918565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560209081526040808320815192830190915254815261057590670b1a2bc2ec500000610bbe565b60006109c333610618565b905060006109cf610412565b336000818152600560209081526040918290208251918201909252905481529192506109fd916106dc610e43565b6104c6336702c68af0bb140000600185610de3565b60006d01000000000000000000000000008210610a9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c756520646f6573206e6f742066697420696e2031303420626974730000604482015290519081900360640190fd5b5090565b600082821115610b0557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000610b178383610e5e565b905080821415610b2757506104c6565b610b2f611386565b5073ffffffffffffffffffffffffffffffffffffffff83166000908152600560209081526040808320815192830190915254815290610b7961056683670b1a2bc2ec500000610bbe565b90506000610b85610412565b9050610ba260028785878986670b1a2bc2ec500000610d68610ed3565b610bb68683610bb086610ef7565b88610de3565b505050505050565b815160009015610bf2575081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610575565b50919050565b600080610c2662015180610c21856040015165ffffffffffff1642610a9490919063ffffffff16565b610efc565b90506000610c376201518083610a94565b9050610c9062015180610c8a610c698588602001516cffffffffffffffffffffffffff16610f1490919063ffffffff16565b8751610c84906cffffffffffffffffffffffffff1686610f14565b90610f87565b90610ffb565b949350505050565b60008184841115610d41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578181015183820152602001610cee565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b610d51611386565b506040805160208101909152600182018152919050565b604080518481528315156020820152808201839052905173ffffffffffffffffffffffffffffffffffffffff8616917f2f2c318dd3a1bee02ade0f8f05d9c8f392f7988aa993cc619153bf068801d259919081900360600190a250505050565b610dd988888888888989898961107c565b5050505050505050565b604080518481528315156020820152808201839052905173ffffffffffffffffffffffffffffffffffffffff8616917fc81c61c2c3ce128e7b0962cbb5ffd5d975dcefcca05b54345474f37943743b7a919081900360600190a250505050565b610e4b611386565b5060408051602081019091526000815290565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020548181146105755773ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040812083905554610eca908290610ec49085610f87565b90610a94565b60005592915050565b610dd98888888715610ee55789610eed565b610eed610e43565b898989898961107c565b511590565b6000818310610f0b5781610f0d565b825b9392505050565b600082610f2357506000610575565b82820282848281610f3057fe5b0414610f0d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806113ba6021913960400191505060405180910390fd5b600082820183811015610f0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080821161106b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161107457fe5b049392505050565b600189015460028a01548190806110928b610ef7565b156110a8576110a1818a610a94565b90506110c9565b6110c66110bf6110b88d89610bbe565b8b90610f14565b8490610a94565b92505b6110d28a610ef7565b156110e8576110e18189610f87565b9050611109565b6111066110ff6110f88c89610bbe565b8a90610f14565b8490610f87565b92505b8383146111185760018d018390555b8181146111275760028d018190555b6000871561114c5761114788610c8a611140858b610f14565b8790610f87565b61114e565b865b9050611158611399565b50604080516060810182528f546cffffffffffffffffffffffffff80821683526d0100000000000000000000000000820416602083018190527a01000000000000000000000000000000000000000000000000000090910465ffffffffffff169282019290925290821461129b578e6111d361039e83610bf8565b6111dc84610a12565b6111e542611308565b835479ffffffffffffffffffffffffffffffffffffffffffffffffffff167a01000000000000000000000000000000000000000000000000000065ffffffffffff9290921691909102177fffffffffffff00000000000000000000000000ffffffffffffffffffffffffff166d01000000000000000000000000006cffffffffffffffffffffffffff92831602177fffffffffffffffffffffffffffffffffffffff000000000000000000000000001691161790555b506112a890508a8c61137f565b6112d85773ffffffffffffffffffffffffffffffffffffffff8c16600090815260038e01602052604090208a5190555b6112f98c6112e68c89610bbe565b6112ef8d610ef7565b8b8963ffffffff16565b50505050505050505050505050565b600066010000000000008210610a9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f76616c756520646f6573206e6f742066697420696e2034382062697473000000604482015290519081900360640190fd5b5190511490565b6040518060200160405280600081525090565b60408051606081018252600080825260208201819052918101919091529056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212206161f442c3a95796cfd0294dae5874ccbe10de5941ed80840630bd3fd04b4bae64736f6c634300060c0033000000000000000000000000a0446d8804611944f1b527ecd37d7dcbe442caba

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c57806394f4b1621161006657806394f4b16214610269578063ad33334814610271578063e44f53d314610333578063fa3f88ae14610366576100ea565b806370a08231146101f85780637bcf84c01461022b5780638903573014610248576100ea565b80632fce8dea116100c85780632fce8dea1461018457806331f866af1461018c5780634187b7d6146101bf5780634aded6ce146101f0576100ea565b806310d97a18146100ef57806318160ddd1461012f57806327a2743314610149575b600080fd5b6100f761036e565b604080516cffffffffffffffffffffffffff948516815292909316602083015265ffffffffffff168183015290519081900360600190f35b610137610412565b60408051918252519081900360200190f35b6101826004803603604081101561015f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610418565b005b6100f76104ca565b610137600480360360208110156101a257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661051d565b6101c761057b565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61013761059f565b6101376004803603602081101561020e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610618565b6101826004803603602081101561024157600080fd5b5035610640565b610250610707565b6040805192835260208301919091528051918290030190f35b610137610793565b6101826004803603604081101561028757600080fd5b8101906020810181356401000000008111156102a257600080fd5b8201836020820111156102b457600080fd5b803590602001918460208302840111640100000000831117156102d657600080fd5b9193909290916020810190356401000000008111156102f457600080fd5b82018360208201111561030657600080fd5b8035906020019184602083028401116401000000008311171561032857600080fd5b509092509050610803565b6101376004803603602081101561034957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610973565b6101826109b8565b600254600090819081906103a39061039e90670de0b6b3a7640000906cffffffffffffffffffffffffff16610a94565b610a12565b6002546103dd9061039e90670de0b6b3a7640000906d010000000000000000000000000090046cffffffffffffffffffffffffff16610a94565b60025491959094507a01000000000000000000000000000000000000000000000000000090910465ffffffffffff1692509050565b60005490565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a0446d8804611944f1b527ecd37d7dcbe442caba16146104bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416363657373207265737472696374656420746f206d6f746865727368697000604482015290519081900360640190fd5b6104c68282610b0b565b5050565b6002546cffffffffffffffffffffffffff808216926d01000000000000000000000000008304909116917a010000000000000000000000000000000000000000000000000000900465ffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832081519283019091525481526105759061056690670b1a2bc2ec500000610bbe565b670de0b6b3a764000090610a94565b92915050565b7f000000000000000000000000a0446d8804611944f1b527ecd37d7dcbe442caba81565b604080516060810182526002546cffffffffffffffffffffffffff80821683526d010000000000000000000000000082041660208301527a010000000000000000000000000000000000000000000000000000900465ffffffffffff16918101919091526000906106139061056690610bf8565b905090565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b6000610694826040518060400160405280601c81526020017f476f7665726e616e636520736861726520697320746f6f206869676800000000815250670de0b6b3a7640000610c989092919063ffffffff16565b905060006106a133610618565b905060006106ad610412565b336000818152600560209081526040918290208251918201909252905481529192506106f4916106dc87610d49565b60029291908686670b1a2bc2ec500000610d68610dc8565b6107013384600085610de3565b50505050565b604080516060810182526002546cffffffffffffffffffffffffff80821683526d010000000000000000000000000082041660208301527a010000000000000000000000000000000000000000000000000000900465ffffffffffff1691810191909152600090819061077990610bf8565b915061078d670de0b6b3a764000083610a94565b90509091565b604080516060810182526002546cffffffffffffffffffffffffff80821683526d010000000000000000000000000082041660208301527a010000000000000000000000000000000000000000000000000000900465ffffffffffff169181019190915260009061061390610bf8565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a0446d8804611944f1b527ecd37d7dcbe442caba16146108a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416363657373207265737472696374656420746f206d6f746865727368697000604482015290519081900360640190fd5b82811461091557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f417272617973206c656e6774682073686f756c6420626520657175616c000000604482015290519081900360640190fd5b60005b8381101561096c5761096485858381811061092f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1684848481811061095857fe5b90506020020135610b0b565b600101610918565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560209081526040808320815192830190915254815261057590670b1a2bc2ec500000610bbe565b60006109c333610618565b905060006109cf610412565b336000818152600560209081526040918290208251918201909252905481529192506109fd916106dc610e43565b6104c6336702c68af0bb140000600185610de3565b60006d01000000000000000000000000008210610a9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f76616c756520646f6573206e6f742066697420696e2031303420626974730000604482015290519081900360640190fd5b5090565b600082821115610b0557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000610b178383610e5e565b905080821415610b2757506104c6565b610b2f611386565b5073ffffffffffffffffffffffffffffffffffffffff83166000908152600560209081526040808320815192830190915254815290610b7961056683670b1a2bc2ec500000610bbe565b90506000610b85610412565b9050610ba260028785878986670b1a2bc2ec500000610d68610ed3565b610bb68683610bb086610ef7565b88610de3565b505050505050565b815160009015610bf2575081517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610575565b50919050565b600080610c2662015180610c21856040015165ffffffffffff1642610a9490919063ffffffff16565b610efc565b90506000610c376201518083610a94565b9050610c9062015180610c8a610c698588602001516cffffffffffffffffffffffffff16610f1490919063ffffffff16565b8751610c84906cffffffffffffffffffffffffff1686610f14565b90610f87565b90610ffb565b949350505050565b60008184841115610d41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578181015183820152602001610cee565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b610d51611386565b506040805160208101909152600182018152919050565b604080518481528315156020820152808201839052905173ffffffffffffffffffffffffffffffffffffffff8616917f2f2c318dd3a1bee02ade0f8f05d9c8f392f7988aa993cc619153bf068801d259919081900360600190a250505050565b610dd988888888888989898961107c565b5050505050505050565b604080518481528315156020820152808201839052905173ffffffffffffffffffffffffffffffffffffffff8616917fc81c61c2c3ce128e7b0962cbb5ffd5d975dcefcca05b54345474f37943743b7a919081900360600190a250505050565b610e4b611386565b5060408051602081019091526000815290565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020548181146105755773ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040812083905554610eca908290610ec49085610f87565b90610a94565b60005592915050565b610dd98888888715610ee55789610eed565b610eed610e43565b898989898961107c565b511590565b6000818310610f0b5781610f0d565b825b9392505050565b600082610f2357506000610575565b82820282848281610f3057fe5b0414610f0d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806113ba6021913960400191505060405180910390fd5b600082820183811015610f0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080821161106b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161107457fe5b049392505050565b600189015460028a01548190806110928b610ef7565b156110a8576110a1818a610a94565b90506110c9565b6110c66110bf6110b88d89610bbe565b8b90610f14565b8490610a94565b92505b6110d28a610ef7565b156110e8576110e18189610f87565b9050611109565b6111066110ff6110f88c89610bbe565b8a90610f14565b8490610f87565b92505b8383146111185760018d018390555b8181146111275760028d018190555b6000871561114c5761114788610c8a611140858b610f14565b8790610f87565b61114e565b865b9050611158611399565b50604080516060810182528f546cffffffffffffffffffffffffff80821683526d0100000000000000000000000000820416602083018190527a01000000000000000000000000000000000000000000000000000090910465ffffffffffff169282019290925290821461129b578e6111d361039e83610bf8565b6111dc84610a12565b6111e542611308565b835479ffffffffffffffffffffffffffffffffffffffffffffffffffff167a01000000000000000000000000000000000000000000000000000065ffffffffffff9290921691909102177fffffffffffff00000000000000000000000000ffffffffffffffffffffffffff166d01000000000000000000000000006cffffffffffffffffffffffffff92831602177fffffffffffffffffffffffffffffffffffffff000000000000000000000000001691161790555b506112a890508a8c61137f565b6112d85773ffffffffffffffffffffffffffffffffffffffff8c16600090815260038e01602052604090208a5190555b6112f98c6112e68c89610bbe565b6112ef8d610ef7565b8b8963ffffffff16565b50505050505050505050505050565b600066010000000000008210610a9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f76616c756520646f6573206e6f742066697420696e2034382062697473000000604482015290519081900360640190fd5b5190511490565b6040518060200160405280600081525090565b60408051606081018252600080825260208201819052918101919091529056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212206161f442c3a95796cfd0294dae5874ccbe10de5941ed80840630bd3fd04b4bae64736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000a0446d8804611944f1b527ecd37d7dcbe442caba

-----Decoded View---------------
Arg [0] : _mothership (address): 0xA0446D8804611944F1B527eCD37d7dcbE442caba

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0446d8804611944f1b527ecd37d7dcbe442caba


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.