Notice: The OpenEthereum team and core developers are aware of the syncing issues facing the OE client and are working to diagnose and fix. New block data will not be available on Etherscan until a fix is released.

Contract 0x8F1155447Ee97b5Ae147a01a5c420B0FDDF0370D

 
Ad
Ad
Txn Hash Method
Block
From
To
Value
0xada1d51a12ab49f507ea149bb37dd10cf47a6dcb84a18cf43c0c761d542d6da7Exit122432272021-04-15 7:10:176 hrs 2 mins ago0x20eadfcaf91bd98674ff8fc341d148e1731576a4 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.03499177882
0x2f4e28420671b9d43beb3ec695f11bba91636a17b2efcc73f806bfa82dc3d7f3Exit122429412021-04-15 6:07:457 hrs 5 mins ago0x62a32ea089109e7b8f0fe29d839736ddb0c753f6 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.03887215288
0x4abc1c662d77f95d6a0de95bc6a34a6e280ef806d40c7f00de7b81232a336516Stake122423922021-04-15 4:00:459 hrs 12 mins ago0xbf18e45aba8c6bb1f3e83659812e37f14478d9d5 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.0153645870
0xa09efa0fbb8d5eb73a2a7abc364c575e865f736e24f7534df912cf61b27c8dd7Exit122351832021-04-14 1:16:181 day 11 hrs ago0xa9befffe0061866e240cbbed7e2572c48941b2db IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.01668139
0x92d41a4e011db1e64d991990d9c3fb8f1f790f4e6657c2f1ce44b0e883603007Get Reward122351102021-04-14 1:00:521 day 12 hrs ago0x16f037a3ddf53da1b047a926e1833219f0a8e1fc IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.03646625125
0x94efb5797e7764d5673043e3f6f7b08ea7c8a058d44487ca05ec7251490b19bbExit122312422021-04-13 10:41:172 days 2 hrs ago0xa9befffe0061866e240cbbed7e2572c48941b2db IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.0188880390
0xcb62cf251f31737f5d90dd63d62e14272a424d0532ca95041a1ecb44f4433dccExit122312342021-04-13 10:38:542 days 2 hrs ago0xa9befffe0061866e240cbbed7e2572c48941b2db IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.0154890
0xae1618694646935e5f15b11283bbb00f32bbeb595224e21e333e6c06d31b67bcExit122291232021-04-13 2:44:312 days 10 hrs ago0xfe62145b68ae16b59f88c121651a9019f13f3653 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.02946492059772.000001459
0xd6dc2f72c2d566133981d8a22f992e6709a6924060a7496f4b93cbb0300a4f1eGet Reward122289572021-04-13 2:08:362 days 11 hrs ago0x5fbd75846a90e965fefacfe5d80e8e2ba675d841 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.01341698498
0xaa0d2d651ff5b752bc35d76c941ae21f78f8a27726603ca39802cc5449813de6Exit122289532021-04-13 2:06:402 days 11 hrs ago0x5fbd75846a90e965fefacfe5d80e8e2ba675d841 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.03541850783
0x69613d6da1f1734708ebc8561acad3774b832a924d6118b4e62c6335913d5358Get Reward122192022021-04-11 14:36:513 days 22 hrs ago0x1ea6a6085f2ce3e1f982684a28879761343ff4ce IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.01108954819981.000001459
0xfa8c9271b1061265c3f3ee7c9bea067048e8b5aa3cee92306963442ca7b6c997Exit122191852021-04-11 14:33:193 days 22 hrs ago0x1ea6a6085f2ce3e1f982684a28879761343ff4ce IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.03443621773
0x4b5dac819ab389de18efd5bb888dd165826f01f591fec3f9080ac8dac171000bExit122190542021-04-11 14:01:583 days 23 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.01532819264
0x8fbda5d455b481a7351df7504a46dd3553e5b7cd9ce8822a442efb9c91168466Get Reward122189652021-04-11 13:44:233 days 23 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.00904186819966.000001459
0xe16aadf7616b185a65e9749ae3a7b588473b3244a87182ac026ee131c05938ccGet Reward122189242021-04-11 13:34:443 days 23 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.0089048765
0x453bf924d8e11eef8eb5aec95d1f8c7f5442861e0496e778292d528e647f2cc1Exit122159642021-04-11 2:33:044 days 10 hrs ago0xfedf3f726e77a7c5ff0304043f49bb261c47a1e2 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.02956762575
0x9f41d8f98d014d8ffaf473d93c545f7d086eabda0dbacd783cc9135e27aa2b1dExit122138022021-04-10 18:32:434 days 18 hrs ago0x97960149fc611508748de01202974d372a677632 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.02918539130
0xe7e4fc404ce374a00b35f80c6c011a852e54d50cc1779cfe2e4c335bd1befcdaGet Reward122137962021-04-10 18:31:294 days 18 hrs ago0x97960149fc611508748de01202974d372a677632 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.0368076120
0xe2adf2c158400dc7d518df6dfb5b504f7e2c93bed20b59948dd565f43fe77b4fExit122095712021-04-10 2:57:185 days 10 hrs ago0xf2d2a8c4988ff113307e80f53678d157eea6371c IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.0219987582191.851702109
0x9f5b864d4352783c87d0f06324de819afddf1300a9e79111d83e0b0c8d7d3200Get Reward122095592021-04-10 2:54:385 days 10 hrs ago0xf2d2a8c4988ff113307e80f53678d157eea6371c IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.03337243053591.000001459
0xb9ddbf680386378d38619588210ccd38d08c3e09bb39bcc27cb14e42cb836e34Get Reward122085652021-04-09 23:16:175 days 13 hrs ago0x51d679666d6a24653f1fae57a8b1a04f69abab99 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.010966330880.1
0x37eca990a935d8c77290c0b5c6980b1e37e335baa17b08359a9a818da7ea2f58Exit122083492021-04-09 22:30:265 days 14 hrs ago0x51d679666d6a24653f1fae57a8b1a04f69abab99 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.04270038591
0xc55ba73e825340714138fc3a42d61bd6ca2c977757335b141b3306ea215529bfExit122082532021-04-09 22:08:355 days 15 hrs ago0x09dbc4a902199bbe7f7ec29b3714731786f2e878 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.0215552790
0x17123ffc7d10452a943027bf2f752c3dd6a4bcb1eb501e910ca6922339381317Get Reward122082412021-04-09 22:05:465 days 15 hrs ago0x09dbc4a902199bbe7f7ec29b3714731786f2e878 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.030305790
0x40b65f4494663bebb574aaa43606f15cfde7df30fbdaf696813a7dbf00061a99Exit122075802021-04-09 19:33:165 days 17 hrs ago0x1a31c94f97c649bc2a8adbceb54d1f4a075be4b1 IN  0x8f1155447ee97b5ae147a01a5c420b0fddf0370d0 Ether0.02874036120
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xE24D896966e08eF9DE13535b1C301A2a6494d868

Contract Name:
JointCampaign

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

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

pragma solidity 0.5.16;

pragma experimental ABIEncoderV2;

import {Ownable} from "../lib/Ownable.sol";
import {SafeMath} from "../lib/SafeMath.sol";
import {SafeERC20} from "../lib/SafeERC20.sol";
import {Decimal} from "../lib/Decimal.sol";

import {IERC20} from "../token/IERC20.sol";

import {IMozartCoreV2} from "../debt/mozart/IMozartCoreV2.sol";
import {MozartTypes} from "../debt/mozart/MozartTypes.sol";

contract JointCampaign is Ownable {

    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /* ========== Structs ========== */

    struct Staker {
        uint256 positionId;
        uint256 debtSnapshot;
        uint256 balance;
        uint256 arcRewardPerTokenPaid;
        uint256 collabRewardPerTokenPaid;
        uint256 arcRewardsEarned;
        uint256 collabRewardsEarned;
        uint256 arcRewardsReleased;
        uint256 collabRewardsReleased;
    }

    /* ========== Variables ========== */

    bool public isInitialized;

    IERC20 public arcRewardToken;
    IERC20 public collabRewardToken;
    IERC20 public stakingToken;

    IMozartCoreV2 public stateContract;

    address public arcDAO;
    address public arcRewardsDistributor;
    address public collabRewardsDistributor;

    mapping (address => Staker) public stakers;

    uint256 public arcPeriodFinish = 0;
    uint256 public collabPeriodFinish = 0;
    uint256 public rewardsDuration = 0;
    uint256 public arcLastUpdateTime;
    uint256 public collabLastUpdateTime;

    uint256 public arcRewardRate = 0;
    uint256 public collabRewardRate = 0;

    uint256 public arcRewardPerTokenStored;
    uint256 public collabPerTokenStored;

    Decimal.D256 public daoAllocation;
    Decimal.D256 public slasherCut;

    uint8 public stakeToDebtRatio;

    bool public arcTokensClaimable;
    bool public collabTokensClaimable;

    uint256 private _totalSupply;

    /* ========== Events ========== */

    event RewardAdded (uint256 _reward, address _rewardToken);

    event Staked(address indexed _user, uint256 _amount);

    event Withdrawn(address indexed _user, uint256 _amount);

    event RewardPaid(address indexed _user, uint256 _arcReward, uint256 _collabReward);

    event RewardsDurationUpdated(uint256 _newDuration);

    event ERC20Recovered(address _token, uint256 _amount);

    event PositionStaked(address _address, uint256 _positionId);

    event ArcClaimableStatusUpdated(bool _status);

    event CollabClaimableStatusUpdated(bool _status);

    event UserSlashed(address _user, address _slasher, uint256 _arcPenalty, uint256 _collabPenalty);

    event CollabRewardsDistributorUpdated(address _rewardsDistributor);

    event ArcRewardsDistributorUpdated(address _rewardsDistributor);

    event CollabRecovered(uint256 _amount);

    /* ========== Modifiers ========== */

    modifier updateReward(address _account, address _rewardToken) {
        _updateReward(_account, _rewardToken);
        _;
    }

    modifier onlyRewardDistributors() {
        require(
            msg.sender == arcRewardsDistributor || msg.sender == collabRewardsDistributor,
            "Caller is not a reward distributor"
        );
        _;
    }

    modifier onlyCollabDistributor() {
        require(
            msg.sender == collabRewardsDistributor,
            "Caller is not the collab rewards distributor"
        );
        _;
    }

    modifier verifyRewardToken(address _rewardTokenAddress) {
        bool isArcToken = _rewardTokenAddress == address(arcRewardToken);
        bool iscollabToken = _rewardTokenAddress == address(collabRewardToken);

        require (
            isArcToken || iscollabToken,
            "The reward token address does not correspond to one of the rewards tokens."
        );
        _;
    }

    /* ========== Admin Functions ========== */

    function setcollabRewardsDistributor(
        address _rewardsDistributor
    )
        external
        onlyCollabDistributor
    {
        require(
            collabRewardsDistributor != _rewardsDistributor,
            "Cannot set the same rewards distributor"
        );

        collabRewardsDistributor = _rewardsDistributor;
        emit CollabRewardsDistributorUpdated(_rewardsDistributor);
    }

    function setArcRewardsDistributor(
        address _rewardsDistributor
    )
        external
        onlyOwner
    {
        require(
            arcRewardsDistributor != _rewardsDistributor,
            "Cannot set the same rewards distributor"
        );

        arcRewardsDistributor = _rewardsDistributor;
        emit ArcRewardsDistributorUpdated(_rewardsDistributor);
    }

    function setRewardsDuration(
        uint256 _rewardsDuration
    )
        external
        onlyOwner
    {
        uint256 periodFinish = arcPeriodFinish > collabPeriodFinish
            ? arcPeriodFinish
            : collabPeriodFinish;

        require(
            periodFinish == 0 || getCurrentTimestamp() > periodFinish,
            "Prev period must be complete before changing duration for new period"
        );

        rewardsDuration = _rewardsDuration;
        emit RewardsDurationUpdated(rewardsDuration);
    }

    /**
     * @notice Sets the reward amount for the given reward token. There contract must
     *          already have at least as much amount as the given `_reward`
     *
     * @param _reward The amount of the reward
     * @param _rewardToken The address of the reward token
     */
    function notifyRewardAmount(
        uint256 _reward,
        address _rewardToken
    )
        external
        onlyRewardDistributors
        verifyRewardToken(_rewardToken)
        updateReward(address(0), _rewardToken)
    {
        require(
            rewardsDuration > 0,
            "Rewards duration is not set"
        );

        uint256 remaining;
        uint256 leftover;

        if (_rewardToken == address(arcRewardToken)) {
            require(
                msg.sender == arcRewardsDistributor,
                "Only the ARCx rewards distributor can notify the amount of ARCx rewards"
            );

            if (getCurrentTimestamp() >= arcPeriodFinish) {
                arcRewardRate = _reward.div(rewardsDuration);
            } else {
                remaining = arcPeriodFinish.sub(getCurrentTimestamp());
                leftover = remaining.mul(arcRewardRate);
                arcRewardRate = _reward.add(leftover).div(rewardsDuration);

            }

            require(
                arcRewardRate <= arcRewardToken.balanceOf(address(this)).div(rewardsDuration),
                "Provided reward too high for the balance of ARCx token"
            );

            arcPeriodFinish = getCurrentTimestamp().add(rewardsDuration);
            arcLastUpdateTime = getCurrentTimestamp();
        } else {
            require(
                msg.sender == collabRewardsDistributor,
                "Only the collab rewards distributor can notify the amount of collab rewards"
            );

            // collab token
            if (getCurrentTimestamp() >= collabPeriodFinish) {
                collabRewardRate = _reward.div(rewardsDuration);
            } else {
                remaining = collabPeriodFinish.sub(getCurrentTimestamp());
                leftover = remaining.mul(collabRewardRate);
                collabRewardRate = _reward.add(leftover).div(rewardsDuration);

            }

            require(
                collabRewardRate <= collabRewardToken.balanceOf(address(this)).div(rewardsDuration),
                "Provided reward too high for the balance of collab token"
            );

            collabPeriodFinish = getCurrentTimestamp().add(rewardsDuration);
            collabLastUpdateTime = getCurrentTimestamp();
        }

        emit RewardAdded(_reward, _rewardToken);
    }

    /**
     * @notice Allows owner to recover any ERC20 token sent to this contract, except the staking
     *          okens and the reward tokens - with the exception of ARCx surplus that was transfered.
     *
     * @param _tokenAddress the address of the token
     * @param _tokenAmount to amount to recover
     */
    function recoverERC20(
        address _tokenAddress,
        uint256 _tokenAmount
    )
        external
        onlyOwner
    {
        // If _tokenAddress is ARCx, only allow its recovery if the amount is not greater than
        // the current reward
        if (_tokenAddress == address(arcRewardToken) && rewardsDuration > 0) {
            uint256 arcBalance = arcRewardToken.balanceOf(address(this));

            require(
                arcRewardRate <= arcBalance.sub(_tokenAmount).div(rewardsDuration),
                "Only the surplus of the reward can be recovered, not more"
            );
        }

        // Cannot recover the staking token or the collab rewards token
        require(
            _tokenAddress != address(stakingToken) && _tokenAddress != address(collabRewardToken),
            "Cannot withdraw the staking or collab reward tokens"
        );

        IERC20(_tokenAddress).safeTransfer(owner(), _tokenAmount);
        emit ERC20Recovered(_tokenAddress, _tokenAmount);
    }

    /**
     * @notice Lets the collab reward distributor recover a desired amount of collab as long as that
     *          amount is not greater than the reward to recover
     *
     * @param _amount The amount of collab to recover
     */
    function recovercollab(
        uint256 _amount
    )
        external
        onlyCollabDistributor
    {
        if (rewardsDuration > 0) {
            uint256 collabBalance = collabRewardToken.balanceOf(address(this));

            require(
                collabRewardRate <= collabBalance.sub(_amount).div(rewardsDuration),
                "Only the surplus of the reward can be recovered, not more"
            );
        }

        collabRewardToken.safeTransfer(msg.sender, _amount);
        emit CollabRecovered(_amount);
    }

    function setArcTokensClaimable(
        bool _enabled
    )
        external
        onlyOwner
    {
        arcTokensClaimable = _enabled;

        emit ArcClaimableStatusUpdated(_enabled);
    }

    function setCollabTokensClaimable(
        bool _enabled
    )
        external
        onlyOwner
    {
        collabTokensClaimable = _enabled;

        emit CollabClaimableStatusUpdated(_enabled);
    }

    function init(
        address _arcDAO,
        address _arcRewardsDistributor,
        address _collabRewardsDistributor,
        address _arcRewardToken,
        address _collabRewardToken,
        address _stakingToken,
        Decimal.D256 memory _daoAllocation,
        Decimal.D256 memory _slasherCut,
        uint8 _stakeToDebtRatio,
        address _stateContract
    )
        public
        onlyOwner
    {
        require(
            !isInitialized &&
            _arcDAO != address(0) &&
            _arcRewardsDistributor != address(0) &&
            _collabRewardsDistributor != address(0) &&
            _arcRewardToken != address(0) &&
            _collabRewardToken != address(0) &&
            _stakingToken != address(0) &&
            _daoAllocation.value > 0 &&
            _slasherCut.value > 0 &&
            _stakeToDebtRatio > 0 &&
            _stateContract != address(0),
            "One or more values is empty"
        );

        isInitialized = true;

        arcDAO = _arcDAO;
        arcRewardsDistributor = _arcRewardsDistributor;
        collabRewardsDistributor = _collabRewardsDistributor;
        arcRewardToken = IERC20(_arcRewardToken);
        collabRewardToken = IERC20(_collabRewardToken);
        stakingToken = IERC20(_stakingToken);

        daoAllocation = _daoAllocation;
        slasherCut = _slasherCut;
        stakeToDebtRatio = _stakeToDebtRatio;

        stateContract = IMozartCoreV2(_stateContract);
    }

    /* ========== View Functions ========== */

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

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

    function lastTimeRewardApplicable(
        address _rewardToken
    )
        public
        view
        verifyRewardToken(_rewardToken)
        returns (uint256)
    {
        uint256 relevantPeriod = _rewardToken == address(arcRewardToken) ? arcPeriodFinish : collabPeriodFinish;

        return getCurrentTimestamp() < relevantPeriod ? getCurrentTimestamp() : relevantPeriod;
    }

    function arcRewardPerTokenUser()
        external
        view
        returns (uint256)
    {
        if (_totalSupply == 0) {
            return arcRewardPerTokenStored;
        }

        return
            Decimal.mul(
                arcRewardPerTokenStored.add(
                    lastTimeRewardApplicable(address(arcRewardToken))
                        .sub(arcLastUpdateTime)
                        .mul(arcRewardRate)
                        .mul(1e18)
                        .div(_totalSupply)
                ),
                userAllocation()
            );
    }

    function collabRewardPerToken()
        external
        view
        returns (uint256)
    {
        if (_totalSupply == 0) {
            return collabPerTokenStored;
        }

        return collabPerTokenStored.add(
            lastTimeRewardApplicable(address(collabRewardToken))
                .sub(collabLastUpdateTime)
                .mul(collabRewardRate)
                .mul(1e18)
                .div(_totalSupply)
        );
    }

    function _actualEarned(
        address _account,
        address _rewardTokenAddress
    )
        internal
        view
        verifyRewardToken(_rewardTokenAddress)
        returns (uint256)
    {
        uint256 stakerBalance = stakers[_account].balance;

        if (_rewardTokenAddress == address(arcRewardToken)) {
            return
                stakerBalance.mul(
                    _rewardPerToken(address(arcRewardToken))
                    .sub(stakers[_account].arcRewardPerTokenPaid)
                )
                .div(1e18)
                .add(stakers[_account].arcRewardsEarned);
        }

        return
            stakerBalance.mul(
                _rewardPerToken(address(collabRewardToken))
                .sub(stakers[_account].collabRewardPerTokenPaid)
            )
            .div(1e18)
            .add(stakers[_account].collabRewardsEarned);
    }

    function arcEarned(
        address _account
    )
        external
        view
        returns (uint256)
    {
        return Decimal.mul(
            _actualEarned(_account, address(arcRewardToken)),
            userAllocation()
        );
    }

    function collabEarned(
        address _account
    )
        external
        view
        returns (uint256)
    {
        return _actualEarned(_account, address(collabRewardToken));
    }

    function getArcRewardForDuration()
        external
        view
        returns (uint256)
    {
        return arcRewardRate.mul(rewardsDuration);
    }

    function getCollabRewardForDuration()
        external
        view
        returns (uint256)
    {
        return collabRewardRate.mul(rewardsDuration);
    }

    function getCurrentTimestamp()
        public
        view
        returns (uint256)
    {
        return block.timestamp;
    }

    function isMinter(
        address _user,
        uint256 _amount,
        uint256 _positionId
    )
        public
        view
        returns (bool)
    {
        MozartTypes.Position memory position = stateContract.getPosition(_positionId);

        if (position.owner != _user) {
            return false;
        }

        return uint256(position.borrowedAmount.value) >= _amount;
    }

    function  userAllocation()
        public
        view
        returns (Decimal.D256 memory)
    {
        return Decimal.sub(
            Decimal.one(),
            daoAllocation.value
        );
    }

    /* ========== Mutative Functions ========== */

    function stake(
        uint256 _amount,
        uint256 _positionId
    )
        external
        updateReward(msg.sender, address(0))
    {
        uint256 totalBalance = balanceOf(msg.sender).add(_amount);

        // Setting each variable invididually means we don't overwrite
        Staker storage staker = stakers[msg.sender];

        if (staker.positionId != 0) {
            require (
                staker.positionId == _positionId,
                "You cannot stake based on a different debt position"
            );
        }

        require(
            stakeToDebtRatio != 0,
            "The stake to debt ratio cannot be 0"
        );

        uint256 debtRequirement = totalBalance.div(uint256(stakeToDebtRatio));

        require(
            isMinter(
                msg.sender,
                debtRequirement,
                _positionId
            ),
            "Must be a valid minter"
        );

        if (staker.positionId == 0) {
            staker.positionId = _positionId;
        }
        staker.debtSnapshot = debtRequirement;
        staker.balance = staker.balance.add(_amount);

        _totalSupply = _totalSupply.add(_amount);

        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);

        emit Staked(msg.sender, _amount);
    }

    function slash(
        address _user
    )
        external
        updateReward(_user, address(0))
    {
        require(
            _user != msg.sender,
            "You cannot slash yourself"
        );

        uint256 currentTime = getCurrentTimestamp();
        require(
            currentTime < arcPeriodFinish ||
            currentTime < collabPeriodFinish,
            "You cannot slash after the reward period"
        );

        Staker storage userStaker = stakers[_user];

        require(
            isMinter(
                _user,
                userStaker.debtSnapshot,
                userStaker.positionId
            ) == false,
            "You can't slash a user who is a valid minter"
        );

        uint256 arcPenalty = userStaker.arcRewardsEarned.sub(userStaker.arcRewardsReleased);
        uint256 arcBounty = Decimal.mul(arcPenalty, slasherCut);

        uint256 collabPenalty = userStaker.collabRewardsEarned.sub(userStaker.collabRewardsReleased);

        stakers[msg.sender].arcRewardsEarned = stakers[msg.sender].arcRewardsEarned.add(arcBounty);
        stakers[msg.sender].collabRewardsEarned = stakers[msg.sender].collabRewardsEarned.add(collabPenalty);

        stakers[arcRewardsDistributor].arcRewardsEarned = stakers[arcRewardsDistributor].arcRewardsEarned.add(
            arcPenalty.sub(arcBounty)
        );

        userStaker.arcRewardsEarned = userStaker.arcRewardsEarned.sub(arcPenalty);
        userStaker.collabRewardsEarned = userStaker.collabRewardsEarned.sub(collabPenalty);

        emit UserSlashed(
            _user,
            msg.sender,
            arcPenalty,
            collabPenalty
        );
    }

    function getReward(address _user)
        public
        updateReward(_user, address(0))
    {
        Staker storage staker = stakers[_user];
        uint256 arcPayableAmount;
        uint256 collabPayableAmount;

        require(
            collabTokensClaimable || arcTokensClaimable,
            "At least one reward token must be claimable"
        );

        if (collabTokensClaimable) {
            collabPayableAmount = staker.collabRewardsEarned.sub(staker.collabRewardsReleased);
            staker.collabRewardsReleased = staker.collabRewardsReleased.add(collabPayableAmount);

            collabRewardToken.safeTransfer(_user, collabPayableAmount);
        }

        if (arcTokensClaimable) {
            arcPayableAmount = staker.arcRewardsEarned.sub(staker.arcRewardsReleased);
            staker.arcRewardsReleased = staker.arcRewardsReleased.add(arcPayableAmount);

            uint256 daoPayable = Decimal.mul(arcPayableAmount, daoAllocation);
            arcRewardToken.safeTransfer(arcDAO, daoPayable);
            arcRewardToken.safeTransfer(_user, arcPayableAmount.sub(daoPayable));
        }

        emit RewardPaid(_user, arcPayableAmount, collabPayableAmount);
    }

    function withdraw(
        uint256 _amount
    )
        public
        updateReward(msg.sender, address(0))
    {
        require(
            _amount >= 0,
            "Cannot withdraw less than 0"
        );

        _totalSupply = _totalSupply.sub(_amount);

        Staker storage staker = stakers[msg.sender];

        staker.balance = staker.balance.sub(_amount);
        staker.debtSnapshot = staker.balance.div(uint256(stakeToDebtRatio));

        stakingToken.safeTransfer(msg.sender, _amount);

        emit Withdrawn(msg.sender, _amount);
    }

    function exit()
        external
    {
        getReward(msg.sender);
        withdraw(balanceOf(msg.sender));
    }

    /* ========== Private Functions ========== */

    function _updateReward(
        address _account,
        address _rewardToken
    )
        private
    {
        require(
            _rewardToken == address(0) ||
            _rewardToken == address(arcRewardToken) ||
            _rewardToken == address(collabRewardToken),
            "The reward token can either be 0 or a valid reward token"
        );

        // If an individual reward token is updated, only update the relevant variables
        if (_rewardToken == address(0)) {
            arcRewardPerTokenStored = _rewardPerToken(address(arcRewardToken));
            collabPerTokenStored = _rewardPerToken(address(collabRewardToken));

            arcLastUpdateTime = lastTimeRewardApplicable(address(arcRewardToken));
            collabLastUpdateTime = lastTimeRewardApplicable(address(collabRewardToken));

        } else if (_rewardToken == address(arcRewardToken)) {
            arcRewardPerTokenStored = _rewardPerToken(address(arcRewardToken));
            arcLastUpdateTime = lastTimeRewardApplicable(address(arcRewardToken));

        } else {
            collabPerTokenStored = _rewardPerToken(address(collabRewardToken));
            collabLastUpdateTime = lastTimeRewardApplicable(address(collabRewardToken));
        }

        if (_account != address(0)) {
            stakers[_account].arcRewardsEarned = _actualEarned(_account, address(arcRewardToken));
            stakers[_account].arcRewardPerTokenPaid = arcRewardPerTokenStored;

            stakers[_account].collabRewardsEarned = _actualEarned(_account, address(collabRewardToken));
            stakers[_account].collabRewardPerTokenPaid = collabPerTokenStored;
        }
    }

    function _rewardPerToken(
        address _rewardTokenAddress
    )
        private
        view
        verifyRewardToken(_rewardTokenAddress)
        returns (uint256)
    {
        if (_rewardTokenAddress == address(arcRewardToken)) {
            if (_totalSupply == 0) {
                return arcRewardPerTokenStored;
            }

            return arcRewardPerTokenStored.add(
                lastTimeRewardApplicable(address(arcRewardToken))
                    .sub(arcLastUpdateTime)
                    .mul(arcRewardRate)
                    .mul(1e18)
                    .div(_totalSupply)
            );
        } else {
            if (_totalSupply == 0) {
                return collabPerTokenStored;
            }

            return collabPerTokenStored.add(
                lastTimeRewardApplicable(address(collabRewardToken))
                    .sub(collabLastUpdateTime)
                    .mul(collabRewardRate)
                    .mul(1e18)
                    .div(_totalSupply)
            );
        }
    }


}

File 2 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.5.16;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 3 of 10 : SafeMath.sol
pragma solidity ^0.5.16;

library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {

        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
}

File 4 of 10 : SafeERC20.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.5.16;

import {IERC20} from "../token/IERC20.sol";

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library SafeERC20 {
    function safeApprove(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        /* solium-disable-next-line */
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(0x095ea7b3, to, value)
        );

        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "SafeERC20: APPROVE_FAILED"
        );
    }

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        /* solium-disable-next-line */
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );

        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "SafeERC20: TRANSFER_FAILED"
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        /* solium-disable-next-line */
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(
                0x23b872dd,
                from,
                to,
                value
            )
        );

        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "SafeERC20: TRANSFER_FROM_FAILED"
        );
    }
}

File 5 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.5.16;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(
        address recipient,
        uint256 amount
    )
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(
        address owner,
        address spender
    )
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(
        address spender,
        uint256 amount
    )
        external
        returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    )
        external
        returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 value
    );

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

File 6 of 10 : Decimal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;

import {SafeMath} from "../lib/SafeMath.sol";
import {Math} from "./Math.sol";

/**
 * @title Decimal
 *
 * Library that defines a fixed-point number with 18 decimal places.
 */
library Decimal {
    using SafeMath for uint256;

    // ============ Constants ============

    uint256 constant BASE = 10**18;

    // ============ Structs ============

    struct D256 {
        uint256 value;
    }

    // ============ Functions ============

    function one()
        internal
        pure
        returns (D256 memory)
    {
        return D256({ value: BASE });
    }

    function onePlus(
        D256 memory d
    )
        internal
        pure
        returns (D256 memory)
    {
        return D256({ value: d.value.add(BASE) });
    }

    function mul(
        uint256 target,
        D256 memory d
    )
        internal
        pure
        returns (uint256)
    {
        return Math.getPartial(target, d.value, BASE);
    }

    function mul(
        D256 memory d1,
        D256 memory d2
    )
        internal
        pure
        returns (D256 memory)
    {
        return Decimal.D256({ value: Math.getPartial(d1.value, d2.value, BASE) });
    }

    function div(
        uint256 target,
        D256 memory d
    )
        internal
        pure
        returns (uint256)
    {
        return Math.getPartial(target, BASE, d.value);
    }

    function add(
        D256 memory d,
        uint256 amount
    )
        internal
        pure
        returns (D256 memory)
    {
        return D256({ value: d.value.add(amount) });
    }

    function sub(
        D256 memory d,
        uint256 amount
    )
        internal
        pure
        returns (D256 memory)
    {
        return D256({ value: d.value.sub(amount) });
    }

}

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

pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;

import {SafeMath} from "./SafeMath.sol";

/**
 * @title Math
 *
 * Library for non-standard Math functions
 */
library Math {
    using SafeMath for uint256;

    // ============ Library Functions ============

    /*
     * Return target * (numerator / denominator).
     */
    function getPartial(
        uint256 target,
        uint256 numerator,
        uint256 denominator
    )
        internal
        pure
        returns (uint256)
    {
        return target.mul(numerator).div(denominator);
    }

    function to128(
        uint256 number
    )
        internal
        pure
        returns (uint128)
    {
        uint128 result = uint128(number);
        require(
            result == number,
            "Math: Unsafe cast to uint128"
        );
        return result;
    }

    function min(
        uint256 a,
        uint256 b
    )
        internal
        pure
        returns (uint256)
    {
        return a < b ? a : b;
    }

    function max(
        uint256 a,
        uint256 b
    )
        internal
        pure
        returns (uint256)
    {
        return a > b ? a : b;
    }
}

File 8 of 10 : IMozartCoreV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.5.16;
pragma experimental ABIEncoderV2;

import {MozartTypes} from "./MozartTypes.sol";

interface IMozartCoreV2 {
    function getPosition(
        uint256 id
    )
        external
        view
        returns (MozartTypes.Position memory);
}

File 9 of 10 : MozartTypes.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;

import {Amount} from "../../lib/Amount.sol";

library MozartTypes {

    /* ========== Structs ========== */

    struct Position {
        address owner;
        Amount.Principal collateralAmount;
        Amount.Principal borrowedAmount;
    }

}

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

pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;

import {SafeMath} from "../lib/SafeMath.sol";
import {Math} from "../lib/Math.sol";

library Amount {

    using Math for uint256;
    using SafeMath for uint256;

    // ============ Constants ============

    uint256 constant BASE = 10**18;

    // A Principal Amount is an amount that's been adjusted by an index

    struct Principal {
        bool sign; // true if positive
        uint256 value;
    }

    function zero()
        internal
        pure
        returns (Principal memory)
    {
        return Principal({
            sign: false,
            value: 0
        });
    }

    function sub(
        Principal memory a,
        Principal memory b
    )
        internal
        pure
        returns (Principal memory)
    {
        return add(a, negative(b));
    }

    function add(
        Principal memory a,
        Principal memory b
    )
        internal
        pure
        returns (Principal memory)
    {
        Principal memory result;

        if (a.sign == b.sign) {
            result.sign = a.sign;
            result.value = SafeMath.add(a.value, b.value);
        } else {
            if (a.value >= b.value) {
                result.sign = a.sign;
                result.value = SafeMath.sub(a.value, b.value);
            } else {
                result.sign = b.sign;
                result.value = SafeMath.sub(b.value, a.value);
            }
        }
        return result;
    }

    function equals(
        Principal memory a,
        Principal memory b
    )
        internal
        pure
        returns (bool)
    {
        if (a.value == b.value) {
            if (a.value == 0) {
                return true;
            }
            return a.sign == b.sign;
        }
        return false;
    }

    function negative(
        Principal memory a
    )
        internal
        pure
        returns (Principal memory)
    {
        return Principal({
            sign: !a.sign,
            value: a.value
        });
    }

    function calculateAdjusted(
        Principal memory a,
        uint256 index
    )
        internal
        pure
        returns (uint256)
    {
        return Math.getPartial(a.value, index, BASE);
    }

    function calculatePrincipal(
        uint256 value,
        uint256 index,
        bool sign
    )
        internal
        pure
        returns (Principal memory)
    {
        return Principal({
            sign: sign,
            value: Math.getPartial(value, BASE, index)
        });
    }

}

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"ArcClaimableStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"ArcRewardsDistributorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"CollabClaimableStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"CollabRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"CollabRewardsDistributorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ERC20Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_positionId","type":"uint256"}],"name":"PositionStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_reward","type":"uint256"},{"indexed":false,"internalType":"address","name":"_rewardToken","type":"address"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_arcReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_collabReward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"address","name":"_slasher","type":"address"},{"indexed":false,"internalType":"uint256","name":"_arcPenalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_collabPenalty","type":"uint256"}],"name":"UserSlashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":true,"inputs":[],"name":"arcDAO","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"arcEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"arcLastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"arcPeriodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"arcRewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"arcRewardPerTokenUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"arcRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"arcRewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"arcRewardsDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"arcTokensClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"collabEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collabLastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collabPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collabPeriodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collabRewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collabRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collabRewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collabRewardsDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collabTokensClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"daoAllocation","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getArcRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCollabRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_arcDAO","type":"address"},{"internalType":"address","name":"_arcRewardsDistributor","type":"address"},{"internalType":"address","name":"_collabRewardsDistributor","type":"address"},{"internalType":"address","name":"_arcRewardToken","type":"address"},{"internalType":"address","name":"_collabRewardToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"_daoAllocation","type":"tuple"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"_slasherCut","type":"tuple"},{"internalType":"uint8","name":"_stakeToDebtRatio","type":"uint8"},{"internalType":"address","name":"_stateContract","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_positionId","type":"uint256"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_reward","type":"uint256"},{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recovercollab","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"setArcRewardsDistributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setArcTokensClaimable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setCollabTokensClaimable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"setcollabRewardsDistributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"slash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"slasherCut","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_positionId","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakeToDebtRatio","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"debtSnapshot","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"arcRewardPerTokenPaid","type":"uint256"},{"internalType":"uint256","name":"collabRewardPerTokenPaid","type":"uint256"},{"internalType":"uint256","name":"arcRewardsEarned","type":"uint256"},{"internalType":"uint256","name":"collabRewardsEarned","type":"uint256"},{"internalType":"uint256","name":"arcRewardsReleased","type":"uint256"},{"internalType":"uint256","name":"collabRewardsReleased","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stateContract","outputs":[{"internalType":"contract IMozartCoreV2","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"userAllocation","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604081905260006009819055600a819055600b819055600e819055600f81905580546001600160a01b031916339081178255917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a361358b806100686000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c806381c7adf21161019d578063b846bc06116100e9578063db5f30e1116100a2578063f2fde38b1161007c578063f2fde38b146105ba578063f6712e2e146105cd578063f6af38dd146105d5578063fe4caff3146105e85761030c565b8063db5f30e1146105a2578063e7878c33146105aa578063e9fad8ee146105b25761030c565b8063b846bc0614610546578063c00007b01461054e578063c1928ba014610561578063c96be4cb14610574578063cc1a378f14610587578063cd2d79081461059a5761030c565b80639168ae72116101565780639c577dbb116101305780639c577dbb1461050e5780639c833ffa14610516578063b3287aa514610529578063b483cb5c1461053e5761030c565b80639168ae72146104c95780639af71b79146104f15780639b922351146105065761030c565b806381c7adf214610483578063860a09981461048b578063886140be146104935780638980f11f1461049b5780638da5cb5b146104ae5780638ffa7a32146104b65761030c565b806346a0b48f1161025c57806368d53c431161021557806370a08231116101ef57806370a0823114610440578063715018a61461045357806372f702f31461045b5780637b0472f0146104705761030c565b806368d53c43146104105780636c9230db146104235780636d156ef21461042b5761030c565b806346a0b48f146103ca578063541140af146103d25780635bd92439146103e5578063638634ee146103ed57806366f7cd351461040057806367abfefc146104085761030c565b8063265e214d116102c9578063386a9525116102a3578063386a952514610392578063392e53cd1461039a57806344b8ad08146103af578063463e9a00146103b75761030c565b8063265e214d1461036f5780632e1a7d4d1461037757806334960a251461038a5761030c565b8063038c9634146103115780630e3764c11461033a57806318160ddd14610342578063241a09fc1461034a578063258e9bb01461035257806325df1dc51461035a575b600080fd5b61032461031f366004612596565b6105fb565b60405161033191906133b2565b60405180910390f35b61032461062c565b610324610632565b610324610639565b61032461063f565b61036d610368366004612714565b610645565b005b6103246106c8565b61036d61038536600461276e565b6106ce565b61032461079b565b6103246107a1565b6103a26107a7565b60405161033191906131b8565b6103246107b7565b61036d6103c53660046125b4565b610844565b6103246109fb565b6103246103e0366004612596565b610a01565b610324610a1b565b6103246103fb366004612596565b610a21565b610324610ab3565b610324610b1a565b61036d61041e3660046127aa565b610b33565b610324610ed2565b610433610ed6565b6040516103319190613129565b61032461044e366004612596565b610ee5565b61036d610f03565b610463610f77565b60405161033191906131c6565b61036d61047e3660046127da565b610f86565b6104636110ea565b6103a26110f9565b610324611107565b61036d6104a936600461268d565b61110d565b6104336112c0565b61036d6104c4366004612596565b6112cf565b6104dc6104d7366004612596565b611372565b604051610331999897969594939291906133e9565b6104f96113c0565b60405161033191906133a4565b6104336113db565b6103246113ea565b6103a26105243660046126c7565b611403565b6105316114ca565b604051610331919061346f565b6104636114d3565b6104336114e2565b61036d61055c366004612596565b6114f1565b61036d61056f366004612596565b6116bd565b61036d610582366004612596565b611760565b61036d61059536600461276e565b6119b1565b610324611a5a565b610463611a60565b6103a2611a6f565b61036d611a7e565b61036d6105c8366004612596565b611a95565b610324611b40565b61036d6105e3366004612714565b611b46565b61036d6105f636600461276e565b611bb3565b600154600090610626906106199084906001600160a01b0316611cef565b6106216113c0565b611e1a565b92915050565b60095481565b6015545b90565b600d5481565b600e5481565b6000546001600160a01b031633146106785760405162461bcd60e51b815260040161066f90613334565b60405180910390fd5b6014805462ff0000191662010000831515021790556040517f30c218371e1a7a6f866468bad0b43039efd19a3cf2804f4ea9db21ae04693b41906106bd9083906131b8565b60405180910390a150565b600a5481565b3360006106db8282611e33565b6015546106ee908463ffffffff61200916565b6015553360009081526008602052604090206002810154610715908563ffffffff61200916565b60028201819055601454610732919060ff1663ffffffff61203116565b6001820155600354610754906001600160a01b0316338663ffffffff61206616565b336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58560405161078d91906133b2565b60405180910390a250505050565b600f5481565b600b5481565b600054600160a01b900460ff1681565b6000601554600014156107cd5750601154610636565b61083f610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b9063ffffffff61200916565b9063ffffffff61215416565b9063ffffffff61203116565b6011549063ffffffff61218e16565b905090565b6000546001600160a01b0316331461086e5760405162461bcd60e51b815260040161066f90613334565b600054600160a01b900460ff1615801561089057506001600160a01b038a1615155b80156108a457506001600160a01b03891615155b80156108b857506001600160a01b03881615155b80156108cc57506001600160a01b03871615155b80156108e057506001600160a01b03861615155b80156108f457506001600160a01b03851615155b80156109005750835115155b801561090c5750825115155b801561091b575060008260ff16115b801561092f57506001600160a01b03811615155b61094b5760405162461bcd60e51b815260040161066f90613364565b60008054600160a01b60ff60a01b19909116179055600580546001600160a01b03199081166001600160a01b039c8d16179091556006805482169a8c169a909a17909955600780548a16988b1698909817909755600180548916968a1696909617909555600280548816948916949094179093556003805487169288169290921790915551601255516013556014805460ff191660ff909216919091179055600480549092169216919091179055565b600c5481565b6002546000906106269083906001600160a01b0316611cef565b60105481565b60015460025460009183916001600160a01b038084169281168314929116148180610a495750805b610a655760405162461bcd60e51b815260040161066f90613304565b6001546000906001600160a01b03878116911614610a8557600a54610a89565b6009545b905080610a94610ed2565b10610a9f5780610aa7565b610aa7610ed2565b9450505b505050919050565b600060155460001415610ac95750601054610636565b61083f610619610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b6010549063ffffffff61218e16565b600061083f600b54600e5461215490919063ffffffff16565b6006546001600160a01b0316331480610b5657506007546001600160a01b031633145b610b725760405162461bcd60e51b815260040161066f90613224565b60015460025482916001600160a01b0380841691811682149216148180610b965750805b610bb25760405162461bcd60e51b815260040161066f90613304565b600084610bbf8282611e33565b6000600b5411610be15760405162461bcd60e51b815260040161066f90613354565b60015460009081906001600160a01b0389811691161415610d75576006546001600160a01b03163314610c265760405162461bcd60e51b815260040161066f90613344565b600954610c31610ed2565b10610c5257600b54610c4a908a9063ffffffff61203116565b600e55610ca1565b610c6c610c5d610ed2565b6009549063ffffffff61200916565b9150610c83600e548361215490919063ffffffff16565b600b54909150610c9d906108248b8463ffffffff61218e16565b600e555b600b546001546040516370a0823160e01b8152610d2792916001600160a01b0316906370a0823190610cd7903090600401613129565b60206040518083038186803b158015610cef57600080fd5b505afa158015610d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610824919081019061278c565b600e541115610d485760405162461bcd60e51b815260040161066f90613374565b610d62600b54610d56610ed2565b9063ffffffff61218e16565b600955610d6d610ed2565b600c55610e8e565b6007546001600160a01b03163314610d9f5760405162461bcd60e51b815260040161066f90613244565b600a54610daa610ed2565b10610dcb57600b54610dc3908a9063ffffffff61203116565b600f55610e1a565b610de5610dd6610ed2565b600a549063ffffffff61200916565b9150610dfc600f548361215490919063ffffffff16565b600b54909150610e16906108248b8463ffffffff61218e16565b600f555b600b546002546040516370a0823160e01b8152610e5092916001600160a01b0316906370a0823190610cd7903090600401613129565b600f541115610e715760405162461bcd60e51b815260040161066f90613314565b610e7f600b54610d56610ed2565b600a55610e8a610ed2565b600d555b7ffb5edb6eb340a01f6a67189edc978df97841c43752c212fc85995ea2300176358989604051610ebf9291906133c0565b60405180910390a1505050505050505050565b4290565b6005546001600160a01b031681565b6001600160a01b031660009081526008602052604090206002015490565b6000546001600160a01b03163314610f2d5760405162461bcd60e51b815260040161066f90613334565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6003546001600160a01b031681565b336000610f938282611e33565b6000610fa285610d5633610ee5565b33600090815260086020526040902080549192509015610fdc5780548514610fdc5760405162461bcd60e51b815260040161066f90613254565b60145460ff16610ffe5760405162461bcd60e51b815260040161066f90613234565b60145460009061101890849060ff1663ffffffff61203116565b9050611025338288611403565b6110415760405162461bcd60e51b815260040161066f906131d4565b815461104b578582555b600182018190556002820154611067908863ffffffff61218e16565b600283015560155461107f908863ffffffff61218e16565b6015556003546110a0906001600160a01b031633308a63ffffffff6121b316565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516110d991906133b2565b60405180910390a250505050505050565b6002546001600160a01b031681565b601454610100900460ff1681565b60125481565b6000546001600160a01b031633146111375760405162461bcd60e51b815260040161066f90613334565b6001546001600160a01b03838116911614801561115657506000600b54115b15611219576001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061118c903090600401613129565b60206040518083038186803b1580156111a457600080fd5b505afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111dc919081019061278c565b600b549091506111f690610824838563ffffffff61200916565b600e5411156112175760405162461bcd60e51b815260040161066f90613394565b505b6003546001600160a01b0383811691161480159061124557506002546001600160a01b03838116911614155b6112615760405162461bcd60e51b815260040161066f90613294565b61128361126c6112c0565b6001600160a01b038416908363ffffffff61206616565b7f505b28e6941631badc363841ecbf8e1214b9379c643936458e87be718e15799982826040516112b492919061319d565b60405180910390a15050565b6000546001600160a01b031690565b6007546001600160a01b031633146112f95760405162461bcd60e51b815260040161066f906132f4565b6007546001600160a01b03828116911614156113275760405162461bcd60e51b815260040161066f906132d4565b600780546001600160a01b0319166001600160a01b0383161790556040517fa5980cc016ca7b243fcd49a5a2110c5c2cee36a5acf75bb343de641bf79d1994906106bd908390613129565b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154905089565b6113c8612415565b61083f6113d36122a4565b6012546122c6565b6006546001600160a01b031681565b600061083f600b54600f5461215490919063ffffffff16565b600061140d612428565b6004805460405163eb02c30160e01b81526001600160a01b039091169163eb02c3019161143c918791016133b2565b60a06040518083038186803b15801561145457600080fd5b505afa158015611468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061148c9190810190612750565b9050846001600160a01b031681600001516001600160a01b0316146114b55760009150506114c3565b604001516020015183111590505b9392505050565b60145460ff1681565b6001546001600160a01b031681565b6007546001600160a01b031681565b8060006114fe8282611e33565b6001600160a01b0383166000908152600860205260408120601454909190819062010000900460ff16806115395750601454610100900460ff165b6115555760405162461bcd60e51b815260040161066f90613384565b60145462010000900460ff16156115b9576008830154600684015461157f9163ffffffff61200916565b6008840154909150611597908263ffffffff61218e16565b60088401556002546115b9906001600160a01b0316878363ffffffff61206616565b601454610100900460ff161561167257600783015460058401546115e29163ffffffff61200916565b60078401549092506115fa908363ffffffff61218e16565b60078401556040805160208101909152601254815260009061161d908490611e1a565b600554600154919250611643916001600160a01b0390811691168363ffffffff61206616565b61167087611657858463ffffffff61200916565b6001546001600160a01b0316919063ffffffff61206616565b505b856001600160a01b03167fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f5183836040516116ad9291906133db565b60405180910390a2505050505050565b6000546001600160a01b031633146116e75760405162461bcd60e51b815260040161066f90613334565b6006546001600160a01b03828116911614156117155760405162461bcd60e51b815260040161066f906132d4565b600680546001600160a01b0319166001600160a01b0383161790556040517f824e31e09d4608742fcb7f21dce6d7cee255bd3de48a2a1490d9bcad42092847906106bd908390613129565b80600061176d8282611e33565b6001600160a01b0383163314156117965760405162461bcd60e51b815260040161066f906132b4565b60006117a0610ed2565b90506009548110806117b35750600a5481105b6117cf5760405162461bcd60e51b815260040161066f906131e4565b6001600160a01b0384166000908152600860205260409020600181015481546117f9918791611403565b156118165760405162461bcd60e51b815260040161066f906132a4565b60006118338260070154836005015461200990919063ffffffff16565b60408051602081019091526013548152909150600090611854908390611e1a565b905060006118738460080154856006015461200990919063ffffffff16565b33600090815260086020526040902060050154909150611899908363ffffffff61218e16565b3360009081526008602052604090206005810191909155600601546118c4908263ffffffff61218e16565b336000908152600860205260409020600601556119146118ea848463ffffffff61200916565b6006546001600160a01b03166000908152600860205260409020600501549063ffffffff61218e16565b6006546001600160a01b0316600090815260086020526040902060059081019190915584015461194a908463ffffffff61200916565b60058501556006840154611964908263ffffffff61200916565b60068501556040517f44d3b6c4ee455b8799ef3f69bac5716b9226683bfd39f54e01fb9baf80bfa7f59061199f908a90339087908690613137565b60405180910390a15050505050505050565b6000546001600160a01b031633146119db5760405162461bcd60e51b815260040161066f90613334565b6000600a54600954116119f057600a546119f4565b6009545b9050801580611a09575080611a07610ed2565b115b611a255760405162461bcd60e51b815260040161066f906132c4565b600b8290556040517ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d3906112b49084906133b2565b60135481565b6004546001600160a01b031681565b60145462010000900460ff1681565b611a87336114f1565b611a9361038533610ee5565b565b6000546001600160a01b03163314611abf5760405162461bcd60e51b815260040161066f90613334565b6001600160a01b038116611ae55760405162461bcd60e51b815260040161066f90613204565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b6000546001600160a01b03163314611b705760405162461bcd60e51b815260040161066f90613334565b6014805461ff001916610100831515021790556040517f9e9c6629f80449dcfd37495f5298443a9429e9cd4380acdbe7bf0a4a372808f5906106bd9083906131b8565b6007546001600160a01b03163314611bdd5760405162461bcd60e51b815260040161066f906132f4565b600b5415611ca3576002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611c16903090600401613129565b60206040518083038186803b158015611c2e57600080fd5b505afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c66919081019061278c565b600b54909150611c8090610824838563ffffffff61200916565b600f541115611ca15760405162461bcd60e51b815260040161066f90613394565b505b600254611cc0906001600160a01b0316338363ffffffff61206616565b7fabd364c2d6134187b55f0d7302022dc5db2cb14cd6f6f2e33752d641e09a108c816040516106bd91906133b2565b60015460025460009183916001600160a01b038084169281168314929116148180611d175750805b611d335760405162461bcd60e51b815260040161066f90613304565b6001600160a01b03808716600090815260086020526040902060020154600154909187811691161415611dc1576001600160a01b0380881660009081526008602052604090206005810154600390910154600154611db993610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b869063ffffffff61215416565b945050611e11565b6001600160a01b0380881660009081526008602052604090206006810154600490910154600254611e0d93610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b9450505b50505092915050565b60006114c3838360000151670de0b6b3a76400006123f7565b6001600160a01b0381161580611e5657506001546001600160a01b038281169116145b80611e6e57506002546001600160a01b038281169116145b611e8a5760405162461bcd60e51b815260040161066f90613264565b6001600160a01b038116611efd57600154611ead906001600160a01b03166122f6565b601055600254611ec5906001600160a01b03166122f6565b601155600154611edd906001600160a01b0316610a21565b600c55600254611ef5906001600160a01b0316610a21565b600d55611f79565b6001546001600160a01b0382811691161415611f4857600154611f28906001600160a01b03166122f6565b601055600154611f40906001600160a01b0316610a21565b600c55611f79565b600254611f5d906001600160a01b03166122f6565b601155600254611f75906001600160a01b0316610a21565b600d555b6001600160a01b0382161561200557600154611f9f9083906001600160a01b0316611cef565b6001600160a01b0380841660009081526008602052604090206005810192909255601054600390920191909155600254611fdb91849116611cef565b6001600160a01b038316600090815260086020526040902060068101919091556011546004909101555b5050565b60008282111561202b5760405162461bcd60e51b815260040161066f90613274565b50900390565b60008082116120525760405162461bcd60e51b815260040161066f90613284565b600082848161205d57fe5b04949350505050565b60006060846001600160a01b031663a9059cbb858560405160240161208c92919061319d565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516120c5919061311d565b6000604051808303816000865af19150503d8060008114612102576040519150601f19603f3d011682016040523d82523d6000602084013e612107565b606091505b50915091508180156121315750805115806121315750808060200190516121319190810190612732565b61214d5760405162461bcd60e51b815260040161066f906131f4565b5050505050565b60008261216357506000610626565b8282028284828161217057fe5b04146114c35760405162461bcd60e51b815260040161066f90613324565b6000828201838110156114c35760405162461bcd60e51b815260040161066f90613214565b60006060856001600160a01b03166323b872dd8686866040516024016121db93929190613175565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612214919061311d565b6000604051808303816000865af19150503d8060008114612251576040519150601f19603f3d011682016040523d82523d6000602084013e612256565b606091505b50915091508180156122805750805115806122805750808060200190516122809190810190612732565b61229c5760405162461bcd60e51b815260040161066f906132e4565b505050505050565b6122ac612415565b506040805160208101909152670de0b6b3a7640000815290565b6122ce612415565b6040805160208101909152835181906122ed908563ffffffff61200916565b90529392505050565b60015460025460009183916001600160a01b03808416928116831492911614818061231e5750805b61233a5760405162461bcd60e51b815260040161066f90613304565b6001546001600160a01b03868116911614156123a757601554612361576010549350610aab565b6123a0610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b9350610aab565b6015546123b8576011549350610aab565b6123a0610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b600061240d82610824868663ffffffff61215416565b949350505050565b6040518060200160405280600081525090565b604051806060016040528060006001600160a01b0316815260200161244b61245d565b815260200161245861245d565b905290565b604080518082019091526000808252602082015290565b803561062681613516565b805161062681613516565b80356106268161352d565b80516106268161352d565b6000602082840312156124b257600080fd5b6124bc602061347d565b905060006124ca8484612575565b82525092915050565b600060a082840312156124e557600080fd5b6124ef606061347d565b905060006124fd848461247f565b825250602061250e8484830161252e565b60208301525060606125228482850161252e565b60408301525092915050565b60006040828403121561254057600080fd5b61254a604061347d565b905060006125588484612495565b825250602061256984848301612580565b60208301525092915050565b803561062681613536565b805161062681613536565b80356106268161353f565b6000602082840312156125a857600080fd5b600061240d8484612474565b6000806000806000806000806000806101408b8d0312156125d457600080fd5b60006125e08d8d612474565b9a505060206125f18d828e01612474565b99505060406126028d828e01612474565b98505060606126138d828e01612474565b97505060806126248d828e01612474565b96505060a06126358d828e01612474565b95505060c06126468d828e016124a0565b94505060e06126578d828e016124a0565b9350506101006126698d828e0161258b565b92505061012061267b8d828e01612474565b9150509295989b9194979a5092959850565b600080604083850312156126a057600080fd5b60006126ac8585612474565b92505060206126bd85828601612575565b9150509250929050565b6000806000606084860312156126dc57600080fd5b60006126e88686612474565b93505060206126f986828701612575565b925050604061270a86828701612575565b9150509250925092565b60006020828403121561272657600080fd5b600061240d848461248a565b60006020828403121561274457600080fd5b600061240d8484612495565b600060a0828403121561276257600080fd5b600061240d84846124d3565b60006020828403121561278057600080fd5b600061240d8484612575565b60006020828403121561279e57600080fd5b600061240d8484612580565b600080604083850312156127bd57600080fd5b60006127c98585612575565b92505060206126bd85828601612474565b600080604083850312156127ed57600080fd5b60006126ac8585612575565b612802816134d8565b82525050565b612802816134b6565b612802816134c1565b6000612825826134a4565b61282f81856134a8565b935061283f8185602086016134ea565b9290920192915050565b612802816134df565b600061285f6016836134ad565b7526bab9ba1031329030903b30b634b21036b4b73a32b960511b815260200192915050565b60006128916028836134ad565b7f596f752063616e6e6f7420736c6173682061667465722074686520726577617281526719081c195c9a5bd960c21b602082015260400192915050565b60006128db601a836134ad565b7f5361666545524332303a205452414e534645525f4641494c4544000000000000815260200192915050565b60006129146026836134ad565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061295c601b836134ad565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006129956022836134ad565b7f43616c6c6572206973206e6f742061207265776172642064697374726962757481526137b960f11b602082015260400192915050565b60006129d96023836134ad565b7f546865207374616b6520746f206465627420726174696f2063616e6e6f74206281526206520360ec1b602082015260400192915050565b6000612a1e604b836134ad565b7f4f6e6c792074686520636f6c6c6162207265776172647320646973747269627581527f746f722063616e206e6f746966792074686520616d6f756e74206f6620636f6c60208201526a6c6162207265776172647360a81b604082015260600192915050565b6000612a916033836134ad565b7f596f752063616e6e6f74207374616b65206261736564206f6e2061206469666681527232b932b73a103232b13a103837b9b4ba34b7b760691b602082015260400192915050565b6000612ae66038836134ad565b7f5468652072657761726420746f6b656e2063616e20656974686572206265203081527f206f7220612076616c69642072657761726420746f6b656e0000000000000000602082015260400192915050565b6000612b45601e836134ad565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b6000612b7e601a836134ad565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000815260200192915050565b6000612bb76033836134ad565b7f43616e6e6f7420776974686472617720746865207374616b696e67206f7220638152726f6c6c61622072657761726420746f6b656e7360681b602082015260400192915050565b6000612c0c602c836134ad565b7f596f752063616e277420736c617368206120757365722077686f20697320612081526b3b30b634b21036b4b73a32b960a11b602082015260400192915050565b6000612c5a6019836134ad565b7f596f752063616e6e6f7420736c61736820796f757273656c6600000000000000815260200192915050565b6000612c936044836134ad565b7f5072657620706572696f64206d75737420626520636f6d706c6574652062656681527f6f7265206368616e67696e67206475726174696f6e20666f72206e65772070656020820152631c9a5bd960e21b604082015260600192915050565b6000612cff6027836134ad565b7f43616e6e6f7420736574207468652073616d65207265776172647320646973748152663934b13aba37b960c91b602082015260400192915050565b6000612d48601f836134ad565b7f5361666545524332303a205452414e534645525f46524f4d5f4641494c454400815260200192915050565b6000612d81602c836134ad565b7f43616c6c6572206973206e6f742074686520636f6c6c6162207265776172647381526b103234b9ba3934b13aba37b960a11b602082015260400192915050565b6000612dcf604a836134ad565b7f5468652072657761726420746f6b656e206164647265737320646f6573206e6f81527f7420636f72726573706f6e6420746f206f6e65206f66207468652072657761726020820152693239903a37b5b2b7399760b11b604082015260600192915050565b6000612e416038836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f722074686581527f2062616c616e6365206f6620636f6c6c616220746f6b656e0000000000000000602082015260400192915050565b6000612ea06021836134ad565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612ee36020836134ad565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612f1c6047836134ad565b7f4f6e6c792074686520415243782072657761726473206469737472696275746f81527f722063616e206e6f746966792074686520616d6f756e74206f662041524378206020820152667265776172647360c81b604082015260600192915050565b6000612f8b601b836134ad565b7f52657761726473206475726174696f6e206973206e6f74207365740000000000815260200192915050565b6000612fc4601b836134ad565b7f4f6e65206f72206d6f72652076616c75657320697320656d7074790000000000815260200192915050565b6000612ffd6036836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f7220746865815275103130b630b731b29037b31020a921bc103a37b5b2b760511b602082015260400192915050565b6000613055602b836134ad565b7f4174206c65617374206f6e652072657761726420746f6b656e206d757374206281526a6520636c61696d61626c6560a81b602082015260400192915050565b60006130a26039836134ad565b7f4f6e6c792074686520737572706c7573206f662074686520726577617264206381527f616e206265207265636f76657265642c206e6f74206d6f726500000000000000602082015260400192915050565b80516020830190613105848261310b565b50505050565b61280281610636565b612802816134d2565b60006114c3828461281a565b602081016106268284612808565b608081016131458287612808565b61315260208301866127f9565b61315f604083018561310b565b61316c606083018461310b565b95945050505050565b606081016131838286612808565b6131906020830185612808565b61240d604083018461310b565b604081016131ab8285612808565b6114c3602083018461310b565b602081016106268284612811565b602081016106268284612849565b6020808252810161062681612852565b6020808252810161062681612884565b60208082528101610626816128ce565b6020808252810161062681612907565b602080825281016106268161294f565b6020808252810161062681612988565b60208082528101610626816129cc565b6020808252810161062681612a11565b6020808252810161062681612a84565b6020808252810161062681612ad9565b6020808252810161062681612b38565b6020808252810161062681612b71565b6020808252810161062681612baa565b6020808252810161062681612bff565b6020808252810161062681612c4d565b6020808252810161062681612c86565b6020808252810161062681612cf2565b6020808252810161062681612d3b565b6020808252810161062681612d74565b6020808252810161062681612dc2565b6020808252810161062681612e34565b6020808252810161062681612e93565b6020808252810161062681612ed6565b6020808252810161062681612f0f565b6020808252810161062681612f7e565b6020808252810161062681612fb7565b6020808252810161062681612ff0565b6020808252810161062681613048565b6020808252810161062681613095565b6020810161062682846130f4565b60208101610626828461310b565b604081016133ce828561310b565b6114c36020830184612808565b604081016131ab828561310b565b61012081016133f8828c61310b565b613405602083018b61310b565b613412604083018a61310b565b61341f606083018961310b565b61342c608083018861310b565b61343960a083018761310b565b61344660c083018661310b565b61345360e083018561310b565b61346161010083018461310b565b9a9950505050505050505050565b602081016106268284613114565b60405181810167ffffffffffffffff8111828210171561349c57600080fd5b604052919050565b5190565b919050565b90815260200190565b6000610626826134c6565b151590565b6001600160a01b031690565b60ff1690565b6000610626825b6000610626826134b6565b60005b838110156135055781810151838201526020016134ed565b838111156131055750506000910152565b61351f816134b6565b811461352a57600080fd5b50565b61351f816134c1565b61351f81610636565b61351f816134d256fea365627a7a723158201638b185845030a9b86bc643871b7594d2bc7db91529f1a2ee9e725f07c8c2a06c6578706572696d656e74616cf564736f6c63430005100040

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.