ETH Price: $3,412.48 (-7.19%)
 
Transaction Hash
Method
Block
From
To
Exit126922682021-06-23 19:26:561294 days ago1624476416IN
ARCx: Farm 7
0 ETH0.0029560620
Get Reward126922662021-06-23 19:26:431294 days ago1624476403IN
ARCx: Farm 7
0 ETH0.0021939620
Get Reward126922622021-06-23 19:25:491294 days ago1624476349IN
ARCx: Farm 7
0 ETH0.006574620
Get Reward126440302021-06-16 6:58:111301 days ago1623826691IN
ARCx: Farm 7
0 ETH0.0012056811
Exit126440062021-06-16 6:52:381301 days ago1623826358IN
ARCx: Farm 7
0 ETH0.0039834111
Get Reward126313982021-06-14 8:07:101303 days ago1623658030IN
ARCx: Farm 7
0 ETH0.0020825519
Exit126134642021-06-11 13:18:511306 days ago1623417531IN
ARCx: Farm 7
0 ETH0.0025126517
Get Reward126134572021-06-11 13:17:361306 days ago1623417456IN
ARCx: Farm 7
0 ETH0.0017551616.00000005
Get Reward126066372021-06-10 12:00:291307 days ago1623326429IN
ARCx: Farm 7
0 ETH0.0012056811
Get Reward126058132021-06-10 8:53:241307 days ago1623315204IN
ARCx: Farm 7
0 ETH0.001424913
Get Reward126008452021-06-09 14:28:101308 days ago1623248890IN
ARCx: Farm 7
0 ETH0.0020825519
Get Reward125946022021-06-08 15:10:261309 days ago1623165026IN
ARCx: Farm 7
0 ETH0.0059078753.90000005
Get Reward125944672021-06-08 14:38:391309 days ago1623163119IN
ARCx: Farm 7
0 ETH0.005480450
Get Reward125865772021-06-07 9:23:091310 days ago1623057789IN
ARCx: Farm 7
0 ETH0.0016441215
Exit125840292021-06-06 23:46:321311 days ago1623023192IN
ARCx: Farm 7
0 ETH0.0016258311
Get Reward125840242021-06-06 23:45:211311 days ago1623023121IN
ARCx: Farm 7
0 ETH0.0032398311
Exit125516002021-06-01 23:37:051316 days ago1622590625IN
ARCx: Farm 7
0 ETH0.007245621
Exit125079822021-05-26 5:08:171322 days ago1622005697IN
ARCx: Farm 7
0 ETH0.0054687137
Get Reward125076482021-05-26 3:55:171322 days ago1622001317IN
ARCx: Farm 7
0 ETH0.0116648636.00000145
Exit124845512021-05-22 14:12:271326 days ago1621692747IN
ARCx: Farm 7
0 ETH0.0053588241
Get Reward124845292021-05-22 14:07:121326 days ago1621692432IN
ARCx: Farm 7
0 ETH0.0125838841
Exit124517412021-05-17 11:55:471331 days ago1621252547IN
ARCx: Farm 7
0 ETH0.0201759255
Get Reward124446182021-05-16 9:19:321332 days ago1621156772IN
ARCx: Farm 7
0 ETH0.0056996152
Get Reward124412012021-05-15 20:32:271333 days ago1621110747IN
ARCx: Farm 7
0 ETH0.0078341468
Withdraw124383552021-05-15 10:08:411333 days ago1621073321IN
ARCx: Farm 7
0 ETH0.0059331577
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xE24D8969...a6494d868
The constructor portion of the code might be different and could alter the actual behaviour of the contract

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"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061030c5760003560e01c806381c7adf21161019d578063b846bc06116100e9578063db5f30e1116100a2578063f2fde38b1161007c578063f2fde38b146105ba578063f6712e2e146105cd578063f6af38dd146105d5578063fe4caff3146105e85761030c565b8063db5f30e1146105a2578063e7878c33146105aa578063e9fad8ee146105b25761030c565b8063b846bc0614610546578063c00007b01461054e578063c1928ba014610561578063c96be4cb14610574578063cc1a378f14610587578063cd2d79081461059a5761030c565b80639168ae72116101565780639c577dbb116101305780639c577dbb1461050e5780639c833ffa14610516578063b3287aa514610529578063b483cb5c1461053e5761030c565b80639168ae72146104c95780639af71b79146104f15780639b922351146105065761030c565b806381c7adf214610483578063860a09981461048b578063886140be146104935780638980f11f1461049b5780638da5cb5b146104ae5780638ffa7a32146104b65761030c565b806346a0b48f1161025c57806368d53c431161021557806370a08231116101ef57806370a0823114610440578063715018a61461045357806372f702f31461045b5780637b0472f0146104705761030c565b806368d53c43146104105780636c9230db146104235780636d156ef21461042b5761030c565b806346a0b48f146103ca578063541140af146103d25780635bd92439146103e5578063638634ee146103ed57806366f7cd351461040057806367abfefc146104085761030c565b8063265e214d116102c9578063386a9525116102a3578063386a952514610392578063392e53cd1461039a57806344b8ad08146103af578063463e9a00146103b75761030c565b8063265e214d1461036f5780632e1a7d4d1461037757806334960a251461038a5761030c565b8063038c9634146103115780630e3764c11461033a57806318160ddd14610342578063241a09fc1461034a578063258e9bb01461035257806325df1dc51461035a575b600080fd5b61032461031f366004612596565b6105fb565b60405161033191906133b2565b60405180910390f35b61032461062c565b610324610632565b610324610639565b61032461063f565b61036d610368366004612714565b610645565b005b6103246106c8565b61036d61038536600461276e565b6106ce565b61032461079b565b6103246107a1565b6103a26107a7565b60405161033191906131b8565b6103246107b7565b61036d6103c53660046125b4565b610844565b6103246109fb565b6103246103e0366004612596565b610a01565b610324610a1b565b6103246103fb366004612596565b610a21565b610324610ab3565b610324610b1a565b61036d61041e3660046127aa565b610b33565b610324610ed2565b610433610ed6565b6040516103319190613129565b61032461044e366004612596565b610ee5565b61036d610f03565b610463610f77565b60405161033191906131c6565b61036d61047e3660046127da565b610f86565b6104636110ea565b6103a26110f9565b610324611107565b61036d6104a936600461268d565b61110d565b6104336112c0565b61036d6104c4366004612596565b6112cf565b6104dc6104d7366004612596565b611372565b604051610331999897969594939291906133e9565b6104f96113c0565b60405161033191906133a4565b6104336113db565b6103246113ea565b6103a26105243660046126c7565b611403565b6105316114ca565b604051610331919061346f565b6104636114d3565b6104336114e2565b61036d61055c366004612596565b6114f1565b61036d61056f366004612596565b6116bd565b61036d610582366004612596565b611760565b61036d61059536600461276e565b6119b1565b610324611a5a565b610463611a60565b6103a2611a6f565b61036d611a7e565b61036d6105c8366004612596565b611a95565b610324611b40565b61036d6105e3366004612714565b611b46565b61036d6105f636600461276e565b611bb3565b600154600090610626906106199084906001600160a01b0316611cef565b6106216113c0565b611e1a565b92915050565b60095481565b6015545b90565b600d5481565b600e5481565b6000546001600160a01b031633146106785760405162461bcd60e51b815260040161066f90613334565b60405180910390fd5b6014805462ff0000191662010000831515021790556040517f30c218371e1a7a6f866468bad0b43039efd19a3cf2804f4ea9db21ae04693b41906106bd9083906131b8565b60405180910390a150565b600a5481565b3360006106db8282611e33565b6015546106ee908463ffffffff61200916565b6015553360009081526008602052604090206002810154610715908563ffffffff61200916565b60028201819055601454610732919060ff1663ffffffff61203116565b6001820155600354610754906001600160a01b0316338663ffffffff61206616565b336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58560405161078d91906133b2565b60405180910390a250505050565b600f5481565b600b5481565b600054600160a01b900460ff1681565b6000601554600014156107cd5750601154610636565b61083f610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b9063ffffffff61200916565b9063ffffffff61215416565b9063ffffffff61203116565b6011549063ffffffff61218e16565b905090565b6000546001600160a01b0316331461086e5760405162461bcd60e51b815260040161066f90613334565b600054600160a01b900460ff1615801561089057506001600160a01b038a1615155b80156108a457506001600160a01b03891615155b80156108b857506001600160a01b03881615155b80156108cc57506001600160a01b03871615155b80156108e057506001600160a01b03861615155b80156108f457506001600160a01b03851615155b80156109005750835115155b801561090c5750825115155b801561091b575060008260ff16115b801561092f57506001600160a01b03811615155b61094b5760405162461bcd60e51b815260040161066f90613364565b60008054600160a01b60ff60a01b19909116179055600580546001600160a01b03199081166001600160a01b039c8d16179091556006805482169a8c169a909a17909955600780548a16988b1698909817909755600180548916968a1696909617909555600280548816948916949094179093556003805487169288169290921790915551601255516013556014805460ff191660ff909216919091179055600480549092169216919091179055565b600c5481565b6002546000906106269083906001600160a01b0316611cef565b60105481565b60015460025460009183916001600160a01b038084169281168314929116148180610a495750805b610a655760405162461bcd60e51b815260040161066f90613304565b6001546000906001600160a01b03878116911614610a8557600a54610a89565b6009545b905080610a94610ed2565b10610a9f5780610aa7565b610aa7610ed2565b9450505b505050919050565b600060155460001415610ac95750601054610636565b61083f610619610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b6010549063ffffffff61218e16565b600061083f600b54600e5461215490919063ffffffff16565b6006546001600160a01b0316331480610b5657506007546001600160a01b031633145b610b725760405162461bcd60e51b815260040161066f90613224565b60015460025482916001600160a01b0380841691811682149216148180610b965750805b610bb25760405162461bcd60e51b815260040161066f90613304565b600084610bbf8282611e33565b6000600b5411610be15760405162461bcd60e51b815260040161066f90613354565b60015460009081906001600160a01b0389811691161415610d75576006546001600160a01b03163314610c265760405162461bcd60e51b815260040161066f90613344565b600954610c31610ed2565b10610c5257600b54610c4a908a9063ffffffff61203116565b600e55610ca1565b610c6c610c5d610ed2565b6009549063ffffffff61200916565b9150610c83600e548361215490919063ffffffff16565b600b54909150610c9d906108248b8463ffffffff61218e16565b600e555b600b546001546040516370a0823160e01b8152610d2792916001600160a01b0316906370a0823190610cd7903090600401613129565b60206040518083038186803b158015610cef57600080fd5b505afa158015610d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610824919081019061278c565b600e541115610d485760405162461bcd60e51b815260040161066f90613374565b610d62600b54610d56610ed2565b9063ffffffff61218e16565b600955610d6d610ed2565b600c55610e8e565b6007546001600160a01b03163314610d9f5760405162461bcd60e51b815260040161066f90613244565b600a54610daa610ed2565b10610dcb57600b54610dc3908a9063ffffffff61203116565b600f55610e1a565b610de5610dd6610ed2565b600a549063ffffffff61200916565b9150610dfc600f548361215490919063ffffffff16565b600b54909150610e16906108248b8463ffffffff61218e16565b600f555b600b546002546040516370a0823160e01b8152610e5092916001600160a01b0316906370a0823190610cd7903090600401613129565b600f541115610e715760405162461bcd60e51b815260040161066f90613314565b610e7f600b54610d56610ed2565b600a55610e8a610ed2565b600d555b7ffb5edb6eb340a01f6a67189edc978df97841c43752c212fc85995ea2300176358989604051610ebf9291906133c0565b60405180910390a1505050505050505050565b4290565b6005546001600160a01b031681565b6001600160a01b031660009081526008602052604090206002015490565b6000546001600160a01b03163314610f2d5760405162461bcd60e51b815260040161066f90613334565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6003546001600160a01b031681565b336000610f938282611e33565b6000610fa285610d5633610ee5565b33600090815260086020526040902080549192509015610fdc5780548514610fdc5760405162461bcd60e51b815260040161066f90613254565b60145460ff16610ffe5760405162461bcd60e51b815260040161066f90613234565b60145460009061101890849060ff1663ffffffff61203116565b9050611025338288611403565b6110415760405162461bcd60e51b815260040161066f906131d4565b815461104b578582555b600182018190556002820154611067908863ffffffff61218e16565b600283015560155461107f908863ffffffff61218e16565b6015556003546110a0906001600160a01b031633308a63ffffffff6121b316565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516110d991906133b2565b60405180910390a250505050505050565b6002546001600160a01b031681565b601454610100900460ff1681565b60125481565b6000546001600160a01b031633146111375760405162461bcd60e51b815260040161066f90613334565b6001546001600160a01b03838116911614801561115657506000600b54115b15611219576001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061118c903090600401613129565b60206040518083038186803b1580156111a457600080fd5b505afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111dc919081019061278c565b600b549091506111f690610824838563ffffffff61200916565b600e5411156112175760405162461bcd60e51b815260040161066f90613394565b505b6003546001600160a01b0383811691161480159061124557506002546001600160a01b03838116911614155b6112615760405162461bcd60e51b815260040161066f90613294565b61128361126c6112c0565b6001600160a01b038416908363ffffffff61206616565b7f505b28e6941631badc363841ecbf8e1214b9379c643936458e87be718e15799982826040516112b492919061319d565b60405180910390a15050565b6000546001600160a01b031690565b6007546001600160a01b031633146112f95760405162461bcd60e51b815260040161066f906132f4565b6007546001600160a01b03828116911614156113275760405162461bcd60e51b815260040161066f906132d4565b600780546001600160a01b0319166001600160a01b0383161790556040517fa5980cc016ca7b243fcd49a5a2110c5c2cee36a5acf75bb343de641bf79d1994906106bd908390613129565b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154905089565b6113c8612415565b61083f6113d36122a4565b6012546122c6565b6006546001600160a01b031681565b600061083f600b54600f5461215490919063ffffffff16565b600061140d612428565b6004805460405163eb02c30160e01b81526001600160a01b039091169163eb02c3019161143c918791016133b2565b60a06040518083038186803b15801561145457600080fd5b505afa158015611468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061148c9190810190612750565b9050846001600160a01b031681600001516001600160a01b0316146114b55760009150506114c3565b604001516020015183111590505b9392505050565b60145460ff1681565b6001546001600160a01b031681565b6007546001600160a01b031681565b8060006114fe8282611e33565b6001600160a01b0383166000908152600860205260408120601454909190819062010000900460ff16806115395750601454610100900460ff165b6115555760405162461bcd60e51b815260040161066f90613384565b60145462010000900460ff16156115b9576008830154600684015461157f9163ffffffff61200916565b6008840154909150611597908263ffffffff61218e16565b60088401556002546115b9906001600160a01b0316878363ffffffff61206616565b601454610100900460ff161561167257600783015460058401546115e29163ffffffff61200916565b60078401549092506115fa908363ffffffff61218e16565b60078401556040805160208101909152601254815260009061161d908490611e1a565b600554600154919250611643916001600160a01b0390811691168363ffffffff61206616565b61167087611657858463ffffffff61200916565b6001546001600160a01b0316919063ffffffff61206616565b505b856001600160a01b03167fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f5183836040516116ad9291906133db565b60405180910390a2505050505050565b6000546001600160a01b031633146116e75760405162461bcd60e51b815260040161066f90613334565b6006546001600160a01b03828116911614156117155760405162461bcd60e51b815260040161066f906132d4565b600680546001600160a01b0319166001600160a01b0383161790556040517f824e31e09d4608742fcb7f21dce6d7cee255bd3de48a2a1490d9bcad42092847906106bd908390613129565b80600061176d8282611e33565b6001600160a01b0383163314156117965760405162461bcd60e51b815260040161066f906132b4565b60006117a0610ed2565b90506009548110806117b35750600a5481105b6117cf5760405162461bcd60e51b815260040161066f906131e4565b6001600160a01b0384166000908152600860205260409020600181015481546117f9918791611403565b156118165760405162461bcd60e51b815260040161066f906132a4565b60006118338260070154836005015461200990919063ffffffff16565b60408051602081019091526013548152909150600090611854908390611e1a565b905060006118738460080154856006015461200990919063ffffffff16565b33600090815260086020526040902060050154909150611899908363ffffffff61218e16565b3360009081526008602052604090206005810191909155600601546118c4908263ffffffff61218e16565b336000908152600860205260409020600601556119146118ea848463ffffffff61200916565b6006546001600160a01b03166000908152600860205260409020600501549063ffffffff61218e16565b6006546001600160a01b0316600090815260086020526040902060059081019190915584015461194a908463ffffffff61200916565b60058501556006840154611964908263ffffffff61200916565b60068501556040517f44d3b6c4ee455b8799ef3f69bac5716b9226683bfd39f54e01fb9baf80bfa7f59061199f908a90339087908690613137565b60405180910390a15050505050505050565b6000546001600160a01b031633146119db5760405162461bcd60e51b815260040161066f90613334565b6000600a54600954116119f057600a546119f4565b6009545b9050801580611a09575080611a07610ed2565b115b611a255760405162461bcd60e51b815260040161066f906132c4565b600b8290556040517ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d3906112b49084906133b2565b60135481565b6004546001600160a01b031681565b60145462010000900460ff1681565b611a87336114f1565b611a9361038533610ee5565b565b6000546001600160a01b03163314611abf5760405162461bcd60e51b815260040161066f90613334565b6001600160a01b038116611ae55760405162461bcd60e51b815260040161066f90613204565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b6000546001600160a01b03163314611b705760405162461bcd60e51b815260040161066f90613334565b6014805461ff001916610100831515021790556040517f9e9c6629f80449dcfd37495f5298443a9429e9cd4380acdbe7bf0a4a372808f5906106bd9083906131b8565b6007546001600160a01b03163314611bdd5760405162461bcd60e51b815260040161066f906132f4565b600b5415611ca3576002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611c16903090600401613129565b60206040518083038186803b158015611c2e57600080fd5b505afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c66919081019061278c565b600b54909150611c8090610824838563ffffffff61200916565b600f541115611ca15760405162461bcd60e51b815260040161066f90613394565b505b600254611cc0906001600160a01b0316338363ffffffff61206616565b7fabd364c2d6134187b55f0d7302022dc5db2cb14cd6f6f2e33752d641e09a108c816040516106bd91906133b2565b60015460025460009183916001600160a01b038084169281168314929116148180611d175750805b611d335760405162461bcd60e51b815260040161066f90613304565b6001600160a01b03808716600090815260086020526040902060020154600154909187811691161415611dc1576001600160a01b0380881660009081526008602052604090206005810154600390910154600154611db993610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b869063ffffffff61215416565b945050611e11565b6001600160a01b0380881660009081526008602052604090206006810154600490910154600254611e0d93610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b9450505b50505092915050565b60006114c3838360000151670de0b6b3a76400006123f7565b6001600160a01b0381161580611e5657506001546001600160a01b038281169116145b80611e6e57506002546001600160a01b038281169116145b611e8a5760405162461bcd60e51b815260040161066f90613264565b6001600160a01b038116611efd57600154611ead906001600160a01b03166122f6565b601055600254611ec5906001600160a01b03166122f6565b601155600154611edd906001600160a01b0316610a21565b600c55600254611ef5906001600160a01b0316610a21565b600d55611f79565b6001546001600160a01b0382811691161415611f4857600154611f28906001600160a01b03166122f6565b601055600154611f40906001600160a01b0316610a21565b600c55611f79565b600254611f5d906001600160a01b03166122f6565b601155600254611f75906001600160a01b0316610a21565b600d555b6001600160a01b0382161561200557600154611f9f9083906001600160a01b0316611cef565b6001600160a01b0380841660009081526008602052604090206005810192909255601054600390920191909155600254611fdb91849116611cef565b6001600160a01b038316600090815260086020526040902060068101919091556011546004909101555b5050565b60008282111561202b5760405162461bcd60e51b815260040161066f90613274565b50900390565b60008082116120525760405162461bcd60e51b815260040161066f90613284565b600082848161205d57fe5b04949350505050565b60006060846001600160a01b031663a9059cbb858560405160240161208c92919061319d565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516120c5919061311d565b6000604051808303816000865af19150503d8060008114612102576040519150601f19603f3d011682016040523d82523d6000602084013e612107565b606091505b50915091508180156121315750805115806121315750808060200190516121319190810190612732565b61214d5760405162461bcd60e51b815260040161066f906131f4565b5050505050565b60008261216357506000610626565b8282028284828161217057fe5b04146114c35760405162461bcd60e51b815260040161066f90613324565b6000828201838110156114c35760405162461bcd60e51b815260040161066f90613214565b60006060856001600160a01b03166323b872dd8686866040516024016121db93929190613175565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612214919061311d565b6000604051808303816000865af19150503d8060008114612251576040519150601f19603f3d011682016040523d82523d6000602084013e612256565b606091505b50915091508180156122805750805115806122805750808060200190516122809190810190612732565b61229c5760405162461bcd60e51b815260040161066f906132e4565b505050505050565b6122ac612415565b506040805160208101909152670de0b6b3a7640000815290565b6122ce612415565b6040805160208101909152835181906122ed908563ffffffff61200916565b90529392505050565b60015460025460009183916001600160a01b03808416928116831492911614818061231e5750805b61233a5760405162461bcd60e51b815260040161066f90613304565b6001546001600160a01b03868116911614156123a757601554612361576010549350610aab565b6123a0610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b9350610aab565b6015546123b8576011549350610aab565b6123a0610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b600061240d82610824868663ffffffff61215416565b949350505050565b6040518060200160405280600081525090565b604051806060016040528060006001600160a01b0316815260200161244b61245d565b815260200161245861245d565b905290565b604080518082019091526000808252602082015290565b803561062681613516565b805161062681613516565b80356106268161352d565b80516106268161352d565b6000602082840312156124b257600080fd5b6124bc602061347d565b905060006124ca8484612575565b82525092915050565b600060a082840312156124e557600080fd5b6124ef606061347d565b905060006124fd848461247f565b825250602061250e8484830161252e565b60208301525060606125228482850161252e565b60408301525092915050565b60006040828403121561254057600080fd5b61254a604061347d565b905060006125588484612495565b825250602061256984848301612580565b60208301525092915050565b803561062681613536565b805161062681613536565b80356106268161353f565b6000602082840312156125a857600080fd5b600061240d8484612474565b6000806000806000806000806000806101408b8d0312156125d457600080fd5b60006125e08d8d612474565b9a505060206125f18d828e01612474565b99505060406126028d828e01612474565b98505060606126138d828e01612474565b97505060806126248d828e01612474565b96505060a06126358d828e01612474565b95505060c06126468d828e016124a0565b94505060e06126578d828e016124a0565b9350506101006126698d828e0161258b565b92505061012061267b8d828e01612474565b9150509295989b9194979a5092959850565b600080604083850312156126a057600080fd5b60006126ac8585612474565b92505060206126bd85828601612575565b9150509250929050565b6000806000606084860312156126dc57600080fd5b60006126e88686612474565b93505060206126f986828701612575565b925050604061270a86828701612575565b9150509250925092565b60006020828403121561272657600080fd5b600061240d848461248a565b60006020828403121561274457600080fd5b600061240d8484612495565b600060a0828403121561276257600080fd5b600061240d84846124d3565b60006020828403121561278057600080fd5b600061240d8484612575565b60006020828403121561279e57600080fd5b600061240d8484612580565b600080604083850312156127bd57600080fd5b60006127c98585612575565b92505060206126bd85828601612474565b600080604083850312156127ed57600080fd5b60006126ac8585612575565b612802816134d8565b82525050565b612802816134b6565b612802816134c1565b6000612825826134a4565b61282f81856134a8565b935061283f8185602086016134ea565b9290920192915050565b612802816134df565b600061285f6016836134ad565b7526bab9ba1031329030903b30b634b21036b4b73a32b960511b815260200192915050565b60006128916028836134ad565b7f596f752063616e6e6f7420736c6173682061667465722074686520726577617281526719081c195c9a5bd960c21b602082015260400192915050565b60006128db601a836134ad565b7f5361666545524332303a205452414e534645525f4641494c4544000000000000815260200192915050565b60006129146026836134ad565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061295c601b836134ad565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006129956022836134ad565b7f43616c6c6572206973206e6f742061207265776172642064697374726962757481526137b960f11b602082015260400192915050565b60006129d96023836134ad565b7f546865207374616b6520746f206465627420726174696f2063616e6e6f74206281526206520360ec1b602082015260400192915050565b6000612a1e604b836134ad565b7f4f6e6c792074686520636f6c6c6162207265776172647320646973747269627581527f746f722063616e206e6f746966792074686520616d6f756e74206f6620636f6c60208201526a6c6162207265776172647360a81b604082015260600192915050565b6000612a916033836134ad565b7f596f752063616e6e6f74207374616b65206261736564206f6e2061206469666681527232b932b73a103232b13a103837b9b4ba34b7b760691b602082015260400192915050565b6000612ae66038836134ad565b7f5468652072657761726420746f6b656e2063616e20656974686572206265203081527f206f7220612076616c69642072657761726420746f6b656e0000000000000000602082015260400192915050565b6000612b45601e836134ad565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b6000612b7e601a836134ad565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000815260200192915050565b6000612bb76033836134ad565b7f43616e6e6f7420776974686472617720746865207374616b696e67206f7220638152726f6c6c61622072657761726420746f6b656e7360681b602082015260400192915050565b6000612c0c602c836134ad565b7f596f752063616e277420736c617368206120757365722077686f20697320612081526b3b30b634b21036b4b73a32b960a11b602082015260400192915050565b6000612c5a6019836134ad565b7f596f752063616e6e6f7420736c61736820796f757273656c6600000000000000815260200192915050565b6000612c936044836134ad565b7f5072657620706572696f64206d75737420626520636f6d706c6574652062656681527f6f7265206368616e67696e67206475726174696f6e20666f72206e65772070656020820152631c9a5bd960e21b604082015260600192915050565b6000612cff6027836134ad565b7f43616e6e6f7420736574207468652073616d65207265776172647320646973748152663934b13aba37b960c91b602082015260400192915050565b6000612d48601f836134ad565b7f5361666545524332303a205452414e534645525f46524f4d5f4641494c454400815260200192915050565b6000612d81602c836134ad565b7f43616c6c6572206973206e6f742074686520636f6c6c6162207265776172647381526b103234b9ba3934b13aba37b960a11b602082015260400192915050565b6000612dcf604a836134ad565b7f5468652072657761726420746f6b656e206164647265737320646f6573206e6f81527f7420636f72726573706f6e6420746f206f6e65206f66207468652072657761726020820152693239903a37b5b2b7399760b11b604082015260600192915050565b6000612e416038836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f722074686581527f2062616c616e6365206f6620636f6c6c616220746f6b656e0000000000000000602082015260400192915050565b6000612ea06021836134ad565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612ee36020836134ad565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612f1c6047836134ad565b7f4f6e6c792074686520415243782072657761726473206469737472696275746f81527f722063616e206e6f746966792074686520616d6f756e74206f662041524378206020820152667265776172647360c81b604082015260600192915050565b6000612f8b601b836134ad565b7f52657761726473206475726174696f6e206973206e6f74207365740000000000815260200192915050565b6000612fc4601b836134ad565b7f4f6e65206f72206d6f72652076616c75657320697320656d7074790000000000815260200192915050565b6000612ffd6036836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f7220746865815275103130b630b731b29037b31020a921bc103a37b5b2b760511b602082015260400192915050565b6000613055602b836134ad565b7f4174206c65617374206f6e652072657761726420746f6b656e206d757374206281526a6520636c61696d61626c6560a81b602082015260400192915050565b60006130a26039836134ad565b7f4f6e6c792074686520737572706c7573206f662074686520726577617264206381527f616e206265207265636f76657265642c206e6f74206d6f726500000000000000602082015260400192915050565b80516020830190613105848261310b565b50505050565b61280281610636565b612802816134d2565b60006114c3828461281a565b602081016106268284612808565b608081016131458287612808565b61315260208301866127f9565b61315f604083018561310b565b61316c606083018461310b565b95945050505050565b606081016131838286612808565b6131906020830185612808565b61240d604083018461310b565b604081016131ab8285612808565b6114c3602083018461310b565b602081016106268284612811565b602081016106268284612849565b6020808252810161062681612852565b6020808252810161062681612884565b60208082528101610626816128ce565b6020808252810161062681612907565b602080825281016106268161294f565b6020808252810161062681612988565b60208082528101610626816129cc565b6020808252810161062681612a11565b6020808252810161062681612a84565b6020808252810161062681612ad9565b6020808252810161062681612b38565b6020808252810161062681612b71565b6020808252810161062681612baa565b6020808252810161062681612bff565b6020808252810161062681612c4d565b6020808252810161062681612c86565b6020808252810161062681612cf2565b6020808252810161062681612d3b565b6020808252810161062681612d74565b6020808252810161062681612dc2565b6020808252810161062681612e34565b6020808252810161062681612e93565b6020808252810161062681612ed6565b6020808252810161062681612f0f565b6020808252810161062681612f7e565b6020808252810161062681612fb7565b6020808252810161062681612ff0565b6020808252810161062681613048565b6020808252810161062681613095565b6020810161062682846130f4565b60208101610626828461310b565b604081016133ce828561310b565b6114c36020830184612808565b604081016131ab828561310b565b61012081016133f8828c61310b565b613405602083018b61310b565b613412604083018a61310b565b61341f606083018961310b565b61342c608083018861310b565b61343960a083018761310b565b61344660c083018661310b565b61345360e083018561310b565b61346161010083018461310b565b9a9950505050505050505050565b602081016106268284613114565b60405181810167ffffffffffffffff8111828210171561349c57600080fd5b604052919050565b5190565b919050565b90815260200190565b6000610626826134c6565b151590565b6001600160a01b031690565b60ff1690565b6000610626825b6000610626826134b6565b60005b838110156135055781810151838201526020016134ed565b838111156131055750506000910152565b61351f816134b6565b811461352a57600080fd5b50565b61351f816134c1565b61351f81610636565b61351f816134d256fea365627a7a723158201638b185845030a9b86bc643871b7594d2bc7db91529f1a2ee9e725f07c8c2a06c6578706572696d656e74616cf564736f6c63430005100040

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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