Contract 0x8F1155447Ee97b5Ae147a01a5c420B0FDDF0370D

ARCx 
 
Txn Hash
Method
Block
From
To
Value
0xd9816d4e1d95b12ce1729c2a5ffe23055479bd0b31eeb0211af8e53a3072720aExit126922682021-06-23 19:26:56413 days 18 hrs ago0x453695ebaebcb111049f12ea440733ae3f863e14 IN  ARCx: Farm 70 Ether0.‍0029560620
0xe1175748129cc51bb25eb606265b95066035c8311d1c4b2cf8c16157f86574feGet Reward126922662021-06-23 19:26:43413 days 18 hrs ago0x453695ebaebcb111049f12ea440733ae3f863e14 IN  ARCx: Farm 70 Ether0.‍0021939620
0x463242d45b1356e616ffa95813b4c717329b559452ef36079136c20ac5be3416Get Reward126922622021-06-23 19:25:49413 days 18 hrs ago0x453695ebaebcb111049f12ea440733ae3f863e14 IN  ARCx: Farm 70 Ether0.‍006574620
0xf76bdacaf0819d7a1267056536ed87be0e864e9ee5ce8068c8a18c7ca5db5ed5Get Reward126440302021-06-16 6:58:11421 days 7 hrs ago0xb37287e045646fb6a40fc7424cbb48e9feccaa64 IN  ARCx: Farm 70 Ether0.‍0012056811
0x1ed6f105b1f10f259a4cb22695444678203d5234e165732f8212336e95403115Exit126440062021-06-16 6:52:38421 days 7 hrs ago0xb37287e045646fb6a40fc7424cbb48e9feccaa64 IN  ARCx: Farm 70 Ether0.‍0039834111
0x02860bc26543571966428121b720566aca0a28b6a88c4c6bcb4ccf0cf423aaf2Get Reward126313982021-06-14 8:07:10423 days 5 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  ARCx: Farm 70 Ether0.‍0020825519
0xcfb349160bb0326241f098dfe61d7d188caaf9b3fc668ef8b7a549f8af86b897Exit126134642021-06-11 13:18:51426 days 46 mins ago0xcf07aeda16eba7c76f91a589e2c5265b1bf379a8 IN  ARCx: Farm 70 Ether0.‍0025126517
0x795e9a645dc19b1c28fa408a69145fd9b3a5e638989919e54554bfa5c2d4e772Get Reward126134572021-06-11 13:17:36426 days 47 mins ago0xcf07aeda16eba7c76f91a589e2c5265b1bf379a8 IN  ARCx: Farm 70 Ether0.‍0017551616.‍00000005
0xba6fe414869ca5682d51e29fda657b3c8373a4ff9742012f131ff8a3f7bab4a1Get Reward126066372021-06-10 12:00:29427 days 2 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  ARCx: Farm 70 Ether0.‍0012056811
0xdefcb0dd50afa489f45e1a66d361f678d5b72bf82fa47b8abae8dd60aa1bdd32Get Reward126058132021-06-10 8:53:24427 days 5 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  ARCx: Farm 70 Ether0.‍001424913
0xcfcaeafb7972a8a62137d9ef605b6e459149b42325b1ff4b9dd8dab61461e207Get Reward126008452021-06-09 14:28:10427 days 23 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  ARCx: Farm 70 Ether0.‍0020825519
0x33178a8c8741c3f4209b20e9bd0d14bba2b4b9253ac03359ba109cf1aff8cf50Get Reward125946022021-06-08 15:10:26428 days 22 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  ARCx: Farm 70 Ether0.‍0059078753.‍90000005
0x2639384ecd9d2c2bed9160e404d61e0f324737f167ccf92f673dd5322e1cfb8aGet Reward125944672021-06-08 14:38:39428 days 23 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  ARCx: Farm 70 Ether0.‍005480450
0x1ae9c01bb13905007efab1e00dddd6ef1d5dc56a0451e2099eb2b7cc8c9cfe1fGet Reward125865772021-06-07 9:23:09430 days 4 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  ARCx: Farm 70 Ether0.‍0016441215
0x41e3a3c25d88661cc764d06e299a0f2f4cf0896d58c8b3b383f53223f0a67533Exit125840292021-06-06 23:46:32430 days 14 hrs ago0x3d18ef2eff0644bb0e6045f6906da0eb34c3200f IN  ARCx: Farm 70 Ether0.‍0016258311
0xa1925cc0f73ce17bc6d9e993cae54764d440ca1c7a29daf4f09b4fbe0c9ead09Get Reward125840242021-06-06 23:45:21430 days 14 hrs ago0x3d18ef2eff0644bb0e6045f6906da0eb34c3200f IN  ARCx: Farm 70 Ether0.‍0032398311
0x76d61bc0e6b03cc9d6952115901a4eef9af9a0085e38fa885f172ad5b7346d79Exit125516002021-06-01 23:37:05435 days 14 hrs ago0x9b0c19000a8631c1f555bb365bde308384e4f2ff IN  ARCx: Farm 70 Ether0.‍007245621
0x23d154c12fa7ab7ce0b9c7bb623b87451a9bad3e2470df87ce513bc1f60c644cExit125079822021-05-26 5:08:17442 days 8 hrs ago0xc217eeae1e24753888673cfc6fd941051e8fc432 IN  ARCx: Farm 70 Ether0.‍0054687137
0x8b527cc5bc98b4ae34017759b26e14dc05102de9f161b69b174a15e804f60b6bGet Reward125076482021-05-26 3:55:17442 days 10 hrs ago0xc217eeae1e24753888673cfc6fd941051e8fc432 IN  ARCx: Farm 70 Ether0.‍0116648636.‍00000145
0x2a77a964dabfc935e4ac5cee139b153033553619d5b0de1748753afbb915bb64Exit124845512021-05-22 14:12:27445 days 23 hrs ago0xdd4bc51496dc93a0c47008e820e0d80745476f22 IN  ARCx: Farm 70 Ether0.‍0053588241
0xe32845cc91a3ef774d6ed68ae3ffc1c98e462f26771370c69387f8ad37a37413Get Reward124845292021-05-22 14:07:12445 days 23 hrs ago0xdd4bc51496dc93a0c47008e820e0d80745476f22 IN  ARCx: Farm 70 Ether0.‍0125838841
0xf636e8bea876fbe75b6ab240be4dfdcb36edd295340f98913457555ad024fb6aExit124517412021-05-17 11:55:47451 days 2 hrs ago0x53d7a5d2dde61856045090aab99b3f1f444b8851 IN  ARCx: Farm 70 Ether0.‍0201759255
0x8a60d62c0a75d68c765d829183ac305b394a6fdc5e4127d972783a2f236aaf35Get Reward124446182021-05-16 9:19:32452 days 4 hrs ago0xececafb3fea380ed39264a7ac86a3af846375aff IN  ARCx: Farm 70 Ether0.‍0056996152
0x791eb36c1c2ec6ac1dda58c926e7114638fb4acfe52ba8b509656098d9394177Get Reward124412012021-05-15 20:32:27452 days 17 hrs ago0x6f9bb7e454f5b3eb2310343f0e99269dc2bb8a1d IN  ARCx: Farm 70 Ether0.‍0078341468
0x747e70f160fca78154a7701579e749c602f0e410e367427fc5d5c4226f3c53beWithdraw124383552021-05-15 10:08:41453 days 3 hrs ago0xbf18e45aba8c6bb1f3e83659812e37f14478d9d5 IN  ARCx: Farm 70 Ether0.‍0059331577
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Similar Match Source Code
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.

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.