Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 11 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18209607 | 305 days ago | Contract Creation | 0 ETH | |||
18163238 | 311 days ago | Contract Creation | 0 ETH | |||
17963681 | 339 days ago | Contract Creation | 0 ETH | |||
17768706 | 366 days ago | Contract Creation | 0 ETH | |||
17564133 | 395 days ago | Contract Creation | 0 ETH | |||
17370516 | 422 days ago | Contract Creation | 0 ETH | |||
17141153 | 455 days ago | Contract Creation | 0 ETH | |||
17122652 | 457 days ago | Contract Creation | 0 ETH | |||
17086603 | 462 days ago | Contract Creation | 0 ETH | |||
17080295 | 463 days ago | Contract Creation | 0 ETH | |||
17080113 | 463 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
SmartChefFactory
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-19 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; pragma abicoder v2; 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "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 virtual onlyOwner { _transferOwnership(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 virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IPancakeProfile { function createProfile( uint256 _teamId, address _nftAddress, uint256 _tokenId ) external; function increaseUserPoints( address _userAddress, uint256 _numberPoints, uint256 _campaignId ) external; function removeUserPoints(address _userAddress, uint256 _numberPoints) external; function addNftAddress(address _nftAddress) external; function addTeam(string calldata _teamName, string calldata _teamDescription) external; function getUserProfile(address _userAddress) external view returns ( uint256, uint256, uint256, address, uint256, bool ); function getUserStatus(address _userAddress) external view returns (bool); function getTeamProfile(uint256 _teamId) external view returns ( string memory, string memory, uint256, uint256, bool ); } contract SmartChefInitializable is Ownable, ReentrancyGuard { using SafeERC20 for IERC20Metadata; // The address of the smart chef factory address public immutable SMART_CHEF_FACTORY; // Whether a limit is set for users bool public userLimit; // Whether it is initialized bool public isInitialized; // Accrued token per share uint256 public accTokenPerShare; // The block timestamp when CAKE mining ends uint256 public endTimestamp; // The block timestamp when CAKE mining starts uint256 public startTimestamp; // The block timestamp of the last pool update uint256 public lastRewardTimestamp; // The pool limit (0 if none) uint256 public poolLimitPerUser; // Seconds available for user limit (after start timestamp) uint256 public numberSecondsForUserLimit; // Pancake profile address address public immutable pancakeProfile; // Pancake Profile is requested bool public pancakeProfileIsRequested; // Pancake Profile points threshold uint256 public pancakeProfileThresholdPoints; // CAKE tokens created per second uint256 public rewardPerSecond; // The precision factor uint256 public PRECISION_FACTOR; // The reward token IERC20Metadata public rewardToken; // The staked token IERC20Metadata public stakedToken; // Info of each user that stakes tokens (stakedToken) mapping(address => UserInfo) public userInfo; struct UserInfo { uint256 amount; // How many staked tokens the user has provided uint256 rewardDebt; } event Deposit(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event NewStartAndEndTimestamp(uint256 startTimestamp, uint256 endTimestamp); event NewRewardPerSecond(uint256 rewardPerSecond); event NewPoolLimit(uint256 poolLimitPerUser); event RewardsStop(uint256 blockNumber); event TokenRecovery(address indexed token, uint256 amount); event Withdraw(address indexed user, uint256 amount); event UpdateProfileAndThresholdPointsRequirement(bool isProfileRequested, uint256 thresholdPoints); /** * @notice Constructor * @param _pancakeProfile: Pancake Profile address * @param _pancakeProfileIsRequested: Pancake Profile is requested * @param _pancakeProfileThresholdPoints: Pancake Profile need threshold points */ constructor( address _pancakeProfile, bool _pancakeProfileIsRequested, uint256 _pancakeProfileThresholdPoints ) { SMART_CHEF_FACTORY = msg.sender; pancakeProfile = _pancakeProfile; // It can be empty on Other chain if (_pancakeProfile != address(0)) { IPancakeProfile(_pancakeProfile).getTeamProfile(1); // if pancakeProfile is requested pancakeProfileIsRequested = _pancakeProfileIsRequested; // pancakeProfile threshold points when profile & points are requested pancakeProfileThresholdPoints = _pancakeProfileThresholdPoints; } else { pancakeProfileIsRequested = false; pancakeProfileThresholdPoints = 0; } } /* * @notice Initialize the contract * @param _stakedToken: staked token address * @param _rewardToken: reward token address * @param _rewardPerSecond: reward per second (in rewardToken) * @param _startTimestamp: start block timestamp * @param _endTimestamp: end block timestamp * @param _poolLimitPerUser: pool limit per user in stakedToken (if any, else 0) * @param _numberSecondsForUserLimit: seconds available for user limit (after start timestamp) * @param _admin: admin address with ownership */ function initialize( IERC20Metadata _stakedToken, IERC20Metadata _rewardToken, uint256 _rewardPerSecond, uint256 _startTimestamp, uint256 _endTimestamp, uint256 _poolLimitPerUser, uint256 _numberSecondsForUserLimit, address _admin ) external { require(!isInitialized, "Already initialized"); require(msg.sender == SMART_CHEF_FACTORY, "Not factory"); require(_startTimestamp < _endTimestamp, "New startTimestamp must be lower than new endTimestamp"); require(block.timestamp < _startTimestamp, "New startTimestamp must be higher than current block timestamp"); // Make this contract initialized isInitialized = true; stakedToken = _stakedToken; rewardToken = _rewardToken; rewardPerSecond = _rewardPerSecond; startTimestamp = _startTimestamp; endTimestamp = _endTimestamp; if (_poolLimitPerUser > 0) { userLimit = true; poolLimitPerUser = _poolLimitPerUser; numberSecondsForUserLimit = _numberSecondsForUserLimit; } uint256 decimalsRewardToken = uint256(rewardToken.decimals()); require(decimalsRewardToken < 30, "Must be inferior to 30"); PRECISION_FACTOR = uint256(10**(uint256(30) - decimalsRewardToken)); require(PRECISION_FACTOR * rewardPerSecond / (10**decimalsRewardToken) >= 100_000_000, "rewardPerSecond must be larger"); // Set the lastRewardBlock as the startTimestamp lastRewardTimestamp = startTimestamp; // Transfer ownership to the admin address who becomes owner of the contract transferOwnership(_admin); } /* * @notice Deposit staked tokens and collect reward tokens (if any) * @param _amount: amount to withdraw (in rewardToken) */ function deposit(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; if (pancakeProfile != address(0)) { // Checks whether the user has an active profile require( (!pancakeProfileIsRequested && pancakeProfileThresholdPoints == 0) || IPancakeProfile(pancakeProfile).getUserStatus(msg.sender), "Deposit: Must have an active profile" ); uint256 numberUserPoints = 0; if (pancakeProfileThresholdPoints > 0) { require(pancakeProfile != address(0), "Deposit: PancakeProfile is not exist"); (, numberUserPoints, , , , ) = IPancakeProfile(pancakeProfile).getUserProfile(msg.sender); } require( pancakeProfileThresholdPoints == 0 || numberUserPoints >= pancakeProfileThresholdPoints, "Deposit: User is not get enough user points" ); } userLimit = hasUserLimit(); require(!userLimit || ((_amount + user.amount) <= poolLimitPerUser), "Deposit: Amount above limit"); _updatePool(); if (user.amount > 0) { uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (pending > 0) { rewardToken.safeTransfer(address(msg.sender), pending); } } if (_amount > 0) { user.amount = user.amount + _amount; stakedToken.safeTransferFrom(address(msg.sender), address(this), _amount); } user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; emit Deposit(msg.sender, _amount); } /* * @notice Withdraw staked tokens and collect reward tokens * @param _amount: amount to withdraw (in rewardToken) */ function withdraw(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "Amount to withdraw too high"); _updatePool(); uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (_amount > 0) { user.amount = user.amount - _amount; stakedToken.safeTransfer(address(msg.sender), _amount); } if (pending > 0) { rewardToken.safeTransfer(address(msg.sender), pending); } user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; emit Withdraw(msg.sender, _amount); } /* * @notice Withdraw staked tokens without caring about rewards rewards * @dev Needs to be for emergency. */ function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 amountToTransfer = user.amount; user.amount = 0; user.rewardDebt = 0; if (amountToTransfer > 0) { stakedToken.safeTransfer(address(msg.sender), amountToTransfer); } emit EmergencyWithdraw(msg.sender, user.amount); } /* * @notice Stop rewards * @dev Only callable by owner. Needs to be for emergency. */ function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { rewardToken.safeTransfer(address(msg.sender), _amount); } /** * @notice Allows the owner to recover tokens sent to the contract by mistake * @param _token: token address * @dev Callable by owner */ function recoverToken(address _token) external onlyOwner { require(_token != address(stakedToken), "Operations: Cannot recover staked token"); require(_token != address(rewardToken), "Operations: Cannot recover reward token"); uint256 balance = IERC20Metadata(_token).balanceOf(address(this)); require(balance != 0, "Operations: Cannot recover zero balance"); IERC20Metadata(_token).safeTransfer(address(msg.sender), balance); emit TokenRecovery(_token, balance); } /* * @notice Stop rewards * @dev Only callable by owner */ function stopReward() external onlyOwner { endTimestamp = block.timestamp; emit RewardsStop(endTimestamp); } /* * @notice Update pool limit per user * @dev Only callable by owner. * @param _userLimit: whether the limit remains forced * @param _poolLimitPerUser: new pool limit per user */ function updatePoolLimitPerUser(bool _userLimit, uint256 _poolLimitPerUser) external onlyOwner { require(userLimit, "Must be set"); if (_userLimit) { require(_poolLimitPerUser > poolLimitPerUser, "New limit must be higher"); poolLimitPerUser = _poolLimitPerUser; } else { userLimit = _userLimit; poolLimitPerUser = 0; } emit NewPoolLimit(poolLimitPerUser); } /* * @notice Update reward per block * @dev Only callable by owner. * @param _rewardPerSecond: the reward per second */ function updateRewardPerSecond(uint256 _rewardPerSecond) external onlyOwner { require(block.timestamp < startTimestamp, "Pool has started"); uint256 decimalsRewardToken = uint256(rewardToken.decimals()); require(PRECISION_FACTOR * _rewardPerSecond / (10**decimalsRewardToken) >= 100_000_000, "rewardPerSecond must be larger"); rewardPerSecond = _rewardPerSecond; emit NewRewardPerSecond(_rewardPerSecond); } /** * @notice It allows the admin to update start and end blocks * @dev This function is only callable by owner. * @param _startTimestamp: the new start block timestamp * @param _endTimestamp: the new end block timestamp */ function updateStartAndEndTimestamp(uint256 _startTimestamp, uint256 _endTimestamp) external onlyOwner { require(block.timestamp < startTimestamp, "Pool has started"); require(_startTimestamp < _endTimestamp, "New startTimestamp must be lower than new endTimestamp"); require(block.timestamp < _startTimestamp, "New startTimestamp must be higher than current block timestamp"); startTimestamp = _startTimestamp; endTimestamp = _endTimestamp; // Set the lastRewardTimestamp as the startTimestamp lastRewardTimestamp = startTimestamp; emit NewStartAndEndTimestamp(_startTimestamp, _endTimestamp); } /** * @notice It allows the admin to update profile and thresholdPoints' requirement. * @dev This function is only callable by owner. * @param _isRequested: the profile is requested * @param _thresholdPoints: the threshold points */ function updateProfileAndThresholdPointsRequirement(bool _isRequested, uint256 _thresholdPoints) external onlyOwner { require(pancakeProfile != address(0), "Pancake profile address is null"); require(_thresholdPoints >= 0, "Threshold points need to exceed 0"); pancakeProfileIsRequested = _isRequested; pancakeProfileThresholdPoints = _thresholdPoints; emit UpdateProfileAndThresholdPointsRequirement(_isRequested, _thresholdPoints); } /* * @notice View function to see pending reward on frontend. * @param _user: user address * @return Pending reward for a given user */ function pendingReward(address _user) external view returns (uint256) { UserInfo storage user = userInfo[_user]; uint256 stakedTokenSupply = stakedToken.balanceOf(address(this)); if (block.timestamp > lastRewardTimestamp && stakedTokenSupply != 0) { uint256 multiplier = _getMultiplier(lastRewardTimestamp, block.timestamp); uint256 cakeReward = multiplier * rewardPerSecond; uint256 adjustedTokenPerShare = accTokenPerShare + (cakeReward * PRECISION_FACTOR) / stakedTokenSupply; return (user.amount * adjustedTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; } else { return (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; } } /* * @notice Update reward variables of the given pool to be up-to-date. */ function _updatePool() internal { if (block.timestamp <= lastRewardTimestamp) { return; } uint256 stakedTokenSupply = stakedToken.balanceOf(address(this)); if (stakedTokenSupply == 0) { lastRewardTimestamp = block.timestamp; return; } uint256 multiplier = _getMultiplier(lastRewardTimestamp, block.timestamp); uint256 cakeReward = multiplier * rewardPerSecond; accTokenPerShare = accTokenPerShare + (cakeReward * PRECISION_FACTOR) / stakedTokenSupply; lastRewardTimestamp = block.timestamp; } /* * @notice Return reward multiplier over the given _from to _to block. * @param _from: block to start * @param _to: block to finish */ function _getMultiplier(uint256 _from, uint256 _to) internal view returns (uint256) { if (_to <= endTimestamp) { return _to - _from; } else if (_from >= endTimestamp) { return 0; } else { return endTimestamp - _from; } } /* * @notice Return user limit is set or zero. */ function hasUserLimit() public view returns (bool) { if (!userLimit || (block.timestamp >= (startTimestamp + numberSecondsForUserLimit))) { return false; } return true; } } contract SmartChefFactory is Ownable { event NewSmartChefContract(address indexed smartChef); constructor() { // } /* * @notice Deploy the pool * @param _stakedToken: staked token address * @param _rewardToken: reward token address * @param _rewardPerSecond: reward per second (in rewardToken) * @param _startTimestamp: start block timestamp * @param _endTimestamp: end block timestamp * @param _poolLimitPerUser: pool limit per user in stakedToken (if any, else 0) * @param _numberSecondsForUserLimit: seconds available for user limit (after start block) * @param _pancakeProfile: Pancake Profile address * @param _pancakeProfileIsRequested: Pancake Profile is requested * @param _pancakeProfileThresholdPoints: Pancake Profile need threshold points * @param _admin: admin address with ownership * @return address of new smart chef contract */ function deployPool( IERC20Metadata _stakedToken, IERC20Metadata _rewardToken, uint256 _rewardPerSecond, uint256 _startTimestamp, uint256 _endTimestamp, uint256 _poolLimitPerUser, uint256 _numberSecondsForUserLimit, address _pancakeProfile, bool _pancakeProfileIsRequested, uint256 _pancakeProfileThresholdPoints, address _admin ) external onlyOwner { require(_stakedToken.totalSupply() >= 0); require(_rewardToken.totalSupply() >= 0); require(_stakedToken != _rewardToken, "Tokens must be be different"); bytes memory bytecode = type(SmartChefInitializable).creationCode; // pass constructor argument bytecode = abi.encodePacked( bytecode, abi.encode(_pancakeProfile, _pancakeProfileIsRequested, _pancakeProfileThresholdPoints) ); bytes32 salt = keccak256(abi.encodePacked(_stakedToken, _rewardToken, _startTimestamp)); address smartChefAddress; assembly { smartChefAddress := create2(0, add(bytecode, 32), mload(bytecode), salt) } SmartChefInitializable(smartChefAddress).initialize( _stakedToken, _rewardToken, _rewardPerSecond, _startTimestamp, _endTimestamp, _poolLimitPerUser, _numberSecondsForUserLimit, _admin ); emit NewSmartChefContract(smartChefAddress); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"smartChef","type":"address"}],"name":"NewSmartChefContract","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"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"_stakedToken","type":"address"},{"internalType":"contract IERC20Metadata","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"},{"internalType":"uint256","name":"_numberSecondsForUserLimit","type":"uint256"},{"internalType":"address","name":"_pancakeProfile","type":"address"},{"internalType":"bool","name":"_pancakeProfileIsRequested","type":"bool"},{"internalType":"uint256","name":"_pancakeProfileThresholdPoints","type":"uint256"},{"internalType":"address","name":"_admin","type":"address"}],"name":"deployPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613a128061007e6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063715018a6146100515780638da5cb5b1461005b578063f2fde38b14610087578063f8d98c8a1461009a575b600080fd5b6100596100ad565b005b6000546040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610059610095366004610794565b61013f565b6100596100a83660046107b7565b61026f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b61013d6000610701565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012a565b73ffffffffffffffffffffffffffffffffffffffff8116610263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161012a565b61026c81610701565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012a565b60008b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561033857600080fd5b505afa15801561034c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103709190610864565b101561037b57600080fd5b60008a73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103c357600080fd5b505afa1580156103d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fb9190610864565b101561040657600080fd5b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16141561049c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f546f6b656e73206d75737420626520626520646966666572656e740000000000604482015260640161012a565b6000604051806020016104ae90610776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081815273ffffffffffffffffffffffffffffffffffffffff8816602083015286151590820152606081018590529091508190608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261054f92916020016108b5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608f811b821660208501528e901b166034830152604882018b905291506000906068016040516020818303038152906040528051906020012090506000818351602085016000f590508073ffffffffffffffffffffffffffffffffffffffff16632aa2c3818f8f8f8f8f8f8f8c6040518963ffffffff1660e01b815260040161067e98979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015260408701959095526060860193909352608085019190915260a084015260c083015290911660e08201526101000190565b600060405180830381600087803b15801561069857600080fd5b505af11580156106ac573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841692507fe0d103a92c6ff6c4aceb49d436f4028e0deb4884fdbcb9f32b03045eabb44a6c9150600090a25050505050505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6130e880620008f583390190565b803561078f816108d2565b919050565b6000602082840312156107a5578081fd5b81356107b0816108d2565b9392505050565b60008060008060008060008060008060006101608c8e0312156107d8578687fd5b8b356107e3816108d2565b9a5060208c01356107f3816108d2565b995060408c0135985060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c0135610826816108d2565b93506101008c0135801515811461083b578384fd5b92506101208c013591506108526101408d01610784565b90509295989b509295989b9093969950565b600060208284031215610875578081fd5b5051919050565b60008151815b8181101561089c5760208185018101518683015201610882565b818111156108aa5782828601525b509290920192915050565b60006108ca6108c4838661087c565b8461087c565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461026c57600080fdfe60c06040523480156200001157600080fd5b50604051620030e8380380620030e883398101604081905262000034916200023c565b6200003f3362000123565b6001805533606090811b60805283901b6001600160601b03191660a0526001600160a01b038316156200010a5760405163aee2f47f60e01b8152600160048201526001600160a01b0384169063aee2f47f9060240160006040518083038186803b158015620000ad57600080fd5b505afa158015620000c2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ec919081019062000288565b50506009805460ff1916861515179055505050600a8190556200011a565b6009805460ff191690556000600a555b5050506200032b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805180151581146200018457600080fd5b919050565b600082601f8301126200019a578081fd5b81516001600160401b0380821115620001b757620001b762000315565b604051601f8301601f19908116603f01168101908282118183101715620001e257620001e262000315565b81604052838152602092508683858801011115620001fe578485fd5b8491505b8382101562000221578582018301518183018401529082019062000202565b838211156200023257848385830101525b9695505050505050565b60008060006060848603121562000251578283fd5b83516001600160a01b038116811462000268578384fd5b9250620002786020850162000173565b9150604084015190509250925092565b600080600080600060a08688031215620002a0578081fd5b85516001600160401b0380821115620002b7578283fd5b620002c589838a0162000189565b96506020880151915080821115620002db578283fd5b50620002ea8882890162000189565b9450506040860151925060608601519150620003096080870162000173565b90509295509295909350565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c612d6762000381600039600081816103ee01528181610ef701528181611745015281816117c6015281816118ed01526119db0152600081816103c7015261053b0152612d676000f3fe608060405234801561001057600080fd5b506004361061020b5760003560e01c80638f6629151161012a578063cc356c59116100bd578063e6fd48bc1161008c578063f40f0f5211610071578063f40f0f5214610470578063f7c618c114610483578063f8077fae146104a357600080fd5b8063e6fd48bc14610454578063f2fde38b1461045d57600080fd5b8063cc356c5914610410578063cc7a262e14610423578063ccd34cd514610443578063db2e21bc1461044c57600080fd5b8063a85adeab116100f9578063a85adeab146103a6578063b6b55f25146103af578063bd617191146103c2578063c7d936ec146103e957600080fd5b80638f6629151461036f57806392e8990e146103785780639be65a6014610380578063a0b409051461039357600080fd5b80634a7c01ec116101a2578063715018a611610171578063715018a61461031757806380dc06721461031f5780638da5cb5b146103275780638f10369a1461036657600080fd5b80634a7c01ec146102e15780635a0b5f34146102ee57806366fe9f8a146102fb578063681096311461030457600080fd5b80632e1a7d4d116101de5780632e1a7d4d146102865780633279beab14610299578063392e53cd146102ac5780634004c8e7146102ce57600080fd5b80630ace6247146102105780631573ebdf1461022c5780631959a002146102355780632aa2c38114610271575b600080fd5b610219600a5481565b6040519081526020015b60405180910390f35b61021960085481565b61025c6102433660046128bf565b600f602052600090815260409020805460019091015482565b60408051928352602083019190915201610223565b61028461027f366004612922565b6104ac565b005b61028461029436600461299d565b610983565b6102846102a736600461299d565b610b6b565b6002546102be90610100900460ff1681565b6040519015158152602001610223565b6102846102dc36600461299d565b610c13565b6002546102be9060ff1681565b6009546102be9060ff1681565b61021960075481565b6102846103123660046128f7565b610e74565b610284610ffc565b610284611089565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610223565b610219600b5481565b61021960035481565b6102be611145565b61028461038e3660046128bf565b61117a565b6102846103a13660046128f7565b6114f5565b61021960045481565b6102846103bd36600461299d565b6116c2565b6103417f000000000000000000000000000000000000000000000000000000000000000081565b6103417f000000000000000000000000000000000000000000000000000000000000000081565b61028461041e3660046129cd565b611cd0565b600e546103419073ffffffffffffffffffffffffffffffffffffffff1681565b610219600c5481565b610284611f1f565b61021960055481565b61028461046b3660046128bf565b61200d565b61021961047e3660046128bf565b61213a565b600d546103419073ffffffffffffffffffffffffffffffffffffffff1681565b61021960065481565b600254610100900460ff1615610523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f7420666163746f7279000000000000000000000000000000000000000000604482015260640161051a565b838510610651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4e657720737461727454696d657374616d70206d757374206265206c6f77657260448201527f207468616e206e657720656e6454696d657374616d7000000000000000000000606482015260840161051a565b8442106106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4e657720737461727454696d657374616d70206d75737420626520686967686560448201527f72207468616e2063757272656e7420626c6f636b2074696d657374616d700000606482015260840161051a565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600e805473ffffffffffffffffffffffffffffffffffffffff808b167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600d8054928a1692909116919091179055600b8690556005859055600484905582156107ac57600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600783905560088290555b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce567916004808301926020929190829003018186803b15801561081757600080fd5b505afa15801561082b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084f9190612a4c565b60ff169050601e81106108be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d75737420626520696e666572696f7220746f20333000000000000000000000604482015260640161051a565b6108c981601e612c8f565b6108d490600a612b8c565b600c556305f5e1006108e782600a612b8c565b600b54600c546108f79190612c52565b6109019190612af2565b1015610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7265776172645065725365636f6e64206d757374206265206c61726765720000604482015260640161051a565b6005546006556109788261200d565b505050505050505050565b600260015414156109f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b6002600155336000908152600f602052604090208054821115610a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f20686967680000000000604482015260640161051a565b610a776122bf565b60008160010154600c546003548460000154610a939190612c52565b610a9d9190612af2565b610aa79190612c8f565b90508215610ae2578154610abc908490612c8f565b8255600e54610ae29073ffffffffffffffffffffffffffffffffffffffff1633856123ce565b8015610b0c57600d54610b0c9073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b600c546003548354610b1e9190612c52565b610b289190612af2565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001805550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b600d54610c109073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6005544210610cff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506f6f6c20686173207374617274656400000000000000000000000000000000604482015260640161051a565b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce567916004808301926020929190829003018186803b158015610d6a57600080fd5b505afa158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da29190612a4c565b60ff1690506305f5e100610db782600a612b8c565b83600c54610dc59190612c52565b610dcf9190612af2565b1015610e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7265776172645065725365636f6e64206d757374206265206c61726765720000604482015260640161051a565b600b8290556040518281527f3fca6699460f553eae31233dba0b41f635e80f5bd8132d7f2af5456c3e247be0906020015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f50616e63616b652070726f66696c652061646472657373206973206e756c6c00604482015260640161051a565b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515908117909155600a82905560408051918252602082018390527f915d08e0e89c58e352d7c1d66c942cb15dac8a7294d2ca80ddf46f1998f0512b9101610e68565b60005473ffffffffffffffffffffffffffffffffffffffff16331461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b61108760006124a7565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b4260048190556040519081527ffed9fcb0ca3d1e761a4b929792bb24082fba92dca81252646ad306d3068065669060200160405180910390a1565b60025460009060ff16158061116957506008546005546111659190612ada565b4210155b156111745750600090565b50600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b600e5473ffffffffffffffffffffffffffffffffffffffff828116911614156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207374616b6560448201527f6420746f6b656e00000000000000000000000000000000000000000000000000606482015260840161051a565b600d5473ffffffffffffffffffffffffffffffffffffffff82811691161415611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f76657220726577617260448201527f6420746f6b656e00000000000000000000000000000000000000000000000000606482015260840161051a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156113b957600080fd5b505afa1580156113cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f191906129b5565b905080611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201527f62616c616e636500000000000000000000000000000000000000000000000000606482015260840161051a565b6114a173ffffffffffffffffffffffffffffffffffffffff831633836123ce565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e98826040516114e991815260200190565b60405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b60025460ff166115e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d75737420626520736574000000000000000000000000000000000000000000604482015260640161051a565b811561165d576007548111611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6577206c696d6974206d757374206265206869676865720000000000000000604482015260640161051a565b600781905561168f565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683151517905560006007555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600754604051610e6891815260200190565b6002600154141561172f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b6002600155336000908152600f602052604090207f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615611b125760095460ff161580156117925750600a54155b8061185557506040517fea0d5dcd0000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063ea0d5dcd9060240160206040518083038186803b15801561181d57600080fd5b505afa158015611831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185591906128db565b6118e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369743a204d757374206861766520616e206163746976652070726f60448201527f66696c6500000000000000000000000000000000000000000000000000000000606482015260840161051a565b600a5460009015611a73577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166119ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369743a2050616e63616b6550726f66696c65206973206e6f74206560448201527f7869737400000000000000000000000000000000000000000000000000000000606482015260840161051a565b6040517f987ee1560000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063987ee1569060240160c06040518083038186803b158015611a3257600080fd5b505afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a91906129ee565b50929450505050505b600a541580611a845750600a548110155b611b10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4465706f7369743a2055736572206973206e6f742067657420656e6f7567682060448201527f7573657220706f696e7473000000000000000000000000000000000000000000606482015260840161051a565b505b611b1a611145565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515918217905560ff161580611b6457506007548154611b619084612ada565b11155b611bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4465706f7369743a20416d6f756e742061626f7665206c696d69740000000000604482015260640161051a565b611bd26122bf565b805415611c375760008160010154600c546003548460000154611bf59190612c52565b611bff9190612af2565b611c099190612c8f565b90508015611c3557600d54611c359073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b505b8115611c71578054611c4a908390612ada565b8155600e54611c719073ffffffffffffffffffffffffffffffffffffffff1633308561251c565b600c546003548254611c839190612c52565b611c8d9190612af2565b600182015560405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020015b60405180910390a2505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6005544210611dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506f6f6c20686173207374617274656400000000000000000000000000000000604482015260640161051a565b808210611e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4e657720737461727454696d657374616d70206d757374206265206c6f77657260448201527f207468616e206e657720656e6454696d657374616d7000000000000000000000606482015260840161051a565b814210611eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4e657720737461727454696d657374616d70206d75737420626520686967686560448201527f72207468616e2063757272656e7420626c6f636b2074696d657374616d700000606482015260840161051a565b60058290556004819055600682905560408051838152602081018390527f600b4644e23e4e5ac956d20c02417fc8385bd0324ce2ce012b91d812ad89024b9101610e68565b60026001541415611f8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b60026001908155336000908152600f60205260408120805482825592810191909155908015611fd957600e54611fd99073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969590602001611cc0565b60005473ffffffffffffffffffffffffffffffffffffffff16331461208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b73ffffffffffffffffffffffffffffffffffffffff8116612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610c10816124a7565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600f6020526040808220600e5491517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152929390928492909116906370a082319060240160206040518083038186803b1580156121ba57600080fd5b505afa1580156121ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f291906129b5565b90506006544211801561220457508015155b1561228c57600061221760065442612580565b90506000600b54826122299190612c52565b9050600083600c548361223c9190612c52565b6122469190612af2565b6003546122539190612ada565b90508460010154600c5482876000015461226d9190612c52565b6122779190612af2565b6122819190612c8f565b979650505050505050565b6001820154600c5460035484546122a39190612c52565b6122ad9190612af2565b6122b79190612c8f565b949350505050565b60065442116122ca57565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561233457600080fd5b505afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c91906129b5565b90508061237a575042600655565b600061238860065442612580565b90506000600b548261239a9190612c52565b905082600c54826123ab9190612c52565b6123b59190612af2565b6003546123c29190612ada565b60035550504260065550565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526124a29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526125c1565b505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261257a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612420565b50505050565b6000600454821161259c576125958383612c8f565b90506125bb565b60045483106125ad575060006125bb565b826004546125959190612c8f565b92915050565b6000612623826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126cd9092919063ffffffff16565b8051909150156124a2578080602001905181019061264191906128db565b6124a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161051a565b60606126dc84846000856126e6565b90505b9392505050565b606082471015612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161051a565b73ffffffffffffffffffffffffffffffffffffffff85163b6127f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161051a565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161281f9190612a6d565b60006040518083038185875af1925050503d806000811461285c576040519150601f19603f3d011682016040523d82523d6000602084013e612861565b606091505b50915091506122818282866060831561287b5750816126df565b82511561288b5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051a9190612a89565b6000602082840312156128d0578081fd5b81356126df81612d01565b6000602082840312156128ec578081fd5b81516126df81612d23565b60008060408385031215612909578081fd5b823561291481612d23565b946020939093013593505050565b600080600080600080600080610100898b03121561293e578384fd5b883561294981612d01565b9750602089013561295981612d01565b965060408901359550606089013594506080890135935060a0890135925060c0890135915060e089013561298c81612d01565b809150509295985092959890939650565b6000602082840312156129ae578081fd5b5035919050565b6000602082840312156129c6578081fd5b5051919050565b600080604083850312156129df578182fd5b50508035926020909101359150565b60008060008060008060c08789031215612a06578182fd5b8651955060208701519450604087015193506060870151612a2681612d01565b608088015160a08901519194509250612a3e81612d23565b809150509295509295509295565b600060208284031215612a5d578081fd5b815160ff811681146126df578182fd5b60008251612a7f818460208701612ca6565b9190910192915050565b6020815260008251806020840152612aa8816040850160208701612ca6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115612aed57612aed612cd2565b500190565b600082612b26577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b600181815b80851115612b8457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612b6a57612b6a612cd2565b80851615612b7757918102915b93841c9390800290612b30565b509250929050565b60006126df8383600082612ba2575060016125bb565b81612baf575060006125bb565b8160018114612bc55760028114612bcf57612beb565b60019150506125bb565b60ff841115612be057612be0612cd2565b50506001821b6125bb565b5060208310610133831016604e8410600b8410161715612c0e575081810a6125bb565b612c188383612b2b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612c4a57612c4a612cd2565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c8a57612c8a612cd2565b500290565b600082821015612ca157612ca1612cd2565b500390565b60005b83811015612cc1578181015183820152602001612ca9565b8381111561257a5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c1057600080fd5b8015158114610c1057600080fdfea264697066735822122038564d7e6ac9e27efc7a0786910a29d6dfe0b26ef8eeaa930b320b896ea987e264736f6c63430008040033a2646970667358221220fd96b88ee4d36810ef6135e7b4b84bf3db5361ca97d867db6cc123e1d6becd2b64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063715018a6146100515780638da5cb5b1461005b578063f2fde38b14610087578063f8d98c8a1461009a575b600080fd5b6100596100ad565b005b6000546040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610059610095366004610794565b61013f565b6100596100a83660046107b7565b61026f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b61013d6000610701565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146101c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012a565b73ffffffffffffffffffffffffffffffffffffffff8116610263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161012a565b61026c81610701565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161012a565b60008b73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561033857600080fd5b505afa15801561034c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103709190610864565b101561037b57600080fd5b60008a73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103c357600080fd5b505afa1580156103d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fb9190610864565b101561040657600080fd5b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16141561049c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f546f6b656e73206d75737420626520626520646966666572656e740000000000604482015260640161012a565b6000604051806020016104ae90610776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081815273ffffffffffffffffffffffffffffffffffffffff8816602083015286151590820152606081018590529091508190608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261054f92916020016108b5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608f811b821660208501528e901b166034830152604882018b905291506000906068016040516020818303038152906040528051906020012090506000818351602085016000f590508073ffffffffffffffffffffffffffffffffffffffff16632aa2c3818f8f8f8f8f8f8f8c6040518963ffffffff1660e01b815260040161067e98979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015260408701959095526060860193909352608085019190915260a084015260c083015290911660e08201526101000190565b600060405180830381600087803b15801561069857600080fd5b505af11580156106ac573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841692507fe0d103a92c6ff6c4aceb49d436f4028e0deb4884fdbcb9f32b03045eabb44a6c9150600090a25050505050505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6130e880620008f583390190565b803561078f816108d2565b919050565b6000602082840312156107a5578081fd5b81356107b0816108d2565b9392505050565b60008060008060008060008060008060006101608c8e0312156107d8578687fd5b8b356107e3816108d2565b9a5060208c01356107f3816108d2565b995060408c0135985060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c0135610826816108d2565b93506101008c0135801515811461083b578384fd5b92506101208c013591506108526101408d01610784565b90509295989b509295989b9093969950565b600060208284031215610875578081fd5b5051919050565b60008151815b8181101561089c5760208185018101518683015201610882565b818111156108aa5782828601525b509290920192915050565b60006108ca6108c4838661087c565b8461087c565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461026c57600080fdfe60c06040523480156200001157600080fd5b50604051620030e8380380620030e883398101604081905262000034916200023c565b6200003f3362000123565b6001805533606090811b60805283901b6001600160601b03191660a0526001600160a01b038316156200010a5760405163aee2f47f60e01b8152600160048201526001600160a01b0384169063aee2f47f9060240160006040518083038186803b158015620000ad57600080fd5b505afa158015620000c2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ec919081019062000288565b50506009805460ff1916861515179055505050600a8190556200011a565b6009805460ff191690556000600a555b5050506200032b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805180151581146200018457600080fd5b919050565b600082601f8301126200019a578081fd5b81516001600160401b0380821115620001b757620001b762000315565b604051601f8301601f19908116603f01168101908282118183101715620001e257620001e262000315565b81604052838152602092508683858801011115620001fe578485fd5b8491505b8382101562000221578582018301518183018401529082019062000202565b838211156200023257848385830101525b9695505050505050565b60008060006060848603121562000251578283fd5b83516001600160a01b038116811462000268578384fd5b9250620002786020850162000173565b9150604084015190509250925092565b600080600080600060a08688031215620002a0578081fd5b85516001600160401b0380821115620002b7578283fd5b620002c589838a0162000189565b96506020880151915080821115620002db578283fd5b50620002ea8882890162000189565b9450506040860151925060608601519150620003096080870162000173565b90509295509295909350565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c612d6762000381600039600081816103ee01528181610ef701528181611745015281816117c6015281816118ed01526119db0152600081816103c7015261053b0152612d676000f3fe608060405234801561001057600080fd5b506004361061020b5760003560e01c80638f6629151161012a578063cc356c59116100bd578063e6fd48bc1161008c578063f40f0f5211610071578063f40f0f5214610470578063f7c618c114610483578063f8077fae146104a357600080fd5b8063e6fd48bc14610454578063f2fde38b1461045d57600080fd5b8063cc356c5914610410578063cc7a262e14610423578063ccd34cd514610443578063db2e21bc1461044c57600080fd5b8063a85adeab116100f9578063a85adeab146103a6578063b6b55f25146103af578063bd617191146103c2578063c7d936ec146103e957600080fd5b80638f6629151461036f57806392e8990e146103785780639be65a6014610380578063a0b409051461039357600080fd5b80634a7c01ec116101a2578063715018a611610171578063715018a61461031757806380dc06721461031f5780638da5cb5b146103275780638f10369a1461036657600080fd5b80634a7c01ec146102e15780635a0b5f34146102ee57806366fe9f8a146102fb578063681096311461030457600080fd5b80632e1a7d4d116101de5780632e1a7d4d146102865780633279beab14610299578063392e53cd146102ac5780634004c8e7146102ce57600080fd5b80630ace6247146102105780631573ebdf1461022c5780631959a002146102355780632aa2c38114610271575b600080fd5b610219600a5481565b6040519081526020015b60405180910390f35b61021960085481565b61025c6102433660046128bf565b600f602052600090815260409020805460019091015482565b60408051928352602083019190915201610223565b61028461027f366004612922565b6104ac565b005b61028461029436600461299d565b610983565b6102846102a736600461299d565b610b6b565b6002546102be90610100900460ff1681565b6040519015158152602001610223565b6102846102dc36600461299d565b610c13565b6002546102be9060ff1681565b6009546102be9060ff1681565b61021960075481565b6102846103123660046128f7565b610e74565b610284610ffc565b610284611089565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610223565b610219600b5481565b61021960035481565b6102be611145565b61028461038e3660046128bf565b61117a565b6102846103a13660046128f7565b6114f5565b61021960045481565b6102846103bd36600461299d565b6116c2565b6103417f000000000000000000000000000000000000000000000000000000000000000081565b6103417f000000000000000000000000000000000000000000000000000000000000000081565b61028461041e3660046129cd565b611cd0565b600e546103419073ffffffffffffffffffffffffffffffffffffffff1681565b610219600c5481565b610284611f1f565b61021960055481565b61028461046b3660046128bf565b61200d565b61021961047e3660046128bf565b61213a565b600d546103419073ffffffffffffffffffffffffffffffffffffffff1681565b61021960065481565b600254610100900460ff1615610523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f7420666163746f7279000000000000000000000000000000000000000000604482015260640161051a565b838510610651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4e657720737461727454696d657374616d70206d757374206265206c6f77657260448201527f207468616e206e657720656e6454696d657374616d7000000000000000000000606482015260840161051a565b8442106106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4e657720737461727454696d657374616d70206d75737420626520686967686560448201527f72207468616e2063757272656e7420626c6f636b2074696d657374616d700000606482015260840161051a565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600e805473ffffffffffffffffffffffffffffffffffffffff808b167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600d8054928a1692909116919091179055600b8690556005859055600484905582156107ac57600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600783905560088290555b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce567916004808301926020929190829003018186803b15801561081757600080fd5b505afa15801561082b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084f9190612a4c565b60ff169050601e81106108be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d75737420626520696e666572696f7220746f20333000000000000000000000604482015260640161051a565b6108c981601e612c8f565b6108d490600a612b8c565b600c556305f5e1006108e782600a612b8c565b600b54600c546108f79190612c52565b6109019190612af2565b1015610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7265776172645065725365636f6e64206d757374206265206c61726765720000604482015260640161051a565b6005546006556109788261200d565b505050505050505050565b600260015414156109f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b6002600155336000908152600f602052604090208054821115610a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f20686967680000000000604482015260640161051a565b610a776122bf565b60008160010154600c546003548460000154610a939190612c52565b610a9d9190612af2565b610aa79190612c8f565b90508215610ae2578154610abc908490612c8f565b8255600e54610ae29073ffffffffffffffffffffffffffffffffffffffff1633856123ce565b8015610b0c57600d54610b0c9073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b600c546003548354610b1e9190612c52565b610b289190612af2565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001805550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b600d54610c109073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6005544210610cff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506f6f6c20686173207374617274656400000000000000000000000000000000604482015260640161051a565b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce567916004808301926020929190829003018186803b158015610d6a57600080fd5b505afa158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da29190612a4c565b60ff1690506305f5e100610db782600a612b8c565b83600c54610dc59190612c52565b610dcf9190612af2565b1015610e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7265776172645065725365636f6e64206d757374206265206c61726765720000604482015260640161051a565b600b8290556040518281527f3fca6699460f553eae31233dba0b41f635e80f5bd8132d7f2af5456c3e247be0906020015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f50616e63616b652070726f66696c652061646472657373206973206e756c6c00604482015260640161051a565b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515908117909155600a82905560408051918252602082018390527f915d08e0e89c58e352d7c1d66c942cb15dac8a7294d2ca80ddf46f1998f0512b9101610e68565b60005473ffffffffffffffffffffffffffffffffffffffff16331461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b61108760006124a7565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b4260048190556040519081527ffed9fcb0ca3d1e761a4b929792bb24082fba92dca81252646ad306d3068065669060200160405180910390a1565b60025460009060ff16158061116957506008546005546111659190612ada565b4210155b156111745750600090565b50600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b600e5473ffffffffffffffffffffffffffffffffffffffff828116911614156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207374616b6560448201527f6420746f6b656e00000000000000000000000000000000000000000000000000606482015260840161051a565b600d5473ffffffffffffffffffffffffffffffffffffffff82811691161415611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f76657220726577617260448201527f6420746f6b656e00000000000000000000000000000000000000000000000000606482015260840161051a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156113b957600080fd5b505afa1580156113cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f191906129b5565b905080611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201527f62616c616e636500000000000000000000000000000000000000000000000000606482015260840161051a565b6114a173ffffffffffffffffffffffffffffffffffffffff831633836123ce565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e98826040516114e991815260200190565b60405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b60025460ff166115e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d75737420626520736574000000000000000000000000000000000000000000604482015260640161051a565b811561165d576007548111611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6577206c696d6974206d757374206265206869676865720000000000000000604482015260640161051a565b600781905561168f565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683151517905560006007555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600754604051610e6891815260200190565b6002600154141561172f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b6002600155336000908152600f602052604090207f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615611b125760095460ff161580156117925750600a54155b8061185557506040517fea0d5dcd0000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063ea0d5dcd9060240160206040518083038186803b15801561181d57600080fd5b505afa158015611831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185591906128db565b6118e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369743a204d757374206861766520616e206163746976652070726f60448201527f66696c6500000000000000000000000000000000000000000000000000000000606482015260840161051a565b600a5460009015611a73577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166119ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369743a2050616e63616b6550726f66696c65206973206e6f74206560448201527f7869737400000000000000000000000000000000000000000000000000000000606482015260840161051a565b6040517f987ee1560000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063987ee1569060240160c06040518083038186803b158015611a3257600080fd5b505afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a91906129ee565b50929450505050505b600a541580611a845750600a548110155b611b10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4465706f7369743a2055736572206973206e6f742067657420656e6f7567682060448201527f7573657220706f696e7473000000000000000000000000000000000000000000606482015260840161051a565b505b611b1a611145565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515918217905560ff161580611b6457506007548154611b619084612ada565b11155b611bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4465706f7369743a20416d6f756e742061626f7665206c696d69740000000000604482015260640161051a565b611bd26122bf565b805415611c375760008160010154600c546003548460000154611bf59190612c52565b611bff9190612af2565b611c099190612c8f565b90508015611c3557600d54611c359073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b505b8115611c71578054611c4a908390612ada565b8155600e54611c719073ffffffffffffffffffffffffffffffffffffffff1633308561251c565b600c546003548254611c839190612c52565b611c8d9190612af2565b600182015560405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020015b60405180910390a2505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6005544210611dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506f6f6c20686173207374617274656400000000000000000000000000000000604482015260640161051a565b808210611e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4e657720737461727454696d657374616d70206d757374206265206c6f77657260448201527f207468616e206e657720656e6454696d657374616d7000000000000000000000606482015260840161051a565b814210611eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4e657720737461727454696d657374616d70206d75737420626520686967686560448201527f72207468616e2063757272656e7420626c6f636b2074696d657374616d700000606482015260840161051a565b60058290556004819055600682905560408051838152602081018390527f600b4644e23e4e5ac956d20c02417fc8385bd0324ce2ce012b91d812ad89024b9101610e68565b60026001541415611f8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b60026001908155336000908152600f60205260408120805482825592810191909155908015611fd957600e54611fd99073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969590602001611cc0565b60005473ffffffffffffffffffffffffffffffffffffffff16331461208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b73ffffffffffffffffffffffffffffffffffffffff8116612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610c10816124a7565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600f6020526040808220600e5491517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152929390928492909116906370a082319060240160206040518083038186803b1580156121ba57600080fd5b505afa1580156121ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f291906129b5565b90506006544211801561220457508015155b1561228c57600061221760065442612580565b90506000600b54826122299190612c52565b9050600083600c548361223c9190612c52565b6122469190612af2565b6003546122539190612ada565b90508460010154600c5482876000015461226d9190612c52565b6122779190612af2565b6122819190612c8f565b979650505050505050565b6001820154600c5460035484546122a39190612c52565b6122ad9190612af2565b6122b79190612c8f565b949350505050565b60065442116122ca57565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561233457600080fd5b505afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c91906129b5565b90508061237a575042600655565b600061238860065442612580565b90506000600b548261239a9190612c52565b905082600c54826123ab9190612c52565b6123b59190612af2565b6003546123c29190612ada565b60035550504260065550565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526124a29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526125c1565b505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261257a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612420565b50505050565b6000600454821161259c576125958383612c8f565b90506125bb565b60045483106125ad575060006125bb565b826004546125959190612c8f565b92915050565b6000612623826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126cd9092919063ffffffff16565b8051909150156124a2578080602001905181019061264191906128db565b6124a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161051a565b60606126dc84846000856126e6565b90505b9392505050565b606082471015612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161051a565b73ffffffffffffffffffffffffffffffffffffffff85163b6127f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161051a565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161281f9190612a6d565b60006040518083038185875af1925050503d806000811461285c576040519150601f19603f3d011682016040523d82523d6000602084013e612861565b606091505b50915091506122818282866060831561287b5750816126df565b82511561288b5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051a9190612a89565b6000602082840312156128d0578081fd5b81356126df81612d01565b6000602082840312156128ec578081fd5b81516126df81612d23565b60008060408385031215612909578081fd5b823561291481612d23565b946020939093013593505050565b600080600080600080600080610100898b03121561293e578384fd5b883561294981612d01565b9750602089013561295981612d01565b965060408901359550606089013594506080890135935060a0890135925060c0890135915060e089013561298c81612d01565b809150509295985092959890939650565b6000602082840312156129ae578081fd5b5035919050565b6000602082840312156129c6578081fd5b5051919050565b600080604083850312156129df578182fd5b50508035926020909101359150565b60008060008060008060c08789031215612a06578182fd5b8651955060208701519450604087015193506060870151612a2681612d01565b608088015160a08901519194509250612a3e81612d23565b809150509295509295509295565b600060208284031215612a5d578081fd5b815160ff811681146126df578182fd5b60008251612a7f818460208701612ca6565b9190910192915050565b6020815260008251806020840152612aa8816040850160208701612ca6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115612aed57612aed612cd2565b500190565b600082612b26577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b600181815b80851115612b8457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612b6a57612b6a612cd2565b80851615612b7757918102915b93841c9390800290612b30565b509250929050565b60006126df8383600082612ba2575060016125bb565b81612baf575060006125bb565b8160018114612bc55760028114612bcf57612beb565b60019150506125bb565b60ff841115612be057612be0612cd2565b50506001821b6125bb565b5060208310610133831016604e8410600b8410161715612c0e575081810a6125bb565b612c188383612b2b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612c4a57612c4a612cd2565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c8a57612c8a612cd2565b500290565b600082821015612ca157612ca1612cd2565b500390565b60005b83811015612cc1578181015183820152602001612ca9565b8381111561257a5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c1057600080fd5b8015158114610c1057600080fdfea264697066735822122038564d7e6ac9e27efc7a0786910a29d6dfe0b26ef8eeaa930b320b896ea987e264736f6c63430008040033a2646970667358221220fd96b88ee4d36810ef6135e7b4b84bf3db5361ca97d867db6cc123e1d6becd2b64736f6c63430008040033
Deployed Bytecode Sourcemap
35363:2523:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12734:103;;;:::i;:::-;;12083:87;12129:7;12156:6;12083:87;;;12156:6;;;;3108:74:1;;12083:87:0;;;;;3096:2:1;12083:87:0;;;12992:201;;;;;;:::i;:::-;;:::i;36330:1553::-;;;;;;:::i;:::-;;:::i;12734:103::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;5355:2:1;12295:68:0;;;5337:21:1;;;5374:18;;;5367:30;5433:34;5413:18;;;5406:62;5485:18;;12295:68:0;;;;;;;;;12799:30:::1;12826:1;12799:18;:30::i;:::-;12734:103::o:0;12992:201::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;5355:2:1;12295:68:0;;;5337:21:1;;;5374:18;;;5367:30;5433:34;5413:18;;;5406:62;5485:18;;12295:68:0;5327:182:1;12295:68:0;13081:22:::1;::::0;::::1;13073:73;;;::::0;::::1;::::0;;4592:2:1;13073:73:0::1;::::0;::::1;4574:21:1::0;4631:2;4611:18;;;4604:30;4670:34;4650:18;;;4643:62;4741:8;4721:18;;;4714:36;4767:19;;13073:73:0::1;4564:228:1::0;13073:73:0::1;13157:28;13176:8;13157:18;:28::i;:::-;12992:201:::0;:::o;36330:1553::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;5355:2:1;12295:68:0;;;5337:21:1;;;5374:18;;;5367:30;5433:34;5413:18;;;5406:62;5485:18;;12295:68:0;5327:182:1;12295:68:0;36833:1:::1;36803:12;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;36795:40;;;::::0;::::1;;36884:1;36854:12;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;36846:40;;;::::0;::::1;;36921:12;36905:28;;:12;:28;;;;36897:68;;;::::0;::::1;::::0;;4999:2:1;36897:68:0::1;::::0;::::1;4981:21:1::0;5038:2;5018:18;;;5011:30;5077:29;5057:18;;;5050:57;5124:18;;36897:68:0::1;4971:177:1::0;36897:68:0::1;36978:21;37002:41;;;;;;;;:::i;:::-;::::0;;;;;;;;::::1;::::0;;::::1;;;::::0;;;3419:42:1;3407:55;;37002:41:0::1;37157:87:::0;::::1;3389:74:1::0;3506:14;;3499:22;3479:18;;;3472:50;3538:18;;;3531:34;;;37002:41:0;;-1:-1:-1;37002:41:0;;3362:18:1;;37157:87:0::1;::::0;;;;;::::1;::::0;;;;;;;37103:152:::1;::::0;;37157:87:::1;37103:152;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;;2719:66:1;2814:2;2810:15;;;2806:24;;37103:152:0::1;37291:61:::0;::::1;2794:37:1::0;2865:15;;;2861:24;2847:12;;;2840:46;2902:12;;;2895:28;;;37103:152:0;-1:-1:-1;37266:12:0::1;::::0;2939::1;;37291:61:0::1;;;;;;;;;;;;37281:72;;;;;;37266:87;;37364:24;37492:4;37481:8;37475:15;37470:2;37460:8;37456:17;37453:1;37445:52;37425:72;;37543:16;37520:51;;;37586:12;37613;37640:16;37671:15;37701:13;37729:17;37761:26;37802:6;37520:299;;;;;;;;;;;;;;;;;;;;;3971:42:1::0;4040:15;;;4022:34;;4092:15;;;4087:2;4072:18;;4065:43;4139:2;4124:18;;4117:34;;;;4182:2;4167:18;;4160:34;;;;4225:3;4210:19;;4203:35;;;;4269:3;4254:19;;4247:35;4313:3;4298:19;;4291:35;4363:15;;;4357:3;4342:19;;4335:44;3948:3;3933:19;;3915:470;37520:299:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37837:38:0::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;37837:38:0::1;::::0;-1:-1:-1;37837:38:0;;::::1;12374:1;;;36330:1553:::0;;;;;;;;;;;:::o;13353:191::-;13427:16;13446:6;;;13463:17;;;;;;;;;;13496:40;;13446:6;;;;;;;13496:40;;13427:16;13496:40;13353:191;;:::o;-1:-1:-1:-;;;;;;;;:::o;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:257::-;212:6;265:2;253:9;244:7;240:23;236:32;233:2;;;286:6;278;271:22;233:2;330:9;317:23;349:31;374:5;349:31;:::i;:::-;399:5;223:187;-1:-1:-1;;;223:187:1:o;415:1252::-;603:6;611;619;627;635;643;651;659;667;675;683:7;737:3;725:9;716:7;712:23;708:33;705:2;;;759:6;751;744:22;705:2;803:9;790:23;822:31;847:5;822:31;:::i;:::-;872:5;-1:-1:-1;929:2:1;914:18;;901:32;942:33;901:32;942:33;:::i;:::-;994:7;-1:-1:-1;1048:2:1;1033:18;;1020:32;;-1:-1:-1;1099:2:1;1084:18;;1071:32;;-1:-1:-1;1150:3:1;1135:19;;1122:33;;-1:-1:-1;1202:3:1;1187:19;;1174:33;;-1:-1:-1;1254:3:1;1239:19;;1226:33;;-1:-1:-1;1311:3:1;1296:19;;1283:33;1325;1283;1325;:::i;:::-;1377:7;-1:-1:-1;1436:3:1;1421:19;;1408:33;1479:15;;1472:23;1460:36;;1450:2;;1515:6;1507;1500:22;1450:2;1543:7;-1:-1:-1;1597:3:1;1582:19;;1569:33;;-1:-1:-1;1622:39:1;1656:3;1641:19;;1622:39;:::i;:::-;1611:50;;695:972;;;;;;;;;;;;;;:::o;1672:194::-;1742:6;1795:2;1783:9;1774:7;1770:23;1766:32;1763:2;;;1816:6;1808;1801:22;1763:2;-1:-1:-1;1844:16:1;;1753:113;-1:-1:-1;1753:113:1:o;1871:340::-;1912:3;1950:5;1944:12;1974:3;1986:128;2000:6;1997:1;1994:13;1986:128;;;2097:4;2082:13;;;2078:24;;2072:31;2059:11;;;2052:52;2015:12;1986:128;;;2132:6;2129:1;2126:13;2123:2;;;2167:3;2158:6;2153:3;2149:16;2142:29;2123:2;-1:-1:-1;2189:16:1;;;;;1920:291;-1:-1:-1;;1920:291:1:o;2216:261::-;2391:3;2416:55;2441:29;2466:3;2458:6;2441:29;:::i;:::-;2433:6;2416:55;:::i;:::-;2409:62;2399:78;-1:-1:-1;;;;2399:78:1:o;5514:154::-;5600:42;5593:5;5589:54;5582:5;5579:65;5569:2;;5658:1;5655;5648:12
Swarm Source
ipfs://fd96b88ee4d36810ef6135e7b4b84bf3db5361ca97d867db6cc123e1d6becd2b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.