Source Code
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HanepBonusV3
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
istanbul EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
pragma abicoder v2;
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
import "./interface/ILiquidityReward_HANeP_4.sol";
/**
* @title HanepBonusV3
* @dev A smart contract for distributing rewards to liquidity providers and referrers.
* This contract enhances security and management functionality by inheriting ReentrancyGuard, Ownable, and Pausable.
*/
contract HanepBonusV3 is ReentrancyGuard, Ownable, Pausable {
IERC20 public constant HANeP = IERC20(0xC3248A1bd9D72fa3DA6E6ba701E58CbF818354eB);
ILiquidityReward_HANeP_4 public constant LIQUIDITY_REWARD_HANeP_4 = ILiquidityReward_HANeP_4(0xbF5288E237b6c4Ff01af24d301fF7504Ea12F2F0);
// A structure to store the information of a staker.
struct Staker {
uint256 amount; // Amount staked
uint256 startTime; // Start time of staking
uint256 lastClaimedTime; // The last time rewards were claimed
uint256 withdrawalTime; // Time when the staking can be withdrawn
}
mapping(address => Staker[]) private stakerArray; // Mapping each address to an array of Stakers.
// A structure to store the total information.
struct TotalInfo {
uint256 totalDividendAmount; // Total dividend amount
uint256 totalproviderDividendAmount; // Total dividend amount for providers
uint256 totalStakedAmount; // Total staked amount
uint256 totalRewardReleased; // Total rewards released
uint256 unclaimedRewards; // Unclaimed rewards
}
mapping(address => TotalInfo) public totalInfo; // Mapping each address to TotalInfo.
uint256 public constant YEAR = 31536000; // Time in seconds for one year.
uint256 public constant REWARD_PER_SECOND = 43189120370; // 1 HANeP token per second
uint256 private constant WEI_MULTIPLIER = 10 ** 18; // Constant for converting HANeP to wei
uint256 public totalSupply; // Total amount of HANeP staked in the contract
/**
* @dev Adds rewards for referrers. Only the owner can call this function.
* @param _providers Array of addresses of liquidity providers.
* @param _referrers Array of addresses of referrers corresponding to the providers.
*/
function addReferrerList(address[] memory _providers, address[] memory _referrers) external nonReentrant onlyOwner {
require(_providers.length == _referrers.length, "The lengths of the _providers and _referrers arrays must be equal");
for (uint i = 0; i < _providers.length; i++) {
address provider = _providers[i];
address referrer = _referrers[i];
uint256 amount;
require(provider != referrer, "Provider and referrer addresses must not be the same");
for (uint j = 0; j < i; j++) {
require(_providers[j] != provider, "Duplicate accounts are not allowed");
require(_referrers[j] != referrer, "Duplicate accounts in _referrers are not allowed");
}
(,,,,,uint256 referrerReward,) = LIQUIDITY_REWARD_HANeP_4.totalLiquidityInfo(provider);
if(referrerReward == 0) {
revert("don't have any reward");
}
amount = LIQUIDITY_REWARD_HANeP_4.registrationReferrer(provider);
totalInfo[referrer].totalDividendAmount += amount;
emit RewardUpdated(referrer, amount);
}
}
/**
* @dev Adds rewards for liquidity providers. Only the owner can call this function.
* @param _providers Array of addresses of liquidity providers.
* @param _amounts Array of amounts to be rewarded to the providers.
*/
function addProviderList(address[] memory _providers, uint256[] memory _amounts) external nonReentrant onlyOwner {
require(_providers.length == _amounts.length, "The lengths of the _providers and _amounts arrays must be equal");
for (uint i = 0; i < _providers.length; i++) {
address provider = _providers[i];
uint256 amount = _amounts[i];
uint256 totalLiquidityProvider;
for (uint j = 0; j < i; j++) {
require(_providers[j] != provider, "Duplicate accounts are not allowed");
}
(totalLiquidityProvider, , , , , ,) = LIQUIDITY_REWARD_HANeP_4.totalLiquidityInfo(provider);
if(totalLiquidityProvider > 0) {
totalInfo[provider].totalproviderDividendAmount += amount;
emit RewardUpdated(provider, amount);
}else {
revert("You don't have permission");
}
}
}
/**
* @dev Adds addresses to the whitelist and assigns rewards to them. Only the contract owner can call this function.
* @param _accounts Array of addresses to be whitelisted.
* @param _amounts Array of reward amounts for each whitelisted address.
*/
function addWhitelist(address[] memory _accounts, uint256[] memory _amounts) external nonReentrant onlyOwner {
require(_accounts.length == _amounts.length, "Accounts and amounts arrays must have the same length");
for (uint i = 0; i < _accounts.length; i++) {
address user = _accounts[i];
for (uint j = 0; j < i; j++) {
require(_accounts[j] != user, "Duplicate accounts are not allowed");
}
totalInfo[user].totalDividendAmount += _amounts[i];
emit RewardUpdated(user, _amounts[i]);
}
}
/**
* @dev Allows liquidity providers to stake their dividend rewards.
* This function can only be called by dividend reward eligible liquidity providers. The staked amount is added to the total supply.
*/
function stakeProviderDividends() public nonReentrant whenNotPaused {
TotalInfo storage total = totalInfo[msg.sender];
uint256 amount = total.totalproviderDividendAmount;
require(HANeP.balanceOf(address(this)) > amount * REWARD_PER_SECOND * YEAR / WEI_MULTIPLIER, "Total amount of rewards is too high");
require(amount > 0, "Not a whitelisted user");
_addToStakerArray(msg.sender, amount);
LIQUIDITY_REWARD_HANeP_4.registrationProvider(msg.sender);
total.totalStakedAmount += amount;
totalSupply += amount;
delete total.totalproviderDividendAmount;
emit Staked(msg.sender, amount);
}
/**
* @dev Allows liquidity providers to stake their dividends.
* This function can only be called by dividend-eligible liquidity providers. The staked amount is added to the total supply.
*/
function stakeDividends() public nonReentrant whenNotPaused {
TotalInfo storage total = totalInfo[msg.sender];
uint256 amount = total.totalDividendAmount;
require(HANeP.balanceOf(address(this)) > amount * REWARD_PER_SECOND * YEAR / WEI_MULTIPLIER, "Total amount of rewards is too high");
require(amount > 0, "Not a whitelisted user");
_addToStakerArray(msg.sender, amount);
total.totalStakedAmount += amount;
totalSupply += amount;
delete total.totalDividendAmount;
emit Staked(msg.sender, amount);
}
/**
* @dev Allows users to stake HANeP tokens.
* @param _amount The amount of HANeP tokens to stake.
*/
function stake(uint256 _amount) public nonReentrant whenNotPaused {
TotalInfo storage total = totalInfo[msg.sender];
uint256 amount = _amount;
require(HANeP.balanceOf(address(this)) > amount * REWARD_PER_SECOND * YEAR / WEI_MULTIPLIER, "Total amount of rewards is too high");
require(amount > 0, "Not a whitelisted user");
_addToStakerArray(msg.sender, amount);
HANeP.transferFrom(msg.sender, address(this), amount);
total.totalStakedAmount += amount;
totalSupply += amount;
emit Staked(msg.sender, amount);
}
/**
* @dev Allows users to withdraw their staked HANeP tokens after a certain period.
* @param _index The index of the staking entry to withdraw.
*/
function withdraw(uint256 _index) public nonReentrant whenNotPaused {
Staker memory staker = stakerArray[msg.sender][_index];
TotalInfo storage total = totalInfo[msg.sender];
require(block.timestamp > staker.withdrawalTime, "It's not the time to withdraw");
totalSupply -= staker.amount;
total.totalStakedAmount -= staker.amount;
total.unclaimedRewards += _calculateRewards(msg.sender, _index);
HANeP.transfer(msg.sender, staker.amount);
emit Withdrawn(msg.sender, staker.amount);
_removeStaker(_index);
}
/**
* @dev Allows users to claim their accumulated rewards.
*/
function claimRewards() external nonReentrant whenNotPaused {
TotalInfo storage total = totalInfo[msg.sender];
uint256 reward = 0;
for(uint i = 0; i < stakerArray[msg.sender].length; i++) {
Staker storage staker = stakerArray[msg.sender][i];
uint256 rewardValue = _calculateRewards(msg.sender, i);
if (rewardValue > 0) {
reward += rewardValue;
staker.lastClaimedTime = block.timestamp;
}
}
require(reward + total.unclaimedRewards > 0, "No rewards to claim");
HANeP.transfer(msg.sender, reward + total.unclaimedRewards);
total.totalRewardReleased += reward + total.unclaimedRewards;
total.unclaimedRewards = 0;
emit RewardPaid(msg.sender, reward);
}
/**
* @dev Views the total rewards payable to a user.
* @param _user The address of the user to view rewards for.
* @return reward The total rewards payable to the user.
*/
function rewardView(address _user) public view returns(uint256) {
uint256 reward = 0;
for(uint i = 0; i < stakerArray[_user].length; i++) {
uint256 rewardValue = _calculateRewards(_user, i);
if (rewardValue > 0) {
reward += rewardValue;
}
}
return reward;
}
/**
* @dev Views the remaining lock-up period for a user's staking entry.
* @param _user The address of the user.
* @param _index The index of the staking entry.
* @return The remaining lock-up period in seconds. Returns 0 if the period has expired.
*/
function remainingDuration(address _user ,uint _index) public view returns (uint256) {
Staker storage staker = stakerArray[_user][_index];
if(staker.withdrawalTime > block.timestamp) {
return staker.withdrawalTime - block.timestamp;
} else {
return 0;
}
}
/**
* @dev Retrieves all staking entries for a user.
* @param _user The address of the user.
* @return An array of staking entries for the user.
*/
function getStakerArray(address _user) public view returns(Staker[] memory) {
return stakerArray[_user];
}
/**
* @notice Adds a new staker entry to the array for a user.
* @dev This is an internal function called during staking operations.
* @param _user The address of the staker.
* @param _amount The amount of HAN tokens being staked.
*/
function _addToStakerArray(address _user, uint256 _amount) private {
Staker memory newStaker = Staker({
amount : _amount,
startTime : block.timestamp,
lastClaimedTime: block.timestamp,
withdrawalTime : block.timestamp + YEAR
});
stakerArray[_user].push(newStaker);
}
/**
* @notice Removes a staker entry from the array at a specific index.
* @dev This is an internal function called during withdrawal operations.
* @param _index The index of the staker entry to remove.
*/
function _removeStaker(uint256 _index) private {
require(_index < stakerArray[msg.sender].length, "Invalid index");
stakerArray[msg.sender][_index] = stakerArray[msg.sender][stakerArray[msg.sender].length - 1];
stakerArray[msg.sender].pop();
}
/**
* @notice Calculates the rewards for a staker based on the staked amount and time.
* @dev This is an internal view function used to calculate rewards for claiming.
* @param _user The address of the staker.
* @param _index The index of the staker entry for which to calculate rewards.
* @return The calculated reward amount.
*/
function _calculateRewards(address _user, uint256 _index) internal view returns (uint256) {
Staker memory staker = stakerArray[_user][_index];
uint256 reward;
uint256 stakedTime = block.timestamp - staker.lastClaimedTime;
reward = staker.amount * stakedTime * REWARD_PER_SECOND / WEI_MULTIPLIER;
return reward;
}
/**
* @notice Temporarily pauses all staking, withdrawal, and reward claiming operations.
* @dev Can only be called by the contract owner. Utilizes the Pausable contract's _pause function.
*/
function pause() external nonReentrant onlyOwner {
_pause();
}
/**
* @notice Resumes all operations after being paused.
* @dev Can only be called by the contract owner. Utilizes the Pausable contract's _unpause function.
*/
function unpause() external nonReentrant onlyOwner {
_unpause();
}
/**
* @notice Recovers any ERC20 tokens sent to the contract by mistake.
* @dev Can only be called by the contract owner. This function provides a safeguard against accidental token transfers to the contract.
* @param _tokenAddress The address of the ERC20 token to recover.
* @param _tokenAmount The amount of the ERC20 token to recover.
*/
function recoverERC20(address _tokenAddress, uint256 _tokenAmount) external nonReentrant onlyOwner {
IERC20(_tokenAddress).transfer(msg.sender, _tokenAmount);
emit RecoveredERC20(_tokenAddress, _tokenAmount);
}
/**
* @notice Recovers any ERC721 tokens sent to the contract by mistake.
* @dev Can only be called by the contract owner. Similar to recoverERC20, but for ERC721 tokens.
* @param _tokenAddress The address of the ERC721 token to recover.
* @param _tokenId The ID of the ERC721 token to recover.
*/
function recoverERC721(address _tokenAddress, uint256 _tokenId) external nonReentrant onlyOwner {
IERC721(_tokenAddress).safeTransferFrom(address(this),msg.sender,_tokenId);
emit RecoveredERC721(_tokenAddress, _tokenId);
}
// Event declarations to log actions within the contract
event RewardUpdated(address indexed user, uint256 amount);
event Staked(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event RewardPaid(address indexed user, uint256 reward);
event RecoveredERC20(address token, uint256 amount);
event RecoveredERC721(address token, uint256 tokenId);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
import "../utils/Context.sol";
/**
* @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 () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), 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 {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
import "../../introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/*
* @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 GSN 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 payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
import "./Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor () {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @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;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
interface ILiquidityReward_HANeP_4 {
function registrationReferrer(address _user) external returns (uint256);
function registrationProvider(address _user) external returns (uint256);
function rewardView(address _user) external view returns (uint256);
function remainingDuration(address _user, uint256 _index) external view returns (uint256);
function totalLiquidityInfo(address _user) external view returns (
uint256 totalLiquidity,
uint256 totalHanAmount,
uint256 totalWbtcAmount,
uint256 totalRewardReleased,
uint256 unclaimedRewards,
uint256 referrerReward,
uint256 liquidityReward
);
}{
"evmVersion": "istanbul",
"optimizer": {
"enabled": true,
"runs": 1000000
},
"metadata": {
"bytecodeHash": "none"
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecoveredERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"RecoveredERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"HANeP","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_REWARD_HANeP_4","outputs":[{"internalType":"contract ILiquidityReward_HANeP_4","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_PER_SECOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_providers","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"addProviderList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_providers","type":"address[]"},{"internalType":"address[]","name":"_referrers","type":"address[]"}],"name":"addReferrerList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getStakerArray","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"lastClaimedTime","type":"uint256"},{"internalType":"uint256","name":"withdrawalTime","type":"uint256"}],"internalType":"struct HanepBonusV3.Staker[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"remainingDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"rewardView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeProviderDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalInfo","outputs":[{"internalType":"uint256","name":"totalDividendAmount","type":"uint256"},{"internalType":"uint256","name":"totalproviderDividendAmount","type":"uint256"},{"internalType":"uint256","name":"totalStakedAmount","type":"uint256"},{"internalType":"uint256","name":"totalRewardReleased","type":"uint256"},{"internalType":"uint256","name":"unclaimedRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50600160009081556200002362000084565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001805460ff60a01b1916905562000088565b3390565b61342680620000986000396000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806383914540116100ee578063d1e78e8811610097578063e9a6662611610071578063e9a6662614610303578063eb9922fa14610316578063ec80c85614610329578063f2fde38b14610331576101a3565b8063d1e78e88146102c8578063d79c3953146102db578063e8940de2146102e3576101a3565b80638b8c916f116100c85780638b8c916f146102985780638da5cb5b146102ad578063a694fc3a146102b5576101a3565b806383914540146102755780638456cb591461027d5780638980f11f14610285576101a3565b80633f4ba83a116101505780635c975abb1161012a5780635c975abb14610245578063715018a61461025a578063819d4cc614610262576101a3565b80633f4ba83a1461022d5780634834d4f31461023557806349b739651461023d576101a3565b8063372500ab11610181578063372500ab146101ee5780633bb3f02e146101f65780633c1bf9861461021a576101a3565b8063050414bb146101a857806318160ddd146101bd5780632e1a7d4d146101db575b600080fd5b6101bb6101b6366004612d47565b610344565b005b6101c56105fd565b6040516101d29190613385565b60405180910390f35b6101bb6101e9366004612e20565b610603565b6101bb6108a2565b610209610204366004612c9c565b610b51565b6040516101d295949392919061338e565b6101bb610228366004612ce6565b610b81565b6101bb611084565b6101bb6111b2565b6101bb611429565b61024d611749565b6040516101d29190612f7f565b6101bb61176a565b6101bb610270366004612cbd565b611881565b6101c5611a6a565b6101bb611a72565b6101bb610293366004612cbd565b611b99565b6102a0611d90565b6040516101d29190612ea3565b6102a0611da8565b6101bb6102c3366004612e20565b611dc4565b6101c56102d6366004612cbd565b6120ef565b6101c5612159565b6102f66102f1366004612c9c565b612162565b6040516101d29190612f1b565b6101bb610311366004612d47565b61220d565b6101c5610324366004612c9c565b61258e565b6102a06125e9565b6101bb61033f366004612c9c565b612601565b600260005414156103b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556103c36127a3565b73ffffffffffffffffffffffffffffffffffffffff166103e1611da8565b73ffffffffffffffffffffffffffffffffffffffff161461046357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80518251146104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e906131da565b60405180910390fd5b60005b82518110156105f35760008382815181106104c157fe5b6020026020010151905060005b82811015610557578173ffffffffffffffffffffffffffffffffffffffff168582815181106104f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612ff8565b6001016104ce565b5082828151811061056457fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff83166000818152600390935260409092208054909101905583517f401ccfec4c6c7ac3f3b71182750d0f8d73c0d29cc476732b0b21ab0d359da47f908590859081106105cd57fe5b60200260200101516040516105e29190613385565b60405180910390a2506001016104aa565b5050600160005550565b60045481565b6002600054141561067557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055610682611749565b156106ee57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b33600090815260026020526040812080548390811061070957fe5b60009182526020808320604080516080810182526004909402909101805484526001810154848401526002810154848301526003908101546060850190815233865292529092209151909250421161078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612f8a565b81516004805482900390556002820180549190910390556107ae33846127a7565b6004808301805490920190915582516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273c3248a1bd9d72fa3da6e6ba701e58cbf818354eb9263a9059cbb9261080b92339201612ef5565b602060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085d9190612e00565b50815160405133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5916108919190613385565b60405180910390a26105f383612843565b6002600054141561091457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055610921611749565b1561098d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040812090805b33600090815260026020526040902054811015610a0a573360009081526002602052604081208054839081106109d157fe5b9060005260206000209060040201905060006109ed33846127a7565b90508015610a0057426002830155928301925b505060010161099f565b5060008260040154820111610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e906131a3565b6004808301546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273c3248a1bd9d72fa3da6e6ba701e58cbf818354eb9263a9059cbb92610aa39233929187019101612ef5565b602060405180830381600087803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af59190612e00565b5060048201805460038401805491840190910190556000905560405133907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048690610b40908490613385565b60405180910390a250506001600055565b60036020819052600091825260409091208054600182015460028301549383015460049093015491939092909185565b60026000541415610bf357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055610c006127a3565b73ffffffffffffffffffffffffffffffffffffffff16610c1e611da8565b73ffffffffffffffffffffffffffffffffffffffff1614610ca057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8051825114610cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613302565b60005b82518110156105f3576000838281518110610cf557fe5b602002602001015190506000838381518110610d0d57fe5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e906130e9565b60005b84811015610e84578373ffffffffffffffffffffffffffffffffffffffff16878281518110610dad57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612ff8565b8273ffffffffffffffffffffffffffffffffffffffff16868281518110610e2657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610e7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e906132a5565b600101610d82565b506040517feb7638f600000000000000000000000000000000000000000000000000000000815260009073bf5288e237b6c4ff01af24d301ff7504ea12f2f09063eb7638f690610ed8908790600401612ea3565b60e06040518083038186803b158015610ef057600080fd5b505afa158015610f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f289190612e50565b50955050505050508060001415610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612fc1565b6040517f901314da00000000000000000000000000000000000000000000000000000000815273bf5288e237b6c4ff01af24d301ff7504ea12f2f09063901314da90610fbb908790600401612ea3565b602060405180830381600087803b158015610fd557600080fd5b505af1158015610fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100d9190612e38565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600360205260409081902080548401905551919350907f401ccfec4c6c7ac3f3b71182750d0f8d73c0d29cc476732b0b21ab0d359da47f9061106c908590613385565b60405180910390a2505060019092019150610cde9050565b600260005414156110f657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556111036127a3565b73ffffffffffffffffffffffffffffffffffffffff16611121611da8565b73ffffffffffffffffffffffffffffffffffffffff16146111a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111ab6129b7565b6001600055565b6002600054141561122457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055611231611749565b1561129d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360009081526003602052604090208054670de0b6b3a76400006712e6d6c9e7966f0082026040517f70a082310000000000000000000000000000000000000000000000000000000081529190049073c3248a1bd9d72fa3da6e6ba701e58cbf818354eb906370a0823190611316903090600401612ea3565b60206040518083038186803b15801561132e57600080fd5b505afa158015611342573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113669190612e38565b1161139d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613146565b600081116113d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613237565b6113e13382612aa5565b6002820180548201905560048054820190556000825560405133907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d90610b40908490613385565b6002600054141561149b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556114a8611749565b1561151457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360009081526003602052604090206001810154670de0b6b3a76400006712e6d6c9e7966f0082026040517f70a082310000000000000000000000000000000000000000000000000000000081529190049073c3248a1bd9d72fa3da6e6ba701e58cbf818354eb906370a0823190611590903090600401612ea3565b60206040518083038186803b1580156115a857600080fd5b505afa1580156115bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e09190612e38565b11611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613146565b60008111611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613237565b61165b3382612aa5565b6040517f545a795e00000000000000000000000000000000000000000000000000000000815273bf5288e237b6c4ff01af24d301ff7504ea12f2f09063545a795e906116ab903390600401612ea3565b602060405180830381600087803b1580156116c557600080fd5b505af11580156116d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fd9190612e38565b506002820180548201905560048054820190556000600183015560405133907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d90610b40908490613385565b60015474010000000000000000000000000000000000000000900460ff1690565b6117726127a3565b73ffffffffffffffffffffffffffffffffffffffff16611790611da8565b73ffffffffffffffffffffffffffffffffffffffff161461181257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600260005414156118f357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556119006127a3565b73ffffffffffffffffffffffffffffffffffffffff1661191e611da8565b73ffffffffffffffffffffffffffffffffffffffff16146119a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040517f42842e0e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906342842e0e906119f690309033908690600401612ec4565b600060405180830381600087803b158015611a1057600080fd5b505af1158015611a24573d6000803e3d6000fd5b505050507f57519b6a0997d7d44511836bcee0a36871aa79d445816f6c464abb0cd9d3f3e88282604051611a59929190612ef5565b60405180910390a150506001600055565b6301e1338081565b60026000541415611ae457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055611af16127a3565b73ffffffffffffffffffffffffffffffffffffffff16611b0f611da8565b73ffffffffffffffffffffffffffffffffffffffff1614611b9157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111ab612b29565b60026000541415611c0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055611c186127a3565b73ffffffffffffffffffffffffffffffffffffffff16611c36611da8565b73ffffffffffffffffffffffffffffffffffffffff1614611cb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb90611d0c9033908590600401612ef5565b602060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5e9190612e00565b507f55350610fe57096d8c0ffa30beede987326bccfcb0b4415804164d0dd50ce8b18282604051611a59929190612ef5565b73c3248a1bd9d72fa3da6e6ba701e58cbf818354eb81565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60026000541415611e3657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055611e43611749565b15611eaf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902081670de0b6b3a76400006712e6d6c9e7966f0082026040517f70a082310000000000000000000000000000000000000000000000000000000081529190049073c3248a1bd9d72fa3da6e6ba701e58cbf818354eb906370a0823190611f27903090600401612ea3565b60206040518083038186803b158015611f3f57600080fd5b505afa158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f779190612e38565b11611fae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613146565b60008111611fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613237565b611ff23382612aa5565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273c3248a1bd9d72fa3da6e6ba701e58cbf818354eb906323b872dd9061204690339030908690600401612ec4565b602060405180830381600087803b15801561206057600080fd5b505af1158015612074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120989190612e00565b5060028201805482019055600480548201905560405133907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d906120dd908490613385565b60405180910390a25050600160005550565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040812080548291908490811061212357fe5b90600052602060002090600402019050428160030154111561214d57600301544290039050612153565b60009150505b92915050565b640a0e45ad7281565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600260209081526040808320805482518185028101850190935280835260609492939192909184015b828210156122015783829060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050815260200190600101906121a7565b5050505090505b919050565b6002600054141561227f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005561228c6127a3565b73ffffffffffffffffffffffffffffffffffffffff166122aa611da8565b73ffffffffffffffffffffffffffffffffffffffff161461232c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8051825114612367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e9061308c565b60005b82518110156105f357600083828151811061238157fe5b60200260200101519050600083838151811061239957fe5b60200260200101519050600080600090505b84811015612434578373ffffffffffffffffffffffffffffffffffffffff168782815181106123d657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561242c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612ff8565b6001016123ab565b506040517feb7638f600000000000000000000000000000000000000000000000000000000815273bf5288e237b6c4ff01af24d301ff7504ea12f2f09063eb7638f690612485908690600401612ea3565b60e06040518083038186803b15801561249d57600080fd5b505afa1580156124b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d59190612e50565b509495505084159350612551925050505773ffffffffffffffffffffffffffffffffffffffff831660008181526003602052604090819020600101805485019055517f401ccfec4c6c7ac3f3b71182750d0f8d73c0d29cc476732b0b21ab0d359da47f90612544908590613385565b60405180910390a2612583565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e9061326e565b50505060010161236a565b600080805b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020548110156125e25760006125cc85836127a7565b905080156125d957918201915b50600101612593565b5092915050565b73bf5288e237b6c4ff01af24d301ff7504ea12f2f081565b6126096127a3565b73ffffffffffffffffffffffffffffffffffffffff16612627611da8565b73ffffffffffffffffffffffffffffffffffffffff16146126a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612715576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133f46026913960400191505060405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604081208054829190849081106127db57fe5b6000918252602080832060408051608081018252600490940290910180548085526001820154938501939093526002810154918401829052600301546060840152919350429190910390670de0b6b3a7640000908202640a0e45ad7202049695505050505050565b33600090815260026020526040902054811061288b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613055565b33600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106128c857fe5b9060005260206000209060040201600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061292057fe5b600091825260208083208454600490930201918255600180850154908301556002808501548184015560039485015494909201939093553382529091526040902080548061296a57fe5b60008281526020812060047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002810182905560030155905550565b6129bf611749565b612a2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a7b6127a3565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190a1565b604080516080810182529182524260208084018281528484018381526301e133809093016060860190815273ffffffffffffffffffffffffffffffffffffffff909616600090815260028084529481208054600181810183559183529390912095516004909302909501918255519381019390935551908201559051600390910155565b612b31611749565b15612b9d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a7b6127a3565b803573ffffffffffffffffffffffffffffffffffffffff8116811461220857600080fd5b600082601f830112612c39578081fd5b81356020612c4e612c49836133d5565b6133b1565b8281528181019085830183850287018401881015612c6a578586fd5b855b85811015612c8f57612c7d82612c05565b84529284019290840190600101612c6c565b5090979650505050505050565b600060208284031215612cad578081fd5b612cb682612c05565b9392505050565b60008060408385031215612ccf578081fd5b612cd883612c05565b946020939093013593505050565b60008060408385031215612cf8578182fd5b823567ffffffffffffffff80821115612d0f578384fd5b612d1b86838701612c29565b93506020850135915080821115612d30578283fd5b50612d3d85828601612c29565b9150509250929050565b60008060408385031215612d59578182fd5b823567ffffffffffffffff80821115612d70578384fd5b612d7c86838701612c29565b9350602091508185013581811115612d92578384fd5b85019050601f81018613612da4578283fd5b8035612db2612c49826133d5565b81815283810190838501858402850186018a1015612dce578687fd5b8694505b83851015612df0578035835260019490940193918501918501612dd2565b5080955050505050509250929050565b600060208284031215612e11578081fd5b81518015158114612cb6578182fd5b600060208284031215612e31578081fd5b5035919050565b600060208284031215612e49578081fd5b5051919050565b600080600080600080600060e0888a031215612e6a578283fd5b5050855160208701516040880151606089015160808a015160a08b015160c0909b0151949c939b50919990985090965094509092509050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b82811015612f7257815180518552868101518786015285810151868601526060908101519085015260809093019290850190600101612f38565b5091979650505050505050565b901515815260200190565b6020808252601d908201527f49742773206e6f74207468652074696d6520746f207769746864726177000000604082015260600190565b60208082526015908201527f646f6e2774206861766520616e79207265776172640000000000000000000000604082015260600190565b60208082526022908201527f4475706c6963617465206163636f756e747320617265206e6f7420616c6c6f7760408201527f6564000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600d908201527f496e76616c696420696e64657800000000000000000000000000000000000000604082015260600190565b6020808252603f908201527f546865206c656e67746873206f6620746865205f70726f76696465727320616e60408201527f64205f616d6f756e747320617272617973206d75737420626520657175616c00606082015260800190565b60208082526034908201527f50726f766964657220616e64207265666572726572206164647265737365732060408201527f6d757374206e6f74206265207468652073616d65000000000000000000000000606082015260800190565b60208082526023908201527f546f74616c20616d6f756e74206f66207265776172647320697320746f6f206860408201527f6967680000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f4e6f207265776172647320746f20636c61696d00000000000000000000000000604082015260600190565b60208082526035908201527f4163636f756e747320616e6420616d6f756e747320617272617973206d75737460408201527f2068617665207468652073616d65206c656e6774680000000000000000000000606082015260800190565b60208082526016908201527f4e6f7420612077686974656c6973746564207573657200000000000000000000604082015260600190565b60208082526019908201527f596f7520646f6e27742068617665207065726d697373696f6e00000000000000604082015260600190565b60208082526030908201527f4475706c6963617465206163636f756e747320696e205f72656665727265727360408201527f20617265206e6f7420616c6c6f77656400000000000000000000000000000000606082015260800190565b60208082526041908201527f546865206c656e67746873206f6620746865205f70726f76696465727320616e60408201527f64205f72656665727265727320617272617973206d757374206265206571756160608201527f6c00000000000000000000000000000000000000000000000000000000000000608082015260a00190565b90815260200190565b948552602085019390935260408401919091526060830152608082015260a00190565b60405181810167ffffffffffffffff811182821017156133cd57fe5b604052919050565b600067ffffffffffffffff8211156133e957fe5b506020908102019056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a164736f6c6343000706000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a35760003560e01c806383914540116100ee578063d1e78e8811610097578063e9a6662611610071578063e9a6662614610303578063eb9922fa14610316578063ec80c85614610329578063f2fde38b14610331576101a3565b8063d1e78e88146102c8578063d79c3953146102db578063e8940de2146102e3576101a3565b80638b8c916f116100c85780638b8c916f146102985780638da5cb5b146102ad578063a694fc3a146102b5576101a3565b806383914540146102755780638456cb591461027d5780638980f11f14610285576101a3565b80633f4ba83a116101505780635c975abb1161012a5780635c975abb14610245578063715018a61461025a578063819d4cc614610262576101a3565b80633f4ba83a1461022d5780634834d4f31461023557806349b739651461023d576101a3565b8063372500ab11610181578063372500ab146101ee5780633bb3f02e146101f65780633c1bf9861461021a576101a3565b8063050414bb146101a857806318160ddd146101bd5780632e1a7d4d146101db575b600080fd5b6101bb6101b6366004612d47565b610344565b005b6101c56105fd565b6040516101d29190613385565b60405180910390f35b6101bb6101e9366004612e20565b610603565b6101bb6108a2565b610209610204366004612c9c565b610b51565b6040516101d295949392919061338e565b6101bb610228366004612ce6565b610b81565b6101bb611084565b6101bb6111b2565b6101bb611429565b61024d611749565b6040516101d29190612f7f565b6101bb61176a565b6101bb610270366004612cbd565b611881565b6101c5611a6a565b6101bb611a72565b6101bb610293366004612cbd565b611b99565b6102a0611d90565b6040516101d29190612ea3565b6102a0611da8565b6101bb6102c3366004612e20565b611dc4565b6101c56102d6366004612cbd565b6120ef565b6101c5612159565b6102f66102f1366004612c9c565b612162565b6040516101d29190612f1b565b6101bb610311366004612d47565b61220d565b6101c5610324366004612c9c565b61258e565b6102a06125e9565b6101bb61033f366004612c9c565b612601565b600260005414156103b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556103c36127a3565b73ffffffffffffffffffffffffffffffffffffffff166103e1611da8565b73ffffffffffffffffffffffffffffffffffffffff161461046357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80518251146104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e906131da565b60405180910390fd5b60005b82518110156105f35760008382815181106104c157fe5b6020026020010151905060005b82811015610557578173ffffffffffffffffffffffffffffffffffffffff168582815181106104f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612ff8565b6001016104ce565b5082828151811061056457fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff83166000818152600390935260409092208054909101905583517f401ccfec4c6c7ac3f3b71182750d0f8d73c0d29cc476732b0b21ab0d359da47f908590859081106105cd57fe5b60200260200101516040516105e29190613385565b60405180910390a2506001016104aa565b5050600160005550565b60045481565b6002600054141561067557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055610682611749565b156106ee57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b33600090815260026020526040812080548390811061070957fe5b60009182526020808320604080516080810182526004909402909101805484526001810154848401526002810154848301526003908101546060850190815233865292529092209151909250421161078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612f8a565b81516004805482900390556002820180549190910390556107ae33846127a7565b6004808301805490920190915582516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273c3248a1bd9d72fa3da6e6ba701e58cbf818354eb9263a9059cbb9261080b92339201612ef5565b602060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085d9190612e00565b50815160405133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5916108919190613385565b60405180910390a26105f383612843565b6002600054141561091457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055610921611749565b1561098d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040812090805b33600090815260026020526040902054811015610a0a573360009081526002602052604081208054839081106109d157fe5b9060005260206000209060040201905060006109ed33846127a7565b90508015610a0057426002830155928301925b505060010161099f565b5060008260040154820111610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e906131a3565b6004808301546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273c3248a1bd9d72fa3da6e6ba701e58cbf818354eb9263a9059cbb92610aa39233929187019101612ef5565b602060405180830381600087803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af59190612e00565b5060048201805460038401805491840190910190556000905560405133907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048690610b40908490613385565b60405180910390a250506001600055565b60036020819052600091825260409091208054600182015460028301549383015460049093015491939092909185565b60026000541415610bf357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055610c006127a3565b73ffffffffffffffffffffffffffffffffffffffff16610c1e611da8565b73ffffffffffffffffffffffffffffffffffffffff1614610ca057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8051825114610cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613302565b60005b82518110156105f3576000838281518110610cf557fe5b602002602001015190506000838381518110610d0d57fe5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e906130e9565b60005b84811015610e84578373ffffffffffffffffffffffffffffffffffffffff16878281518110610dad57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612ff8565b8273ffffffffffffffffffffffffffffffffffffffff16868281518110610e2657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610e7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e906132a5565b600101610d82565b506040517feb7638f600000000000000000000000000000000000000000000000000000000815260009073bf5288e237b6c4ff01af24d301ff7504ea12f2f09063eb7638f690610ed8908790600401612ea3565b60e06040518083038186803b158015610ef057600080fd5b505afa158015610f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f289190612e50565b50955050505050508060001415610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612fc1565b6040517f901314da00000000000000000000000000000000000000000000000000000000815273bf5288e237b6c4ff01af24d301ff7504ea12f2f09063901314da90610fbb908790600401612ea3565b602060405180830381600087803b158015610fd557600080fd5b505af1158015610fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100d9190612e38565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600360205260409081902080548401905551919350907f401ccfec4c6c7ac3f3b71182750d0f8d73c0d29cc476732b0b21ab0d359da47f9061106c908590613385565b60405180910390a2505060019092019150610cde9050565b600260005414156110f657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556111036127a3565b73ffffffffffffffffffffffffffffffffffffffff16611121611da8565b73ffffffffffffffffffffffffffffffffffffffff16146111a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111ab6129b7565b6001600055565b6002600054141561122457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055611231611749565b1561129d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360009081526003602052604090208054670de0b6b3a76400006712e6d6c9e7966f0082026040517f70a082310000000000000000000000000000000000000000000000000000000081529190049073c3248a1bd9d72fa3da6e6ba701e58cbf818354eb906370a0823190611316903090600401612ea3565b60206040518083038186803b15801561132e57600080fd5b505afa158015611342573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113669190612e38565b1161139d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613146565b600081116113d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613237565b6113e13382612aa5565b6002820180548201905560048054820190556000825560405133907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d90610b40908490613385565b6002600054141561149b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556114a8611749565b1561151457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b3360009081526003602052604090206001810154670de0b6b3a76400006712e6d6c9e7966f0082026040517f70a082310000000000000000000000000000000000000000000000000000000081529190049073c3248a1bd9d72fa3da6e6ba701e58cbf818354eb906370a0823190611590903090600401612ea3565b60206040518083038186803b1580156115a857600080fd5b505afa1580156115bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e09190612e38565b11611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613146565b60008111611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613237565b61165b3382612aa5565b6040517f545a795e00000000000000000000000000000000000000000000000000000000815273bf5288e237b6c4ff01af24d301ff7504ea12f2f09063545a795e906116ab903390600401612ea3565b602060405180830381600087803b1580156116c557600080fd5b505af11580156116d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fd9190612e38565b506002820180548201905560048054820190556000600183015560405133907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d90610b40908490613385565b60015474010000000000000000000000000000000000000000900460ff1690565b6117726127a3565b73ffffffffffffffffffffffffffffffffffffffff16611790611da8565b73ffffffffffffffffffffffffffffffffffffffff161461181257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600260005414156118f357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556119006127a3565b73ffffffffffffffffffffffffffffffffffffffff1661191e611da8565b73ffffffffffffffffffffffffffffffffffffffff16146119a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040517f42842e0e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906342842e0e906119f690309033908690600401612ec4565b600060405180830381600087803b158015611a1057600080fd5b505af1158015611a24573d6000803e3d6000fd5b505050507f57519b6a0997d7d44511836bcee0a36871aa79d445816f6c464abb0cd9d3f3e88282604051611a59929190612ef5565b60405180910390a150506001600055565b6301e1338081565b60026000541415611ae457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055611af16127a3565b73ffffffffffffffffffffffffffffffffffffffff16611b0f611da8565b73ffffffffffffffffffffffffffffffffffffffff1614611b9157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111ab612b29565b60026000541415611c0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055611c186127a3565b73ffffffffffffffffffffffffffffffffffffffff16611c36611da8565b73ffffffffffffffffffffffffffffffffffffffff1614611cb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb90611d0c9033908590600401612ef5565b602060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5e9190612e00565b507f55350610fe57096d8c0ffa30beede987326bccfcb0b4415804164d0dd50ce8b18282604051611a59929190612ef5565b73c3248a1bd9d72fa3da6e6ba701e58cbf818354eb81565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60026000541415611e3657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055611e43611749565b15611eaf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902081670de0b6b3a76400006712e6d6c9e7966f0082026040517f70a082310000000000000000000000000000000000000000000000000000000081529190049073c3248a1bd9d72fa3da6e6ba701e58cbf818354eb906370a0823190611f27903090600401612ea3565b60206040518083038186803b158015611f3f57600080fd5b505afa158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f779190612e38565b11611fae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613146565b60008111611fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613237565b611ff23382612aa5565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273c3248a1bd9d72fa3da6e6ba701e58cbf818354eb906323b872dd9061204690339030908690600401612ec4565b602060405180830381600087803b15801561206057600080fd5b505af1158015612074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120989190612e00565b5060028201805482019055600480548201905560405133907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d906120dd908490613385565b60405180910390a25050600160005550565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040812080548291908490811061212357fe5b90600052602060002090600402019050428160030154111561214d57600301544290039050612153565b60009150505b92915050565b640a0e45ad7281565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600260209081526040808320805482518185028101850190935280835260609492939192909184015b828210156122015783829060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050815260200190600101906121a7565b5050505090505b919050565b6002600054141561227f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005561228c6127a3565b73ffffffffffffffffffffffffffffffffffffffff166122aa611da8565b73ffffffffffffffffffffffffffffffffffffffff161461232c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8051825114612367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e9061308c565b60005b82518110156105f357600083828151811061238157fe5b60200260200101519050600083838151811061239957fe5b60200260200101519050600080600090505b84811015612434578373ffffffffffffffffffffffffffffffffffffffff168782815181106123d657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561242c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90612ff8565b6001016123ab565b506040517feb7638f600000000000000000000000000000000000000000000000000000000815273bf5288e237b6c4ff01af24d301ff7504ea12f2f09063eb7638f690612485908690600401612ea3565b60e06040518083038186803b15801561249d57600080fd5b505afa1580156124b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d59190612e50565b509495505084159350612551925050505773ffffffffffffffffffffffffffffffffffffffff831660008181526003602052604090819020600101805485019055517f401ccfec4c6c7ac3f3b71182750d0f8d73c0d29cc476732b0b21ab0d359da47f90612544908590613385565b60405180910390a2612583565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e9061326e565b50505060010161236a565b600080805b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020548110156125e25760006125cc85836127a7565b905080156125d957918201915b50600101612593565b5092915050565b73bf5288e237b6c4ff01af24d301ff7504ea12f2f081565b6126096127a3565b73ffffffffffffffffffffffffffffffffffffffff16612627611da8565b73ffffffffffffffffffffffffffffffffffffffff16146126a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612715576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133f46026913960400191505060405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604081208054829190849081106127db57fe5b6000918252602080832060408051608081018252600490940290910180548085526001820154938501939093526002810154918401829052600301546060840152919350429190910390670de0b6b3a7640000908202640a0e45ad7202049695505050505050565b33600090815260026020526040902054811061288b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049e90613055565b33600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106128c857fe5b9060005260206000209060040201600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061292057fe5b600091825260208083208454600490930201918255600180850154908301556002808501548184015560039485015494909201939093553382529091526040902080548061296a57fe5b60008281526020812060047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002810182905560030155905550565b6129bf611749565b612a2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a7b6127a3565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190a1565b604080516080810182529182524260208084018281528484018381526301e133809093016060860190815273ffffffffffffffffffffffffffffffffffffffff909616600090815260028084529481208054600181810183559183529390912095516004909302909501918255519381019390935551908201559051600390910155565b612b31611749565b15612b9d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a7b6127a3565b803573ffffffffffffffffffffffffffffffffffffffff8116811461220857600080fd5b600082601f830112612c39578081fd5b81356020612c4e612c49836133d5565b6133b1565b8281528181019085830183850287018401881015612c6a578586fd5b855b85811015612c8f57612c7d82612c05565b84529284019290840190600101612c6c565b5090979650505050505050565b600060208284031215612cad578081fd5b612cb682612c05565b9392505050565b60008060408385031215612ccf578081fd5b612cd883612c05565b946020939093013593505050565b60008060408385031215612cf8578182fd5b823567ffffffffffffffff80821115612d0f578384fd5b612d1b86838701612c29565b93506020850135915080821115612d30578283fd5b50612d3d85828601612c29565b9150509250929050565b60008060408385031215612d59578182fd5b823567ffffffffffffffff80821115612d70578384fd5b612d7c86838701612c29565b9350602091508185013581811115612d92578384fd5b85019050601f81018613612da4578283fd5b8035612db2612c49826133d5565b81815283810190838501858402850186018a1015612dce578687fd5b8694505b83851015612df0578035835260019490940193918501918501612dd2565b5080955050505050509250929050565b600060208284031215612e11578081fd5b81518015158114612cb6578182fd5b600060208284031215612e31578081fd5b5035919050565b600060208284031215612e49578081fd5b5051919050565b600080600080600080600060e0888a031215612e6a578283fd5b5050855160208701516040880151606089015160808a015160a08b015160c0909b0151949c939b50919990985090965094509092509050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b82811015612f7257815180518552868101518786015285810151868601526060908101519085015260809093019290850190600101612f38565b5091979650505050505050565b901515815260200190565b6020808252601d908201527f49742773206e6f74207468652074696d6520746f207769746864726177000000604082015260600190565b60208082526015908201527f646f6e2774206861766520616e79207265776172640000000000000000000000604082015260600190565b60208082526022908201527f4475706c6963617465206163636f756e747320617265206e6f7420616c6c6f7760408201527f6564000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600d908201527f496e76616c696420696e64657800000000000000000000000000000000000000604082015260600190565b6020808252603f908201527f546865206c656e67746873206f6620746865205f70726f76696465727320616e60408201527f64205f616d6f756e747320617272617973206d75737420626520657175616c00606082015260800190565b60208082526034908201527f50726f766964657220616e64207265666572726572206164647265737365732060408201527f6d757374206e6f74206265207468652073616d65000000000000000000000000606082015260800190565b60208082526023908201527f546f74616c20616d6f756e74206f66207265776172647320697320746f6f206860408201527f6967680000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f4e6f207265776172647320746f20636c61696d00000000000000000000000000604082015260600190565b60208082526035908201527f4163636f756e747320616e6420616d6f756e747320617272617973206d75737460408201527f2068617665207468652073616d65206c656e6774680000000000000000000000606082015260800190565b60208082526016908201527f4e6f7420612077686974656c6973746564207573657200000000000000000000604082015260600190565b60208082526019908201527f596f7520646f6e27742068617665207065726d697373696f6e00000000000000604082015260600190565b60208082526030908201527f4475706c6963617465206163636f756e747320696e205f72656665727265727360408201527f20617265206e6f7420616c6c6f77656400000000000000000000000000000000606082015260800190565b60208082526041908201527f546865206c656e67746873206f6620746865205f70726f76696465727320616e60408201527f64205f72656665727265727320617272617973206d757374206265206571756160608201527f6c00000000000000000000000000000000000000000000000000000000000000608082015260a00190565b90815260200190565b948552602085019390935260408401919091526060830152608082015260a00190565b60405181810167ffffffffffffffff811182821017156133cd57fe5b604052919050565b600067ffffffffffffffff8211156133e957fe5b506020908102019056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a164736f6c6343000706000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| OP | 100.00% | $0.114824 | 4,787,165.6964 | $549,681.51 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.