ETH Price: $2,116.70 (-2.15%)

Contract

0xEF40f8B376daa24c48e77BCa11eBb1D4A4F07FCa
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MemberRoles

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license
/**
 *Submitted for verification at Etherscan.io on 2020-10-29
*/

// File: contracts/external/openzeppelin-solidity/math/SafeMath.sol

pragma solidity ^0.5.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, 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");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @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) {
        // 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 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        // Solidity only automatically asserts when dividing 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;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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;
    }
}

library SafeMath64 {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint64 a, uint64 b) internal pure returns (uint64) {
        uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint64 c = a - b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint64 a, uint64 b, string memory errorMessage) internal pure returns (uint64) {
        require(b <= a, errorMessage);
        uint64 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint64 a, uint64 b) internal pure returns (uint64) {
        // 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 0;
        }

        uint64 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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(uint64 a, uint64 b) internal pure returns (uint64) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint64 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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(uint64 a, uint64 b) internal pure returns (uint64) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

// File: contracts/external/govblocks-protocol/interfaces/IMemberRoles.sol

/* Copyright (C) 2017 GovBlocks.io
  This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
  This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
  You should have received a copy of the GNU General Public License
    along with this program.  If not, see http://www.gnu.org/licenses/ */

pragma solidity 0.5.7;


contract IMemberRoles {

    event MemberRole(uint256 indexed roleId, bytes32 roleName, string roleDescription);
    
    enum Role {UnAssigned, AdvisoryBoard, TokenHolder, DisputeResolution}

    function setInititorAddress(address _initiator) external;

    /// @dev Adds new member role
    /// @param _roleName New role name
    /// @param _roleDescription New description hash
    /// @param _authorized Authorized member against every role id
    function addRole(bytes32 _roleName, string memory _roleDescription, address _authorized) public;

    /// @dev Assign or Delete a member from specific role.
    /// @param _memberAddress Address of Member
    /// @param _roleId RoleId to update
    /// @param _active active is set to be True if we want to assign this role to member, False otherwise!
    function updateRole(address _memberAddress, uint _roleId, bool _active) public;

    /// @dev Change Member Address who holds the authority to Add/Delete any member from specific role.
    /// @param _roleId roleId to update its Authorized Address
    /// @param _authorized New authorized address against role id
    function changeAuthorized(uint _roleId, address _authorized) public;

    /// @dev Return number of member roles
    function totalRoles() public view returns(uint256);

    /// @dev Gets the member addresses assigned by a specific role
    /// @param _memberRoleId Member role id
    /// @return roleId Role id
    /// @return allMemberAddress Member addresses of specified role id
    function members(uint _memberRoleId) public view returns(uint, address[] memory allMemberAddress);

    /// @dev Gets all members' length
    /// @param _memberRoleId Member role id
    /// @return memberRoleData[_memberRoleId].memberAddress.length Member length
    function numberOfMembers(uint _memberRoleId) public view returns(uint);
    
    /// @dev Return member address who holds the right to add/remove any member from specific role.
    function authorized(uint _memberRoleId) public view returns(address);

    /// @dev Get All role ids array that has been assigned to a member so far.
    function roles(address _memberAddress) public view returns(uint[] memory assignedRoles);

    /// @dev Returns true if the given role id is assigned to a member.
    /// @param _memberAddress Address of member
    /// @param _roleId Checks member's authenticity with the roleId.
    /// i.e. Returns true if this roleId is assigned to member
    function checkRole(address _memberAddress, uint _roleId) public view returns(bool);   
}

// File: contracts/external/govblocks-protocol/Governed.sol

/* Copyright (C) 2017 GovBlocks.io
  This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
  This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
  You should have received a copy of the GNU General Public License
    along with this program.  If not, see http://www.gnu.org/licenses/ */

pragma solidity 0.5.7;


contract IMaster {
    mapping(address => bool) public whitelistedSponsor;
    function dAppToken() public view returns(address);
    function isInternal(address _address) public view returns(bool);
    function getLatestAddress(bytes2 _module) public view returns(address);
    function isAuthorizedToGovern(address _toCheck) public view returns(bool);
}


contract Governed {

    address public masterAddress; // Name of the dApp, needs to be set by contracts inheriting this contract

    /// @dev modifier that allows only the authorized addresses to execute the function
    modifier onlyAuthorizedToGovern() {
        IMaster ms = IMaster(masterAddress);
        require(ms.getLatestAddress("GV") == msg.sender, "Not authorized");
        _;
    }

    /// @dev checks if an address is authorized to govern
    function isAuthorizedToGovern(address _toCheck) public view returns(bool) {
        IMaster ms = IMaster(masterAddress);
        return (ms.getLatestAddress("GV") == _toCheck);
    } 

}

// File: contracts/external/proxy/Proxy.sol

pragma solidity 0.5.7;


/**
 * @title Proxy
 * @dev Gives the possibility to delegate any call to a foreign implementation.
 */
contract Proxy {
    /**
    * @dev Fallback function allowing to perform a delegatecall to the given implementation.
    * This function will return whatever the implementation call returns
    */
    function () external payable {
        address _impl = implementation();
        require(_impl != address(0));

        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize)
            let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
            let size := returndatasize
            returndatacopy(ptr, 0, size)

            switch result
            case 0 { revert(ptr, size) }
            default { return(ptr, size) }
            }
    }

    /**
    * @dev Tells the address of the implementation where every call will be delegated.
    * @return address of the implementation to which it will be delegated
    */
    function implementation() public view returns (address);
}

// File: contracts/external/proxy/UpgradeabilityProxy.sol

pragma solidity 0.5.7;



/**
 * @title UpgradeabilityProxy
 * @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded
 */
contract UpgradeabilityProxy is Proxy {
    /**
    * @dev This event will be emitted every time the implementation gets upgraded
    * @param implementation representing the address of the upgraded implementation
    */
    event Upgraded(address indexed implementation);

    // Storage position of the address of the current implementation
    bytes32 private constant IMPLEMENTATION_POSITION = keccak256("org.govblocks.proxy.implementation");

    /**
    * @dev Constructor function
    */
    constructor() public {}

    /**
    * @dev Tells the address of the current implementation
    * @return address of the current implementation
    */
    function implementation() public view returns (address impl) {
        bytes32 position = IMPLEMENTATION_POSITION;
        assembly {
            impl := sload(position)
        }
    }

    /**
    * @dev Sets the address of the current implementation
    * @param _newImplementation address representing the new implementation to be set
    */
    function _setImplementation(address _newImplementation) internal {
        bytes32 position = IMPLEMENTATION_POSITION;
        assembly {
        sstore(position, _newImplementation)
        }
    }

    /**
    * @dev Upgrades the implementation address
    * @param _newImplementation representing the address of the new implementation to be set
    */
    function _upgradeTo(address _newImplementation) internal {
        address currentImplementation = implementation();
        require(currentImplementation != _newImplementation);
        _setImplementation(_newImplementation);
        emit Upgraded(_newImplementation);
    }
}

// File: contracts/external/proxy/OwnedUpgradeabilityProxy.sol

pragma solidity 0.5.7;



/**
 * @title OwnedUpgradeabilityProxy
 * @dev This contract combines an upgradeability proxy with basic authorization control functionalities
 */
contract OwnedUpgradeabilityProxy is UpgradeabilityProxy {
    /**
    * @dev Event to show ownership has been transferred
    * @param previousOwner representing the address of the previous owner
    * @param newOwner representing the address of the new owner
    */
    event ProxyOwnershipTransferred(address previousOwner, address newOwner);

    // Storage position of the owner of the contract
    bytes32 private constant PROXY_OWNER_POSITION = keccak256("org.govblocks.proxy.owner");

    /**
    * @dev the constructor sets the original owner of the contract to the sender account.
    */
    constructor(address _implementation) public {
        _setUpgradeabilityOwner(msg.sender);
        _upgradeTo(_implementation);
    }

    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyProxyOwner() {
        require(msg.sender == proxyOwner());
        _;
    }

    /**
    * @dev Tells the address of the owner
    * @return the address of the owner
    */
    function proxyOwner() public view returns (address owner) {
        bytes32 position = PROXY_OWNER_POSITION;
        assembly {
            owner := sload(position)
        }
    }

    /**
    * @dev Allows the current owner to transfer control of the contract to a newOwner.
    * @param _newOwner The address to transfer ownership to.
    */
    function transferProxyOwnership(address _newOwner) public onlyProxyOwner {
        require(_newOwner != address(0));
        _setUpgradeabilityOwner(_newOwner);
        emit ProxyOwnershipTransferred(proxyOwner(), _newOwner);
    }

    /**
    * @dev Allows the proxy owner to upgrade the current version of the proxy.
    * @param _implementation representing the address of the new implementation to be set.
    */
    function upgradeTo(address _implementation) public onlyProxyOwner {
        _upgradeTo(_implementation);
    }

    /**
     * @dev Sets the address of the owner
    */
    function _setUpgradeabilityOwner(address _newProxyOwner) internal {
        bytes32 position = PROXY_OWNER_POSITION;
        assembly {
            sstore(position, _newProxyOwner)
        }
    }
}

// File: contracts/interfaces/Iupgradable.sol

pragma solidity 0.5.7;

contract Iupgradable {

    /**
     * @dev change master address
     */
    function setMasterAddress() public;
}

// File: contracts/interfaces/ITokenController.sol

pragma solidity 0.5.7;

contract ITokenController {
	address public token;
    address public bLOTToken;

    /**
    * @dev Swap BLOT token.
    * account.
    * @param amount The amount that will be swapped.
    */
    function swapBLOT(address _of, address _to, uint256 amount) public;

    function totalBalanceOf(address _of)
        public
        view
        returns (uint256 amount);

    function transferFrom(address _token, address _of, address _to, uint256 amount) public;

    /**
     * @dev Returns tokens locked for a specified address for a
     *      specified reason at a specific time
     * @param _of The address whose tokens are locked
     * @param _reason The reason to query the lock tokens for
     * @param _time The timestamp to query the lock tokens for
     */
    function tokensLockedAtTime(address _of, bytes32 _reason, uint256 _time)
        public
        view
        returns (uint256 amount);

    /**
    * @dev burns an amount of the tokens of the message sender
    * account.
    * @param amount The amount that will be burnt.
    */
    function burnCommissionTokens(uint256 amount) external returns(bool);
 
    function initiateVesting(address _vesting) external;

    function lockForGovernanceVote(address _of, uint _days) public;

    function totalSupply() public view returns (uint256);

    function mint(address _member, uint _amount) public;

}

// File: contracts/MemberRoles.sol

/* Copyright (C) 2020 PlotX.io

  This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

  This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
    along with this program.  If not, see http://www.gnu.org/licenses/ */

pragma solidity 0.5.7;







contract MemberRoles is IMemberRoles, Governed, Iupgradable {

    using SafeMath for uint256;

    ITokenController internal tokenController;
    struct MemberRoleDetails {
        uint256 memberCounter;
        mapping(address => uint256) memberIndex;
        address[] memberAddress;
        address authorized;
    }

    MemberRoleDetails[] internal memberRoleData;
    bool internal constructorCheck;
    address internal initiator;
    uint256 internal minLockAmountForDR;
    uint256 internal lockTimeForDR;

    modifier checkRoleAuthority(uint256 _memberRoleId) {
        if (memberRoleData[_memberRoleId].authorized != address(0))
            require(
                msg.sender == memberRoleData[_memberRoleId].authorized,
                "Not authorized"
            );
        else require(isAuthorizedToGovern(msg.sender), "Not Authorized");
        _;
    }

    /**
     * @dev to swap advisory board member
     * @param _newABAddress is address of new AB member
     * @param _removeAB is advisory board member to be removed
     */
    function swapABMember(address _newABAddress, address _removeAB)
        external
        checkRoleAuthority(uint256(Role.AdvisoryBoard))
    {
        _updateRole(_newABAddress, uint256(Role.AdvisoryBoard), true);
        _updateRole(_removeAB, uint256(Role.AdvisoryBoard), false);
    }

    /**
     * @dev to change the master address
     */
    function setMasterAddress() public {
        OwnedUpgradeabilityProxy proxy = OwnedUpgradeabilityProxy(
            address(uint160(address(this)))
        );
        require(msg.sender == proxy.proxyOwner(), "Sender is not proxy owner.");

        require(masterAddress == address(0), "Master address already set");
        masterAddress = msg.sender;
        IMaster masterInstance = IMaster(masterAddress);
        tokenController = ITokenController(
            masterInstance.getLatestAddress("TC")
        );
        minLockAmountForDR = 500 ether;
        lockTimeForDR = 15 days;
    }

    /**
     * @dev Set the authorized address to add the initial roles and members
     * @param _initiator is address of the initiator
     */
    function setInititorAddress(address _initiator) external {
        OwnedUpgradeabilityProxy proxy = OwnedUpgradeabilityProxy(
            address(uint160(address(this)))
        );
        require(msg.sender == proxy.proxyOwner(), "Sender is not proxy owner.");
        require(initiator == address(0), "Already Set");
        initiator = _initiator;
    }

    /**
     * @dev to initiate the member roles and add initial AB, DR board members
     * @param _abArray is array of addresses of the Initial AB members
     */
    function memberRolesInitiate(
        address[] calldata _abArray
    ) external {
        require(msg.sender == initiator);
        require(!constructorCheck, "Already constructed");
        _addInitialMemberRoles();
        for (uint256 i = 0; i < _abArray.length; i++) {
            _updateRole(_abArray[i], uint256(Role.AdvisoryBoard), true);
        }
        constructorCheck = true;
    }

    /// @dev Adds new member role
    /// @param _roleName New role name
    /// @param _roleDescription New description hash
    /// @param _authorized Authorized member against every role id
    function addRole(
        //solhint-disable-line
        bytes32 _roleName,
        string memory _roleDescription,
        address _authorized
    ) public onlyAuthorizedToGovern {
        _addRole(_roleName, _roleDescription, _authorized);
    }

    /// @dev Assign or Delete a member from specific role.
    /// @param _memberAddress Address of Member
    /// @param _roleId RoleId to update
    /// @param _active active is set to be True if we want to assign this role to member, False otherwise!
    function updateRole(
        //solhint-disable-line
        address _memberAddress,
        uint256 _roleId,
        bool _active
    ) public checkRoleAuthority(_roleId) {
        _updateRole(_memberAddress, _roleId, _active);
    }

    /// @dev Return number of member roles
    function totalRoles() public view returns (uint256) {
        //solhint-disable-line
        return memberRoleData.length;
    }

    /// @dev Change Member Address who holds the authority to Add/Delete any member from specific role.
    /// @param _roleId roleId to update its Authorized Address
    /// @param _newAuthorized New authorized address against role id
    function changeAuthorized(uint256 _roleId, address _newAuthorized)
        public
        checkRoleAuthority(_roleId)
    {
        //solhint-disable-line
        memberRoleData[_roleId].authorized = _newAuthorized;
    }

    /// @dev Gets the member addresses assigned by a specific role
    /// @param _memberRoleId Member role id
    /// @return roleId Role id
    /// @return allMemberAddress Member addresses of specified role id
    function members(uint256 _memberRoleId)
        public
        view
        returns (uint256, address[] memory memberArray)
    {
        return (_memberRoleId, memberRoleData[_memberRoleId].memberAddress);
    }

    /// @dev Gets all members' length
    /// @param _memberRoleId Member role id
    /// @return memberRoleData[_memberRoleId].memberCounter Member length
    function numberOfMembers(uint256 _memberRoleId)
        public
        view
        returns (uint256)
    {
        //solhint-disable-line
        return memberRoleData[_memberRoleId].memberCounter;
    }

    /// @dev Return member address who holds the right to add/remove any member from specific role.
    function authorized(uint256 _memberRoleId) public view returns (address) {
        //solhint-disable-line
        return memberRoleData[_memberRoleId].authorized;
    }

    /// @dev Get All role ids array that has been assigned to a member so far.
    function roles(address _memberAddress)
        public
        view
        returns (uint256[] memory)
    {
        //solhint-disable-line
        uint256 length = memberRoleData.length;
        uint256[] memory assignedRoles = new uint256[](length);
        uint256 counter = 0;
        for (uint256 i = 1; i < length; i++) {
            if (memberRoleData[i].memberIndex[_memberAddress] > 0) {
                assignedRoles[counter] = i;
                counter++;
            }
        }
        if (tokenController.totalBalanceOf(_memberAddress) > 0) {
            assignedRoles[counter] = uint256(Role.TokenHolder);
            counter++;
        }
        if (tokenController.tokensLockedAtTime(_memberAddress, "DR", (lockTimeForDR).add(now)) >= minLockAmountForDR) {
            assignedRoles[counter] = uint256(Role.DisputeResolution);
        }
        return assignedRoles;
    }

    /**
     * @dev Updates Uint Parameters of a code
     * @param code whose details we want to update
     * @param val value to set
     */
    function updateUintParameters(bytes8 code, uint val) public onlyAuthorizedToGovern {
        if(code == "MNLOCKDR") { //Minimum lock amount to consider user as DR member
            minLockAmountForDR = val;
        } else if (code == "TLOCDR") { // Lock period required for DR
            lockTimeForDR = val * (1 days);
        } 
    }

    function getUintParameters(bytes8 code) external view returns(bytes8 codeVal, uint val) {
        codeVal = code;
        if(code == "MNLOCKDR") {
            val = minLockAmountForDR;
        } else if (code == "TLOCDR") { // Lock period required for DR
            val = lockTimeForDR / (1 days);
        } 
    }


    /// @dev Returns true if the given role id is assigned to a member.
    /// @param _memberAddress Address of member
    /// @param _roleId Checks member's authenticity with the roleId.
    /// i.e. Returns true if this roleId is assigned to member
    function checkRole(address _memberAddress, uint256 _roleId)
        public
        view
        returns (bool)
    {
        //solhint-disable-line
        if (_roleId == uint256(Role.UnAssigned)) {
            return true;
        } else if (_roleId == uint256(Role.TokenHolder)) {
            if (tokenController.totalBalanceOf(_memberAddress) > 0) {
                return true;
            }
        } else if (_roleId == uint256(Role.DisputeResolution)) {
            if (tokenController.tokensLockedAtTime(_memberAddress, "DR", (lockTimeForDR).add(now)) >= minLockAmountForDR) {
                return true;
            }
        } else if (memberRoleData[_roleId].memberIndex[_memberAddress] > 0) {
            //solhint-disable-line
            return true;
        }
        return false;
    }

    /// @dev Return total number of members assigned against each role id.
    /// @return totalMembers Total members in particular role id
    function getMemberLengthForAllRoles()
        public
        view
        returns (uint256[] memory totalMembers)
    {
        //solhint-disable-line
        totalMembers = new uint256[](memberRoleData.length);
        for (uint256 i = 0; i < memberRoleData.length; i++) {
            totalMembers[i] = numberOfMembers(i);
        }
    }

    /**
     * @dev to update the member roles
     * @param _memberAddress in concern
     * @param _roleId the id of role
     * @param _active if active is true, add the member, else remove it
     */
    function _updateRole(
        address _memberAddress,
        uint256 _roleId,
        bool _active
    ) internal {
        require(
            _roleId != uint256(Role.TokenHolder) && _roleId != uint256(Role.DisputeResolution),
            "Membership to this role is detected automatically"
        );
        if (_active) {
            require(
                memberRoleData[_roleId].memberIndex[_memberAddress] == 0,
                "already active"
            );

            memberRoleData[_roleId].memberCounter = SafeMath.add(
                memberRoleData[_roleId].memberCounter,
                1
            );
            memberRoleData[_roleId]
                .memberIndex[_memberAddress] = memberRoleData[_roleId]
                .memberAddress
                .length;
            memberRoleData[_roleId].memberAddress.push(_memberAddress);
        } else {
            //Remove the selected member and swap its index with the member at last index
            require(
                memberRoleData[_roleId].memberIndex[_memberAddress] > 0,
                "not active"
            );
            uint256 _memberIndex = memberRoleData[_roleId]
                .memberIndex[_memberAddress];
            address _topElement = memberRoleData[_roleId]
                .memberAddress[memberRoleData[_roleId].memberCounter];
            memberRoleData[_roleId].memberIndex[_topElement] = _memberIndex;
            memberRoleData[_roleId].memberCounter = SafeMath.sub(
                memberRoleData[_roleId].memberCounter,
                1
            );
            memberRoleData[_roleId].memberAddress[_memberIndex] = _topElement;
            memberRoleData[_roleId].memberAddress.length--;
            delete memberRoleData[_roleId].memberIndex[_memberAddress];
        }
    }

    /// @dev Adds new member role
    /// @param _roleName New role name
    /// @param _roleDescription New description hash
    /// @param _authorized Authorized member against every role id
    function _addRole(
        bytes32 _roleName,
        string memory _roleDescription,
        address _authorized
    ) internal {
        emit MemberRole(memberRoleData.length, _roleName, _roleDescription);
        memberRoleData.push(
            MemberRoleDetails(0, new address[](1), _authorized)
        );
    }

    /**
     * @dev to add initial member roles
     */
    function _addInitialMemberRoles() internal {
        _addRole("Unassigned", "Unassigned", address(0));
        _addRole(
            "Advisory Board",
            "Selected few members that are deeply entrusted by the dApp. An ideal advisory board should be a mix of skills of domain, governance, research, technology, consulting etc to improve the performance of the dApp.", //solhint-disable-line
            address(0)
        );
        _addRole(
            "Token Holder",
            "Represents all users who hold dApp tokens. This is the most general category and anyone holding token balance is a part of this category by default.", //solhint-disable-line
            address(0)
        );
        _addRole(
            "DisputeResolution",
            "Represents members who are assigned to vote on resolving disputes", //solhint-disable-line
            address(0)
        );
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"_memberRoleId","type":"uint256"}],"name":"authorized","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_memberRoleId","type":"uint256"}],"name":"numberOfMembers","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_toCheck","type":"address"}],"name":"isAuthorizedToGovern","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_roleName","type":"bytes32"},{"name":"_roleDescription","type":"string"},{"name":"_authorized","type":"address"}],"name":"addRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_memberAddress","type":"address"},{"name":"_roleId","type":"uint256"},{"name":"_active","type":"bool"}],"name":"updateRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_initiator","type":"address"}],"name":"setInititorAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setMasterAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_memberAddress","type":"address"},{"name":"_roleId","type":"uint256"}],"name":"checkRole","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_memberRoleId","type":"uint256"}],"name":"members","outputs":[{"name":"","type":"uint256"},{"name":"memberArray","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"code","type":"bytes8"}],"name":"getUintParameters","outputs":[{"name":"codeVal","type":"bytes8"},{"name":"val","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMemberLengthForAllRoles","outputs":[{"name":"totalMembers","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalRoles","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_memberAddress","type":"address"}],"name":"roles","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"code","type":"bytes8"},{"name":"val","type":"uint256"}],"name":"updateUintParameters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_roleId","type":"uint256"},{"name":"_newAuthorized","type":"address"}],"name":"changeAuthorized","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newABAddress","type":"address"},{"name":"_removeAB","type":"address"}],"name":"swapABMember","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_abArray","type":"address[]"}],"name":"memberRolesInitiate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"masterAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"roleId","type":"uint256"},{"indexed":false,"name":"roleName","type":"bytes32"},{"indexed":false,"name":"roleDescription","type":"string"}],"name":"MemberRole","type":"event"}]

608060405234801561001057600080fd5b50611f6b806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80636122f840116100a25780639dd86e0f116100715780639dd86e0f1461044e578063aa561f9d1461047b578063c578f230146104a7578063cb41e01b146104d5578063d365a08e1461054557610116565b80636122f8401461037d5780636d1c31d2146103c8578063790e118c14610420578063993746421461042857610116565b80632f473021116100e95780632f4730211461027757806343b20ff6146102ab5780634b6199b0146102d1578063505ef22f146102d95780635daf08ca1461030557610116565b80630d48669a1461011b5780630dc6f8471461015457806322ce7254146101835780632dc4bdca146101bd575b600080fd5b6101386004803603602081101561013157600080fd5b503561054d565b604080516001600160a01b039092168252519081900360200190f35b6101716004803603602081101561016a57600080fd5b503561057f565b60408051918252519081900360200190f35b6101a96004803603602081101561019957600080fd5b50356001600160a01b03166105a7565b604080519115158252519081900360200190f35b610275600480360360608110156101d357600080fd5b813591908101906040810160208201356401000000008111156101f557600080fd5b82018360208201111561020757600080fd5b8035906020019184600183028401116401000000008311171561022957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b0316915061063f9050565b005b6102756004803603606081101561028d57600080fd5b506001600160a01b0381351690602081013590604001351515610727565b610275600480360360208110156102c157600080fd5b50356001600160a01b0316610837565b610275610980565b6101a9600480360360408110156102ef57600080fd5b506001600160a01b038135169060200135610b75565b6103226004803603602081101561031b57600080fd5b5035610d3c565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610368578181015183820152602001610350565b50505050905001935050505060405180910390f35b6103a46004803603602081101561039357600080fd5b50356001600160c01b031916610dc5565b604080516001600160c01b0319909316835260208301919091528051918290030190f35b6103d0610e25565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561040c5781810151838201526020016103f4565b505050509050019250505060405180910390f35b610171610e8f565b6103d06004803603602081101561043e57600080fd5b50356001600160a01b0316610e96565b6102756004803603604081101561046457600080fd5b506001600160c01b031981351690602001356110bf565b6102756004803603604081101561049157600080fd5b50803590602001356001600160a01b03166111ed565b610275600480360360408110156104bd57600080fd5b506001600160a01b038135811691602001351661133a565b610275600480360360208110156104eb57600080fd5b81019060208101813564010000000081111561050657600080fd5b82018360208201111561051857600080fd5b8035906020019184602083028401116401000000008311171561053a57600080fd5b50909250905061145b565b61013861152b565b60006002828154811061055c57fe5b60009182526020909120600490910201600301546001600160a01b031692915050565b60006002828154811061058e57fe5b9060005260206000209060040201600001549050919050565b6000805460408051600160e31b6227050b028152600160f11b6123ab02600482015290516001600160a01b03928316928516918391630138285891602480820192602092909190829003018186803b15801561060257600080fd5b505afa158015610616573d6000803e3d6000fd5b505050506040513d602081101561062c57600080fd5b50516001600160a01b0316149392505050565b60005460408051600160e31b6227050b028152600160f11b6123ab02600482015290516001600160a01b039092169133918391630138285891602480820192602092909190829003018186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d60208110156106c257600080fd5b50516001600160a01b0316146107165760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b61072184848461153a565b50505050565b8160006001600160a01b03166002828154811061074057fe5b60009182526020909120600360049092020101546001600160a01b0316146107db576002818154811061076f57fe5b60009182526020909120600490910201600301546001600160a01b031633146107d65760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b61082c565b6107e4336105a7565b61082c5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08105d5d1a1bdc9a5e995902604482015290519081900360640190fd5b61072184848461168d565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561087557600080fd5b505afa158015610889573d6000803e3d6000fd5b505050506040513d602081101561089f57600080fd5b50516001600160a01b031633146109005760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b60035461010090046001600160a01b0316156109575760408051600160e51b62461bcd02815260206004820152600b6024820152600160aa1b6a105b1c9958591e4814d95d02604482015290519081900360640190fd5b50600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b1580156109be57600080fd5b505afa1580156109d2573d6000803e3d6000fd5b505050506040513d60208110156109e857600080fd5b50516001600160a01b03163314610a495760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b6000546001600160a01b031615610aaa5760408051600160e51b62461bcd02815260206004820152601a60248201527f4d6173746572206164647265737320616c726561647920736574000000000000604482015290519081900360640190fd5b600080546001600160a01b03191633179081905560408051600160e31b6227050b028152600160f01b61544302600482015290516001600160a01b03929092169182916301382858916024808301926020929190829003018186803b158015610b1257600080fd5b505afa158015610b26573d6000803e3d6000fd5b505050506040513d6020811015610b3c57600080fd5b5051600180546001600160a01b0319166001600160a01b039092169190911790555050681b1ae4d6e2ef5000006004556213c680600555565b600081610b8457506001610d36565b6002821415610c205760015460408051600160e11b63258770150281526001600160a01b03868116600483015291516000939290921691634b0ee02a91602480820192602092909190829003018186803b158015610be157600080fd5b505afa158015610bf5573d6000803e3d6000fd5b505050506040513d6020811015610c0b57600080fd5b50511115610c1b57506001610d36565b610d32565b6003821415610cec576004546001546005546001600160a01b039091169063179e91f1908690610c56904263ffffffff611ad116565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180600160f11b612229028152506020018281526020019250505060206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d6020811015610cdd57600080fd5b505110610c1b57506001610d36565b600060028381548110610cfb57fe5b600091825260208083206001600160a01b0388168452600160049093020191909101905260409020541115610d3257506001610d36565b5060005b92915050565b600060608260028481548110610d4e57fe5b906000526020600020906004020160020180805480602002602001604051908101604052809291908181526020018280548015610db457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d96575b50505050509050915091505b915091565b806000600160c11b6726a72627a1a5a229026001600160c01b031983161415610df15750600454610dc0565b600160d11b652a2627a1a229026001600160c01b031984161415610dc0576201518060055481610e1d57fe5b049050915091565b6002546040805182815260208084028201019091526060918015610e53578160200160208202803883390190505b50905060005b600254811015610e8b57610e6c8161057f565b828281518110610e7857fe5b6020908102919091010152600101610e59565b5090565b6002545b90565b600254604080518281526020808402820101909152606091908290828015610ec8578160200160208202803883390190505b509050600060015b83811015610f3d57600060028281548110610ee757fe5b600091825260208083206001600160a01b038b168452600160049093020191909101905260409020541115610f355780838381518110610f2357fe5b60209081029190910101526001909101905b600101610ed0565b5060015460408051600160e11b63258770150281526001600160a01b03888116600483015291516000939290921691634b0ee02a91602480820192602092909190829003018186803b158015610f9257600080fd5b505afa158015610fa6573d6000803e3d6000fd5b505050506040513d6020811015610fbc57600080fd5b50511115610fe1576002828281518110610fd257fe5b60209081029190910101526001015b6004546001546005546001600160a01b039091169063179e91f190889061100e904263ffffffff611ad116565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180600160f11b612229028152506020018281526020019250505060206040518083038186803b15801561106b57600080fd5b505afa15801561107f573d6000803e3d6000fd5b505050506040513d602081101561109557600080fd5b5051106110b75760038282815181106110aa57fe5b6020026020010181815250505b509392505050565b60005460408051600160e31b6227050b028152600160f11b6123ab02600482015290516001600160a01b039092169133918391630138285891602480820192602092909190829003018186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d602081101561114257600080fd5b50516001600160a01b0316146111965760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b600160c11b6726a72627a1a5a229026001600160c01b0319841614156111c05760048290556111e8565b600160d11b652a2627a1a229026001600160c01b0319841614156111e8576201518082026005555b505050565b8160006001600160a01b03166002828154811061120657fe5b60009182526020909120600360049092020101546001600160a01b0316146112a1576002818154811061123557fe5b60009182526020909120600490910201600301546001600160a01b0316331461129c5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6112f2565b6112aa336105a7565b6112f25760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08105d5d1a1bdc9a5e995902604482015290519081900360640190fd5b816002848154811061130057fe5b906000526020600020906004020160030160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b600160006001600160a01b03166002828154811061135457fe5b60009182526020909120600360049092020101546001600160a01b0316146113ef576002818154811061138357fe5b60009182526020909120600490910201600301546001600160a01b031633146113ea5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b611440565b6113f8336105a7565b6114405760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08105d5d1a1bdc9a5e995902604482015290519081900360640190fd5b61144e8360015b600161168d565b6111e8826001600061168d565b60035461010090046001600160a01b0316331461147757600080fd5b60035460ff16156114d25760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920636f6e737472756374656400000000000000000000000000604482015290519081900360640190fd5b6114da611b35565b60005b81811015611519576115118383838181106114f457fe5b905060200201356001600160a01b03166001600381111561144757fe5b6001016114dd565b50506003805460ff1916600117905550565b6000546001600160a01b031681565b6002805490507fe2981862bbf692aa30ba39d4eca9c69e5dcebf3eae5fb93332940c23c1c4c3c584846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156115a657818101518382015260200161158e565b50505050905090810190601f1680156115d35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a260408051606081018252600081528151600180825281840190935260029260208301919081602001602082028038833950505081526001600160a01b0384166020918201528254600181018085556000948552938290208351600490920201908155828201518051919261165d92600285019290910190611ca5565b5060409190910151600390910180546001600160a01b0319166001600160a01b0390921691909117905550505050565b6002821415801561169f575060038214155b6116dd57604051600160e51b62461bcd028152600401808060200182810382526031815260200180611daa6031913960400191505060405180910390fd5b801561185e57600282815481106116f057fe5b600091825260208083206001600160a01b0387168452600160049093020191909101905260409020541561176e5760408051600160e51b62461bcd02815260206004820152600e60248201527f616c726561647920616374697665000000000000000000000000000000000000604482015290519081900360640190fd5b6117976002838154811061177e57fe5b9060005260206000209060040201600001546001611ad1565b600283815481106117a457fe5b600091825260209091206004909102015560028054839081106117c357fe5b906000526020600020906004020160020180549050600283815481106117e557fe5b600091825260208083206001600160a01b038816845260016004909302019190910190526040902055600280548390811061181c57fe5b60009182526020808320600492909202909101600201805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790556111e8565b60006002838154811061186d57fe5b600091825260208083206001600160a01b038816845260016004909302019190910190526040902054116118db5760408051600160e51b62461bcd02815260206004820152600a6024820152600160b01b696e6f742061637469766502604482015290519081900360640190fd5b6000600283815481106118ea57fe5b90600052602060002090600402016001016000856001600160a01b03166001600160a01b0316815260200190815260200160002054905060006002848154811061193057fe5b90600052602060002090600402016002016002858154811061194e57fe5b9060005260206000209060040201600001548154811061196a57fe5b600091825260209091200154600280546001600160a01b03909216925083918690811061199357fe5b600091825260208083206001600160a01b038616845260016004909302019190910190526040902055600280546119e89190869081106119cf57fe5b9060005260206000209060040201600001546001611c45565b600285815481106119f557fe5b9060005260206000209060040201600001819055508060028581548110611a1857fe5b90600052602060002090600402016002018381548110611a3457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060028481548110611a6f57fe5b9060005260206000209060040201600201805480919060019003611a939190611d06565b5060028481548110611aa157fe5b600091825260208083206001600160a01b0389168452600160049093020191909101905260408120555050505050565b600082820183811015611b2e5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b611b76600160b21b69155b985cdcda59db9959026040518060400160405280600a8152602001600160b21b69155b985cdcda59db995902815250600061153a565b611bbb7f41647669736f727920426f61726400000000000000000000000000000000000060405180610100016040528060d18152602001611ddb60d19139600061153a565b611bff7f546f6b656e20486f6c64657200000000000000000000000000000000000000006040518060c0016040528060948152602001611eac60949139600061153a565b611c437f446973707574655265736f6c7574696f6e000000000000000000000000000000604051806080016040528060418152602001611d6960419139600061153a565b565b600082821115611c9f5760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b828054828255906000526020600020908101928215611cfa579160200282015b82811115611cfa57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cc5565b50610e8b929150611d2a565b8154818355818111156111e8576000838152602090206111e8918101908301611d4e565b610e9391905b80821115610e8b5780546001600160a01b0319168155600101611d30565b610e9391905b80821115610e8b5760008155600101611d5456fe526570726573656e7473206d656d626572732077686f206172652061737369676e656420746f20766f7465206f6e207265736f6c76696e672064697370757465734d656d6265727368697020746f207468697320726f6c65206973206465746563746564206175746f6d61746963616c6c7953656c656374656420666577206d656d6265727320746861742061726520646565706c7920656e747275737465642062792074686520644170702e20416e20696465616c2061647669736f727920626f6172642073686f756c642062652061206d6978206f6620736b696c6c73206f6620646f6d61696e2c20676f7665726e616e63652c2072657365617263682c20746563686e6f6c6f67792c20636f6e73756c74696e672065746320746f20696d70726f76652074686520706572666f726d616e6365206f662074686520644170702e526570726573656e747320616c6c2075736572732077686f20686f6c64206441707020746f6b656e732e205468697320697320746865206d6f73742067656e6572616c2063617465676f727920616e6420616e796f6e6520686f6c64696e6720746f6b656e2062616c616e636520697320612070617274206f6620746869732063617465676f72792062792064656661756c742ea165627a7a72305820c29d9f4776775a349ed0e866fd284b245101a96a5a51919a9c5133d78f2ad7740029

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c80636122f840116100a25780639dd86e0f116100715780639dd86e0f1461044e578063aa561f9d1461047b578063c578f230146104a7578063cb41e01b146104d5578063d365a08e1461054557610116565b80636122f8401461037d5780636d1c31d2146103c8578063790e118c14610420578063993746421461042857610116565b80632f473021116100e95780632f4730211461027757806343b20ff6146102ab5780634b6199b0146102d1578063505ef22f146102d95780635daf08ca1461030557610116565b80630d48669a1461011b5780630dc6f8471461015457806322ce7254146101835780632dc4bdca146101bd575b600080fd5b6101386004803603602081101561013157600080fd5b503561054d565b604080516001600160a01b039092168252519081900360200190f35b6101716004803603602081101561016a57600080fd5b503561057f565b60408051918252519081900360200190f35b6101a96004803603602081101561019957600080fd5b50356001600160a01b03166105a7565b604080519115158252519081900360200190f35b610275600480360360608110156101d357600080fd5b813591908101906040810160208201356401000000008111156101f557600080fd5b82018360208201111561020757600080fd5b8035906020019184600183028401116401000000008311171561022957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b0316915061063f9050565b005b6102756004803603606081101561028d57600080fd5b506001600160a01b0381351690602081013590604001351515610727565b610275600480360360208110156102c157600080fd5b50356001600160a01b0316610837565b610275610980565b6101a9600480360360408110156102ef57600080fd5b506001600160a01b038135169060200135610b75565b6103226004803603602081101561031b57600080fd5b5035610d3c565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610368578181015183820152602001610350565b50505050905001935050505060405180910390f35b6103a46004803603602081101561039357600080fd5b50356001600160c01b031916610dc5565b604080516001600160c01b0319909316835260208301919091528051918290030190f35b6103d0610e25565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561040c5781810151838201526020016103f4565b505050509050019250505060405180910390f35b610171610e8f565b6103d06004803603602081101561043e57600080fd5b50356001600160a01b0316610e96565b6102756004803603604081101561046457600080fd5b506001600160c01b031981351690602001356110bf565b6102756004803603604081101561049157600080fd5b50803590602001356001600160a01b03166111ed565b610275600480360360408110156104bd57600080fd5b506001600160a01b038135811691602001351661133a565b610275600480360360208110156104eb57600080fd5b81019060208101813564010000000081111561050657600080fd5b82018360208201111561051857600080fd5b8035906020019184602083028401116401000000008311171561053a57600080fd5b50909250905061145b565b61013861152b565b60006002828154811061055c57fe5b60009182526020909120600490910201600301546001600160a01b031692915050565b60006002828154811061058e57fe5b9060005260206000209060040201600001549050919050565b6000805460408051600160e31b6227050b028152600160f11b6123ab02600482015290516001600160a01b03928316928516918391630138285891602480820192602092909190829003018186803b15801561060257600080fd5b505afa158015610616573d6000803e3d6000fd5b505050506040513d602081101561062c57600080fd5b50516001600160a01b0316149392505050565b60005460408051600160e31b6227050b028152600160f11b6123ab02600482015290516001600160a01b039092169133918391630138285891602480820192602092909190829003018186803b15801561069857600080fd5b505afa1580156106ac573d6000803e3d6000fd5b505050506040513d60208110156106c257600080fd5b50516001600160a01b0316146107165760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b61072184848461153a565b50505050565b8160006001600160a01b03166002828154811061074057fe5b60009182526020909120600360049092020101546001600160a01b0316146107db576002818154811061076f57fe5b60009182526020909120600490910201600301546001600160a01b031633146107d65760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b61082c565b6107e4336105a7565b61082c5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08105d5d1a1bdc9a5e995902604482015290519081900360640190fd5b61072184848461168d565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561087557600080fd5b505afa158015610889573d6000803e3d6000fd5b505050506040513d602081101561089f57600080fd5b50516001600160a01b031633146109005760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b60035461010090046001600160a01b0316156109575760408051600160e51b62461bcd02815260206004820152600b6024820152600160aa1b6a105b1c9958591e4814d95d02604482015290519081900360640190fd5b50600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b1580156109be57600080fd5b505afa1580156109d2573d6000803e3d6000fd5b505050506040513d60208110156109e857600080fd5b50516001600160a01b03163314610a495760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b6000546001600160a01b031615610aaa5760408051600160e51b62461bcd02815260206004820152601a60248201527f4d6173746572206164647265737320616c726561647920736574000000000000604482015290519081900360640190fd5b600080546001600160a01b03191633179081905560408051600160e31b6227050b028152600160f01b61544302600482015290516001600160a01b03929092169182916301382858916024808301926020929190829003018186803b158015610b1257600080fd5b505afa158015610b26573d6000803e3d6000fd5b505050506040513d6020811015610b3c57600080fd5b5051600180546001600160a01b0319166001600160a01b039092169190911790555050681b1ae4d6e2ef5000006004556213c680600555565b600081610b8457506001610d36565b6002821415610c205760015460408051600160e11b63258770150281526001600160a01b03868116600483015291516000939290921691634b0ee02a91602480820192602092909190829003018186803b158015610be157600080fd5b505afa158015610bf5573d6000803e3d6000fd5b505050506040513d6020811015610c0b57600080fd5b50511115610c1b57506001610d36565b610d32565b6003821415610cec576004546001546005546001600160a01b039091169063179e91f1908690610c56904263ffffffff611ad116565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180600160f11b612229028152506020018281526020019250505060206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d6020811015610cdd57600080fd5b505110610c1b57506001610d36565b600060028381548110610cfb57fe5b600091825260208083206001600160a01b0388168452600160049093020191909101905260409020541115610d3257506001610d36565b5060005b92915050565b600060608260028481548110610d4e57fe5b906000526020600020906004020160020180805480602002602001604051908101604052809291908181526020018280548015610db457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d96575b50505050509050915091505b915091565b806000600160c11b6726a72627a1a5a229026001600160c01b031983161415610df15750600454610dc0565b600160d11b652a2627a1a229026001600160c01b031984161415610dc0576201518060055481610e1d57fe5b049050915091565b6002546040805182815260208084028201019091526060918015610e53578160200160208202803883390190505b50905060005b600254811015610e8b57610e6c8161057f565b828281518110610e7857fe5b6020908102919091010152600101610e59565b5090565b6002545b90565b600254604080518281526020808402820101909152606091908290828015610ec8578160200160208202803883390190505b509050600060015b83811015610f3d57600060028281548110610ee757fe5b600091825260208083206001600160a01b038b168452600160049093020191909101905260409020541115610f355780838381518110610f2357fe5b60209081029190910101526001909101905b600101610ed0565b5060015460408051600160e11b63258770150281526001600160a01b03888116600483015291516000939290921691634b0ee02a91602480820192602092909190829003018186803b158015610f9257600080fd5b505afa158015610fa6573d6000803e3d6000fd5b505050506040513d6020811015610fbc57600080fd5b50511115610fe1576002828281518110610fd257fe5b60209081029190910101526001015b6004546001546005546001600160a01b039091169063179e91f190889061100e904263ffffffff611ad116565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180600160f11b612229028152506020018281526020019250505060206040518083038186803b15801561106b57600080fd5b505afa15801561107f573d6000803e3d6000fd5b505050506040513d602081101561109557600080fd5b5051106110b75760038282815181106110aa57fe5b6020026020010181815250505b509392505050565b60005460408051600160e31b6227050b028152600160f11b6123ab02600482015290516001600160a01b039092169133918391630138285891602480820192602092909190829003018186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d602081101561114257600080fd5b50516001600160a01b0316146111965760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b600160c11b6726a72627a1a5a229026001600160c01b0319841614156111c05760048290556111e8565b600160d11b652a2627a1a229026001600160c01b0319841614156111e8576201518082026005555b505050565b8160006001600160a01b03166002828154811061120657fe5b60009182526020909120600360049092020101546001600160a01b0316146112a1576002818154811061123557fe5b60009182526020909120600490910201600301546001600160a01b0316331461129c5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6112f2565b6112aa336105a7565b6112f25760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08105d5d1a1bdc9a5e995902604482015290519081900360640190fd5b816002848154811061130057fe5b906000526020600020906004020160030160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b600160006001600160a01b03166002828154811061135457fe5b60009182526020909120600360049092020101546001600160a01b0316146113ef576002818154811061138357fe5b60009182526020909120600490910201600301546001600160a01b031633146113ea5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b611440565b6113f8336105a7565b6114405760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08105d5d1a1bdc9a5e995902604482015290519081900360640190fd5b61144e8360015b600161168d565b6111e8826001600061168d565b60035461010090046001600160a01b0316331461147757600080fd5b60035460ff16156114d25760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920636f6e737472756374656400000000000000000000000000604482015290519081900360640190fd5b6114da611b35565b60005b81811015611519576115118383838181106114f457fe5b905060200201356001600160a01b03166001600381111561144757fe5b6001016114dd565b50506003805460ff1916600117905550565b6000546001600160a01b031681565b6002805490507fe2981862bbf692aa30ba39d4eca9c69e5dcebf3eae5fb93332940c23c1c4c3c584846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156115a657818101518382015260200161158e565b50505050905090810190601f1680156115d35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a260408051606081018252600081528151600180825281840190935260029260208301919081602001602082028038833950505081526001600160a01b0384166020918201528254600181018085556000948552938290208351600490920201908155828201518051919261165d92600285019290910190611ca5565b5060409190910151600390910180546001600160a01b0319166001600160a01b0390921691909117905550505050565b6002821415801561169f575060038214155b6116dd57604051600160e51b62461bcd028152600401808060200182810382526031815260200180611daa6031913960400191505060405180910390fd5b801561185e57600282815481106116f057fe5b600091825260208083206001600160a01b0387168452600160049093020191909101905260409020541561176e5760408051600160e51b62461bcd02815260206004820152600e60248201527f616c726561647920616374697665000000000000000000000000000000000000604482015290519081900360640190fd5b6117976002838154811061177e57fe5b9060005260206000209060040201600001546001611ad1565b600283815481106117a457fe5b600091825260209091206004909102015560028054839081106117c357fe5b906000526020600020906004020160020180549050600283815481106117e557fe5b600091825260208083206001600160a01b038816845260016004909302019190910190526040902055600280548390811061181c57fe5b60009182526020808320600492909202909101600201805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790556111e8565b60006002838154811061186d57fe5b600091825260208083206001600160a01b038816845260016004909302019190910190526040902054116118db5760408051600160e51b62461bcd02815260206004820152600a6024820152600160b01b696e6f742061637469766502604482015290519081900360640190fd5b6000600283815481106118ea57fe5b90600052602060002090600402016001016000856001600160a01b03166001600160a01b0316815260200190815260200160002054905060006002848154811061193057fe5b90600052602060002090600402016002016002858154811061194e57fe5b9060005260206000209060040201600001548154811061196a57fe5b600091825260209091200154600280546001600160a01b03909216925083918690811061199357fe5b600091825260208083206001600160a01b038616845260016004909302019190910190526040902055600280546119e89190869081106119cf57fe5b9060005260206000209060040201600001546001611c45565b600285815481106119f557fe5b9060005260206000209060040201600001819055508060028581548110611a1857fe5b90600052602060002090600402016002018381548110611a3457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060028481548110611a6f57fe5b9060005260206000209060040201600201805480919060019003611a939190611d06565b5060028481548110611aa157fe5b600091825260208083206001600160a01b0389168452600160049093020191909101905260408120555050505050565b600082820183811015611b2e5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b611b76600160b21b69155b985cdcda59db9959026040518060400160405280600a8152602001600160b21b69155b985cdcda59db995902815250600061153a565b611bbb7f41647669736f727920426f61726400000000000000000000000000000000000060405180610100016040528060d18152602001611ddb60d19139600061153a565b611bff7f546f6b656e20486f6c64657200000000000000000000000000000000000000006040518060c0016040528060948152602001611eac60949139600061153a565b611c437f446973707574655265736f6c7574696f6e000000000000000000000000000000604051806080016040528060418152602001611d6960419139600061153a565b565b600082821115611c9f5760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b828054828255906000526020600020908101928215611cfa579160200282015b82811115611cfa57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cc5565b50610e8b929150611d2a565b8154818355818111156111e8576000838152602090206111e8918101908301611d4e565b610e9391905b80821115610e8b5780546001600160a01b0319168155600101611d30565b610e9391905b80821115610e8b5760008155600101611d5456fe526570726573656e7473206d656d626572732077686f206172652061737369676e656420746f20766f7465206f6e207265736f6c76696e672064697370757465734d656d6265727368697020746f207468697320726f6c65206973206465746563746564206175746f6d61746963616c6c7953656c656374656420666577206d656d6265727320746861742061726520646565706c7920656e747275737465642062792074686520644170702e20416e20696465616c2061647669736f727920626f6172642073686f756c642062652061206d6978206f6620736b696c6c73206f6620646f6d61696e2c20676f7665726e616e63652c2072657365617263682c20746563686e6f6c6f67792c20636f6e73756c74696e672065746320746f20696d70726f76652074686520706572666f726d616e6365206f662074686520644170702e526570726573656e747320616c6c2075736572732077686f20686f6c64206441707020746f6b656e732e205468697320697320746865206d6f73742067656e6572616c2063617465676f727920616e6420616e796f6e6520686f6c64696e6720746f6b656e2062616c616e636520697320612070617274206f6620746869732063617465676f72792062792064656661756c742ea165627a7a72305820c29d9f4776775a349ed0e866fd284b245101a96a5a51919a9c5133d78f2ad7740029

Deployed Bytecode Sourcemap

21037:12872:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21037:12872:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26748:171;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26748:171:0;;:::i;:::-;;;;-1:-1:-1;;;;;26748:171:0;;;;;;;;;;;;;;26428:211;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26428:211:0;;:::i;:::-;;;;;;;;;;;;;;;;12804:185;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12804:185:0;-1:-1:-1;;;;;12804:185:0;;:::i;:::-;;;;;;;;;;;;;;;;;;24401:254;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24401:254:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;24401:254:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24401:254:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;24401:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;24401:254:0;;-1:-1:-1;;;24401:254:0;;-1:-1:-1;;;;;24401:254:0;;-1:-1:-1;24401:254:0;;-1:-1:-1;24401:254:0:i;:::-;;24921:240;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24921:240:0;;;;;;;;;;;;;;;:::i;23251:363::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23251:363:0;-1:-1:-1;;;;;23251:363:0;;:::i;22487:607::-;;;:::i;29016:824::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29016:824:0;;;;;;;;:::i;26043:218::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26043:218:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26043:218:0;;;;;;;;;;;;;;;;;;28428:322;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28428:322:0;-1:-1:-1;;;;;;28428:322:0;;:::i;:::-;;;;-1:-1:-1;;;;;;28428:322:0;;;;;;;;;;;;;;;;;;;;;29990:349;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29990:349:0;;;;;;;;;;;;;;;;;25213:131;;;:::i;27007:912::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27007:912:0;-1:-1:-1;;;;;27007:912:0;;:::i;28076:344::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;;28076:344:0;;;;;;;;:::i;25591:227::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25591:227:0;;;;;;-1:-1:-1;;;;;25591:227:0;;:::i;22126:293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22126:293:0;;;;;;;;;;:::i;23791:405::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23791:405:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;23791:405:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23791:405:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;23791:405:0;;-1:-1:-1;23791:405:0;-1:-1:-1;23791:405:0;:::i;12359:28::-;;;:::i;26748:171::-;26812:7;26871:14;26886:13;26871:29;;;;;;;;;;;;;;;;;;;;;:40;;;-1:-1:-1;;;;;26871:40:0;;26748:171;-1:-1:-1;;26748:171:0:o;26428:211::-;26524:7;26588:14;26603:13;26588:29;;;;;;;;;;;;;;;;;;:43;;;26581:50;;26428:211;;;:::o;12804:185::-;12872:4;12910:13;;12943:25;;;-1:-1:-1;;;;;12943:25:0;;-1:-1:-1;;;;;12943:25:0;;;;;;-1:-1:-1;;;;;12910:13:0;;;;12943:37;;;12910:13;;12943:19;;:25;;;;;;;;;;;;;;;12910:13;12943:25;;;5:2:-1;;;;30:1;27;20:12;5:2;12943:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12943:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12943:25:0;-1:-1:-1;;;;;12943:37:0;;;12804:185;-1:-1:-1;;;12804:185:0:o;24401:254::-;12605:10;12626:13;12659:25;;;-1:-1:-1;;;;;12659:25:0;;-1:-1:-1;;;;;12659:25:0;;;;;;-1:-1:-1;;;;;12626:13:0;;;;12688:10;;12626:13;;12659:19;;:25;;;;;;;;;;;;;;;12626:13;12659:25;;;5:2:-1;;;;30:1;27;20:12;5:2;12659:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12659:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12659:25:0;-1:-1:-1;;;;;12659:39:0;;12651:66;;;;;-1:-1:-1;;;;;12651:66:0;;;;;;;;;;;;-1:-1:-1;;;;;12651:66:0;;;;;;;;;;;;;;;24597:50;24606:9;24617:16;24635:11;24597:8;:50::i;:::-;24401:254;;;;:::o;24921:240::-;25088:7;21694:1;-1:-1:-1;;;;;21642:54:0;:14;21657:13;21642:29;;;;;;;;;;;;;;;;:40;:29;;;;;:40;;-1:-1:-1;;;;;21642:40:0;:54;21638:278;;21751:14;21766:13;21751:29;;;;;;;;;;;;;;;;;;;;;:40;;;-1:-1:-1;;;;;21751:40:0;21737:10;:54;21711:130;;;;;-1:-1:-1;;;;;21711:130:0;;;;;;;;;;;;-1:-1:-1;;;;;21711:130:0;;;;;;;;;;;;;;;21638:278;;;21865:32;21886:10;21865:20;:32::i;:::-;21857:59;;;;;-1:-1:-1;;;;;21857:59:0;;;;;;;;;;;;-1:-1:-1;;;;;21857:59:0;;;;;;;;;;;;;;;25108:45;25120:14;25136:7;25145;25108:11;:45::i;23251:363::-;23319:30;23415:4;23319:114;;23466:5;-1:-1:-1;;;;;23466:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23466:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23466:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23466:18:0;-1:-1:-1;;;;;23452:32:0;:10;:32;23444:71;;;;;-1:-1:-1;;;;;23444:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23534:9;;;;;-1:-1:-1;;;;;23534:9:0;:23;23526:47;;;;;-1:-1:-1;;;;;23526:47:0;;;;;;;;;;;;-1:-1:-1;;;;;23526:47:0;;;;;;;;;;;;;;;-1:-1:-1;23584:9:0;:22;;-1:-1:-1;;;;;23584:22:0;;;;;-1:-1:-1;;;;;;23584:22:0;;;;;;;;;23251:363::o;22487:607::-;22533:30;22629:4;22533:114;;22680:5;-1:-1:-1;;;;;22680:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22680:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22680:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22680:18:0;-1:-1:-1;;;;;22666:32:0;:10;:32;22658:71;;;;;-1:-1:-1;;;;;22658:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22775:1;22750:13;-1:-1:-1;;;;;22750:13:0;:27;22742:66;;;;;-1:-1:-1;;;;;22742:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22819:13;:26;;-1:-1:-1;;;;;;22819:26:0;22835:10;22819:26;;;;;22963:37;;;-1:-1:-1;;;;;22963:37:0;;-1:-1:-1;;;;;22963:37:0;;;;;;-1:-1:-1;;;;;22889:13:0;;;;;;;22963:31;;:37;;;;;;;;;;;;;;22889:13;22963:37;;;5:2:-1;;;;30:1;27;20:12;5:2;22963:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22963:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22963:37:0;22914:15;:97;;-1:-1:-1;;;;;;22914:97:0;-1:-1:-1;;;;;22914:97:0;;;;;;;;;-1:-1:-1;;23043:9:0;23022:18;:30;23079:7;23063:13;:23;22487:607::o;29016:824::-;29124:4;29182:35;29178:632;;-1:-1:-1;29241:4:0;29234:11;;29178:632;29286:16;29267:7;:36;29263:547;;;29324:15;;:46;;;-1:-1:-1;;;;;29324:46:0;;-1:-1:-1;;;;;29324:46:0;;;;;;;;;29373:1;;29324:15;;;;;:30;;:46;;;;;;;;;;;;;;;:15;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;29324:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29324:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29324:46:0;:50;29320:102;;;-1:-1:-1;29402:4:0;29395:11;;29320:102;29263:547;;;29462:22;29443:7;:42;29439:371;;;29592:18;;29506:15;;29564:13;;-1:-1:-1;;;;;29506:15:0;;;;:34;;29541:14;;29563:24;;29583:3;29563:24;:19;:24;:::i;:::-;29506:82;;;;;;;;;;;;;-1:-1:-1;;;;;29506:82:0;-1:-1:-1;;;;;29506:82:0;;;;;;-1:-1:-1;;;;;29506:82:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29506:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29506:82:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29506:82:0;:104;29502:156;;-1:-1:-1;29638:4:0;29631:11;;29439:371;29733:1;29679:14;29694:7;29679:23;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29679:51:0;;;;:35;:23;;;;;:35;;;;:51;;;;;;:55;29675:135;;;-1:-1:-1;29794:4:0;29787:11;;29675:135;-1:-1:-1;29827:5:0;29016:824;;;;;:::o;26043:218::-;26131:7;26140:28;26194:13;26209:14;26224:13;26209:29;;;;;;;;;;;;;;;;;;:43;;26186:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26186:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26043:218;;;;:::o;28428:322::-;28537:4;28490:14;-1:-1:-1;;;;;;;;;;;28555:18:0;;;28552:190;;;-1:-1:-1;28596:18:0;;28552:190;;;-1:-1:-1;;;;;;;;;;;28636:16:0;;;28632:110;;;28723:6;28706:13;;:24;;;;;;28700:30;;28428:322;;;:::o;29990:349::-;30184:14;:21;30170:36;;;;;;;;;;;;;;;;30076:29;;30170:36;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;30170:36:0;-1:-1:-1;30155:51:0;-1:-1:-1;30222:9:0;30217:115;30241:14;:21;30237:25;;30217:115;;;30302:18;30318:1;30302:15;:18::i;:::-;30284:12;30297:1;30284:15;;;;;;;;;;;;;;;;;:36;30264:3;;30217:115;;;;29990:349;:::o;25213:131::-;25315:14;:21;25213:131;;:::o;27007:912::-;27177:14;:21;27242;;;;;;;;;;;;;;;;27094:16;;27177:21;27094:16;;27177:21;27242;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;27242:21:0;-1:-1:-1;27209:54:0;-1:-1:-1;27274:15:0;27321:1;27304:207;27328:6;27324:1;:10;27304:207;;;27408:1;27360:14;27375:1;27360:17;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27360:45:0;;;;:29;:17;;;;;:29;;;;:45;;;;;;:49;27356:144;;;27455:1;27430:13;27444:7;27430:22;;;;;;;;;;;;;;;;;:26;27475:9;;;;;27356:144;27336:3;;27304:207;;;-1:-1:-1;27525:15:0;;:46;;;-1:-1:-1;;;;;27525:46:0;;-1:-1:-1;;;;;27525:46:0;;;;;;;;;27574:1;;27525:15;;;;;:30;;:46;;;;;;;;;;;;;;;:15;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;27525:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27525:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27525:46:0;:50;27521:157;;;27625:16;27592:13;27606:7;27592:22;;;;;;;;;;;;;;;;;:50;27657:9;;27521:157;27778:18;;27692:15;;27750:13;;-1:-1:-1;;;;;27692:15:0;;;;:34;;27727:14;;27749:24;;27769:3;27749:24;:19;:24;:::i;:::-;27692:82;;;;;;;;;;;;;-1:-1:-1;;;;;27692:82:0;-1:-1:-1;;;;;27692:82:0;;;;;;-1:-1:-1;;;;;27692:82:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27692:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27692:82:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27692:82:0;:104;27688:193;;27846:22;27813:13;27827:7;27813:22;;;;;;;;;;;;;:56;;;;;27688:193;-1:-1:-1;27898:13:0;27007:912;-1:-1:-1;;;27007:912:0:o;28076:344::-;12605:10;12626:13;12659:25;;;-1:-1:-1;;;;;12659:25:0;;-1:-1:-1;;;;;12659:25:0;;;;;;-1:-1:-1;;;;;12626:13:0;;;;12688:10;;12626:13;;12659:19;;:25;;;;;;;;;;;;;;;12626:13;12659:25;;;5:2:-1;;;;30:1;27;20:12;5:2;12659:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12659:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12659:25:0;-1:-1:-1;;;;;12659:39:0;;12651:66;;;;;-1:-1:-1;;;;;12651:66:0;;;;;;;;;;;;-1:-1:-1;;;;;12651:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28173:18:0;;;28170:242;;;28260:18;:24;;;28170:242;;;-1:-1:-1;;;;;;;;;;;28306:16:0;;;28302:110;;;28393:6;28386:14;;28370:13;:30;28302:110;28076:344;;;:::o;25591:227::-;25702:7;21694:1;-1:-1:-1;;;;;21642:54:0;:14;21657:13;21642:29;;;;;;;;;;;;;;;;:40;:29;;;;;:40;;-1:-1:-1;;;;;21642:40:0;:54;21638:278;;21751:14;21766:13;21751:29;;;;;;;;;;;;;;;;;;;;;:40;;;-1:-1:-1;;;;;21751:40:0;21737:10;:54;21711:130;;;;;-1:-1:-1;;;;;21711:130:0;;;;;;;;;;;;-1:-1:-1;;;;;21711:130:0;;;;;;;;;;;;;;;21638:278;;;21865:32;21886:10;21865:20;:32::i;:::-;21857:59;;;;;-1:-1:-1;;;;;21857:59:0;;;;;;;;;;;;-1:-1:-1;;;;;21857:59:0;;;;;;;;;;;;;;;25796:14;25759;25774:7;25759:23;;;;;;;;;;;;;;;;;;:34;;;:51;;;;;-1:-1:-1;;;;;25759:51:0;;;;;-1:-1:-1;;;;;25759:51:0;;;;;;25591:227;;;:::o;22126:293::-;22244:18;21694:1;-1:-1:-1;;;;;21642:54:0;:14;21657:13;21642:29;;;;;;;;;;;;;;;;:40;:29;;;;;:40;;-1:-1:-1;;;;;21642:40:0;:54;21638:278;;21751:14;21766:13;21751:29;;;;;;;;;;;;;;;;;;;;;:40;;;-1:-1:-1;;;;;21751:40:0;21737:10;:54;21711:130;;;;;-1:-1:-1;;;;;21711:130:0;;;;;;;;;;;;-1:-1:-1;;;;;21711:130:0;;;;;;;;;;;;;;;21638:278;;;21865:32;21886:10;21865:20;:32::i;:::-;21857:59;;;;;-1:-1:-1;;;;;21857:59:0;;;;;;;;;;;;-1:-1:-1;;;;;21857:59:0;;;;;;;;;;;;;;;22281:61;22293:13;22316:18;22308:27;22337:4;22281:11;:61::i;:::-;22353:58;22365:9;22384:18;22405:5;22353:11;:58::i;23791:405::-;23907:9;;;;;-1:-1:-1;;;;;23907:9:0;23893:10;:23;23885:32;;;;;;23937:16;;;;23936:17;23928:49;;;;;-1:-1:-1;;;;;23928:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23988:24;:22;:24::i;:::-;24028:9;24023:132;24043:19;;;24023:132;;;24084:59;24096:8;;24105:1;24096:11;;;;;;;;;;;;;-1:-1:-1;;;;;24096:11:0;24117:18;24109:27;;;;;;;24084:59;24064:3;;24023:132;;;-1:-1:-1;;24165:16:0;:23;;-1:-1:-1;;24165:23:0;24184:4;24165:23;;;-1:-1:-1;23791:405:0:o;12359:28::-;;;-1:-1:-1;;;;;12359:28:0;;:::o;32602:326::-;32762:14;:21;;;;32751:62;32785:9;32796:16;32751:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32751:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32858:51;;;;;;;;-1:-1:-1;32858:51:0;;32879:16;;32893:1;32879:16;;;;;;;;;32824:14;;32858:51;;;;32879:16;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;;;32858:51:0;;-1:-1:-1;;;;;32858:51:0;;;;;;;27:10:-1;;39:1;23:18;;45:23;;;-1:-1;32824:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32824:96:0;;;;;;;;;;;;-1:-1:-1;;;;;;32824:96:0;-1:-1:-1;;;;;32824:96:0;;;;;;;;;-1:-1:-1;;;;32602:326:0:o;30557:1840::-;30728:16;30709:7;:36;;:82;;;;-1:-1:-1;30768:22:0;30749:7;:42;;30709:82;30687:181;;;;-1:-1:-1;;;;;30687:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30883:7;30879:1511;;;30933:14;30948:7;30933:23;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30933:51:0;;;;:35;:23;;;;;:35;;;;:51;;;;;;:56;30907:132;;;;;-1:-1:-1;;;;;30907:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31096:103;31127:14;31142:7;31127:23;;;;;;;;;;;;;;;;;;:37;;;31183:1;31096:12;:103::i;:::-;31056:14;31071:7;31056:23;;;;;;;;;;;;;;;;;;;;;:143;31286:14;:23;;31301:7;;31286:23;;;;;;;;;;;;;;;;:55;;:80;;;;31214:14;31229:7;31214:23;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31214:69:0;;;;:53;:23;;;;;:53;;;;:69;;;;;:152;31381:14;:23;;31396:7;;31381:23;;;;;;;;;;;;;;;;;;;;;;:37;;27:10:-1;;39:1;23:18;;45:23;;31381:58:0;;;;;;;;-1:-1:-1;;;;;;31381:58:0;-1:-1:-1;;;;;31381:58:0;;;;;30879:1511;;;31643:1;31589:14;31604:7;31589:23;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31589:51:0;;;;:35;:23;;;;;:35;;;;:51;;;;;;:55;31563:127;;;;;-1:-1:-1;;;;;31563:127:0;;;;;;;;;;;;-1:-1:-1;;;;;31563:127:0;;;;;;;;;;;;;;;31705:20;31728:14;31743:7;31728:23;;;;;;;;;;;;;;;;;;:53;;:69;31782:14;-1:-1:-1;;;;;31728:69:0;-1:-1:-1;;;;;31728:69:0;;;;;;;;;;;;;31705:92;;31812:19;31834:14;31849:7;31834:23;;;;;;;;;;;;;;;;;;:55;;31890:14;31905:7;31890:23;;;;;;;;;;;;;;;;;;:37;;;31834:94;;;;;;;;;;;;;;;;;;31943:14;:23;;-1:-1:-1;;;;;31834:94:0;;;;-1:-1:-1;31994:12:0;;31958:7;;31943:23;;;;;;;;;;;;;;-1:-1:-1;;;;;31943:48:0;;;;:35;:23;;;;;:35;;;;:48;;;;;:63;32092:14;:23;;32061:103;;32092:14;32107:7;;32092:23;;;;;;;;;;;;;;;;:37;;;32148:1;32061:12;:103::i;:::-;32021:14;32036:7;32021:23;;;;;;;;;;;;;;;;;;:37;;:143;;;;32233:11;32179:14;32194:7;32179:23;;;;;;;;;;;;;;;;;;:37;;32217:12;32179:51;;;;;;;;;;;;;;;;:65;;;;;-1:-1:-1;;;;;32179:65:0;;;;;-1:-1:-1;;;;;32179:65:0;;;;;;32259:14;32274:7;32259:23;;;;;;;;;;;;;;;;;;:37;;:46;;;;;;;;;;;;:::i;:::-;;32327:14;32342:7;32327:23;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32327:51:0;;;;:35;:23;;;;;:35;;;;:51;;;;;32320:58;-1:-1:-1;;30557:1840:0;;;:::o;930:181::-;988:7;1020:5;;;1044:6;;;;1036:46;;;;;-1:-1:-1;;;;;1036:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1102:1;930:181;-1:-1:-1;;;930:181:0:o;32995:911::-;33049:48;-1:-1:-1;;;;;33049:48:0;;;;;;;;;;;;;-1:-1:-1;;;;;33049:48:0;;;33094:1;33049:8;:48::i;:::-;33108:324;;;;;;;;;;;;;;;;;;;33419:1;33108:8;:324::i;:::-;33443:261;;;;;;;;;;;;;;;;;;;33691:1;33443:8;:261::i;:::-;33715:183;;;;;;;;;;;;;;;;;;;33885:1;33715:8;:183::i;:::-;32995:911::o;1386:184::-;1444:7;1477:1;1472;:6;;1464:49;;;;;-1:-1:-1;;;;;1464:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1536:5:0;;;1386:184::o;21037:12872::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21037:12872:0;-1:-1:-1;;;;;21037:12872:0;;;;;;;;;;;-1:-1:-1;21037:12872:0;;;;;;;-1:-1:-1;21037:12872:0;;;-1:-1:-1;21037:12872:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;21037:12872:0;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://c29d9f4776775a349ed0e866fd284b245101a96a5a51919a9c5133d78f2ad774

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

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.