Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
JointCampaign
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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) ); } } }
// 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; } }
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; } }
// 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" ); } }
// 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 ); }
// 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) }); } }
// 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; } }
// 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); }
// 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; } }
// 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) }); } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
6080604081905260006009819055600a819055600b819055600e819055600f81905580546001600160a01b031916339081178255917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a361358b806100686000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c806381c7adf21161019d578063b846bc06116100e9578063db5f30e1116100a2578063f2fde38b1161007c578063f2fde38b146105ba578063f6712e2e146105cd578063f6af38dd146105d5578063fe4caff3146105e85761030c565b8063db5f30e1146105a2578063e7878c33146105aa578063e9fad8ee146105b25761030c565b8063b846bc0614610546578063c00007b01461054e578063c1928ba014610561578063c96be4cb14610574578063cc1a378f14610587578063cd2d79081461059a5761030c565b80639168ae72116101565780639c577dbb116101305780639c577dbb1461050e5780639c833ffa14610516578063b3287aa514610529578063b483cb5c1461053e5761030c565b80639168ae72146104c95780639af71b79146104f15780639b922351146105065761030c565b806381c7adf214610483578063860a09981461048b578063886140be146104935780638980f11f1461049b5780638da5cb5b146104ae5780638ffa7a32146104b65761030c565b806346a0b48f1161025c57806368d53c431161021557806370a08231116101ef57806370a0823114610440578063715018a61461045357806372f702f31461045b5780637b0472f0146104705761030c565b806368d53c43146104105780636c9230db146104235780636d156ef21461042b5761030c565b806346a0b48f146103ca578063541140af146103d25780635bd92439146103e5578063638634ee146103ed57806366f7cd351461040057806367abfefc146104085761030c565b8063265e214d116102c9578063386a9525116102a3578063386a952514610392578063392e53cd1461039a57806344b8ad08146103af578063463e9a00146103b75761030c565b8063265e214d1461036f5780632e1a7d4d1461037757806334960a251461038a5761030c565b8063038c9634146103115780630e3764c11461033a57806318160ddd14610342578063241a09fc1461034a578063258e9bb01461035257806325df1dc51461035a575b600080fd5b61032461031f366004612596565b6105fb565b60405161033191906133b2565b60405180910390f35b61032461062c565b610324610632565b610324610639565b61032461063f565b61036d610368366004612714565b610645565b005b6103246106c8565b61036d61038536600461276e565b6106ce565b61032461079b565b6103246107a1565b6103a26107a7565b60405161033191906131b8565b6103246107b7565b61036d6103c53660046125b4565b610844565b6103246109fb565b6103246103e0366004612596565b610a01565b610324610a1b565b6103246103fb366004612596565b610a21565b610324610ab3565b610324610b1a565b61036d61041e3660046127aa565b610b33565b610324610ed2565b610433610ed6565b6040516103319190613129565b61032461044e366004612596565b610ee5565b61036d610f03565b610463610f77565b60405161033191906131c6565b61036d61047e3660046127da565b610f86565b6104636110ea565b6103a26110f9565b610324611107565b61036d6104a936600461268d565b61110d565b6104336112c0565b61036d6104c4366004612596565b6112cf565b6104dc6104d7366004612596565b611372565b604051610331999897969594939291906133e9565b6104f96113c0565b60405161033191906133a4565b6104336113db565b6103246113ea565b6103a26105243660046126c7565b611403565b6105316114ca565b604051610331919061346f565b6104636114d3565b6104336114e2565b61036d61055c366004612596565b6114f1565b61036d61056f366004612596565b6116bd565b61036d610582366004612596565b611760565b61036d61059536600461276e565b6119b1565b610324611a5a565b610463611a60565b6103a2611a6f565b61036d611a7e565b61036d6105c8366004612596565b611a95565b610324611b40565b61036d6105e3366004612714565b611b46565b61036d6105f636600461276e565b611bb3565b600154600090610626906106199084906001600160a01b0316611cef565b6106216113c0565b611e1a565b92915050565b60095481565b6015545b90565b600d5481565b600e5481565b6000546001600160a01b031633146106785760405162461bcd60e51b815260040161066f90613334565b60405180910390fd5b6014805462ff0000191662010000831515021790556040517f30c218371e1a7a6f866468bad0b43039efd19a3cf2804f4ea9db21ae04693b41906106bd9083906131b8565b60405180910390a150565b600a5481565b3360006106db8282611e33565b6015546106ee908463ffffffff61200916565b6015553360009081526008602052604090206002810154610715908563ffffffff61200916565b60028201819055601454610732919060ff1663ffffffff61203116565b6001820155600354610754906001600160a01b0316338663ffffffff61206616565b336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58560405161078d91906133b2565b60405180910390a250505050565b600f5481565b600b5481565b600054600160a01b900460ff1681565b6000601554600014156107cd5750601154610636565b61083f610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b9063ffffffff61200916565b9063ffffffff61215416565b9063ffffffff61203116565b6011549063ffffffff61218e16565b905090565b6000546001600160a01b0316331461086e5760405162461bcd60e51b815260040161066f90613334565b600054600160a01b900460ff1615801561089057506001600160a01b038a1615155b80156108a457506001600160a01b03891615155b80156108b857506001600160a01b03881615155b80156108cc57506001600160a01b03871615155b80156108e057506001600160a01b03861615155b80156108f457506001600160a01b03851615155b80156109005750835115155b801561090c5750825115155b801561091b575060008260ff16115b801561092f57506001600160a01b03811615155b61094b5760405162461bcd60e51b815260040161066f90613364565b60008054600160a01b60ff60a01b19909116179055600580546001600160a01b03199081166001600160a01b039c8d16179091556006805482169a8c169a909a17909955600780548a16988b1698909817909755600180548916968a1696909617909555600280548816948916949094179093556003805487169288169290921790915551601255516013556014805460ff191660ff909216919091179055600480549092169216919091179055565b600c5481565b6002546000906106269083906001600160a01b0316611cef565b60105481565b60015460025460009183916001600160a01b038084169281168314929116148180610a495750805b610a655760405162461bcd60e51b815260040161066f90613304565b6001546000906001600160a01b03878116911614610a8557600a54610a89565b6009545b905080610a94610ed2565b10610a9f5780610aa7565b610aa7610ed2565b9450505b505050919050565b600060155460001415610ac95750601054610636565b61083f610619610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b6010549063ffffffff61218e16565b600061083f600b54600e5461215490919063ffffffff16565b6006546001600160a01b0316331480610b5657506007546001600160a01b031633145b610b725760405162461bcd60e51b815260040161066f90613224565b60015460025482916001600160a01b0380841691811682149216148180610b965750805b610bb25760405162461bcd60e51b815260040161066f90613304565b600084610bbf8282611e33565b6000600b5411610be15760405162461bcd60e51b815260040161066f90613354565b60015460009081906001600160a01b0389811691161415610d75576006546001600160a01b03163314610c265760405162461bcd60e51b815260040161066f90613344565b600954610c31610ed2565b10610c5257600b54610c4a908a9063ffffffff61203116565b600e55610ca1565b610c6c610c5d610ed2565b6009549063ffffffff61200916565b9150610c83600e548361215490919063ffffffff16565b600b54909150610c9d906108248b8463ffffffff61218e16565b600e555b600b546001546040516370a0823160e01b8152610d2792916001600160a01b0316906370a0823190610cd7903090600401613129565b60206040518083038186803b158015610cef57600080fd5b505afa158015610d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610824919081019061278c565b600e541115610d485760405162461bcd60e51b815260040161066f90613374565b610d62600b54610d56610ed2565b9063ffffffff61218e16565b600955610d6d610ed2565b600c55610e8e565b6007546001600160a01b03163314610d9f5760405162461bcd60e51b815260040161066f90613244565b600a54610daa610ed2565b10610dcb57600b54610dc3908a9063ffffffff61203116565b600f55610e1a565b610de5610dd6610ed2565b600a549063ffffffff61200916565b9150610dfc600f548361215490919063ffffffff16565b600b54909150610e16906108248b8463ffffffff61218e16565b600f555b600b546002546040516370a0823160e01b8152610e5092916001600160a01b0316906370a0823190610cd7903090600401613129565b600f541115610e715760405162461bcd60e51b815260040161066f90613314565b610e7f600b54610d56610ed2565b600a55610e8a610ed2565b600d555b7ffb5edb6eb340a01f6a67189edc978df97841c43752c212fc85995ea2300176358989604051610ebf9291906133c0565b60405180910390a1505050505050505050565b4290565b6005546001600160a01b031681565b6001600160a01b031660009081526008602052604090206002015490565b6000546001600160a01b03163314610f2d5760405162461bcd60e51b815260040161066f90613334565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6003546001600160a01b031681565b336000610f938282611e33565b6000610fa285610d5633610ee5565b33600090815260086020526040902080549192509015610fdc5780548514610fdc5760405162461bcd60e51b815260040161066f90613254565b60145460ff16610ffe5760405162461bcd60e51b815260040161066f90613234565b60145460009061101890849060ff1663ffffffff61203116565b9050611025338288611403565b6110415760405162461bcd60e51b815260040161066f906131d4565b815461104b578582555b600182018190556002820154611067908863ffffffff61218e16565b600283015560155461107f908863ffffffff61218e16565b6015556003546110a0906001600160a01b031633308a63ffffffff6121b316565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516110d991906133b2565b60405180910390a250505050505050565b6002546001600160a01b031681565b601454610100900460ff1681565b60125481565b6000546001600160a01b031633146111375760405162461bcd60e51b815260040161066f90613334565b6001546001600160a01b03838116911614801561115657506000600b54115b15611219576001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061118c903090600401613129565b60206040518083038186803b1580156111a457600080fd5b505afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111dc919081019061278c565b600b549091506111f690610824838563ffffffff61200916565b600e5411156112175760405162461bcd60e51b815260040161066f90613394565b505b6003546001600160a01b0383811691161480159061124557506002546001600160a01b03838116911614155b6112615760405162461bcd60e51b815260040161066f90613294565b61128361126c6112c0565b6001600160a01b038416908363ffffffff61206616565b7f505b28e6941631badc363841ecbf8e1214b9379c643936458e87be718e15799982826040516112b492919061319d565b60405180910390a15050565b6000546001600160a01b031690565b6007546001600160a01b031633146112f95760405162461bcd60e51b815260040161066f906132f4565b6007546001600160a01b03828116911614156113275760405162461bcd60e51b815260040161066f906132d4565b600780546001600160a01b0319166001600160a01b0383161790556040517fa5980cc016ca7b243fcd49a5a2110c5c2cee36a5acf75bb343de641bf79d1994906106bd908390613129565b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154905089565b6113c8612415565b61083f6113d36122a4565b6012546122c6565b6006546001600160a01b031681565b600061083f600b54600f5461215490919063ffffffff16565b600061140d612428565b6004805460405163eb02c30160e01b81526001600160a01b039091169163eb02c3019161143c918791016133b2565b60a06040518083038186803b15801561145457600080fd5b505afa158015611468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061148c9190810190612750565b9050846001600160a01b031681600001516001600160a01b0316146114b55760009150506114c3565b604001516020015183111590505b9392505050565b60145460ff1681565b6001546001600160a01b031681565b6007546001600160a01b031681565b8060006114fe8282611e33565b6001600160a01b0383166000908152600860205260408120601454909190819062010000900460ff16806115395750601454610100900460ff165b6115555760405162461bcd60e51b815260040161066f90613384565b60145462010000900460ff16156115b9576008830154600684015461157f9163ffffffff61200916565b6008840154909150611597908263ffffffff61218e16565b60088401556002546115b9906001600160a01b0316878363ffffffff61206616565b601454610100900460ff161561167257600783015460058401546115e29163ffffffff61200916565b60078401549092506115fa908363ffffffff61218e16565b60078401556040805160208101909152601254815260009061161d908490611e1a565b600554600154919250611643916001600160a01b0390811691168363ffffffff61206616565b61167087611657858463ffffffff61200916565b6001546001600160a01b0316919063ffffffff61206616565b505b856001600160a01b03167fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f5183836040516116ad9291906133db565b60405180910390a2505050505050565b6000546001600160a01b031633146116e75760405162461bcd60e51b815260040161066f90613334565b6006546001600160a01b03828116911614156117155760405162461bcd60e51b815260040161066f906132d4565b600680546001600160a01b0319166001600160a01b0383161790556040517f824e31e09d4608742fcb7f21dce6d7cee255bd3de48a2a1490d9bcad42092847906106bd908390613129565b80600061176d8282611e33565b6001600160a01b0383163314156117965760405162461bcd60e51b815260040161066f906132b4565b60006117a0610ed2565b90506009548110806117b35750600a5481105b6117cf5760405162461bcd60e51b815260040161066f906131e4565b6001600160a01b0384166000908152600860205260409020600181015481546117f9918791611403565b156118165760405162461bcd60e51b815260040161066f906132a4565b60006118338260070154836005015461200990919063ffffffff16565b60408051602081019091526013548152909150600090611854908390611e1a565b905060006118738460080154856006015461200990919063ffffffff16565b33600090815260086020526040902060050154909150611899908363ffffffff61218e16565b3360009081526008602052604090206005810191909155600601546118c4908263ffffffff61218e16565b336000908152600860205260409020600601556119146118ea848463ffffffff61200916565b6006546001600160a01b03166000908152600860205260409020600501549063ffffffff61218e16565b6006546001600160a01b0316600090815260086020526040902060059081019190915584015461194a908463ffffffff61200916565b60058501556006840154611964908263ffffffff61200916565b60068501556040517f44d3b6c4ee455b8799ef3f69bac5716b9226683bfd39f54e01fb9baf80bfa7f59061199f908a90339087908690613137565b60405180910390a15050505050505050565b6000546001600160a01b031633146119db5760405162461bcd60e51b815260040161066f90613334565b6000600a54600954116119f057600a546119f4565b6009545b9050801580611a09575080611a07610ed2565b115b611a255760405162461bcd60e51b815260040161066f906132c4565b600b8290556040517ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d3906112b49084906133b2565b60135481565b6004546001600160a01b031681565b60145462010000900460ff1681565b611a87336114f1565b611a9361038533610ee5565b565b6000546001600160a01b03163314611abf5760405162461bcd60e51b815260040161066f90613334565b6001600160a01b038116611ae55760405162461bcd60e51b815260040161066f90613204565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b6000546001600160a01b03163314611b705760405162461bcd60e51b815260040161066f90613334565b6014805461ff001916610100831515021790556040517f9e9c6629f80449dcfd37495f5298443a9429e9cd4380acdbe7bf0a4a372808f5906106bd9083906131b8565b6007546001600160a01b03163314611bdd5760405162461bcd60e51b815260040161066f906132f4565b600b5415611ca3576002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611c16903090600401613129565b60206040518083038186803b158015611c2e57600080fd5b505afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c66919081019061278c565b600b54909150611c8090610824838563ffffffff61200916565b600f541115611ca15760405162461bcd60e51b815260040161066f90613394565b505b600254611cc0906001600160a01b0316338363ffffffff61206616565b7fabd364c2d6134187b55f0d7302022dc5db2cb14cd6f6f2e33752d641e09a108c816040516106bd91906133b2565b60015460025460009183916001600160a01b038084169281168314929116148180611d175750805b611d335760405162461bcd60e51b815260040161066f90613304565b6001600160a01b03808716600090815260086020526040902060020154600154909187811691161415611dc1576001600160a01b0380881660009081526008602052604090206005810154600390910154600154611db993610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b869063ffffffff61215416565b945050611e11565b6001600160a01b0380881660009081526008602052604090206006810154600490910154600254611e0d93610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b9450505b50505092915050565b60006114c3838360000151670de0b6b3a76400006123f7565b6001600160a01b0381161580611e5657506001546001600160a01b038281169116145b80611e6e57506002546001600160a01b038281169116145b611e8a5760405162461bcd60e51b815260040161066f90613264565b6001600160a01b038116611efd57600154611ead906001600160a01b03166122f6565b601055600254611ec5906001600160a01b03166122f6565b601155600154611edd906001600160a01b0316610a21565b600c55600254611ef5906001600160a01b0316610a21565b600d55611f79565b6001546001600160a01b0382811691161415611f4857600154611f28906001600160a01b03166122f6565b601055600154611f40906001600160a01b0316610a21565b600c55611f79565b600254611f5d906001600160a01b03166122f6565b601155600254611f75906001600160a01b0316610a21565b600d555b6001600160a01b0382161561200557600154611f9f9083906001600160a01b0316611cef565b6001600160a01b0380841660009081526008602052604090206005810192909255601054600390920191909155600254611fdb91849116611cef565b6001600160a01b038316600090815260086020526040902060068101919091556011546004909101555b5050565b60008282111561202b5760405162461bcd60e51b815260040161066f90613274565b50900390565b60008082116120525760405162461bcd60e51b815260040161066f90613284565b600082848161205d57fe5b04949350505050565b60006060846001600160a01b031663a9059cbb858560405160240161208c92919061319d565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516120c5919061311d565b6000604051808303816000865af19150503d8060008114612102576040519150601f19603f3d011682016040523d82523d6000602084013e612107565b606091505b50915091508180156121315750805115806121315750808060200190516121319190810190612732565b61214d5760405162461bcd60e51b815260040161066f906131f4565b5050505050565b60008261216357506000610626565b8282028284828161217057fe5b04146114c35760405162461bcd60e51b815260040161066f90613324565b6000828201838110156114c35760405162461bcd60e51b815260040161066f90613214565b60006060856001600160a01b03166323b872dd8686866040516024016121db93929190613175565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612214919061311d565b6000604051808303816000865af19150503d8060008114612251576040519150601f19603f3d011682016040523d82523d6000602084013e612256565b606091505b50915091508180156122805750805115806122805750808060200190516122809190810190612732565b61229c5760405162461bcd60e51b815260040161066f906132e4565b505050505050565b6122ac612415565b506040805160208101909152670de0b6b3a7640000815290565b6122ce612415565b6040805160208101909152835181906122ed908563ffffffff61200916565b90529392505050565b60015460025460009183916001600160a01b03808416928116831492911614818061231e5750805b61233a5760405162461bcd60e51b815260040161066f90613304565b6001546001600160a01b03868116911614156123a757601554612361576010549350610aab565b6123a0610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b9350610aab565b6015546123b8576011549350610aab565b6123a0610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b600061240d82610824868663ffffffff61215416565b949350505050565b6040518060200160405280600081525090565b604051806060016040528060006001600160a01b0316815260200161244b61245d565b815260200161245861245d565b905290565b604080518082019091526000808252602082015290565b803561062681613516565b805161062681613516565b80356106268161352d565b80516106268161352d565b6000602082840312156124b257600080fd5b6124bc602061347d565b905060006124ca8484612575565b82525092915050565b600060a082840312156124e557600080fd5b6124ef606061347d565b905060006124fd848461247f565b825250602061250e8484830161252e565b60208301525060606125228482850161252e565b60408301525092915050565b60006040828403121561254057600080fd5b61254a604061347d565b905060006125588484612495565b825250602061256984848301612580565b60208301525092915050565b803561062681613536565b805161062681613536565b80356106268161353f565b6000602082840312156125a857600080fd5b600061240d8484612474565b6000806000806000806000806000806101408b8d0312156125d457600080fd5b60006125e08d8d612474565b9a505060206125f18d828e01612474565b99505060406126028d828e01612474565b98505060606126138d828e01612474565b97505060806126248d828e01612474565b96505060a06126358d828e01612474565b95505060c06126468d828e016124a0565b94505060e06126578d828e016124a0565b9350506101006126698d828e0161258b565b92505061012061267b8d828e01612474565b9150509295989b9194979a5092959850565b600080604083850312156126a057600080fd5b60006126ac8585612474565b92505060206126bd85828601612575565b9150509250929050565b6000806000606084860312156126dc57600080fd5b60006126e88686612474565b93505060206126f986828701612575565b925050604061270a86828701612575565b9150509250925092565b60006020828403121561272657600080fd5b600061240d848461248a565b60006020828403121561274457600080fd5b600061240d8484612495565b600060a0828403121561276257600080fd5b600061240d84846124d3565b60006020828403121561278057600080fd5b600061240d8484612575565b60006020828403121561279e57600080fd5b600061240d8484612580565b600080604083850312156127bd57600080fd5b60006127c98585612575565b92505060206126bd85828601612474565b600080604083850312156127ed57600080fd5b60006126ac8585612575565b612802816134d8565b82525050565b612802816134b6565b612802816134c1565b6000612825826134a4565b61282f81856134a8565b935061283f8185602086016134ea565b9290920192915050565b612802816134df565b600061285f6016836134ad565b7526bab9ba1031329030903b30b634b21036b4b73a32b960511b815260200192915050565b60006128916028836134ad565b7f596f752063616e6e6f7420736c6173682061667465722074686520726577617281526719081c195c9a5bd960c21b602082015260400192915050565b60006128db601a836134ad565b7f5361666545524332303a205452414e534645525f4641494c4544000000000000815260200192915050565b60006129146026836134ad565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061295c601b836134ad565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006129956022836134ad565b7f43616c6c6572206973206e6f742061207265776172642064697374726962757481526137b960f11b602082015260400192915050565b60006129d96023836134ad565b7f546865207374616b6520746f206465627420726174696f2063616e6e6f74206281526206520360ec1b602082015260400192915050565b6000612a1e604b836134ad565b7f4f6e6c792074686520636f6c6c6162207265776172647320646973747269627581527f746f722063616e206e6f746966792074686520616d6f756e74206f6620636f6c60208201526a6c6162207265776172647360a81b604082015260600192915050565b6000612a916033836134ad565b7f596f752063616e6e6f74207374616b65206261736564206f6e2061206469666681527232b932b73a103232b13a103837b9b4ba34b7b760691b602082015260400192915050565b6000612ae66038836134ad565b7f5468652072657761726420746f6b656e2063616e20656974686572206265203081527f206f7220612076616c69642072657761726420746f6b656e0000000000000000602082015260400192915050565b6000612b45601e836134ad565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b6000612b7e601a836134ad565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000815260200192915050565b6000612bb76033836134ad565b7f43616e6e6f7420776974686472617720746865207374616b696e67206f7220638152726f6c6c61622072657761726420746f6b656e7360681b602082015260400192915050565b6000612c0c602c836134ad565b7f596f752063616e277420736c617368206120757365722077686f20697320612081526b3b30b634b21036b4b73a32b960a11b602082015260400192915050565b6000612c5a6019836134ad565b7f596f752063616e6e6f7420736c61736820796f757273656c6600000000000000815260200192915050565b6000612c936044836134ad565b7f5072657620706572696f64206d75737420626520636f6d706c6574652062656681527f6f7265206368616e67696e67206475726174696f6e20666f72206e65772070656020820152631c9a5bd960e21b604082015260600192915050565b6000612cff6027836134ad565b7f43616e6e6f7420736574207468652073616d65207265776172647320646973748152663934b13aba37b960c91b602082015260400192915050565b6000612d48601f836134ad565b7f5361666545524332303a205452414e534645525f46524f4d5f4641494c454400815260200192915050565b6000612d81602c836134ad565b7f43616c6c6572206973206e6f742074686520636f6c6c6162207265776172647381526b103234b9ba3934b13aba37b960a11b602082015260400192915050565b6000612dcf604a836134ad565b7f5468652072657761726420746f6b656e206164647265737320646f6573206e6f81527f7420636f72726573706f6e6420746f206f6e65206f66207468652072657761726020820152693239903a37b5b2b7399760b11b604082015260600192915050565b6000612e416038836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f722074686581527f2062616c616e6365206f6620636f6c6c616220746f6b656e0000000000000000602082015260400192915050565b6000612ea06021836134ad565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612ee36020836134ad565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612f1c6047836134ad565b7f4f6e6c792074686520415243782072657761726473206469737472696275746f81527f722063616e206e6f746966792074686520616d6f756e74206f662041524378206020820152667265776172647360c81b604082015260600192915050565b6000612f8b601b836134ad565b7f52657761726473206475726174696f6e206973206e6f74207365740000000000815260200192915050565b6000612fc4601b836134ad565b7f4f6e65206f72206d6f72652076616c75657320697320656d7074790000000000815260200192915050565b6000612ffd6036836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f7220746865815275103130b630b731b29037b31020a921bc103a37b5b2b760511b602082015260400192915050565b6000613055602b836134ad565b7f4174206c65617374206f6e652072657761726420746f6b656e206d757374206281526a6520636c61696d61626c6560a81b602082015260400192915050565b60006130a26039836134ad565b7f4f6e6c792074686520737572706c7573206f662074686520726577617264206381527f616e206265207265636f76657265642c206e6f74206d6f726500000000000000602082015260400192915050565b80516020830190613105848261310b565b50505050565b61280281610636565b612802816134d2565b60006114c3828461281a565b602081016106268284612808565b608081016131458287612808565b61315260208301866127f9565b61315f604083018561310b565b61316c606083018461310b565b95945050505050565b606081016131838286612808565b6131906020830185612808565b61240d604083018461310b565b604081016131ab8285612808565b6114c3602083018461310b565b602081016106268284612811565b602081016106268284612849565b6020808252810161062681612852565b6020808252810161062681612884565b60208082528101610626816128ce565b6020808252810161062681612907565b602080825281016106268161294f565b6020808252810161062681612988565b60208082528101610626816129cc565b6020808252810161062681612a11565b6020808252810161062681612a84565b6020808252810161062681612ad9565b6020808252810161062681612b38565b6020808252810161062681612b71565b6020808252810161062681612baa565b6020808252810161062681612bff565b6020808252810161062681612c4d565b6020808252810161062681612c86565b6020808252810161062681612cf2565b6020808252810161062681612d3b565b6020808252810161062681612d74565b6020808252810161062681612dc2565b6020808252810161062681612e34565b6020808252810161062681612e93565b6020808252810161062681612ed6565b6020808252810161062681612f0f565b6020808252810161062681612f7e565b6020808252810161062681612fb7565b6020808252810161062681612ff0565b6020808252810161062681613048565b6020808252810161062681613095565b6020810161062682846130f4565b60208101610626828461310b565b604081016133ce828561310b565b6114c36020830184612808565b604081016131ab828561310b565b61012081016133f8828c61310b565b613405602083018b61310b565b613412604083018a61310b565b61341f606083018961310b565b61342c608083018861310b565b61343960a083018761310b565b61344660c083018661310b565b61345360e083018561310b565b61346161010083018461310b565b9a9950505050505050505050565b602081016106268284613114565b60405181810167ffffffffffffffff8111828210171561349c57600080fd5b604052919050565b5190565b919050565b90815260200190565b6000610626826134c6565b151590565b6001600160a01b031690565b60ff1690565b6000610626825b6000610626826134b6565b60005b838110156135055781810151838201526020016134ed565b838111156131055750506000910152565b61351f816134b6565b811461352a57600080fd5b50565b61351f816134c1565b61351f81610636565b61351f816134d256fea365627a7a723158201638b185845030a9b86bc643871b7594d2bc7db91529f1a2ee9e725f07c8c2a06c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061030c5760003560e01c806381c7adf21161019d578063b846bc06116100e9578063db5f30e1116100a2578063f2fde38b1161007c578063f2fde38b146105ba578063f6712e2e146105cd578063f6af38dd146105d5578063fe4caff3146105e85761030c565b8063db5f30e1146105a2578063e7878c33146105aa578063e9fad8ee146105b25761030c565b8063b846bc0614610546578063c00007b01461054e578063c1928ba014610561578063c96be4cb14610574578063cc1a378f14610587578063cd2d79081461059a5761030c565b80639168ae72116101565780639c577dbb116101305780639c577dbb1461050e5780639c833ffa14610516578063b3287aa514610529578063b483cb5c1461053e5761030c565b80639168ae72146104c95780639af71b79146104f15780639b922351146105065761030c565b806381c7adf214610483578063860a09981461048b578063886140be146104935780638980f11f1461049b5780638da5cb5b146104ae5780638ffa7a32146104b65761030c565b806346a0b48f1161025c57806368d53c431161021557806370a08231116101ef57806370a0823114610440578063715018a61461045357806372f702f31461045b5780637b0472f0146104705761030c565b806368d53c43146104105780636c9230db146104235780636d156ef21461042b5761030c565b806346a0b48f146103ca578063541140af146103d25780635bd92439146103e5578063638634ee146103ed57806366f7cd351461040057806367abfefc146104085761030c565b8063265e214d116102c9578063386a9525116102a3578063386a952514610392578063392e53cd1461039a57806344b8ad08146103af578063463e9a00146103b75761030c565b8063265e214d1461036f5780632e1a7d4d1461037757806334960a251461038a5761030c565b8063038c9634146103115780630e3764c11461033a57806318160ddd14610342578063241a09fc1461034a578063258e9bb01461035257806325df1dc51461035a575b600080fd5b61032461031f366004612596565b6105fb565b60405161033191906133b2565b60405180910390f35b61032461062c565b610324610632565b610324610639565b61032461063f565b61036d610368366004612714565b610645565b005b6103246106c8565b61036d61038536600461276e565b6106ce565b61032461079b565b6103246107a1565b6103a26107a7565b60405161033191906131b8565b6103246107b7565b61036d6103c53660046125b4565b610844565b6103246109fb565b6103246103e0366004612596565b610a01565b610324610a1b565b6103246103fb366004612596565b610a21565b610324610ab3565b610324610b1a565b61036d61041e3660046127aa565b610b33565b610324610ed2565b610433610ed6565b6040516103319190613129565b61032461044e366004612596565b610ee5565b61036d610f03565b610463610f77565b60405161033191906131c6565b61036d61047e3660046127da565b610f86565b6104636110ea565b6103a26110f9565b610324611107565b61036d6104a936600461268d565b61110d565b6104336112c0565b61036d6104c4366004612596565b6112cf565b6104dc6104d7366004612596565b611372565b604051610331999897969594939291906133e9565b6104f96113c0565b60405161033191906133a4565b6104336113db565b6103246113ea565b6103a26105243660046126c7565b611403565b6105316114ca565b604051610331919061346f565b6104636114d3565b6104336114e2565b61036d61055c366004612596565b6114f1565b61036d61056f366004612596565b6116bd565b61036d610582366004612596565b611760565b61036d61059536600461276e565b6119b1565b610324611a5a565b610463611a60565b6103a2611a6f565b61036d611a7e565b61036d6105c8366004612596565b611a95565b610324611b40565b61036d6105e3366004612714565b611b46565b61036d6105f636600461276e565b611bb3565b600154600090610626906106199084906001600160a01b0316611cef565b6106216113c0565b611e1a565b92915050565b60095481565b6015545b90565b600d5481565b600e5481565b6000546001600160a01b031633146106785760405162461bcd60e51b815260040161066f90613334565b60405180910390fd5b6014805462ff0000191662010000831515021790556040517f30c218371e1a7a6f866468bad0b43039efd19a3cf2804f4ea9db21ae04693b41906106bd9083906131b8565b60405180910390a150565b600a5481565b3360006106db8282611e33565b6015546106ee908463ffffffff61200916565b6015553360009081526008602052604090206002810154610715908563ffffffff61200916565b60028201819055601454610732919060ff1663ffffffff61203116565b6001820155600354610754906001600160a01b0316338663ffffffff61206616565b336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58560405161078d91906133b2565b60405180910390a250505050565b600f5481565b600b5481565b600054600160a01b900460ff1681565b6000601554600014156107cd5750601154610636565b61083f610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b9063ffffffff61200916565b9063ffffffff61215416565b9063ffffffff61203116565b6011549063ffffffff61218e16565b905090565b6000546001600160a01b0316331461086e5760405162461bcd60e51b815260040161066f90613334565b600054600160a01b900460ff1615801561089057506001600160a01b038a1615155b80156108a457506001600160a01b03891615155b80156108b857506001600160a01b03881615155b80156108cc57506001600160a01b03871615155b80156108e057506001600160a01b03861615155b80156108f457506001600160a01b03851615155b80156109005750835115155b801561090c5750825115155b801561091b575060008260ff16115b801561092f57506001600160a01b03811615155b61094b5760405162461bcd60e51b815260040161066f90613364565b60008054600160a01b60ff60a01b19909116179055600580546001600160a01b03199081166001600160a01b039c8d16179091556006805482169a8c169a909a17909955600780548a16988b1698909817909755600180548916968a1696909617909555600280548816948916949094179093556003805487169288169290921790915551601255516013556014805460ff191660ff909216919091179055600480549092169216919091179055565b600c5481565b6002546000906106269083906001600160a01b0316611cef565b60105481565b60015460025460009183916001600160a01b038084169281168314929116148180610a495750805b610a655760405162461bcd60e51b815260040161066f90613304565b6001546000906001600160a01b03878116911614610a8557600a54610a89565b6009545b905080610a94610ed2565b10610a9f5780610aa7565b610aa7610ed2565b9450505b505050919050565b600060155460001415610ac95750601054610636565b61083f610619610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b6010549063ffffffff61218e16565b600061083f600b54600e5461215490919063ffffffff16565b6006546001600160a01b0316331480610b5657506007546001600160a01b031633145b610b725760405162461bcd60e51b815260040161066f90613224565b60015460025482916001600160a01b0380841691811682149216148180610b965750805b610bb25760405162461bcd60e51b815260040161066f90613304565b600084610bbf8282611e33565b6000600b5411610be15760405162461bcd60e51b815260040161066f90613354565b60015460009081906001600160a01b0389811691161415610d75576006546001600160a01b03163314610c265760405162461bcd60e51b815260040161066f90613344565b600954610c31610ed2565b10610c5257600b54610c4a908a9063ffffffff61203116565b600e55610ca1565b610c6c610c5d610ed2565b6009549063ffffffff61200916565b9150610c83600e548361215490919063ffffffff16565b600b54909150610c9d906108248b8463ffffffff61218e16565b600e555b600b546001546040516370a0823160e01b8152610d2792916001600160a01b0316906370a0823190610cd7903090600401613129565b60206040518083038186803b158015610cef57600080fd5b505afa158015610d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610824919081019061278c565b600e541115610d485760405162461bcd60e51b815260040161066f90613374565b610d62600b54610d56610ed2565b9063ffffffff61218e16565b600955610d6d610ed2565b600c55610e8e565b6007546001600160a01b03163314610d9f5760405162461bcd60e51b815260040161066f90613244565b600a54610daa610ed2565b10610dcb57600b54610dc3908a9063ffffffff61203116565b600f55610e1a565b610de5610dd6610ed2565b600a549063ffffffff61200916565b9150610dfc600f548361215490919063ffffffff16565b600b54909150610e16906108248b8463ffffffff61218e16565b600f555b600b546002546040516370a0823160e01b8152610e5092916001600160a01b0316906370a0823190610cd7903090600401613129565b600f541115610e715760405162461bcd60e51b815260040161066f90613314565b610e7f600b54610d56610ed2565b600a55610e8a610ed2565b600d555b7ffb5edb6eb340a01f6a67189edc978df97841c43752c212fc85995ea2300176358989604051610ebf9291906133c0565b60405180910390a1505050505050505050565b4290565b6005546001600160a01b031681565b6001600160a01b031660009081526008602052604090206002015490565b6000546001600160a01b03163314610f2d5760405162461bcd60e51b815260040161066f90613334565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6003546001600160a01b031681565b336000610f938282611e33565b6000610fa285610d5633610ee5565b33600090815260086020526040902080549192509015610fdc5780548514610fdc5760405162461bcd60e51b815260040161066f90613254565b60145460ff16610ffe5760405162461bcd60e51b815260040161066f90613234565b60145460009061101890849060ff1663ffffffff61203116565b9050611025338288611403565b6110415760405162461bcd60e51b815260040161066f906131d4565b815461104b578582555b600182018190556002820154611067908863ffffffff61218e16565b600283015560155461107f908863ffffffff61218e16565b6015556003546110a0906001600160a01b031633308a63ffffffff6121b316565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516110d991906133b2565b60405180910390a250505050505050565b6002546001600160a01b031681565b601454610100900460ff1681565b60125481565b6000546001600160a01b031633146111375760405162461bcd60e51b815260040161066f90613334565b6001546001600160a01b03838116911614801561115657506000600b54115b15611219576001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061118c903090600401613129565b60206040518083038186803b1580156111a457600080fd5b505afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111dc919081019061278c565b600b549091506111f690610824838563ffffffff61200916565b600e5411156112175760405162461bcd60e51b815260040161066f90613394565b505b6003546001600160a01b0383811691161480159061124557506002546001600160a01b03838116911614155b6112615760405162461bcd60e51b815260040161066f90613294565b61128361126c6112c0565b6001600160a01b038416908363ffffffff61206616565b7f505b28e6941631badc363841ecbf8e1214b9379c643936458e87be718e15799982826040516112b492919061319d565b60405180910390a15050565b6000546001600160a01b031690565b6007546001600160a01b031633146112f95760405162461bcd60e51b815260040161066f906132f4565b6007546001600160a01b03828116911614156113275760405162461bcd60e51b815260040161066f906132d4565b600780546001600160a01b0319166001600160a01b0383161790556040517fa5980cc016ca7b243fcd49a5a2110c5c2cee36a5acf75bb343de641bf79d1994906106bd908390613129565b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154905089565b6113c8612415565b61083f6113d36122a4565b6012546122c6565b6006546001600160a01b031681565b600061083f600b54600f5461215490919063ffffffff16565b600061140d612428565b6004805460405163eb02c30160e01b81526001600160a01b039091169163eb02c3019161143c918791016133b2565b60a06040518083038186803b15801561145457600080fd5b505afa158015611468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061148c9190810190612750565b9050846001600160a01b031681600001516001600160a01b0316146114b55760009150506114c3565b604001516020015183111590505b9392505050565b60145460ff1681565b6001546001600160a01b031681565b6007546001600160a01b031681565b8060006114fe8282611e33565b6001600160a01b0383166000908152600860205260408120601454909190819062010000900460ff16806115395750601454610100900460ff165b6115555760405162461bcd60e51b815260040161066f90613384565b60145462010000900460ff16156115b9576008830154600684015461157f9163ffffffff61200916565b6008840154909150611597908263ffffffff61218e16565b60088401556002546115b9906001600160a01b0316878363ffffffff61206616565b601454610100900460ff161561167257600783015460058401546115e29163ffffffff61200916565b60078401549092506115fa908363ffffffff61218e16565b60078401556040805160208101909152601254815260009061161d908490611e1a565b600554600154919250611643916001600160a01b0390811691168363ffffffff61206616565b61167087611657858463ffffffff61200916565b6001546001600160a01b0316919063ffffffff61206616565b505b856001600160a01b03167fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f5183836040516116ad9291906133db565b60405180910390a2505050505050565b6000546001600160a01b031633146116e75760405162461bcd60e51b815260040161066f90613334565b6006546001600160a01b03828116911614156117155760405162461bcd60e51b815260040161066f906132d4565b600680546001600160a01b0319166001600160a01b0383161790556040517f824e31e09d4608742fcb7f21dce6d7cee255bd3de48a2a1490d9bcad42092847906106bd908390613129565b80600061176d8282611e33565b6001600160a01b0383163314156117965760405162461bcd60e51b815260040161066f906132b4565b60006117a0610ed2565b90506009548110806117b35750600a5481105b6117cf5760405162461bcd60e51b815260040161066f906131e4565b6001600160a01b0384166000908152600860205260409020600181015481546117f9918791611403565b156118165760405162461bcd60e51b815260040161066f906132a4565b60006118338260070154836005015461200990919063ffffffff16565b60408051602081019091526013548152909150600090611854908390611e1a565b905060006118738460080154856006015461200990919063ffffffff16565b33600090815260086020526040902060050154909150611899908363ffffffff61218e16565b3360009081526008602052604090206005810191909155600601546118c4908263ffffffff61218e16565b336000908152600860205260409020600601556119146118ea848463ffffffff61200916565b6006546001600160a01b03166000908152600860205260409020600501549063ffffffff61218e16565b6006546001600160a01b0316600090815260086020526040902060059081019190915584015461194a908463ffffffff61200916565b60058501556006840154611964908263ffffffff61200916565b60068501556040517f44d3b6c4ee455b8799ef3f69bac5716b9226683bfd39f54e01fb9baf80bfa7f59061199f908a90339087908690613137565b60405180910390a15050505050505050565b6000546001600160a01b031633146119db5760405162461bcd60e51b815260040161066f90613334565b6000600a54600954116119f057600a546119f4565b6009545b9050801580611a09575080611a07610ed2565b115b611a255760405162461bcd60e51b815260040161066f906132c4565b600b8290556040517ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d3906112b49084906133b2565b60135481565b6004546001600160a01b031681565b60145462010000900460ff1681565b611a87336114f1565b611a9361038533610ee5565b565b6000546001600160a01b03163314611abf5760405162461bcd60e51b815260040161066f90613334565b6001600160a01b038116611ae55760405162461bcd60e51b815260040161066f90613204565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b6000546001600160a01b03163314611b705760405162461bcd60e51b815260040161066f90613334565b6014805461ff001916610100831515021790556040517f9e9c6629f80449dcfd37495f5298443a9429e9cd4380acdbe7bf0a4a372808f5906106bd9083906131b8565b6007546001600160a01b03163314611bdd5760405162461bcd60e51b815260040161066f906132f4565b600b5415611ca3576002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611c16903090600401613129565b60206040518083038186803b158015611c2e57600080fd5b505afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c66919081019061278c565b600b54909150611c8090610824838563ffffffff61200916565b600f541115611ca15760405162461bcd60e51b815260040161066f90613394565b505b600254611cc0906001600160a01b0316338363ffffffff61206616565b7fabd364c2d6134187b55f0d7302022dc5db2cb14cd6f6f2e33752d641e09a108c816040516106bd91906133b2565b60015460025460009183916001600160a01b038084169281168314929116148180611d175750805b611d335760405162461bcd60e51b815260040161066f90613304565b6001600160a01b03808716600090815260086020526040902060020154600154909187811691161415611dc1576001600160a01b0380881660009081526008602052604090206005810154600390910154600154611db993610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b869063ffffffff61215416565b945050611e11565b6001600160a01b0380881660009081526008602052604090206006810154600490910154600254611e0d93610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b9450505b50505092915050565b60006114c3838360000151670de0b6b3a76400006123f7565b6001600160a01b0381161580611e5657506001546001600160a01b038281169116145b80611e6e57506002546001600160a01b038281169116145b611e8a5760405162461bcd60e51b815260040161066f90613264565b6001600160a01b038116611efd57600154611ead906001600160a01b03166122f6565b601055600254611ec5906001600160a01b03166122f6565b601155600154611edd906001600160a01b0316610a21565b600c55600254611ef5906001600160a01b0316610a21565b600d55611f79565b6001546001600160a01b0382811691161415611f4857600154611f28906001600160a01b03166122f6565b601055600154611f40906001600160a01b0316610a21565b600c55611f79565b600254611f5d906001600160a01b03166122f6565b601155600254611f75906001600160a01b0316610a21565b600d555b6001600160a01b0382161561200557600154611f9f9083906001600160a01b0316611cef565b6001600160a01b0380841660009081526008602052604090206005810192909255601054600390920191909155600254611fdb91849116611cef565b6001600160a01b038316600090815260086020526040902060068101919091556011546004909101555b5050565b60008282111561202b5760405162461bcd60e51b815260040161066f90613274565b50900390565b60008082116120525760405162461bcd60e51b815260040161066f90613284565b600082848161205d57fe5b04949350505050565b60006060846001600160a01b031663a9059cbb858560405160240161208c92919061319d565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516120c5919061311d565b6000604051808303816000865af19150503d8060008114612102576040519150601f19603f3d011682016040523d82523d6000602084013e612107565b606091505b50915091508180156121315750805115806121315750808060200190516121319190810190612732565b61214d5760405162461bcd60e51b815260040161066f906131f4565b5050505050565b60008261216357506000610626565b8282028284828161217057fe5b04146114c35760405162461bcd60e51b815260040161066f90613324565b6000828201838110156114c35760405162461bcd60e51b815260040161066f90613214565b60006060856001600160a01b03166323b872dd8686866040516024016121db93929190613175565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612214919061311d565b6000604051808303816000865af19150503d8060008114612251576040519150601f19603f3d011682016040523d82523d6000602084013e612256565b606091505b50915091508180156122805750805115806122805750808060200190516122809190810190612732565b61229c5760405162461bcd60e51b815260040161066f906132e4565b505050505050565b6122ac612415565b506040805160208101909152670de0b6b3a7640000815290565b6122ce612415565b6040805160208101909152835181906122ed908563ffffffff61200916565b90529392505050565b60015460025460009183916001600160a01b03808416928116831492911614818061231e5750805b61233a5760405162461bcd60e51b815260040161066f90613304565b6001546001600160a01b03868116911614156123a757601554612361576010549350610aab565b6123a0610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b9350610aab565b6015546123b8576011549350610aab565b6123a0610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b600061240d82610824868663ffffffff61215416565b949350505050565b6040518060200160405280600081525090565b604051806060016040528060006001600160a01b0316815260200161244b61245d565b815260200161245861245d565b905290565b604080518082019091526000808252602082015290565b803561062681613516565b805161062681613516565b80356106268161352d565b80516106268161352d565b6000602082840312156124b257600080fd5b6124bc602061347d565b905060006124ca8484612575565b82525092915050565b600060a082840312156124e557600080fd5b6124ef606061347d565b905060006124fd848461247f565b825250602061250e8484830161252e565b60208301525060606125228482850161252e565b60408301525092915050565b60006040828403121561254057600080fd5b61254a604061347d565b905060006125588484612495565b825250602061256984848301612580565b60208301525092915050565b803561062681613536565b805161062681613536565b80356106268161353f565b6000602082840312156125a857600080fd5b600061240d8484612474565b6000806000806000806000806000806101408b8d0312156125d457600080fd5b60006125e08d8d612474565b9a505060206125f18d828e01612474565b99505060406126028d828e01612474565b98505060606126138d828e01612474565b97505060806126248d828e01612474565b96505060a06126358d828e01612474565b95505060c06126468d828e016124a0565b94505060e06126578d828e016124a0565b9350506101006126698d828e0161258b565b92505061012061267b8d828e01612474565b9150509295989b9194979a5092959850565b600080604083850312156126a057600080fd5b60006126ac8585612474565b92505060206126bd85828601612575565b9150509250929050565b6000806000606084860312156126dc57600080fd5b60006126e88686612474565b93505060206126f986828701612575565b925050604061270a86828701612575565b9150509250925092565b60006020828403121561272657600080fd5b600061240d848461248a565b60006020828403121561274457600080fd5b600061240d8484612495565b600060a0828403121561276257600080fd5b600061240d84846124d3565b60006020828403121561278057600080fd5b600061240d8484612575565b60006020828403121561279e57600080fd5b600061240d8484612580565b600080604083850312156127bd57600080fd5b60006127c98585612575565b92505060206126bd85828601612474565b600080604083850312156127ed57600080fd5b60006126ac8585612575565b612802816134d8565b82525050565b612802816134b6565b612802816134c1565b6000612825826134a4565b61282f81856134a8565b935061283f8185602086016134ea565b9290920192915050565b612802816134df565b600061285f6016836134ad565b7526bab9ba1031329030903b30b634b21036b4b73a32b960511b815260200192915050565b60006128916028836134ad565b7f596f752063616e6e6f7420736c6173682061667465722074686520726577617281526719081c195c9a5bd960c21b602082015260400192915050565b60006128db601a836134ad565b7f5361666545524332303a205452414e534645525f4641494c4544000000000000815260200192915050565b60006129146026836134ad565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061295c601b836134ad565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006129956022836134ad565b7f43616c6c6572206973206e6f742061207265776172642064697374726962757481526137b960f11b602082015260400192915050565b60006129d96023836134ad565b7f546865207374616b6520746f206465627420726174696f2063616e6e6f74206281526206520360ec1b602082015260400192915050565b6000612a1e604b836134ad565b7f4f6e6c792074686520636f6c6c6162207265776172647320646973747269627581527f746f722063616e206e6f746966792074686520616d6f756e74206f6620636f6c60208201526a6c6162207265776172647360a81b604082015260600192915050565b6000612a916033836134ad565b7f596f752063616e6e6f74207374616b65206261736564206f6e2061206469666681527232b932b73a103232b13a103837b9b4ba34b7b760691b602082015260400192915050565b6000612ae66038836134ad565b7f5468652072657761726420746f6b656e2063616e20656974686572206265203081527f206f7220612076616c69642072657761726420746f6b656e0000000000000000602082015260400192915050565b6000612b45601e836134ad565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b6000612b7e601a836134ad565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000815260200192915050565b6000612bb76033836134ad565b7f43616e6e6f7420776974686472617720746865207374616b696e67206f7220638152726f6c6c61622072657761726420746f6b656e7360681b602082015260400192915050565b6000612c0c602c836134ad565b7f596f752063616e277420736c617368206120757365722077686f20697320612081526b3b30b634b21036b4b73a32b960a11b602082015260400192915050565b6000612c5a6019836134ad565b7f596f752063616e6e6f7420736c61736820796f757273656c6600000000000000815260200192915050565b6000612c936044836134ad565b7f5072657620706572696f64206d75737420626520636f6d706c6574652062656681527f6f7265206368616e67696e67206475726174696f6e20666f72206e65772070656020820152631c9a5bd960e21b604082015260600192915050565b6000612cff6027836134ad565b7f43616e6e6f7420736574207468652073616d65207265776172647320646973748152663934b13aba37b960c91b602082015260400192915050565b6000612d48601f836134ad565b7f5361666545524332303a205452414e534645525f46524f4d5f4641494c454400815260200192915050565b6000612d81602c836134ad565b7f43616c6c6572206973206e6f742074686520636f6c6c6162207265776172647381526b103234b9ba3934b13aba37b960a11b602082015260400192915050565b6000612dcf604a836134ad565b7f5468652072657761726420746f6b656e206164647265737320646f6573206e6f81527f7420636f72726573706f6e6420746f206f6e65206f66207468652072657761726020820152693239903a37b5b2b7399760b11b604082015260600192915050565b6000612e416038836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f722074686581527f2062616c616e6365206f6620636f6c6c616220746f6b656e0000000000000000602082015260400192915050565b6000612ea06021836134ad565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612ee36020836134ad565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612f1c6047836134ad565b7f4f6e6c792074686520415243782072657761726473206469737472696275746f81527f722063616e206e6f746966792074686520616d6f756e74206f662041524378206020820152667265776172647360c81b604082015260600192915050565b6000612f8b601b836134ad565b7f52657761726473206475726174696f6e206973206e6f74207365740000000000815260200192915050565b6000612fc4601b836134ad565b7f4f6e65206f72206d6f72652076616c75657320697320656d7074790000000000815260200192915050565b6000612ffd6036836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f7220746865815275103130b630b731b29037b31020a921bc103a37b5b2b760511b602082015260400192915050565b6000613055602b836134ad565b7f4174206c65617374206f6e652072657761726420746f6b656e206d757374206281526a6520636c61696d61626c6560a81b602082015260400192915050565b60006130a26039836134ad565b7f4f6e6c792074686520737572706c7573206f662074686520726577617264206381527f616e206265207265636f76657265642c206e6f74206d6f726500000000000000602082015260400192915050565b80516020830190613105848261310b565b50505050565b61280281610636565b612802816134d2565b60006114c3828461281a565b602081016106268284612808565b608081016131458287612808565b61315260208301866127f9565b61315f604083018561310b565b61316c606083018461310b565b95945050505050565b606081016131838286612808565b6131906020830185612808565b61240d604083018461310b565b604081016131ab8285612808565b6114c3602083018461310b565b602081016106268284612811565b602081016106268284612849565b6020808252810161062681612852565b6020808252810161062681612884565b60208082528101610626816128ce565b6020808252810161062681612907565b602080825281016106268161294f565b6020808252810161062681612988565b60208082528101610626816129cc565b6020808252810161062681612a11565b6020808252810161062681612a84565b6020808252810161062681612ad9565b6020808252810161062681612b38565b6020808252810161062681612b71565b6020808252810161062681612baa565b6020808252810161062681612bff565b6020808252810161062681612c4d565b6020808252810161062681612c86565b6020808252810161062681612cf2565b6020808252810161062681612d3b565b6020808252810161062681612d74565b6020808252810161062681612dc2565b6020808252810161062681612e34565b6020808252810161062681612e93565b6020808252810161062681612ed6565b6020808252810161062681612f0f565b6020808252810161062681612f7e565b6020808252810161062681612fb7565b6020808252810161062681612ff0565b6020808252810161062681613048565b6020808252810161062681613095565b6020810161062682846130f4565b60208101610626828461310b565b604081016133ce828561310b565b6114c36020830184612808565b604081016131ab828561310b565b61012081016133f8828c61310b565b613405602083018b61310b565b613412604083018a61310b565b61341f606083018961310b565b61342c608083018861310b565b61343960a083018761310b565b61344660c083018661310b565b61345360e083018561310b565b61346161010083018461310b565b9a9950505050505050505050565b602081016106268284613114565b60405181810167ffffffffffffffff8111828210171561349c57600080fd5b604052919050565b5190565b919050565b90815260200190565b6000610626826134c6565b151590565b6001600160a01b031690565b60ff1690565b6000610626825b6000610626826134b6565b60005b838110156135055781810151838201526020016134ed565b838111156131055750506000910152565b61351f816134b6565b811461352a57600080fd5b50565b61351f816134c1565b61351f81610636565b61351f816134d256fea365627a7a723158201638b185845030a9b86bc643871b7594d2bc7db91529f1a2ee9e725f07c8c2a06c6578706572696d656e74616cf564736f6c63430005100040
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.