Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 327 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 12692268 | 1294 days ago | IN | 0 ETH | 0.00295606 | ||||
Get Reward | 12692266 | 1294 days ago | IN | 0 ETH | 0.00219396 | ||||
Get Reward | 12692262 | 1294 days ago | IN | 0 ETH | 0.0065746 | ||||
Get Reward | 12644030 | 1301 days ago | IN | 0 ETH | 0.00120568 | ||||
Exit | 12644006 | 1301 days ago | IN | 0 ETH | 0.00398341 | ||||
Get Reward | 12631398 | 1303 days ago | IN | 0 ETH | 0.00208255 | ||||
Exit | 12613464 | 1306 days ago | IN | 0 ETH | 0.00251265 | ||||
Get Reward | 12613457 | 1306 days ago | IN | 0 ETH | 0.00175516 | ||||
Get Reward | 12606637 | 1307 days ago | IN | 0 ETH | 0.00120568 | ||||
Get Reward | 12605813 | 1307 days ago | IN | 0 ETH | 0.0014249 | ||||
Get Reward | 12600845 | 1308 days ago | IN | 0 ETH | 0.00208255 | ||||
Get Reward | 12594602 | 1309 days ago | IN | 0 ETH | 0.00590787 | ||||
Get Reward | 12594467 | 1309 days ago | IN | 0 ETH | 0.0054804 | ||||
Get Reward | 12586577 | 1310 days ago | IN | 0 ETH | 0.00164412 | ||||
Exit | 12584029 | 1311 days ago | IN | 0 ETH | 0.00162583 | ||||
Get Reward | 12584024 | 1311 days ago | IN | 0 ETH | 0.00323983 | ||||
Exit | 12551600 | 1316 days ago | IN | 0 ETH | 0.0072456 | ||||
Exit | 12507982 | 1322 days ago | IN | 0 ETH | 0.00546871 | ||||
Get Reward | 12507648 | 1322 days ago | IN | 0 ETH | 0.01166486 | ||||
Exit | 12484551 | 1326 days ago | IN | 0 ETH | 0.00535882 | ||||
Get Reward | 12484529 | 1326 days ago | IN | 0 ETH | 0.01258388 | ||||
Exit | 12451741 | 1331 days ago | IN | 0 ETH | 0.02017592 | ||||
Get Reward | 12444618 | 1332 days ago | IN | 0 ETH | 0.00569961 | ||||
Get Reward | 12441201 | 1333 days ago | IN | 0 ETH | 0.00783414 | ||||
Withdraw | 12438355 | 1333 days ago | IN | 0 ETH | 0.00593315 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xE24D8969...a6494d868 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
JointCampaign
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
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"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061030c5760003560e01c806381c7adf21161019d578063b846bc06116100e9578063db5f30e1116100a2578063f2fde38b1161007c578063f2fde38b146105ba578063f6712e2e146105cd578063f6af38dd146105d5578063fe4caff3146105e85761030c565b8063db5f30e1146105a2578063e7878c33146105aa578063e9fad8ee146105b25761030c565b8063b846bc0614610546578063c00007b01461054e578063c1928ba014610561578063c96be4cb14610574578063cc1a378f14610587578063cd2d79081461059a5761030c565b80639168ae72116101565780639c577dbb116101305780639c577dbb1461050e5780639c833ffa14610516578063b3287aa514610529578063b483cb5c1461053e5761030c565b80639168ae72146104c95780639af71b79146104f15780639b922351146105065761030c565b806381c7adf214610483578063860a09981461048b578063886140be146104935780638980f11f1461049b5780638da5cb5b146104ae5780638ffa7a32146104b65761030c565b806346a0b48f1161025c57806368d53c431161021557806370a08231116101ef57806370a0823114610440578063715018a61461045357806372f702f31461045b5780637b0472f0146104705761030c565b806368d53c43146104105780636c9230db146104235780636d156ef21461042b5761030c565b806346a0b48f146103ca578063541140af146103d25780635bd92439146103e5578063638634ee146103ed57806366f7cd351461040057806367abfefc146104085761030c565b8063265e214d116102c9578063386a9525116102a3578063386a952514610392578063392e53cd1461039a57806344b8ad08146103af578063463e9a00146103b75761030c565b8063265e214d1461036f5780632e1a7d4d1461037757806334960a251461038a5761030c565b8063038c9634146103115780630e3764c11461033a57806318160ddd14610342578063241a09fc1461034a578063258e9bb01461035257806325df1dc51461035a575b600080fd5b61032461031f366004612596565b6105fb565b60405161033191906133b2565b60405180910390f35b61032461062c565b610324610632565b610324610639565b61032461063f565b61036d610368366004612714565b610645565b005b6103246106c8565b61036d61038536600461276e565b6106ce565b61032461079b565b6103246107a1565b6103a26107a7565b60405161033191906131b8565b6103246107b7565b61036d6103c53660046125b4565b610844565b6103246109fb565b6103246103e0366004612596565b610a01565b610324610a1b565b6103246103fb366004612596565b610a21565b610324610ab3565b610324610b1a565b61036d61041e3660046127aa565b610b33565b610324610ed2565b610433610ed6565b6040516103319190613129565b61032461044e366004612596565b610ee5565b61036d610f03565b610463610f77565b60405161033191906131c6565b61036d61047e3660046127da565b610f86565b6104636110ea565b6103a26110f9565b610324611107565b61036d6104a936600461268d565b61110d565b6104336112c0565b61036d6104c4366004612596565b6112cf565b6104dc6104d7366004612596565b611372565b604051610331999897969594939291906133e9565b6104f96113c0565b60405161033191906133a4565b6104336113db565b6103246113ea565b6103a26105243660046126c7565b611403565b6105316114ca565b604051610331919061346f565b6104636114d3565b6104336114e2565b61036d61055c366004612596565b6114f1565b61036d61056f366004612596565b6116bd565b61036d610582366004612596565b611760565b61036d61059536600461276e565b6119b1565b610324611a5a565b610463611a60565b6103a2611a6f565b61036d611a7e565b61036d6105c8366004612596565b611a95565b610324611b40565b61036d6105e3366004612714565b611b46565b61036d6105f636600461276e565b611bb3565b600154600090610626906106199084906001600160a01b0316611cef565b6106216113c0565b611e1a565b92915050565b60095481565b6015545b90565b600d5481565b600e5481565b6000546001600160a01b031633146106785760405162461bcd60e51b815260040161066f90613334565b60405180910390fd5b6014805462ff0000191662010000831515021790556040517f30c218371e1a7a6f866468bad0b43039efd19a3cf2804f4ea9db21ae04693b41906106bd9083906131b8565b60405180910390a150565b600a5481565b3360006106db8282611e33565b6015546106ee908463ffffffff61200916565b6015553360009081526008602052604090206002810154610715908563ffffffff61200916565b60028201819055601454610732919060ff1663ffffffff61203116565b6001820155600354610754906001600160a01b0316338663ffffffff61206616565b336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58560405161078d91906133b2565b60405180910390a250505050565b600f5481565b600b5481565b600054600160a01b900460ff1681565b6000601554600014156107cd5750601154610636565b61083f610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b9063ffffffff61200916565b9063ffffffff61215416565b9063ffffffff61203116565b6011549063ffffffff61218e16565b905090565b6000546001600160a01b0316331461086e5760405162461bcd60e51b815260040161066f90613334565b600054600160a01b900460ff1615801561089057506001600160a01b038a1615155b80156108a457506001600160a01b03891615155b80156108b857506001600160a01b03881615155b80156108cc57506001600160a01b03871615155b80156108e057506001600160a01b03861615155b80156108f457506001600160a01b03851615155b80156109005750835115155b801561090c5750825115155b801561091b575060008260ff16115b801561092f57506001600160a01b03811615155b61094b5760405162461bcd60e51b815260040161066f90613364565b60008054600160a01b60ff60a01b19909116179055600580546001600160a01b03199081166001600160a01b039c8d16179091556006805482169a8c169a909a17909955600780548a16988b1698909817909755600180548916968a1696909617909555600280548816948916949094179093556003805487169288169290921790915551601255516013556014805460ff191660ff909216919091179055600480549092169216919091179055565b600c5481565b6002546000906106269083906001600160a01b0316611cef565b60105481565b60015460025460009183916001600160a01b038084169281168314929116148180610a495750805b610a655760405162461bcd60e51b815260040161066f90613304565b6001546000906001600160a01b03878116911614610a8557600a54610a89565b6009545b905080610a94610ed2565b10610a9f5780610aa7565b610aa7610ed2565b9450505b505050919050565b600060155460001415610ac95750601054610636565b61083f610619610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b6010549063ffffffff61218e16565b600061083f600b54600e5461215490919063ffffffff16565b6006546001600160a01b0316331480610b5657506007546001600160a01b031633145b610b725760405162461bcd60e51b815260040161066f90613224565b60015460025482916001600160a01b0380841691811682149216148180610b965750805b610bb25760405162461bcd60e51b815260040161066f90613304565b600084610bbf8282611e33565b6000600b5411610be15760405162461bcd60e51b815260040161066f90613354565b60015460009081906001600160a01b0389811691161415610d75576006546001600160a01b03163314610c265760405162461bcd60e51b815260040161066f90613344565b600954610c31610ed2565b10610c5257600b54610c4a908a9063ffffffff61203116565b600e55610ca1565b610c6c610c5d610ed2565b6009549063ffffffff61200916565b9150610c83600e548361215490919063ffffffff16565b600b54909150610c9d906108248b8463ffffffff61218e16565b600e555b600b546001546040516370a0823160e01b8152610d2792916001600160a01b0316906370a0823190610cd7903090600401613129565b60206040518083038186803b158015610cef57600080fd5b505afa158015610d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610824919081019061278c565b600e541115610d485760405162461bcd60e51b815260040161066f90613374565b610d62600b54610d56610ed2565b9063ffffffff61218e16565b600955610d6d610ed2565b600c55610e8e565b6007546001600160a01b03163314610d9f5760405162461bcd60e51b815260040161066f90613244565b600a54610daa610ed2565b10610dcb57600b54610dc3908a9063ffffffff61203116565b600f55610e1a565b610de5610dd6610ed2565b600a549063ffffffff61200916565b9150610dfc600f548361215490919063ffffffff16565b600b54909150610e16906108248b8463ffffffff61218e16565b600f555b600b546002546040516370a0823160e01b8152610e5092916001600160a01b0316906370a0823190610cd7903090600401613129565b600f541115610e715760405162461bcd60e51b815260040161066f90613314565b610e7f600b54610d56610ed2565b600a55610e8a610ed2565b600d555b7ffb5edb6eb340a01f6a67189edc978df97841c43752c212fc85995ea2300176358989604051610ebf9291906133c0565b60405180910390a1505050505050505050565b4290565b6005546001600160a01b031681565b6001600160a01b031660009081526008602052604090206002015490565b6000546001600160a01b03163314610f2d5760405162461bcd60e51b815260040161066f90613334565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6003546001600160a01b031681565b336000610f938282611e33565b6000610fa285610d5633610ee5565b33600090815260086020526040902080549192509015610fdc5780548514610fdc5760405162461bcd60e51b815260040161066f90613254565b60145460ff16610ffe5760405162461bcd60e51b815260040161066f90613234565b60145460009061101890849060ff1663ffffffff61203116565b9050611025338288611403565b6110415760405162461bcd60e51b815260040161066f906131d4565b815461104b578582555b600182018190556002820154611067908863ffffffff61218e16565b600283015560155461107f908863ffffffff61218e16565b6015556003546110a0906001600160a01b031633308a63ffffffff6121b316565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516110d991906133b2565b60405180910390a250505050505050565b6002546001600160a01b031681565b601454610100900460ff1681565b60125481565b6000546001600160a01b031633146111375760405162461bcd60e51b815260040161066f90613334565b6001546001600160a01b03838116911614801561115657506000600b54115b15611219576001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061118c903090600401613129565b60206040518083038186803b1580156111a457600080fd5b505afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111dc919081019061278c565b600b549091506111f690610824838563ffffffff61200916565b600e5411156112175760405162461bcd60e51b815260040161066f90613394565b505b6003546001600160a01b0383811691161480159061124557506002546001600160a01b03838116911614155b6112615760405162461bcd60e51b815260040161066f90613294565b61128361126c6112c0565b6001600160a01b038416908363ffffffff61206616565b7f505b28e6941631badc363841ecbf8e1214b9379c643936458e87be718e15799982826040516112b492919061319d565b60405180910390a15050565b6000546001600160a01b031690565b6007546001600160a01b031633146112f95760405162461bcd60e51b815260040161066f906132f4565b6007546001600160a01b03828116911614156113275760405162461bcd60e51b815260040161066f906132d4565b600780546001600160a01b0319166001600160a01b0383161790556040517fa5980cc016ca7b243fcd49a5a2110c5c2cee36a5acf75bb343de641bf79d1994906106bd908390613129565b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154905089565b6113c8612415565b61083f6113d36122a4565b6012546122c6565b6006546001600160a01b031681565b600061083f600b54600f5461215490919063ffffffff16565b600061140d612428565b6004805460405163eb02c30160e01b81526001600160a01b039091169163eb02c3019161143c918791016133b2565b60a06040518083038186803b15801561145457600080fd5b505afa158015611468573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061148c9190810190612750565b9050846001600160a01b031681600001516001600160a01b0316146114b55760009150506114c3565b604001516020015183111590505b9392505050565b60145460ff1681565b6001546001600160a01b031681565b6007546001600160a01b031681565b8060006114fe8282611e33565b6001600160a01b0383166000908152600860205260408120601454909190819062010000900460ff16806115395750601454610100900460ff165b6115555760405162461bcd60e51b815260040161066f90613384565b60145462010000900460ff16156115b9576008830154600684015461157f9163ffffffff61200916565b6008840154909150611597908263ffffffff61218e16565b60088401556002546115b9906001600160a01b0316878363ffffffff61206616565b601454610100900460ff161561167257600783015460058401546115e29163ffffffff61200916565b60078401549092506115fa908363ffffffff61218e16565b60078401556040805160208101909152601254815260009061161d908490611e1a565b600554600154919250611643916001600160a01b0390811691168363ffffffff61206616565b61167087611657858463ffffffff61200916565b6001546001600160a01b0316919063ffffffff61206616565b505b856001600160a01b03167fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f5183836040516116ad9291906133db565b60405180910390a2505050505050565b6000546001600160a01b031633146116e75760405162461bcd60e51b815260040161066f90613334565b6006546001600160a01b03828116911614156117155760405162461bcd60e51b815260040161066f906132d4565b600680546001600160a01b0319166001600160a01b0383161790556040517f824e31e09d4608742fcb7f21dce6d7cee255bd3de48a2a1490d9bcad42092847906106bd908390613129565b80600061176d8282611e33565b6001600160a01b0383163314156117965760405162461bcd60e51b815260040161066f906132b4565b60006117a0610ed2565b90506009548110806117b35750600a5481105b6117cf5760405162461bcd60e51b815260040161066f906131e4565b6001600160a01b0384166000908152600860205260409020600181015481546117f9918791611403565b156118165760405162461bcd60e51b815260040161066f906132a4565b60006118338260070154836005015461200990919063ffffffff16565b60408051602081019091526013548152909150600090611854908390611e1a565b905060006118738460080154856006015461200990919063ffffffff16565b33600090815260086020526040902060050154909150611899908363ffffffff61218e16565b3360009081526008602052604090206005810191909155600601546118c4908263ffffffff61218e16565b336000908152600860205260409020600601556119146118ea848463ffffffff61200916565b6006546001600160a01b03166000908152600860205260409020600501549063ffffffff61218e16565b6006546001600160a01b0316600090815260086020526040902060059081019190915584015461194a908463ffffffff61200916565b60058501556006840154611964908263ffffffff61200916565b60068501556040517f44d3b6c4ee455b8799ef3f69bac5716b9226683bfd39f54e01fb9baf80bfa7f59061199f908a90339087908690613137565b60405180910390a15050505050505050565b6000546001600160a01b031633146119db5760405162461bcd60e51b815260040161066f90613334565b6000600a54600954116119f057600a546119f4565b6009545b9050801580611a09575080611a07610ed2565b115b611a255760405162461bcd60e51b815260040161066f906132c4565b600b8290556040517ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d3906112b49084906133b2565b60135481565b6004546001600160a01b031681565b60145462010000900460ff1681565b611a87336114f1565b611a9361038533610ee5565b565b6000546001600160a01b03163314611abf5760405162461bcd60e51b815260040161066f90613334565b6001600160a01b038116611ae55760405162461bcd60e51b815260040161066f90613204565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b6000546001600160a01b03163314611b705760405162461bcd60e51b815260040161066f90613334565b6014805461ff001916610100831515021790556040517f9e9c6629f80449dcfd37495f5298443a9429e9cd4380acdbe7bf0a4a372808f5906106bd9083906131b8565b6007546001600160a01b03163314611bdd5760405162461bcd60e51b815260040161066f906132f4565b600b5415611ca3576002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611c16903090600401613129565b60206040518083038186803b158015611c2e57600080fd5b505afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c66919081019061278c565b600b54909150611c8090610824838563ffffffff61200916565b600f541115611ca15760405162461bcd60e51b815260040161066f90613394565b505b600254611cc0906001600160a01b0316338363ffffffff61206616565b7fabd364c2d6134187b55f0d7302022dc5db2cb14cd6f6f2e33752d641e09a108c816040516106bd91906133b2565b60015460025460009183916001600160a01b038084169281168314929116148180611d175750805b611d335760405162461bcd60e51b815260040161066f90613304565b6001600160a01b03808716600090815260086020526040902060020154600154909187811691161415611dc1576001600160a01b0380881660009081526008602052604090206005810154600390910154600154611db993610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b869063ffffffff61215416565b945050611e11565b6001600160a01b0380881660009081526008602052604090206006810154600490910154600254611e0d93610d5692670de0b6b3a76400009261082492611dac929161080c91166122f6565b9450505b50505092915050565b60006114c3838360000151670de0b6b3a76400006123f7565b6001600160a01b0381161580611e5657506001546001600160a01b038281169116145b80611e6e57506002546001600160a01b038281169116145b611e8a5760405162461bcd60e51b815260040161066f90613264565b6001600160a01b038116611efd57600154611ead906001600160a01b03166122f6565b601055600254611ec5906001600160a01b03166122f6565b601155600154611edd906001600160a01b0316610a21565b600c55600254611ef5906001600160a01b0316610a21565b600d55611f79565b6001546001600160a01b0382811691161415611f4857600154611f28906001600160a01b03166122f6565b601055600154611f40906001600160a01b0316610a21565b600c55611f79565b600254611f5d906001600160a01b03166122f6565b601155600254611f75906001600160a01b0316610a21565b600d555b6001600160a01b0382161561200557600154611f9f9083906001600160a01b0316611cef565b6001600160a01b0380841660009081526008602052604090206005810192909255601054600390920191909155600254611fdb91849116611cef565b6001600160a01b038316600090815260086020526040902060068101919091556011546004909101555b5050565b60008282111561202b5760405162461bcd60e51b815260040161066f90613274565b50900390565b60008082116120525760405162461bcd60e51b815260040161066f90613284565b600082848161205d57fe5b04949350505050565b60006060846001600160a01b031663a9059cbb858560405160240161208c92919061319d565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516120c5919061311d565b6000604051808303816000865af19150503d8060008114612102576040519150601f19603f3d011682016040523d82523d6000602084013e612107565b606091505b50915091508180156121315750805115806121315750808060200190516121319190810190612732565b61214d5760405162461bcd60e51b815260040161066f906131f4565b5050505050565b60008261216357506000610626565b8282028284828161217057fe5b04146114c35760405162461bcd60e51b815260040161066f90613324565b6000828201838110156114c35760405162461bcd60e51b815260040161066f90613214565b60006060856001600160a01b03166323b872dd8686866040516024016121db93929190613175565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612214919061311d565b6000604051808303816000865af19150503d8060008114612251576040519150601f19603f3d011682016040523d82523d6000602084013e612256565b606091505b50915091508180156122805750805115806122805750808060200190516122809190810190612732565b61229c5760405162461bcd60e51b815260040161066f906132e4565b505050505050565b6122ac612415565b506040805160208101909152670de0b6b3a7640000815290565b6122ce612415565b6040805160208101909152835181906122ed908563ffffffff61200916565b90529392505050565b60015460025460009183916001600160a01b03808416928116831492911614818061231e5750805b61233a5760405162461bcd60e51b815260040161066f90613304565b6001546001600160a01b03868116911614156123a757601554612361576010549350610aab565b6123a0610b0b601554610824670de0b6b3a7640000610818600e54610818600c5461080c600160009054906101000a90046001600160a01b0316610a21565b9350610aab565b6015546123b8576011549350610aab565b6123a0610830601554610824670de0b6b3a7640000610818600f54610818600d5461080c600260009054906101000a90046001600160a01b0316610a21565b600061240d82610824868663ffffffff61215416565b949350505050565b6040518060200160405280600081525090565b604051806060016040528060006001600160a01b0316815260200161244b61245d565b815260200161245861245d565b905290565b604080518082019091526000808252602082015290565b803561062681613516565b805161062681613516565b80356106268161352d565b80516106268161352d565b6000602082840312156124b257600080fd5b6124bc602061347d565b905060006124ca8484612575565b82525092915050565b600060a082840312156124e557600080fd5b6124ef606061347d565b905060006124fd848461247f565b825250602061250e8484830161252e565b60208301525060606125228482850161252e565b60408301525092915050565b60006040828403121561254057600080fd5b61254a604061347d565b905060006125588484612495565b825250602061256984848301612580565b60208301525092915050565b803561062681613536565b805161062681613536565b80356106268161353f565b6000602082840312156125a857600080fd5b600061240d8484612474565b6000806000806000806000806000806101408b8d0312156125d457600080fd5b60006125e08d8d612474565b9a505060206125f18d828e01612474565b99505060406126028d828e01612474565b98505060606126138d828e01612474565b97505060806126248d828e01612474565b96505060a06126358d828e01612474565b95505060c06126468d828e016124a0565b94505060e06126578d828e016124a0565b9350506101006126698d828e0161258b565b92505061012061267b8d828e01612474565b9150509295989b9194979a5092959850565b600080604083850312156126a057600080fd5b60006126ac8585612474565b92505060206126bd85828601612575565b9150509250929050565b6000806000606084860312156126dc57600080fd5b60006126e88686612474565b93505060206126f986828701612575565b925050604061270a86828701612575565b9150509250925092565b60006020828403121561272657600080fd5b600061240d848461248a565b60006020828403121561274457600080fd5b600061240d8484612495565b600060a0828403121561276257600080fd5b600061240d84846124d3565b60006020828403121561278057600080fd5b600061240d8484612575565b60006020828403121561279e57600080fd5b600061240d8484612580565b600080604083850312156127bd57600080fd5b60006127c98585612575565b92505060206126bd85828601612474565b600080604083850312156127ed57600080fd5b60006126ac8585612575565b612802816134d8565b82525050565b612802816134b6565b612802816134c1565b6000612825826134a4565b61282f81856134a8565b935061283f8185602086016134ea565b9290920192915050565b612802816134df565b600061285f6016836134ad565b7526bab9ba1031329030903b30b634b21036b4b73a32b960511b815260200192915050565b60006128916028836134ad565b7f596f752063616e6e6f7420736c6173682061667465722074686520726577617281526719081c195c9a5bd960c21b602082015260400192915050565b60006128db601a836134ad565b7f5361666545524332303a205452414e534645525f4641494c4544000000000000815260200192915050565b60006129146026836134ad565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b600061295c601b836134ad565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006129956022836134ad565b7f43616c6c6572206973206e6f742061207265776172642064697374726962757481526137b960f11b602082015260400192915050565b60006129d96023836134ad565b7f546865207374616b6520746f206465627420726174696f2063616e6e6f74206281526206520360ec1b602082015260400192915050565b6000612a1e604b836134ad565b7f4f6e6c792074686520636f6c6c6162207265776172647320646973747269627581527f746f722063616e206e6f746966792074686520616d6f756e74206f6620636f6c60208201526a6c6162207265776172647360a81b604082015260600192915050565b6000612a916033836134ad565b7f596f752063616e6e6f74207374616b65206261736564206f6e2061206469666681527232b932b73a103232b13a103837b9b4ba34b7b760691b602082015260400192915050565b6000612ae66038836134ad565b7f5468652072657761726420746f6b656e2063616e20656974686572206265203081527f206f7220612076616c69642072657761726420746f6b656e0000000000000000602082015260400192915050565b6000612b45601e836134ad565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b6000612b7e601a836134ad565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000815260200192915050565b6000612bb76033836134ad565b7f43616e6e6f7420776974686472617720746865207374616b696e67206f7220638152726f6c6c61622072657761726420746f6b656e7360681b602082015260400192915050565b6000612c0c602c836134ad565b7f596f752063616e277420736c617368206120757365722077686f20697320612081526b3b30b634b21036b4b73a32b960a11b602082015260400192915050565b6000612c5a6019836134ad565b7f596f752063616e6e6f7420736c61736820796f757273656c6600000000000000815260200192915050565b6000612c936044836134ad565b7f5072657620706572696f64206d75737420626520636f6d706c6574652062656681527f6f7265206368616e67696e67206475726174696f6e20666f72206e65772070656020820152631c9a5bd960e21b604082015260600192915050565b6000612cff6027836134ad565b7f43616e6e6f7420736574207468652073616d65207265776172647320646973748152663934b13aba37b960c91b602082015260400192915050565b6000612d48601f836134ad565b7f5361666545524332303a205452414e534645525f46524f4d5f4641494c454400815260200192915050565b6000612d81602c836134ad565b7f43616c6c6572206973206e6f742074686520636f6c6c6162207265776172647381526b103234b9ba3934b13aba37b960a11b602082015260400192915050565b6000612dcf604a836134ad565b7f5468652072657761726420746f6b656e206164647265737320646f6573206e6f81527f7420636f72726573706f6e6420746f206f6e65206f66207468652072657761726020820152693239903a37b5b2b7399760b11b604082015260600192915050565b6000612e416038836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f722074686581527f2062616c616e6365206f6620636f6c6c616220746f6b656e0000000000000000602082015260400192915050565b6000612ea06021836134ad565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612ee36020836134ad565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612f1c6047836134ad565b7f4f6e6c792074686520415243782072657761726473206469737472696275746f81527f722063616e206e6f746966792074686520616d6f756e74206f662041524378206020820152667265776172647360c81b604082015260600192915050565b6000612f8b601b836134ad565b7f52657761726473206475726174696f6e206973206e6f74207365740000000000815260200192915050565b6000612fc4601b836134ad565b7f4f6e65206f72206d6f72652076616c75657320697320656d7074790000000000815260200192915050565b6000612ffd6036836134ad565b7f50726f76696465642072657761726420746f6f206869676820666f7220746865815275103130b630b731b29037b31020a921bc103a37b5b2b760511b602082015260400192915050565b6000613055602b836134ad565b7f4174206c65617374206f6e652072657761726420746f6b656e206d757374206281526a6520636c61696d61626c6560a81b602082015260400192915050565b60006130a26039836134ad565b7f4f6e6c792074686520737572706c7573206f662074686520726577617264206381527f616e206265207265636f76657265642c206e6f74206d6f726500000000000000602082015260400192915050565b80516020830190613105848261310b565b50505050565b61280281610636565b612802816134d2565b60006114c3828461281a565b602081016106268284612808565b608081016131458287612808565b61315260208301866127f9565b61315f604083018561310b565b61316c606083018461310b565b95945050505050565b606081016131838286612808565b6131906020830185612808565b61240d604083018461310b565b604081016131ab8285612808565b6114c3602083018461310b565b602081016106268284612811565b602081016106268284612849565b6020808252810161062681612852565b6020808252810161062681612884565b60208082528101610626816128ce565b6020808252810161062681612907565b602080825281016106268161294f565b6020808252810161062681612988565b60208082528101610626816129cc565b6020808252810161062681612a11565b6020808252810161062681612a84565b6020808252810161062681612ad9565b6020808252810161062681612b38565b6020808252810161062681612b71565b6020808252810161062681612baa565b6020808252810161062681612bff565b6020808252810161062681612c4d565b6020808252810161062681612c86565b6020808252810161062681612cf2565b6020808252810161062681612d3b565b6020808252810161062681612d74565b6020808252810161062681612dc2565b6020808252810161062681612e34565b6020808252810161062681612e93565b6020808252810161062681612ed6565b6020808252810161062681612f0f565b6020808252810161062681612f7e565b6020808252810161062681612fb7565b6020808252810161062681612ff0565b6020808252810161062681613048565b6020808252810161062681613095565b6020810161062682846130f4565b60208101610626828461310b565b604081016133ce828561310b565b6114c36020830184612808565b604081016131ab828561310b565b61012081016133f8828c61310b565b613405602083018b61310b565b613412604083018a61310b565b61341f606083018961310b565b61342c608083018861310b565b61343960a083018761310b565b61344660c083018661310b565b61345360e083018561310b565b61346161010083018461310b565b9a9950505050505050505050565b602081016106268284613114565b60405181810167ffffffffffffffff8111828210171561349c57600080fd5b604052919050565b5190565b919050565b90815260200190565b6000610626826134c6565b151590565b6001600160a01b031690565b60ff1690565b6000610626825b6000610626826134b6565b60005b838110156135055781810151838201526020016134ed565b838111156131055750506000910152565b61351f816134b6565b811461352a57600080fd5b50565b61351f816134c1565b61351f81610636565b61351f816134d256fea365627a7a723158201638b185845030a9b86bc643871b7594d2bc7db91529f1a2ee9e725f07c8c2a06c6578706572696d656e74616cf564736f6c63430005100040
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1.79 | 708.084 | $1,267.47 |
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.