Overview
MOVR Balance
MOVR Value
$6,306.87 (@ $6.20/MOVR)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 51 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mass Update Pool... | 1653131 | 1120 days ago | IN | 0 MOVR | 0.00059721 | ||||
Emergency Reward... | 1653110 | 1120 days ago | IN | 0 MOVR | 0.00013707 | ||||
Emergency Reward... | 1578667 | 1139 days ago | IN | 0 MOVR | 0.00013707 | ||||
Emergency Reward... | 1577607 | 1140 days ago | IN | 0 MOVR | 0.00013704 | ||||
Emergency Reward... | 1577391 | 1140 days ago | IN | 0 MOVR | 0.00013704 | ||||
Emergency Reward... | 1577382 | 1140 days ago | IN | 0 MOVR | 0.00013704 | ||||
Mass Update Pool... | 1573599 | 1141 days ago | IN | 0 MOVR | 0.00059721 | ||||
Emergency Reward... | 1573592 | 1141 days ago | IN | 0 MOVR | 0.00013709 | ||||
Emergency Reward... | 1573585 | 1141 days ago | IN | 0 MOVR | 0.00013712 | ||||
Emergency Reward... | 1573584 | 1141 days ago | IN | 0 MOVR | 0.00013712 | ||||
Emergency Reward... | 1573578 | 1141 days ago | IN | 0 MOVR | 0.00013712 | ||||
Emergency Reward... | 1573459 | 1141 days ago | IN | 0 MOVR | 0.00013712 | ||||
Mass Update Pool... | 1573447 | 1141 days ago | IN | 0 MOVR | 0.00059721 | ||||
Emergency Reward... | 1573426 | 1141 days ago | IN | 0 MOVR | 0.00061313 | ||||
Emergency Reward... | 1573417 | 1141 days ago | IN | 0 MOVR | 0.00061313 | ||||
Emergency Reward... | 1573416 | 1141 days ago | IN | 0 MOVR | 0.0006856 | ||||
Emergency Reward... | 1573415 | 1141 days ago | IN | 0 MOVR | 0.0006856 | ||||
Emergency Reward... | 1573411 | 1141 days ago | IN | 0 MOVR | 0.00061301 | ||||
Emergency Reward... | 1573402 | 1141 days ago | IN | 0 MOVR | 0.00061313 | ||||
Emergency Reward... | 1573397 | 1141 days ago | IN | 0 MOVR | 0.00061301 | ||||
Emergency Reward... | 1573393 | 1141 days ago | IN | 0 MOVR | 0.00061313 | ||||
Emergency Reward... | 1573392 | 1141 days ago | IN | 0 MOVR | 0.0006856 | ||||
Emergency Reward... | 1573389 | 1141 days ago | IN | 0 MOVR | 0.0006856 | ||||
Emergency Reward... | 1570763 | 1141 days ago | IN | 0 MOVR | 0.00061324 | ||||
Emergency Reward... | 1570760 | 1141 days ago | IN | 0 MOVR | 0.00061324 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11236873 | 3 days ago | 0 MOVR | ||||
11231998 | 3 days ago | 0 MOVR | ||||
11193819 | 6 days ago | 0 MOVR | ||||
11193803 | 6 days ago | 0 MOVR | ||||
11184961 | 6 days ago | 0 MOVR | ||||
11082255 | 14 days ago | 0 MOVR | ||||
11074515 | 14 days ago | 0 MOVR | ||||
11045981 | 16 days ago | 0 MOVR | ||||
11037596 | 17 days ago | 0 MOVR | ||||
11003824 | 19 days ago | 0 MOVR | ||||
10987804 | 20 days ago | 0.00000001 MOVR | ||||
10987151 | 21 days ago | 0.00000002 MOVR | ||||
10987148 | 21 days ago | 0.00000006 MOVR | ||||
10962716 | 22 days ago | 0 MOVR | ||||
10960791 | 22 days ago | 0 MOVR | ||||
10949168 | 23 days ago | 0 MOVR | ||||
10940805 | 24 days ago | 0 MOVR | ||||
10923586 | 25 days ago | 0 MOVR | ||||
10897268 | 27 days ago | 0 MOVR | ||||
10879999 | 28 days ago | 0.00000057 MOVR | ||||
10802989 | 34 days ago | 0 MOVR | ||||
10692917 | 42 days ago | 0.00000005 MOVR | ||||
10692912 | 42 days ago | 0.00000001 MOVR | ||||
10692811 | 42 days ago | 0 MOVR | ||||
10545819 | 52 days ago | 0 MOVR |
Loading...
Loading
Contract Name:
ComplexRewarderPerSecV3
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2022-02-23 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ 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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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); } } } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ 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 make 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; } } interface IBoringERC20 { function mint(address to, uint256 amount) external; function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); /// @notice EIP 2612 function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } interface IComplexRewarder { function onSolarReward( uint256 pid, address user, uint256 newLpAmount ) external; function pendingTokens(uint256 pid, address user) external view returns (uint256 pending); function rewardToken() external view returns (IBoringERC20); function poolRewardsPerSec(uint256 pid) external view returns (uint256); } interface ISolarDistributorV2 { function totalAllocPoint() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; function poolLength() external view returns (uint256); function poolTotalLp(uint256 pid) external view returns (uint256); } // solhint-disable avoid-low-level-calls library BoringERC20 { bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol() bytes4 private constant SIG_NAME = 0x06fdde03; // name() bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals() bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) function returnDataToString(bytes memory data) internal pure returns (string memory) { if (data.length >= 64) { return abi.decode(data, (string)); } else if (data.length == 32) { uint8 i = 0; while (i < 32 && data[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && data[i] != 0; i++) { bytesArray[i] = data[i]; } return string(bytesArray); } else { return "???"; } } /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token symbol. function safeSymbol(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_SYMBOL) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.name version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token name. function safeName(IBoringERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_NAME) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. /// @param token The address of the ERC-20 token contract. /// @return (uint8) Token decimals. function safeDecimals(IBoringERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_DECIMALS) ); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransfer( IBoringERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed" ); } /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param from Transfer tokens from. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransferFrom( IBoringERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed" ); } } /** * This is a sample contract to be used in the SolarDistributorV2 contract for partners to reward * stakers with their native token alongside SOLAR. * * It assumes no minting rights, so requires a set amount of YOUR_TOKEN to be transferred to this contract prior. * E.g. say you've allocated 100,000 XYZ to the SOLAR-XYZ farm over 30 days. Then you would need to transfer * 100,000 XYZ and set the block reward accordingly so it's fully distributed after 30 days. */ contract ComplexRewarderPerSecV3 is IComplexRewarder, Ownable, ReentrancyGuard { using BoringERC20 for IBoringERC20; IBoringERC20 public immutable override rewardToken; ISolarDistributorV2 public immutable distributorV2; bool public immutable isNative; /// @notice Info of each distributorV2 user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of REWARD entitled to the user. struct UserInfo { uint256 amount; uint256 rewardDebt; } /// @notice Info of each distributorV2 poolInfo. /// `accTokenPerShare` Amount of REWARD each LP token is worth. /// `startTimestamp` The start timestamp of rewards. /// `lastRewardTimestamp` The last timestamp REWARD was rewarded to the poolInfo. /// `allocPoint` The amount of allocation points assigned to the pool. /// `totalRewards` The amount of rewards added to the pool. struct PoolInfo { uint256 accTokenPerShare; uint256 startTimestamp; uint256 lastRewardTimestamp; uint256 totalRewards; } /// @notice Reward info /// `startTimestamp` The start timestamp of rewards /// `endTimestamp` The end timestamp of rewards /// `rewardPerSec` The amount of rewards per second struct RewardInfo { uint256 startTimestamp; uint256 endTimestamp; uint256 rewardPerSec; } /// @notice Info of each pool. mapping(uint256 => PoolInfo) public poolInfo; /// @dev this is mostly used for extending reward period /// @notice Reward info is a set of {endTimestamp, rewardPerSec} /// indexed by pool id mapping(uint256 => RewardInfo[]) public poolRewardInfo; uint256[] public poolIds; /// @notice Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; /// @notice limit length of reward info /// how many phases are allowed uint256 public immutable rewardInfoLimit = 52; //1y // The precision factor uint256 private immutable ACC_TOKEN_PRECISION; event OnReward(address indexed user, uint256 amount); event RewardRateUpdated(uint256 oldRate, uint256 newRate); event AddPool(uint256 indexed pid); event UpdatePool( uint256 indexed pid, uint256 lastRewardTimestamp, uint256 lpSupply, uint256 accTokenPerShare ); event AddRewardInfo( uint256 indexed pid, uint256 indexed phase, uint256 endTimestamp, uint256 rewardPerSec ); modifier onlyDistributorV2() { require( msg.sender == address(distributorV2), "onlyDistributorV2: only DistributorV2 can call this function" ); _; } constructor( IBoringERC20 _rewardToken, ISolarDistributorV2 _distributorV2, bool _isNative ) { require( Address.isContract(address(_rewardToken)), "constructor: reward token must be a valid contract" ); require( Address.isContract(address(_distributorV2)), "constructor: SolarDistributorV2 must be a valid contract" ); rewardToken = _rewardToken; distributorV2 = _distributorV2; isNative = _isNative; uint256 decimalsRewardToken = uint256( _isNative ? 18 : _rewardToken.safeDecimals() ); require( decimalsRewardToken < 30, "constructor: reward token decimals must be inferior to 30" ); ACC_TOKEN_PRECISION = uint256( 10**(uint256(30) - (decimalsRewardToken)) ); } /// @notice Add a new pool. Can only be called by the owner. /// @param _pid pool id on DistributorV2 function add(uint256 _pid, uint256 _startTimestamp) public onlyOwner { require(poolInfo[_pid].lastRewardTimestamp == 0, "pool already exists"); poolInfo[_pid] = PoolInfo({ startTimestamp: _startTimestamp, lastRewardTimestamp: _startTimestamp, accTokenPerShare: 0, totalRewards: 0 }); poolIds.push(_pid); emit AddPool(_pid); } /// @notice if the new reward info is added, the reward & its end timestamp will be extended by the newly pushed reward info. function addRewardInfo( uint256 _pid, uint256 _endTimestamp, uint256 _rewardPerSec ) external payable onlyOwner { RewardInfo[] storage rewardInfo = poolRewardInfo[_pid]; PoolInfo storage pool = poolInfo[_pid]; require( rewardInfo.length < rewardInfoLimit, "add reward info: reward info length exceeds the limit" ); require( rewardInfo.length == 0 || rewardInfo[rewardInfo.length - 1].endTimestamp >= block.timestamp, "add reward info: reward period ended" ); require( rewardInfo.length == 0 || rewardInfo[rewardInfo.length - 1].endTimestamp < _endTimestamp, "add reward info: bad new endTimestamp" ); uint256 startTimestamp = rewardInfo.length == 0 ? pool.startTimestamp : rewardInfo[rewardInfo.length - 1].endTimestamp; uint256 timeRange = _endTimestamp - startTimestamp; uint256 totalRewards = timeRange * _rewardPerSec; if (!isNative) { rewardToken.safeTransferFrom( msg.sender, address(this), totalRewards ); } else { require( msg.value == totalRewards, "add reward info: not enough funds to transfer" ); } pool.totalRewards += totalRewards; rewardInfo.push( RewardInfo({ startTimestamp: startTimestamp, endTimestamp: _endTimestamp, rewardPerSec: _rewardPerSec }) ); emit AddRewardInfo( _pid, rewardInfo.length - 1, _endTimestamp, _rewardPerSec ); } function _endTimestampOf(uint256 _pid, uint256 _timestamp) internal view returns (uint256) { RewardInfo[] memory rewardInfo = poolRewardInfo[_pid]; uint256 len = rewardInfo.length; if (len == 0) { return 0; } for (uint256 i = 0; i < len; ++i) { if (_timestamp <= rewardInfo[i].endTimestamp) return rewardInfo[i].endTimestamp; } /// @dev when couldn't find any reward info, it means that _timestamp exceed endTimestamp /// so return the latest reward info. return rewardInfo[len - 1].endTimestamp; } /// @notice this will return end timestamp based on the current block timestamp. function currentEndTimestamp(uint256 _pid) external view returns (uint256) { return _endTimestampOf(_pid, block.timestamp); } /// @notice Return reward multiplier over the given _from to _to timestamp. function _getTimeElapsed( uint256 _from, uint256 _to, uint256 _endTimestamp ) public pure returns (uint256) { if ((_from >= _endTimestamp) || (_from > _to)) { return 0; } if (_to <= _endTimestamp) { return _to - _from; } return _endTimestamp - _from; } /// @notice Update reward variables of the given pool. /// @param _pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function updatePool(uint256 _pid) external nonReentrant returns (PoolInfo memory pool) { return _updatePool(_pid); } /// @notice Update reward variables of the given pool. /// @param pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function _updatePool(uint256 pid) public returns (PoolInfo memory pool) { pool = poolInfo[pid]; RewardInfo[] memory rewardInfo = poolRewardInfo[pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return pool; } uint256 lpSupply = distributorV2.poolTotalLp(pid); if (lpSupply == 0) { // if there is no total supply, return and use the pool's start timestamp as the last reward timestamp // so that ALL reward will be distributed. // however, if the first deposit is out of reward period, last reward timestamp will be its timestamp // in order to keep the multiplier = 0 if (block.timestamp > _endTimestampOf(pid, block.timestamp)) { pool.lastRewardTimestamp = block.timestamp; emit UpdatePool( pid, pool.lastRewardTimestamp, lpSupply, pool.accTokenPerShare ); } return pool; } /// @dev for each reward info for (uint256 i = 0; i < rewardInfo.length; ++i) { // @dev get multiplier based on current timestamp and rewardInfo's end timestamp // multiplier will be a range of either (current timestamp - pool.timestamp) // or (reward info's endtimestamp - pool.timestamp) or 0 uint256 timeElapsed = _getTimeElapsed( pool.lastRewardTimestamp, block.timestamp, rewardInfo[i].endTimestamp ); if (timeElapsed == 0) continue; // @dev if currentTimestamp exceed end timestamp, use end timestamp as the last reward timestamp // so that for the next iteration, previous endTimestamp will be used as the last reward timestamp if (block.timestamp > rewardInfo[i].endTimestamp) { pool.lastRewardTimestamp = rewardInfo[i].endTimestamp; } else { pool.lastRewardTimestamp = block.timestamp; } uint256 tokenReward = (timeElapsed * rewardInfo[i].rewardPerSec); pool.accTokenPerShare += ((tokenReward * ACC_TOKEN_PRECISION) / lpSupply); } poolInfo[pid] = pool; emit UpdatePool( pid, pool.lastRewardTimestamp, lpSupply, pool.accTokenPerShare ); return pool; } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() public nonReentrant { _massUpdatePools(); } // Update reward vairables for all pools. Be careful of gas spending! function _massUpdatePools() internal { uint256 length = poolIds.length; for (uint256 pid = 0; pid < length; ++pid) { _updatePool(poolIds[pid]); } } /// @notice Function called by SolarDistributorV2 whenever staker claims SOLAR harvest. Allows staker to also receive a 2nd reward token. /// @param _user Address of user /// @param _amount Number of LP tokens the user has function onSolarReward( uint256 _pid, address _user, uint256 _amount ) external override onlyDistributorV2 nonReentrant { PoolInfo memory pool = _updatePool(_pid); UserInfo storage user = userInfo[_pid][_user]; uint256 pending = 0; uint256 rewardBalance = 0; if (isNative) { rewardBalance = address(this).balance; } else { rewardBalance = rewardToken.balanceOf(address(this)); } if (user.amount > 0) { pending = (((user.amount * pool.accTokenPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt); if (pending > 0) { if (isNative) { if (pending > rewardBalance) { (bool success, ) = _user.call{value: rewardBalance}(""); require(success, "Transfer failed"); } else { (bool success, ) = _user.call{value: pending}(""); require(success, "Transfer failed"); } } else { if (pending > rewardBalance) { rewardToken.safeTransfer(_user, rewardBalance); } else { rewardToken.safeTransfer(_user, pending); } } } } user.amount = _amount; user.rewardDebt = (user.amount * pool.accTokenPerShare) / ACC_TOKEN_PRECISION; emit OnReward(_user, pending); } /// @notice View function to see pending Reward on frontend. function pendingTokens(uint256 _pid, address _user) external view override returns (uint256) { return _pendingTokens( _pid, userInfo[_pid][_user].amount, userInfo[_pid][_user].rewardDebt ); } function _pendingTokens( uint256 _pid, uint256 _amount, uint256 _rewardDebt ) internal view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; RewardInfo[] memory rewardInfo = poolRewardInfo[_pid]; uint256 accTokenPerShare = pool.accTokenPerShare; uint256 lpSupply = distributorV2.poolTotalLp(_pid); if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 cursor = pool.lastRewardTimestamp; for (uint256 i = 0; i < rewardInfo.length; ++i) { uint256 timeElapsed = _getTimeElapsed( cursor, block.timestamp, rewardInfo[i].endTimestamp ); if (timeElapsed == 0) continue; cursor = rewardInfo[i].endTimestamp; uint256 tokenReward = (timeElapsed * rewardInfo[i].rewardPerSec); accTokenPerShare += (tokenReward * ACC_TOKEN_PRECISION) / lpSupply; } } pending = (((_amount * accTokenPerShare) / ACC_TOKEN_PRECISION) - _rewardDebt); } function _rewardPerSecOf(uint256 _pid, uint256 _blockTimestamp) internal view returns (uint256) { RewardInfo[] memory rewardInfo = poolRewardInfo[_pid]; PoolInfo storage pool = poolInfo[_pid]; uint256 len = rewardInfo.length; if (len == 0) { return 0; } if (pool.startTimestamp > _blockTimestamp) { return 0; } for (uint256 i = 0; i < len; ++i) { if (_blockTimestamp <= rewardInfo[i].endTimestamp) return rewardInfo[i].rewardPerSec; } /// @dev when couldn't find any reward info, it means that timestamp exceed endblock /// so return 0 return 0; } /// @notice View function to see pool rewards per sec function poolRewardsPerSec(uint256 _pid) external view override returns (uint256) { return _rewardPerSecOf(_pid, block.timestamp); } /// @notice Withdraw reward. EMERGENCY ONLY. function emergencyRewardWithdraw( uint256 _pid, uint256 _amount, address _beneficiary ) external onlyOwner nonReentrant { PoolInfo storage pool = poolInfo[_pid]; uint256 lpSupply = distributorV2.poolTotalLp(_pid); uint256 currentStakingPendingReward = _pendingTokens(_pid, lpSupply, 0); require( currentStakingPendingReward + _amount <= pool.totalRewards, "emergency reward withdraw: not enough reward token" ); pool.totalRewards -= _amount; if (!isNative) { rewardToken.safeTransfer(_beneficiary, _amount); } else { (bool sent, ) = _beneficiary.call{value: _amount}(""); require(sent, "emergency reward withdraw: failed to send"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IBoringERC20","name":"_rewardToken","type":"address"},{"internalType":"contract ISolarDistributorV2","name":"_distributorV2","type":"address"},{"internalType":"bool","name":"_isNative","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"AddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"phase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"name":"AddRewardInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"RewardRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accTokenPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"_getTimeElapsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"_updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct ComplexRewarderPerSecV3.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_rewardPerSec","type":"uint256"}],"name":"addRewardInfo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"currentEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributorV2","outputs":[{"internalType":"contract ISolarDistributorV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"onSolarReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolRewardInfo","outputs":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardInfoLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct ComplexRewarderPerSecV3.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
610120604052603460e0523480156200001757600080fd5b5060405162003020380380620030208339810160408190526200003a9162000371565b620000453362000252565b600180819055506200006283620002a260201b62001ccb1760201c565b620000cf5760405162461bcd60e51b815260206004820152603260248201527f636f6e7374727563746f723a2072657761726420746f6b656e206d7573742062604482015271194818481d985b1a590818dbdb9d1c9858dd60721b60648201526084015b60405180910390fd5b620000e582620002a260201b62001ccb1760201c565b620001595760405162461bcd60e51b815260206004820152603860248201527f636f6e7374727563746f723a20536f6c61724469737472696275746f7256322060448201527f6d75737420626520612076616c696420636f6e747261637400000000000000006064820152608401620000c6565b6001600160601b0319606084811b821660805283901b1660a05280151560f81b60c052600081620001a957620001a3846001600160a01b0316620002a860201b62001cd11760201c565b620001ac565b60125b60ff169050601e8110620002295760405162461bcd60e51b815260206004820152603960248201527f636f6e7374727563746f723a2072657761726420746f6b656e20646563696d6160448201527f6c73206d75737420626520696e666572696f7220746f203330000000000000006064820152608401620000c6565b6200023681601e6200053a565b6200024390600a6200047c565b61010052506200058392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3b151590565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691620002f09190620003f5565b600060405180830381855afa9150503d80600081146200032d576040519150601f19603f3d011682016040523d82523d6000602084013e62000332565b606091505b509150915081801562000346575080516020145b6200035357601262000369565b80806020019051810190620003699190620003c9565b949350505050565b6000806000606084860312156200038757600080fd5b835162000394816200056a565b6020850151909350620003a7816200056a565b60408501519092508015158114620003be57600080fd5b809150509250925092565b600060208284031215620003dc57600080fd5b815160ff81168114620003ee57600080fd5b9392505050565b6000825160005b81811015620004185760208186018101518583015201620003fc565b8181111562000428576000828501525b509190910192915050565b600181815b808511156200047457816000190482111562000458576200045862000554565b808516156200046657918102915b93841c939080029062000438565b509250929050565b6000620003ee8383600082620004955750600162000534565b81620004a45750600062000534565b8160018114620004bd5760028114620004c857620004e8565b600191505062000534565b60ff841115620004dc57620004dc62000554565b50506001821b62000534565b5060208310610133831016604e8410600b84101617156200050d575081810a62000534565b62000519838362000433565b806000190482111562000530576200053062000554565b0290505b92915050565b6000828210156200054f576200054f62000554565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146200058057600080fd5b50565b60805160601c60a05160601c60c05160f81c60e051610100516129d16200064f60003960008181611591015281816119fc01528181611bf801528181611fe3015261203701526000818161018b0152610a5e0152600081816103830152818161085701528181610d07015281816118ff0152611a430152600081816103e7015281816106fe015281816113c5015281816117a00152611eb001526000818161051f0152818161089601528181610d440152818161195801528181611b840152611bca01526129d16000f3fe6080604052600436106101745760003560e01c806373cfc6b2116100cb5780639e494bee1161007f578063f7c618c111610059578063f7c618c11461050d578063fe8343fb14610541578063ffcd42631461056157600080fd5b80639e494bee146104ad578063d4aa89b5146104cd578063f2fde38b146104ed57600080fd5b80637d0d9d5f116100b05780637d0d9d5f146103d55780638da5cb5b1461042e57806393f1a40b1461045957600080fd5b806373cfc6b214610371578063771602f7146103b557600080fd5b8063465e81ec1161012d57806369883b4e1161010757806369883b4e1461031c578063715018a61461033c578063723336311461035157600080fd5b8063465e81ec1461029457806351eb05a6146102b4578063630b5ba11461030757600080fd5b80631526fe271161015e5780631526fe27146101fb5780631d1231311461025f5780632ea807c51461028157600080fd5b8062d74850146101795780630832cfbf146101c0575b600080fd5b34801561018557600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101cc57600080fd5b506101e06101db36600461277c565b610581565b604080519384526020840192909252908201526060016101b7565b34801561020757600080fd5b5061023f6102163660046126e9565b600260208190526000918252604090912080546001820154928201546003909201549092919084565b6040805194855260208501939093529183015260608201526080016101b7565b34801561026b57600080fd5b5061027f61027a36600461279e565b6105c3565b005b61027f61028f3660046127d3565b6109c0565b3480156102a057600080fd5b506101ad6102af3660046126e9565b610eb2565b3480156102c057600080fd5b506102d46102cf3660046126e9565b610ec4565b6040516101b791908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561031357600080fd5b5061027f610f74565b34801561032857600080fd5b506101ad6103373660046126e9565b610ff4565b34801561034857600080fd5b5061027f611015565b34801561035d57600080fd5b506101ad61036c3660046127d3565b6110a2565b34801561037d57600080fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016101b7565b3480156103c157600080fd5b5061027f6103d036600461277c565b6110eb565b3480156103e157600080fd5b506104097f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b34801561043a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610409565b34801561046557600080fd5b5061049861047436600461271b565b60056020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101b7565b3480156104b957600080fd5b506101ad6104c83660046126e9565b611295565b3480156104d957600080fd5b506102d46104e83660046126e9565b6112a1565b3480156104f957600080fd5b5061027f6105083660046126ac565b611658565b34801561051957600080fd5b506104097f000000000000000000000000000000000000000000000000000000000000000081565b34801561054d57600080fd5b5061027f61055c366004612747565b611788565b34801561056d57600080fd5b506101ad61057c36600461271b565b611c89565b6003602052816000526040600020818154811061059d57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b60005473ffffffffffffffffffffffffffffffffffffffff163314610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600260015414156106b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b600260018190556000848152602091909152604080822090517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018690529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561075557600080fd5b505afa158015610769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078d9190612702565b9050600061079d86836000611dcc565b60038401549091506107af868361285d565b111561083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f656d657267656e6379207265776172642077697468647261773a206e6f74206560448201527f6e6f7567682072657761726420746f6b656e00000000000000000000000000006064820152608401610640565b8483600301600082825461085191906128ed565b909155507f000000000000000000000000000000000000000000000000000000000000000090506108c2576108bd73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168587612080565b6109b4565b60008473ffffffffffffffffffffffffffffffffffffffff168660405160006040518083038185875af1925050503d806000811461091c576040519150601f19603f3d011682016040523d82523d6000602084013e610921565b606091505b50509050806109b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e6379207265776172642077697468647261773a206661696c6560448201527f6420746f2073656e6400000000000000000000000000000000000000000000006064820152608401610640565b505b50506001805550505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b6000838152600360209081526040808320600290925290912081547f000000000000000000000000000000000000000000000000000000000000000011610b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f6164642072657761726420696e666f3a2072657761726420696e666f206c656e60448201527f677468206578636565647320746865206c696d697400000000000000000000006064820152608401610640565b81541580610b4a5750815442908390610b25906001906128ed565b81548110610b3557610b3561296c565b90600052602060002090600302016001015410155b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6164642072657761726420696e666f3a2072657761726420706572696f64206560448201527f6e646564000000000000000000000000000000000000000000000000000000006064820152608401610640565b81541580610c145750815484908390610bf0906001906128ed565b81548110610c0057610c0061296c565b906000526020600020906003020160010154105b610ca0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f6164642072657761726420696e666f3a20626164206e657720656e6454696d6560448201527f7374616d700000000000000000000000000000000000000000000000000000006064820152608401610640565b815460009015610ce15782548390610cba906001906128ed565b81548110610cca57610cca61296c565b906000526020600020906003020160010154610ce7565b81600101545b90506000610cf582876128ed565b90506000610d0386836128b0565b90507f0000000000000000000000000000000000000000000000000000000000000000610d7157610d6c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846121f0565b610e00565b803414610e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f6164642072657761726420696e666f3a206e6f7420656e6f7567682066756e6460448201527f7320746f207472616e73666572000000000000000000000000000000000000006064820152608401610640565b80846003016000828254610e14919061285d565b90915550506040805160608101825284815260208082018a8152928201898152885460018181018b5560008b8152939093209351600390910290930192835592518282015591516002909101558554610e6d91906128ed565b60408051898152602081018990528a917fad90731bd0d97445f5af66088f3adebf343c520c20e033cc42f93b124258cdc2910160405180910390a35050505050505050565b6000610ebe8242612369565b92915050565b610eef6040518060800160405280600081526020016000815260200160008152602001600081525090565b60026001541415610f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b6002600155610f6a826112a1565b6001805592915050565b60026001541415610fe1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b6002600155610fee612499565b60018055565b6004818154811061100457600080fd5b600091825260209091200154905081565b60005473ffffffffffffffffffffffffffffffffffffffff163314611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b6110a060006124e2565b565b600081841015806110b257508284115b156110bf575060006110e4565b8183116110d7576110d084846128ed565b90506110e4565b6110e184836128ed565b90505b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b60008281526002602081905260409091200154156111e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20616c726561647920657869737473000000000000000000000000006044820152606401610640565b6040805160808101825260008082526020808301858152838501868152606085018481528885526002938490528685209551865591516001808701919091559051928501929092555160039093019290925560048054928301815581527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101849055905183917f6f92874181ba07c8e988c53b7d3c2fdcff7154a3500137bf6a350ebac65c087091a25050565b6000610ebe8242612557565b6112cc6040518060800160405280600081526020016000815260200160008152602001600081525090565b50600081815260026020818152604080842081516080810183528154815260018201548185015293810154848301526003908101546060850152858552825280842080548251818502810185019093528083529394939192909190849084015b8282101561137c578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250508152602001906001019061132c565b505050509050816040015142116113935750919050565b6040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561141c57600080fd5b505afa158015611430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114549190612702565b9050806114bf576114658442612557565b4211156114b85742604084810182905284518151928352602083018490529082015284907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46906060015b60405180910390a25b5050919050565b60005b82518110156115e55760006114f98560400151428685815181106114e8576114e861296c565b6020026020010151602001516110a2565b90508061150657506115d5565b8382815181106115185761151861296c565b6020026020010151602001514211156115575783828151811061153d5761153d61296c565b60200260200101516020015185604001818152505061155e565b4260408601525b60008483815181106115725761157261296c565b6020026020010151604001518261158991906128b0565b9050836115b67f0000000000000000000000000000000000000000000000000000000000000000836128b0565b6115c09190612875565b865187906115cf90839061285d565b90525050505b6115de81612904565b90506114c2565b5060008481526002602081815260409283902086518082558783015160018301558785015193820184905560608089015160039093019290925584519384529183018590529282015285917f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f4691016114af565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b73ffffffffffffffffffffffffffffffffffffffff811661177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610640565b611785816124e2565b50565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f6f6e6c794469737472696275746f7256323a206f6e6c7920446973747269627560448201527f746f7256322063616e2063616c6c20746869732066756e6374696f6e000000006064820152608401610640565b600260015414156118ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b600260015560006118ca846112a1565b600085815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684529091528120919250807f00000000000000000000000000000000000000000000000000000000000000001561192a5750476119ea565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156119af57600080fd5b505afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190612702565b90505b825415611bf1576001830154845184547f000000000000000000000000000000000000000000000000000000000000000091611a25916128b0565b611a2f9190612875565b611a3991906128ed565b91508115611bf1577f000000000000000000000000000000000000000000000000000000000000000015611b625780821115611b405760008673ffffffffffffffffffffffffffffffffffffffff16826040515b60006040518083038185875af1925050503d8060008114611aca576040519150601f19603f3d011682016040523d82523d6000602084013e611acf565b606091505b5050905080611b3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610640565b50611bf1565b60008673ffffffffffffffffffffffffffffffffffffffff1683604051611a8d565b80821115611bb057611bab73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783612080565b611bf1565b611bf173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168784612080565b84835583517f000000000000000000000000000000000000000000000000000000000000000090611c2290876128b0565b611c2c9190612875565b600184015560405182815273ffffffffffffffffffffffffffffffffffffffff8716907fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b49060200160405180910390a25050600180555050505050565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152812080546001909101546110e4918591611dcc565b3b151590565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691611d529190612822565b600060405180830381855afa9150503d8060008114611d8d576040519150601f19603f3d011682016040523d82523d6000602084013e611d92565b606091505b5091509150818015611da5575080516020145b611db0576012611dc4565b80806020019051810190611dc491906127ff565b949350505050565b600083815260026020818152604080842081516080810183528154815260018201548185015293810154848301526003908101546060850152878552825280842080548251818502810185019093528083528593849084015b82821015611e755783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611e25565b505084516040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018b905293945092600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063654c9ece9060240160206040518083038186803b158015611f0857600080fd5b505afa158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190612702565b9050836040015142118015611f5457508015155b1561203457604084015160005b8451811015612031576000611f8383428885815181106114e8576114e861296c565b905080611f905750612021565b858281518110611fa257611fa261296c565b60200260200101516020015192506000868381518110611fc457611fc461296c565b60200260200101516040015182611fdb91906128b0565b9050846120087f0000000000000000000000000000000000000000000000000000000000000000836128b0565b6120129190612875565b61201c908761285d565b955050505b61202a81612904565b9050611f61565b50505b857f0000000000000000000000000000000000000000000000000000000000000000612060848a6128b0565b61206a9190612875565b61207491906128ed565b98975050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916121179190612822565b6000604051808303816000865af19150503d8060008114612154576040519150601f19603f3d011682016040523d82523d6000602084013e612159565b606091505b509150915081801561218357508051158061218357508080602001905181019061218391906126c7565b6121e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610640565b5050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161228f9190612822565b6000604051808303816000865af19150503d80600081146122cc576040519150601f19603f3d011682016040523d82523d6000602084013e6122d1565b606091505b50915091508180156122fb5750805115806122fb5750808060200190518101906122fb91906126c7565b612361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610640565b505050505050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156123e25783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612392565b505050600086815260026020526040902082519293509190508061240c5760009350505050610ebe565b84826001015411156124245760009350505050610ebe565b60005b8181101561248c578381815181106124415761244161296c565b602002602001015160200151861161247c578381815181106124655761246561296c565b602002602001015160400151945050505050610ebe565b61248581612904565b9050612427565b5060009695505050505050565b60045460005b818110156124de576124cd600482815481106124bd576124bd61296c565b90600052602060002001546112a1565b506124d781612904565b905061249f565b5050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156125d05783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612580565b505082519293505050806125e957600092505050610ebe565b60005b81811015612650578281815181106126065761260661296c565b60200260200101516020015185116126405782818151811061262a5761262a61296c565b6020026020010151602001519350505050610ebe565b61264981612904565b90506125ec565b508161265d6001836128ed565b8151811061266d5761266d61296c565b6020026020010151602001519250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146126a757600080fd5b919050565b6000602082840312156126be57600080fd5b6110e482612683565b6000602082840312156126d957600080fd5b815180151581146110e457600080fd5b6000602082840312156126fb57600080fd5b5035919050565b60006020828403121561271457600080fd5b5051919050565b6000806040838503121561272e57600080fd5b8235915061273e60208401612683565b90509250929050565b60008060006060848603121561275c57600080fd5b8335925061276c60208501612683565b9150604084013590509250925092565b6000806040838503121561278f57600080fd5b50508035926020909101359150565b6000806000606084860312156127b357600080fd5b83359250602084013591506127ca60408501612683565b90509250925092565b6000806000606084860312156127e857600080fd5b505081359360208301359350604090920135919050565b60006020828403121561281157600080fd5b815160ff811681146110e457600080fd5b6000825160005b818110156128435760208186018101518583015201612829565b81811115612852576000828501525b509190910192915050565b600082198211156128705761287061293d565b500190565b6000826128ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128e8576128e861293d565b500290565b6000828210156128ff576128ff61293d565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129365761293661293d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220d358124710e02f4aa4a4d267f81d662ca03a1b0761539e1433665854b7df7dce64736f6c6343000807003300000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x6080604052600436106101745760003560e01c806373cfc6b2116100cb5780639e494bee1161007f578063f7c618c111610059578063f7c618c11461050d578063fe8343fb14610541578063ffcd42631461056157600080fd5b80639e494bee146104ad578063d4aa89b5146104cd578063f2fde38b146104ed57600080fd5b80637d0d9d5f116100b05780637d0d9d5f146103d55780638da5cb5b1461042e57806393f1a40b1461045957600080fd5b806373cfc6b214610371578063771602f7146103b557600080fd5b8063465e81ec1161012d57806369883b4e1161010757806369883b4e1461031c578063715018a61461033c578063723336311461035157600080fd5b8063465e81ec1461029457806351eb05a6146102b4578063630b5ba11461030757600080fd5b80631526fe271161015e5780631526fe27146101fb5780631d1231311461025f5780632ea807c51461028157600080fd5b8062d74850146101795780630832cfbf146101c0575b600080fd5b34801561018557600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000003481565b6040519081526020015b60405180910390f35b3480156101cc57600080fd5b506101e06101db36600461277c565b610581565b604080519384526020840192909252908201526060016101b7565b34801561020757600080fd5b5061023f6102163660046126e9565b600260208190526000918252604090912080546001820154928201546003909201549092919084565b6040805194855260208501939093529183015260608201526080016101b7565b34801561026b57600080fd5b5061027f61027a36600461279e565b6105c3565b005b61027f61028f3660046127d3565b6109c0565b3480156102a057600080fd5b506101ad6102af3660046126e9565b610eb2565b3480156102c057600080fd5b506102d46102cf3660046126e9565b610ec4565b6040516101b791908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561031357600080fd5b5061027f610f74565b34801561032857600080fd5b506101ad6103373660046126e9565b610ff4565b34801561034857600080fd5b5061027f611015565b34801561035d57600080fd5b506101ad61036c3660046127d3565b6110a2565b34801561037d57600080fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000181565b60405190151581526020016101b7565b3480156103c157600080fd5b5061027f6103d036600461277c565b6110eb565b3480156103e157600080fd5b506104097f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b34801561043a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610409565b34801561046557600080fd5b5061049861047436600461271b565b60056020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101b7565b3480156104b957600080fd5b506101ad6104c83660046126e9565b611295565b3480156104d957600080fd5b506102d46104e83660046126e9565b6112a1565b3480156104f957600080fd5b5061027f6105083660046126ac565b611658565b34801561051957600080fd5b506104097f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a81565b34801561054d57600080fd5b5061027f61055c366004612747565b611788565b34801561056d57600080fd5b506101ad61057c36600461271b565b611c89565b6003602052816000526040600020818154811061059d57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b60005473ffffffffffffffffffffffffffffffffffffffff163314610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600260015414156106b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b600260018190556000848152602091909152604080822090517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018690529091907f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f73ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561075557600080fd5b505afa158015610769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078d9190612702565b9050600061079d86836000611dcc565b60038401549091506107af868361285d565b111561083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f656d657267656e6379207265776172642077697468647261773a206e6f74206560448201527f6e6f7567682072657761726420746f6b656e00000000000000000000000000006064820152608401610640565b8483600301600082825461085191906128ed565b909155507f000000000000000000000000000000000000000000000000000000000000000190506108c2576108bd73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a168587612080565b6109b4565b60008473ffffffffffffffffffffffffffffffffffffffff168660405160006040518083038185875af1925050503d806000811461091c576040519150601f19603f3d011682016040523d82523d6000602084013e610921565b606091505b50509050806109b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e6379207265776172642077697468647261773a206661696c6560448201527f6420746f2073656e6400000000000000000000000000000000000000000000006064820152608401610640565b505b50506001805550505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b6000838152600360209081526040808320600290925290912081547f000000000000000000000000000000000000000000000000000000000000003411610b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f6164642072657761726420696e666f3a2072657761726420696e666f206c656e60448201527f677468206578636565647320746865206c696d697400000000000000000000006064820152608401610640565b81541580610b4a5750815442908390610b25906001906128ed565b81548110610b3557610b3561296c565b90600052602060002090600302016001015410155b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6164642072657761726420696e666f3a2072657761726420706572696f64206560448201527f6e646564000000000000000000000000000000000000000000000000000000006064820152608401610640565b81541580610c145750815484908390610bf0906001906128ed565b81548110610c0057610c0061296c565b906000526020600020906003020160010154105b610ca0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f6164642072657761726420696e666f3a20626164206e657720656e6454696d6560448201527f7374616d700000000000000000000000000000000000000000000000000000006064820152608401610640565b815460009015610ce15782548390610cba906001906128ed565b81548110610cca57610cca61296c565b906000526020600020906003020160010154610ce7565b81600101545b90506000610cf582876128ed565b90506000610d0386836128b0565b90507f0000000000000000000000000000000000000000000000000000000000000001610d7157610d6c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a163330846121f0565b610e00565b803414610e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f6164642072657761726420696e666f3a206e6f7420656e6f7567682066756e6460448201527f7320746f207472616e73666572000000000000000000000000000000000000006064820152608401610640565b80846003016000828254610e14919061285d565b90915550506040805160608101825284815260208082018a8152928201898152885460018181018b5560008b8152939093209351600390910290930192835592518282015591516002909101558554610e6d91906128ed565b60408051898152602081018990528a917fad90731bd0d97445f5af66088f3adebf343c520c20e033cc42f93b124258cdc2910160405180910390a35050505050505050565b6000610ebe8242612369565b92915050565b610eef6040518060800160405280600081526020016000815260200160008152602001600081525090565b60026001541415610f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b6002600155610f6a826112a1565b6001805592915050565b60026001541415610fe1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b6002600155610fee612499565b60018055565b6004818154811061100457600080fd5b600091825260209091200154905081565b60005473ffffffffffffffffffffffffffffffffffffffff163314611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b6110a060006124e2565b565b600081841015806110b257508284115b156110bf575060006110e4565b8183116110d7576110d084846128ed565b90506110e4565b6110e184836128ed565b90505b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b60008281526002602081905260409091200154156111e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20616c726561647920657869737473000000000000000000000000006044820152606401610640565b6040805160808101825260008082526020808301858152838501868152606085018481528885526002938490528685209551865591516001808701919091559051928501929092555160039093019290925560048054928301815581527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101849055905183917f6f92874181ba07c8e988c53b7d3c2fdcff7154a3500137bf6a350ebac65c087091a25050565b6000610ebe8242612557565b6112cc6040518060800160405280600081526020016000815260200160008152602001600081525090565b50600081815260026020818152604080842081516080810183528154815260018201548185015293810154848301526003908101546060850152858552825280842080548251818502810185019093528083529394939192909190849084015b8282101561137c578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250508152602001906001019061132c565b505050509050816040015142116113935750919050565b6040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018490526000907f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f73ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561141c57600080fd5b505afa158015611430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114549190612702565b9050806114bf576114658442612557565b4211156114b85742604084810182905284518151928352602083018490529082015284907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46906060015b60405180910390a25b5050919050565b60005b82518110156115e55760006114f98560400151428685815181106114e8576114e861296c565b6020026020010151602001516110a2565b90508061150657506115d5565b8382815181106115185761151861296c565b6020026020010151602001514211156115575783828151811061153d5761153d61296c565b60200260200101516020015185604001818152505061155e565b4260408601525b60008483815181106115725761157261296c565b6020026020010151604001518261158991906128b0565b9050836115b67f000000000000000000000000000000000000000000000000000000e8d4a51000836128b0565b6115c09190612875565b865187906115cf90839061285d565b90525050505b6115de81612904565b90506114c2565b5060008481526002602081815260409283902086518082558783015160018301558785015193820184905560608089015160039093019290925584519384529183018590529282015285917f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f4691016114af565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b73ffffffffffffffffffffffffffffffffffffffff811661177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610640565b611785816124e2565b50565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f6f6e6c794469737472696275746f7256323a206f6e6c7920446973747269627560448201527f746f7256322063616e2063616c6c20746869732066756e6374696f6e000000006064820152608401610640565b600260015414156118ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b600260015560006118ca846112a1565b600085815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684529091528120919250807f00000000000000000000000000000000000000000000000000000000000000011561192a5750476119ea565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a73ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156119af57600080fd5b505afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190612702565b90505b825415611bf1576001830154845184547f000000000000000000000000000000000000000000000000000000e8d4a5100091611a25916128b0565b611a2f9190612875565b611a3991906128ed565b91508115611bf1577f000000000000000000000000000000000000000000000000000000000000000115611b625780821115611b405760008673ffffffffffffffffffffffffffffffffffffffff16826040515b60006040518083038185875af1925050503d8060008114611aca576040519150601f19603f3d011682016040523d82523d6000602084013e611acf565b606091505b5050905080611b3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610640565b50611bf1565b60008673ffffffffffffffffffffffffffffffffffffffff1683604051611a8d565b80821115611bb057611bab73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a168783612080565b611bf1565b611bf173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a168784612080565b84835583517f000000000000000000000000000000000000000000000000000000e8d4a5100090611c2290876128b0565b611c2c9190612875565b600184015560405182815273ffffffffffffffffffffffffffffffffffffffff8716907fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b49060200160405180910390a25050600180555050505050565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152812080546001909101546110e4918591611dcc565b3b151590565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691611d529190612822565b600060405180830381855afa9150503d8060008114611d8d576040519150601f19603f3d011682016040523d82523d6000602084013e611d92565b606091505b5091509150818015611da5575080516020145b611db0576012611dc4565b80806020019051810190611dc491906127ff565b949350505050565b600083815260026020818152604080842081516080810183528154815260018201548185015293810154848301526003908101546060850152878552825280842080548251818502810185019093528083528593849084015b82821015611e755783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611e25565b505084516040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018b905293945092600092507f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f73ffffffffffffffffffffffffffffffffffffffff16915063654c9ece9060240160206040518083038186803b158015611f0857600080fd5b505afa158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190612702565b9050836040015142118015611f5457508015155b1561203457604084015160005b8451811015612031576000611f8383428885815181106114e8576114e861296c565b905080611f905750612021565b858281518110611fa257611fa261296c565b60200260200101516020015192506000868381518110611fc457611fc461296c565b60200260200101516040015182611fdb91906128b0565b9050846120087f000000000000000000000000000000000000000000000000000000e8d4a51000836128b0565b6120129190612875565b61201c908761285d565b955050505b61202a81612904565b9050611f61565b50505b857f000000000000000000000000000000000000000000000000000000e8d4a51000612060848a6128b0565b61206a9190612875565b61207491906128ed565b98975050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916121179190612822565b6000604051808303816000865af19150503d8060008114612154576040519150601f19603f3d011682016040523d82523d6000602084013e612159565b606091505b509150915081801561218357508051158061218357508080602001905181019061218391906126c7565b6121e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610640565b5050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161228f9190612822565b6000604051808303816000865af19150503d80600081146122cc576040519150601f19603f3d011682016040523d82523d6000602084013e6122d1565b606091505b50915091508180156122fb5750805115806122fb5750808060200190518101906122fb91906126c7565b612361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610640565b505050505050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156123e25783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612392565b505050600086815260026020526040902082519293509190508061240c5760009350505050610ebe565b84826001015411156124245760009350505050610ebe565b60005b8181101561248c578381815181106124415761244161296c565b602002602001015160200151861161247c578381815181106124655761246561296c565b602002602001015160400151945050505050610ebe565b61248581612904565b9050612427565b5060009695505050505050565b60045460005b818110156124de576124cd600482815481106124bd576124bd61296c565b90600052602060002001546112a1565b506124d781612904565b905061249f565b5050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156125d05783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612580565b505082519293505050806125e957600092505050610ebe565b60005b81811015612650578281815181106126065761260661296c565b60200260200101516020015185116126405782818151811061262a5761262a61296c565b6020026020010151602001519350505050610ebe565b61264981612904565b90506125ec565b508161265d6001836128ed565b8151811061266d5761266d61296c565b6020026020010151602001519250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146126a757600080fd5b919050565b6000602082840312156126be57600080fd5b6110e482612683565b6000602082840312156126d957600080fd5b815180151581146110e457600080fd5b6000602082840312156126fb57600080fd5b5035919050565b60006020828403121561271457600080fd5b5051919050565b6000806040838503121561272e57600080fd5b8235915061273e60208401612683565b90509250929050565b60008060006060848603121561275c57600080fd5b8335925061276c60208501612683565b9150604084013590509250925092565b6000806040838503121561278f57600080fd5b50508035926020909101359150565b6000806000606084860312156127b357600080fd5b83359250602084013591506127ca60408501612683565b90509250925092565b6000806000606084860312156127e857600080fd5b505081359360208301359350604090920135919050565b60006020828403121561281157600080fd5b815160ff811681146110e457600080fd5b6000825160005b818110156128435760208186018101518583015201612829565b81811115612852576000828501525b509190910192915050565b600082198211156128705761287061293d565b500190565b6000826128ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128e8576128e861293d565b500290565b6000828210156128ff576128ff61293d565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129365761293661293d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220d358124710e02f4aa4a4d267f81d662ca03a1b0761539e1433665854b7df7dce64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f0000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x98878B06940aE243284CA214f92Bb71a2b032B8A
Arg [1] : _distributorV2 (address): 0x0329867a8c457e9F75e25b0685011291CD30904F
Arg [2] : _isNative (bool): True
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Arg [1] : 0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
19546:16664:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21547:45;;;;;;;;;;;;;;;;;;11123:25:1;;;11111:2;11096:18;21547:45:0;;;;;;;;21238:54;;;;;;;;;;-1:-1:-1;21238:54:0;;;;;:::i;:::-;;:::i;:::-;;;;11614:25:1;;;11670:2;11655:18;;11648:34;;;;11698:18;;;11691:34;11602:2;11587:18;21238:54:0;11412:319:1;21025:44:0;;;;;;;;;;-1:-1:-1;21025:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11967:25:1;;;12023:2;12008:18;;12001:34;;;;12051:18;;;12044:34;12109:2;12094:18;;12087:34;11954:3;11939:19;21025:44:0;11736:391:1;35383:824:0;;;;;;;;;;-1:-1:-1;35383:824:0;;;;;:::i;:::-;;:::i;:::-;;24003:1894;;;;;;:::i;:::-;;:::i;35138:187::-;;;;;;;;;;-1:-1:-1;35138:187:0;;;;;:::i;:::-;;:::i;27433:162::-;;;;;;;;;;-1:-1:-1;27433:162:0;;;;;:::i;:::-;;:::i;:::-;;;;;;10763:13:1;;10745:32;;10833:4;10821:17;;;10815:24;10793:20;;;10786:54;10896:4;10884:17;;;10878:24;10856:20;;;10849:54;10959:4;10947:17;;;10941:24;10919:20;;;10912:54;;;;10732:3;10717:19;;10548:424;30418:84:0;;;;;;;;;;;;;:::i;21301:24::-;;;;;;;;;;-1:-1:-1;21301:24:0;;;;;:::i;:::-;;:::i;10173:94::-;;;;;;;;;;;;;:::i;26888:360::-;;;;;;;;;;-1:-1:-1;26888:360:0;;;;;:::i;:::-;;:::i;19789:30::-;;;;;;;;;;;;;;;;;;4569:14:1;;4562:22;4544:41;;4532:2;4517:18;19789:30:0;4404:187:1;23433:431:0;;;;;;;;;;-1:-1:-1;23433:431:0;;;;;:::i;:::-;;:::i;19732:50::-;;;;;;;;;;;;;;;;;;3644:42:1;3632:55;;;3614:74;;3602:2;3587:18;19732:50:0;3468:226:1;9522:87:0;;;;;;;;;;-1:-1:-1;9568:7:0;9595:6;;;9522:87;;21392:64;;;;;;;;;;-1:-1:-1;21392:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11333:25:1;;;11389:2;11374:18;;11367:34;;;;11306:18;21392:64:0;11159:248:1;26660:139:0;;;;;;;;;;-1:-1:-1;26660:139:0;;;;;:::i;:::-;;:::i;27779:2556::-;;;;;;;;;;-1:-1:-1;27779:2556:0;;;;;:::i;:::-;;:::i;10422:192::-;;;;;;;;;;-1:-1:-1;10422:192:0;;;;;:::i;:::-;;:::i;19675:50::-;;;;;;;;;;;;;;;31023:1629;;;;;;;;;;-1:-1:-1;31023:1629:0;;;;;:::i;:::-;;:::i;32726:323::-;;;;;;;;;;-1:-1:-1;32726:323:0;;;;;:::i;:::-;;:::i;21238:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21238:54:0;;-1:-1:-1;21238:54:0;:::o;35383:824::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;;;;;;;;;12457:1:::1;13053:7;;:19;;13045:63;;;::::0;::::1;::::0;;9976:2:1;13045:63:0::1;::::0;::::1;9958:21:1::0;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0::1;9774:355:1::0;13045:63:0::1;12457:1;13186:7;:18:::0;;;35546:21:::2;35570:14:::0;;;::::2;::::0;;;;;;;;35614:31;;;;;::::2;::::0;::::2;11123:25:1::0;;;35570:14:0;;35546:21;35614:13:::2;:25;;::::0;::::2;::::0;11096:18:1;;35614:31:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35595:50;;35658:35;35696:33;35711:4;35717:8;35727:1;35696:14;:33::i;:::-;35805:17;::::0;::::2;::::0;35658:71;;-1:-1:-1;35764:37:0::2;35794:7:::0;35658:71;35764:37:::2;:::i;:::-;:58;;35742:158;;;::::0;::::2;::::0;;6825:2:1;35742:158:0::2;::::0;::::2;6807:21:1::0;6864:2;6844:18;;;6837:30;6903:34;6883:18;;;6876:62;6974:20;6954:18;;;6947:48;7012:19;;35742:158:0::2;6623:414:1::0;35742:158:0::2;35932:7;35911:4;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;35957:8:0::2;::::0;-1:-1:-1;35952:248:0::2;;35982:47;:24;:11;:24;36007:12:::0;36021:7;35982:24:::2;:47::i;:::-;35952:248;;;36063:9;36078:12;:17;;36103:7;36078:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36062:53;;;36138:4;36130:58;;;::::0;::::2;::::0;;6415:2:1;36130:58:0::2;::::0;::::2;6397:21:1::0;6454:2;6434:18;;;6427:30;6493:34;6473:18;;;6466:62;6564:11;6544:18;;;6537:39;6593:19;;36130:58:0::2;6213:405:1::0;36130:58:0::2;36047:153;35952:248;-1:-1:-1::0;;12413:1:0::1;13365:22:::0;;-1:-1:-1;;;;35383:824:0:o;24003:1894::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;24158:31:::1;24192:20:::0;;;:14:::1;:20;::::0;;;;;;;24247:8:::1;:14:::0;;;;;;24294:17;;24314:15:::1;-1:-1:-1::0;24272:138:0::1;;;::::0;::::1;::::0;;9193:2:1;24272:138:0::1;::::0;::::1;9175:21:1::0;9232:2;9212:18;;;9205:30;9271:34;9251:18;;;9244:62;9342:23;9322:18;;;9315:51;9383:19;;24272:138:0::1;8991:417:1::0;24272:138:0::1;24443:17:::0;;:22;;:125:::1;;-1:-1:-1::0;24497:17:0;;24553:15:::1;::::0;24486:10;;24497:21:::1;::::0;24517:1:::1;::::0;24497:21:::1;:::i;:::-;24486:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;:82;;24443:125;24421:211;;;::::0;::::1;::::0;;8034:2:1;24421:211:0::1;::::0;::::1;8016:21:1::0;8073:2;8053:18;;;8046:30;8112:34;8092:18;;;8085:62;8183:6;8163:18;;;8156:34;8207:19;;24421:211:0::1;7832:400:1::0;24421:211:0::1;24665:17:::0;;:22;;:105:::1;;-1:-1:-1::0;24719:17:0;;24757:13;;24708:10;;24719:21:::1;::::0;24739:1:::1;::::0;24719:21:::1;:::i;:::-;24708:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;:62;24665:105;24643:192;;;::::0;::::1;::::0;;8787:2:1;24643:192:0::1;::::0;::::1;8769:21:1::0;8826:2;8806:18;;;8799:30;8865:34;8845:18;;;8838:62;8936:7;8916:18;;;8909:35;8961:19;;24643:192:0::1;8585:401:1::0;24643:192:0::1;24873:17:::0;;24848:22:::1;::::0;24873;:119:::1;;24957:17:::0;;24946:10;;24957:21:::1;::::0;24977:1:::1;::::0;24957:21:::1;:::i;:::-;24946:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;24873:119;;;24911:4;:19;;;24873:119;24848:144:::0;-1:-1:-1;25005:17:0::1;25025:30;24848:144:::0;25025:13;:30:::1;:::i;:::-;25005:50:::0;-1:-1:-1;25066:20:0::1;25089:25;25101:13:::0;25005:50;25089:25:::1;:::i;:::-;25066:48;;25132:8;25127:342;;25157:135;:28;:11;:28;25204:10;25241:4;25265:12:::0;25157:28:::1;:135::i;:::-;25127:342;;;25364:12;25351:9;:25;25325:132;;;::::0;::::1;::::0;;10336:2:1;25325:132:0::1;::::0;::::1;10318:21:1::0;10375:2;10355:18;;;10348:30;10414:34;10394:18;;;10387:62;10485:15;10465:18;;;10458:43;10518:19;;25325:132:0::1;10134:409:1::0;25325:132:0::1;25502:12;25481:4;:17;;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25557:168:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;25527:209;;::::1;::::0;;::::1;::::0;;-1:-1:-1;25527:209:0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;25801:17;;:21:::1;::::0;25527:209;25801:21:::1;:::i;:::-;25754:135;::::0;;11333:25:1;;;11389:2;11374:18;;11367:34;;;25782:4:0;;25754:135:::1;::::0;11306:18:1;25754:135:0::1;;;;;;;24147:1750;;;;;24003:1894:::0;;;:::o;35138:187::-;35247:7;35279:38;35295:4;35301:15;35279;:38::i;:::-;35272:45;35138:187;-1:-1:-1;;35138:187:0:o;27433:162::-;27525:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27525:20:0;12457:1;13053:7;;:19;;13045:63;;;;;;;9976:2:1;13045:63:0;;;9958:21:1;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0;9774:355:1;13045:63:0;12457:1;13186:7;:18;27570:17:::1;27582:4:::0;27570:11:::1;:17::i;:::-;12413:1:::0;13365:22;;27563:24;27433:162;-1:-1:-1;;27433:162:0:o;30418:84::-;12457:1;13053:7;;:19;;13045:63;;;;;;;9976:2:1;13045:63:0;;;9958:21:1;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0;9774:355:1;13045:63:0;12457:1;13186:7;:18;30476::::1;:16;:18::i;:::-;12413:1:::0;13365:22;;30418:84::o;21301:24::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21301:24:0;:::o;10173:94::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;10238:21:::1;10256:1;10238:9;:21::i;:::-;10173:94::o:0;26888:360::-;27019:7;27053:13;27044:5;:22;;27043:41;;;;27080:3;27072:5;:11;27043:41;27039:82;;;-1:-1:-1;27108:1:0;27101:8;;27039:82;27142:13;27135:3;:20;27131:71;;27179:11;27185:5;27179:3;:11;:::i;:::-;27172:18;;;;27131:71;27219:21;27235:5;27219:13;:21;:::i;:::-;27212:28;;26888:360;;;;;;:::o;23433:431::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;23521:14:::1;::::0;;;:8:::1;:14;::::0;;;;;;;:34:::1;::::0;:39;23513:71:::1;;;::::0;::::1;::::0;;8439:2:1;23513:71:0::1;::::0;::::1;8421:21:1::0;8478:2;8458:18;;;8451:30;8517:21;8497:18;;;8490:49;8556:18;;23513:71:0::1;8237:343:1::0;23513:71:0::1;23614:182;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;23614:182:0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;23597:14;;;:8:::1;:14:::0;;;;;;;:199;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;23809:7:::1;:18:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;23843:13;;23606:4;;23843:13:::1;::::0;::::1;23433:431:::0;;:::o;26660:139::-;26726:7;26753:38;26769:4;26775:15;26753;:38::i;27779:2556::-;27829:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27829:20:0;-1:-1:-1;27869:13:0;;;;:8;:13;;;;;;;;27862:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27926:19;;;;;;;;27893:52;;;;;;;;;;;;;;;;;27862:20;;27869:13;27893:52;;27926:19;;27893:52;27869:13;;27893:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27981:4;:24;;;27962:15;:43;27958:87;;28022:11;27779:2556;;;:::o;27958:87::-;28076:30;;;;;;;;11123:25:1;;;28057:16:0;;28076:13;:25;;;;;11096:18:1;;28076:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28057:49;-1:-1:-1;28123:13:0;28119:751;;28514:37;28530:3;28535:15;28514;:37::i;:::-;28496:15;:55;28492:339;;;28599:15;28572:24;;;;:42;;;28775:21;;28638:177;;11614:25:1;;;11670:2;11655:18;;11648:34;;;11698:18;;;11691:34;28671:3:0;;28638:177;;11602:2:1;11587:18;28638:177:0;;;;;;;;28492:339;28847:11;;27779:2556;;;:::o;28119:751::-;28926:9;28921:1195;28945:10;:17;28941:1;:21;28921:1195;;;29238:19;29260:152;29294:4;:24;;;29337:15;29371:10;29382:1;29371:13;;;;;;;;:::i;:::-;;;;;;;:26;;;29260:15;:152::i;:::-;29238:174;-1:-1:-1;29431:16:0;29427:30;;29449:8;;;29427:30;29718:10;29729:1;29718:13;;;;;;;;:::i;:::-;;;;;;;:26;;;29700:15;:44;29696:221;;;29792:10;29803:1;29792:13;;;;;;;;:::i;:::-;;;;;;;:26;;;29765:4;:24;;:53;;;;;29696:221;;;29886:15;29859:24;;;:42;29696:221;29933:19;29970:10;29981:1;29970:13;;;;;;;;:::i;:::-;;;;;;;:26;;;29956:11;:40;;;;:::i;:::-;29933:64;-1:-1:-1;30095:8:0;30041:33;30055:19;29933:64;30041:33;:::i;:::-;30040:63;;;;:::i;:::-;30014:90;;:4;;:90;;;;;:::i;:::-;;;-1:-1:-1;;;28921:1195:0;28964:3;;;:::i;:::-;;;28921:1195;;;-1:-1:-1;30128:13:0;;;;:8;:13;;;;;;;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30166:137;;11614:25:1;;;11655:18;;;11648:34;;;11698:18;;;11691:34;30128:13:0;;30166:137;;11587:18:1;30166:137:0;11412:319:1;10422:192:0;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;10511:22:::1;::::0;::::1;10503:73;;;::::0;::::1;::::0;;5664:2:1;10503:73:0::1;::::0;::::1;5646:21:1::0;5703:2;5683:18;;;5676:30;5742:34;5722:18;;;5715:62;5813:8;5793:18;;;5786:36;5839:19;;10503:73:0::1;5462:402:1::0;10503:73:0::1;10587:19;10597:8;10587:9;:19::i;:::-;10422:192:::0;:::o;31023:1629::-;22236:10;:36;22258:13;22236:36;;22214:146;;;;;;;7244:2:1;22214:146:0;;;7226:21:1;7283:2;7263:18;;;7256:30;7322:34;7302:18;;;7295:62;7393:30;7373:18;;;7366:58;7441:19;;22214:146:0;7042:424:1;22214:146:0;12457:1:::1;13053:7;;:19;;13045:63;;;::::0;::::1;::::0;;9976:2:1;13045:63:0::1;::::0;::::1;9958:21:1::0;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0::1;9774:355:1::0;13045:63:0::1;12457:1;13186:7;:18:::0;31186:20:::2;31209:17;31221:4:::0;31209:11:::2;:17::i;:::-;31237:21;31261:14:::0;;;:8:::2;:14;::::0;;;;;;;:21:::2;::::0;::::2;::::0;;;;;;;31186:40;;-1:-1:-1;31237:21:0;31367:8:::2;31363:163;;;-1:-1:-1::0;31408:21:0::2;31363:163;;;31478:36;::::0;;;;31508:4:::2;31478:36;::::0;::::2;3614:74:1::0;31478:11:0::2;:21;;::::0;::::2;::::0;3587:18:1;;31478:36:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31462:52;;31363:163;31542:11:::0;;:15;31538:915:::2;;31666:15;::::0;::::2;::::0;31601:21;;31587:11;;31643:19:::2;::::0;31587:35:::2;::::0;::::2;:::i;:::-;31586:76;;;;:::i;:::-;31585:96;;;;:::i;:::-;31574:108:::0;-1:-1:-1;31703:11:0;;31699:743:::2;;31739:8;31735:692;;;31786:13;31776:7;:23;31772:365;;;31829:12;31847:5;:10;;31865:13;31847:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31828:55;;;31918:7;31910:35;;;::::0;::::2;::::0;;6071:2:1;31910:35:0::2;::::0;::::2;6053:21:1::0;6110:2;6090:18;;;6083:30;6149:17;6129:18;;;6122:45;6184:18;;31910:35:0::2;5869:339:1::0;31910:35:0::2;31801:168;31735:692;;31772:365;32003:12;32021:5;:10;;32039:7;32021:30;;;3258:205:1::0;31735:692:0::2;32199:13;32189:7;:23;32185:223;;;32241:46;:24;:11;:24;32266:5:::0;32273:13;32241:24:::2;:46::i;:::-;32185:223;;;32344:40;:24;:11;:24;32369:5:::0;32376:7;32344:24:::2;:40::i;:::-;32465:21:::0;;;32545;;32583:19:::2;::::0;32531:35:::2;::::0;32479:7;32531:35:::2;:::i;:::-;32530:72;;;;:::i;:::-;32499:15;::::0;::::2;:103:::0;32620:24:::2;::::0;11123:25:1;;;32620:24:0::2;::::0;::::2;::::0;::::2;::::0;11111:2:1;11096:18;32620:24:0::2;;;;;;;-1:-1:-1::0;;12413:1:0::1;13365:22:::0;;-1:-1:-1;;;;;31023:1629:0:o;32726:323::-;32846:7;32947:14;;;:8;:14;;;;;;;;:21;;;;;;;;;;:28;;32994:32;;;;;32891:150;;32947:14;;32891;:150::i;741:387::-;1064:20;1112:8;;;741:387::o;17302:293::-;17461:36;;;;;;;;;;;;;;;;;;17484:12;17461:36;;;17421:87;;17367:5;;;;;;17421:25;;;;:87;;17461:36;17421:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17385:123;;;;17526:7;:28;;;;;17537:4;:11;17552:2;17537:17;17526:28;:61;;17585:2;17526:61;;;17568:4;17557:25;;;;;;;;;;;;:::i;:::-;17519:68;17302:293;-1:-1:-1;;;;17302:293:0:o;33057:1250::-;33190:15;33241:14;;;:8;:14;;;;;;;;33218:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33299:20;;;;;;;;33266:53;;;;;;;;;;;;;;;;;33190:15;;;;33266:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33359:21:0;;33410:31;;;;;;;;11123:25:1;;;33266:53:0;;-1:-1:-1;33359:21:0;33332:24;;-1:-1:-1;33410:13:0;:25;;;-1:-1:-1;33410:25:0;;11096:18:1;;33410:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33391:50;;33476:4;:24;;;33458:15;:42;:59;;;;-1:-1:-1;33504:13:0;;;33458:59;33454:742;;;33551:24;;;;33534:14;33592:593;33616:10;:17;33612:1;:21;33592:593;;;33659:19;33681:150;33719:6;33748:15;33786:10;33797:1;33786:13;;;;;;;;:::i;33681:150::-;33659:172;-1:-1:-1;33854:16:0;33850:30;;33872:8;;;33850:30;33908:10;33919:1;33908:13;;;;;;;;:::i;:::-;;;;;;;:26;;;33899:35;;33955:19;34013:10;34024:1;34013:13;;;;;;;;:::i;:::-;;;;;;;:26;;;33978:11;:61;;;;:::i;:::-;33955:85;-1:-1:-1;34161:8:0;34103:33;34117:19;33955:85;34103:33;:::i;:::-;34102:67;;;;:::i;:::-;34061:108;;;;:::i;:::-;;;33640:545;;33592:593;33635:3;;;:::i;:::-;;;33592:593;;;;33519:677;33454:742;34287:11;34251:19;34221:26;34231:16;34221:7;:26;:::i;:::-;34220:50;;;;:::i;:::-;34219:79;;;;:::i;:::-;34208:91;33057:1250;-1:-1:-1;;;;;;;;33057:1250:0:o;17871:407::-;18065:48;;;18031:19;4294:55:1;;;18065:48:0;;;4276:74:1;4366:18;;;;4359:34;;;18065:48:0;;;;;;;;;;4249:18:1;;;;18065:48:0;;;;;;;;;18088:12;18065:48;;;18031:93;;-1:-1:-1;;;;18031:19:0;;;;:93;;18065:48;18031:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17995:129;;;;18157:7;:57;;;;-1:-1:-1;18169:11:0;;:16;;:44;;;18200:4;18189:24;;;;;;;;;;;;:::i;:::-;18135:135;;;;;;;5307:2:1;18135:135:0;;;5289:21:1;5346:2;5326:18;;;5319:30;5385;5365:18;;;5358:58;5433:18;;18135:135:0;5105:352:1;18135:135:0;17984:294;;17871:407;;;:::o;18601:449::-;18822:59;;;18788:19;3980:15:1;;;18822:59:0;;;3962:34:1;4032:15;;;4012:18;;;4005:43;4064:18;;;;4057:34;;;18822:59:0;;;;;;;;;;3874:18:1;;;;18822:59:0;;;;;;;;;18845:17;18822:59;;;18788:104;;-1:-1:-1;;;;18788:19:0;;;;:104;;18822:59;18788:104;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18752:140;;;;18925:7;:57;;;;-1:-1:-1;18937:11:0;;:16;;:44;;;18968:4;18957:24;;;;;;;;;;;;:::i;:::-;18903:139;;;;;;;9615:2:1;18903:139:0;;;9597:21:1;;;9634:18;;;9627:30;9693:34;9673:18;;;9666:62;9745:18;;18903:139:0;9413:356:1;18903:139:0;18741:309;;18601:449;;;;:::o;34315:756::-;34429:7;34487:20;;;:14;:20;;;;;;;;34454:53;;;;;;;;;;;;;;;;;34429:7;;;;34454:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34518:21:0;34542:14;;;:8;:14;;;;;34581:17;;34454:53;;-1:-1:-1;34542:14:0;34581:17;-1:-1:-1;34613:8:0;34609:49;;34645:1;34638:8;;;;;;;34609:49;34694:15;34672:4;:19;;;:37;34668:78;;;34733:1;34726:8;;;;;;;34668:78;34769:9;34764:162;34788:3;34784:1;:7;34764:162;;;34836:10;34847:1;34836:13;;;;;;;;:::i;:::-;;;;;;;:26;;;34817:15;:45;34813:101;;34888:10;34899:1;34888:13;;;;;;;;:::i;:::-;;;;;;;:26;;;34881:33;;;;;;;;34813:101;34793:3;;;:::i;:::-;;;34764:162;;;-1:-1:-1;35062:1:0;;34315:756;-1:-1:-1;;;;;;34315:756:0:o;30585:192::-;30650:7;:14;30633;30675:95;30703:6;30697:3;:12;30675:95;;;30733:25;30745:7;30753:3;30745:12;;;;;;;;:::i;:::-;;;;;;;;;30733:11;:25::i;:::-;-1:-1:-1;30711:5:0;;;:::i;:::-;;;30675:95;;;;30622:155;30585:192::o;10622:173::-;10678:16;10697:6;;;10714:17;;;;;;;;;;10747:40;;10697:6;;;;;;;10747:40;;10678:16;10747:40;10667:128;10622:173;:::o;25905:661::-;26014:7;26072:20;;;:14;:20;;;;;;;;26039:53;;;;;;;;;;;;;;;;;26014:7;;;;26039:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26117:17:0;;26039:53;;-1:-1:-1;;;26149:8:0;26145:49;;26181:1;26174:8;;;;;;26145:49;26209:9;26204:157;26228:3;26224:1;:7;26204:157;;;26271:10;26282:1;26271:13;;;;;;;;:::i;:::-;;;;;;;:26;;;26257:10;:40;26253:96;;26323:10;26334:1;26323:13;;;;;;;;:::i;:::-;;;;;;;:26;;;26316:33;;;;;;;26253:96;26233:3;;;:::i;:::-;;;26204:157;;;-1:-1:-1;26526:10:0;26537:7;26543:1;26537:3;:7;:::i;:::-;26526:19;;;;;;;;:::i;:::-;;;;;;;:32;;;26519:39;;;;25905:661;;;;:::o;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:277::-;473:6;526:2;514:9;505:7;501:23;497:32;494:52;;;542:1;539;532:12;494:52;574:9;568:16;627:5;620:13;613:21;606:5;603:32;593:60;;649:1;646;639:12;688:180;747:6;800:2;788:9;779:7;775:23;771:32;768:52;;;816:1;813;806:12;768:52;-1:-1:-1;839:23:1;;688:180;-1:-1:-1;688:180:1:o;873:184::-;943:6;996:2;984:9;975:7;971:23;967:32;964:52;;;1012:1;1009;1002:12;964:52;-1:-1:-1;1035:16:1;;873:184;-1:-1:-1;873:184:1:o;1062:254::-;1130:6;1138;1191:2;1179:9;1170:7;1166:23;1162:32;1159:52;;;1207:1;1204;1197:12;1159:52;1243:9;1230:23;1220:33;;1272:38;1306:2;1295:9;1291:18;1272:38;:::i;:::-;1262:48;;1062:254;;;;;:::o;1321:322::-;1398:6;1406;1414;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1519:9;1506:23;1496:33;;1548:38;1582:2;1571:9;1567:18;1548:38;:::i;:::-;1538:48;;1633:2;1622:9;1618:18;1605:32;1595:42;;1321:322;;;;;:::o;1648:248::-;1716:6;1724;1777:2;1765:9;1756:7;1752:23;1748:32;1745:52;;;1793:1;1790;1783:12;1745:52;-1:-1:-1;;1816:23:1;;;1886:2;1871:18;;;1858:32;;-1:-1:-1;1648:248:1:o;1901:322::-;1978:6;1986;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2099:9;2086:23;2076:33;;2156:2;2145:9;2141:18;2128:32;2118:42;;2179:38;2213:2;2202:9;2198:18;2179:38;:::i;:::-;2169:48;;1901:322;;;;;:::o;2228:316::-;2305:6;2313;2321;2374:2;2362:9;2353:7;2349:23;2345:32;2342:52;;;2390:1;2387;2380:12;2342:52;-1:-1:-1;;2413:23:1;;;2483:2;2468:18;;2455:32;;-1:-1:-1;2534:2:1;2519:18;;;2506:32;;2228:316;-1:-1:-1;2228:316:1:o;2549:273::-;2617:6;2670:2;2658:9;2649:7;2645:23;2641:32;2638:52;;;2686:1;2683;2676:12;2638:52;2718:9;2712:16;2768:4;2761:5;2757:16;2750:5;2747:27;2737:55;;2788:1;2785;2778:12;2827:426;2956:3;2994:6;2988:13;3019:1;3029:129;3043:6;3040:1;3037:13;3029:129;;;3141:4;3125:14;;;3121:25;;3115:32;3102:11;;;3095:53;3058:12;3029:129;;;3176:6;3173:1;3170:13;3167:48;;;3211:1;3202:6;3197:3;3193:16;3186:27;3167:48;-1:-1:-1;3231:16:1;;;;;2827:426;-1:-1:-1;;2827:426:1:o;12132:128::-;12172:3;12203:1;12199:6;12196:1;12193:13;12190:39;;;12209:18;;:::i;:::-;-1:-1:-1;12245:9:1;;12132:128::o;12265:274::-;12305:1;12331;12321:189;;12366:77;12363:1;12356:88;12467:4;12464:1;12457:15;12495:4;12492:1;12485:15;12321:189;-1:-1:-1;12524:9:1;;12265:274::o;12544:228::-;12584:7;12710:1;12642:66;12638:74;12635:1;12632:81;12627:1;12620:9;12613:17;12609:105;12606:131;;;12717:18;;:::i;:::-;-1:-1:-1;12757:9:1;;12544:228::o;12777:125::-;12817:4;12845:1;12842;12839:8;12836:34;;;12850:18;;:::i;:::-;-1:-1:-1;12887:9:1;;12777:125::o;12907:195::-;12946:3;12977:66;12970:5;12967:77;12964:103;;;13047:18;;:::i;:::-;-1:-1:-1;13094:1:1;13083:13;;12907:195::o;13107:184::-;13159:77;13156:1;13149:88;13256:4;13253:1;13246:15;13280:4;13277:1;13270:15;13296:184;13348:77;13345:1;13338:88;13445:4;13442:1;13435:15;13469:4;13466:1;13459:15
Swarm Source
ipfs://d358124710e02f4aa4a4d267f81d662ca03a1b0761539e1433665854b7df7dce
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
MOVR | 100.00% | $6.2 | 1,017.7528 | $6,306.87 |
Loading...
Loading
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.