Source Code
Latest 25 from a total of 6,347 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim Reward | 143655609 | 6 hrs ago | IN | 0 ETH | 0.000000006986 | ||||
| Claim Reward | 143238598 | 9 days ago | IN | 0 ETH | 0.000000007114 | ||||
| Withdraw | 142650735 | 23 days ago | IN | 0 ETH | 0.000000012059 | ||||
| Withdraw | 142536864 | 26 days ago | IN | 0 ETH | 0.00000001473 | ||||
| Withdraw | 142244893 | 32 days ago | IN | 0 ETH | 0.000000016829 | ||||
| Stake | 141904802 | 40 days ago | IN | 0 ETH | 0.000000047177 | ||||
| Stake | 141719935 | 45 days ago | IN | 0 ETH | 0.000000075214 | ||||
| Claim Reward | 141462436 | 51 days ago | IN | 0 ETH | 0.000000016964 | ||||
| Claim Reward | 140721841 | 68 days ago | IN | 0 ETH | 0.000000010567 | ||||
| Claim Reward | 140479800 | 73 days ago | IN | 0 ETH | 0.000000009672 | ||||
| Claim Reward | 140162354 | 81 days ago | IN | 0 ETH | 0.000000011196 | ||||
| Claim Reward | 140135169 | 81 days ago | IN | 0 ETH | 0.000000012199 | ||||
| Stake | 139859992 | 88 days ago | IN | 0 ETH | 0.000000082168 | ||||
| Claim Reward | 139856758 | 88 days ago | IN | 0 ETH | 0.000000008463 | ||||
| Withdraw | 139722723 | 91 days ago | IN | 0 ETH | 0.000000021134 | ||||
| Withdraw | 139471088 | 97 days ago | IN | 0 ETH | 0.000000013811 | ||||
| Withdraw | 139015635 | 107 days ago | IN | 0 ETH | 0.000000005382 | ||||
| Withdraw | 139015608 | 107 days ago | IN | 0 ETH | 0.000000014759 | ||||
| Claim Reward | 138911967 | 110 days ago | IN | 0 ETH | 0.000000008575 | ||||
| Claim Reward | 138782681 | 113 days ago | IN | 0 ETH | 0.000000012977 | ||||
| Withdraw | 138562861 | 118 days ago | IN | 0 ETH | 0.000000145744 | ||||
| Withdraw | 138562823 | 118 days ago | IN | 0 ETH | 0.00000020084 | ||||
| Withdraw | 138308381 | 124 days ago | IN | 0 ETH | 0.000000055276 | ||||
| Withdraw | 138308369 | 124 days ago | IN | 0 ETH | 0.000000064068 | ||||
| Withdraw | 138308124 | 124 days ago | IN | 0 ETH | 0.000000048445 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HanepBonusStaking
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
contract HanepBonusStaking is ReentrancyGuard, Ownable, Pausable {
IERC20 public immutable hanToken;
IERC20 public immutable epToken;
constructor(address _hanToken, address _epToken) onlyOwner {
hanToken = IERC20(_hanToken);
epToken = IERC20(_epToken);
}
struct Staker {
uint256 amount;
uint256 startTime;
uint256 withdrawalTime;
uint256 remainingEpAmount;
uint256 hanRewardAmount;
}
struct Total {
uint256 epRewardReleased;
uint256 hanRewardReleased;
uint256 stakedAmount;
uint256 hanAmount;
}
mapping(address => Staker) private stakers;
mapping(address => Staker[]) private stakerArray;
mapping(address => Total) public totalData;
mapping(address => uint256) public whitelistAmount;
address[] private whitelistArray;
uint256 public immutable hanTokenPerLpToken = 1268391679351;
uint256 public immutable epTokenPerLpToken = 15854900000;
uint256 public tokenQuota = 10000 ether;
uint256 public totalSupply;
function addWhitelist(address[] memory _accounts, uint256[] memory _amounts) public 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];
uint256 amount = _amounts[i];
// Check for duplicates within the input array
for (uint j = 0; j < i; j++) {
require(_accounts[j] != user, "Duplicate accounts are not allowed");
}
// Check if user is already in the whitelist
bool isExisting = false;
for (uint k = 0; k < whitelistArray.length; k++) {
if (whitelistArray[k] == user) {
isExisting = true;
break;
}
}
// If not existing, add to the whitelistArray
if (!isExisting) {
whitelistArray.push(user);
}
whitelistAmount[user] += amount; // Assuming whitelistAmount is a mapping from address to uint256
}
}
// "STAKE" function
function stake() public nonReentrant whenNotPaused {
Staker storage staker = stakers[msg.sender];
Total storage total = totalData[msg.sender];
require(whitelistAmount[msg.sender] + totalSupply <= tokenQuota, "Too Many Token");
require(epToken.balanceOf(address(this)) > whitelistAmount[msg.sender] * epTokenPerLpToken * 365 days / 10**18, "Total amount of rewards is too high");
require(whitelistAmount[msg.sender] > 0, "Not a whitelisted user");
uint256 amount = whitelistAmount[msg.sender];
staker.amount = amount;
staker.startTime = block.timestamp;
staker.withdrawalTime = block.timestamp + 365 days;
staker.remainingEpAmount = amount * epTokenPerLpToken * 365 days / 10**18;
staker.hanRewardAmount = amount * hanTokenPerLpToken * 365 days / 10**18;
total.hanAmount += staker.hanRewardAmount;
stakerArray[msg.sender].push(staker);
total.stakedAmount += amount;
totalSupply += amount;
delete whitelistAmount[msg.sender];
removeAddress(whitelistArray, msg.sender);
emit Staked(msg.sender, amount);
}
// "WITHDRAW" function
function withdraw(uint256 _index) public nonReentrant {
Staker storage staker = stakerArray[msg.sender][_index];
Total storage total = totalData[msg.sender];
require(block.timestamp > staker.withdrawalTime, "It's not the time to withdraw");
totalSupply -= staker.amount;
total.stakedAmount -= staker.amount;
total.epRewardReleased += staker.remainingEpAmount;
total.hanRewardReleased += staker.hanRewardAmount;
total.hanAmount -= staker.hanRewardAmount;
epToken.transfer(msg.sender, staker.amount + staker.remainingEpAmount);
hanToken.transfer(msg.sender, staker.hanRewardAmount);
emit Withdrawn(msg.sender, staker.amount);
removeStaker(_index);
}
// "epToken CLAIM" function
function claimReward() public {
Total storage total = totalData[msg.sender];
uint256 reward;
for(uint i = 0; i < stakerArray[msg.sender].length; i++) {
Staker storage staker = stakerArray[msg.sender][i];
uint256 rewardValue = (block.timestamp - staker.startTime) * (staker.amount * epTokenPerLpToken) / 10**18;
if (rewardValue > staker.remainingEpAmount) {
rewardValue = staker.remainingEpAmount;
}
if (rewardValue > 0) {
reward += rewardValue;
staker.remainingEpAmount -= rewardValue;
staker.startTime = block.timestamp;
}
}
if (reward > 0) {
epToken.transfer(msg.sender, reward);
total.epRewardReleased += reward;
emit RewardPaid(msg.sender, reward);
}
if (reward == 0) {
revert("There's no reward for your claim");
}
}
// Current Rewardable Amount Output Function
function rewardView(address _user) public view returns(uint256) {
uint256 reward;
for(uint i = 0; i < stakerArray[_user].length; i++) {
Staker storage staker = stakerArray[_user][i];
uint256 rewardValue = (block.timestamp - staker.startTime) * (staker.amount * epTokenPerLpToken) / 10**18;
if (rewardValue > staker.remainingEpAmount) {
rewardValue = staker.remainingEpAmount;
}
if (rewardValue > 0) {
reward += rewardValue;
}
}
if (reward == 0) {
return 0;
}
return reward;
}
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;
}
}
function getStakerArray(address _user) public view returns(Staker[] memory) {
return stakerArray[_user];
}
function getWhitelistArray() public view returns(address[] memory) {
return whitelistArray;
}
function setTokenQuota(uint256 _newTokenQuota) public onlyOwner {
require(_newTokenQuota > totalSupply, "Too Small Quota");
tokenQuota = _newTokenQuota;
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function recoverERC20(address _tokenAddress, uint256 _tokenAmount) external onlyOwner {
IERC20(_tokenAddress).transfer(msg.sender, _tokenAmount);
emit RecoveredERC20(_tokenAddress, _tokenAmount);
}
function recoverERC721(address _tokenAddress, uint256 _tokenId) external onlyOwner {
IERC721(_tokenAddress).safeTransferFrom(address(this),msg.sender,_tokenId);
emit RecoveredERC721(_tokenAddress, _tokenId);
}
function removeStaker(uint256 _index) internal {
require(_index < stakerArray[msg.sender].length, "Invalid index");
stakerArray[msg.sender][_index] = stakerArray[msg.sender][stakerArray[msg.sender].length - 1];
stakerArray[msg.sender].pop();
}
function removeAddress(address[] storage _array, address _address) internal {
for (uint256 i = 0; i < _array.length; i++) {
if (_array[i] == _address) {
_array[i] = _array[_array.length - 1];
_array.pop();
break;
}
}
}
// ------------------ EVENTS ------------------ //
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
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/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 Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
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
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/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`.
*
* 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;
/**
* @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* 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 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 the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.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() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.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 making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.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
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^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 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;
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_hanToken","type":"address"},{"internalType":"address","name":"_epToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epTokenPerLpToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"withdrawalTime","type":"uint256"},{"internalType":"uint256","name":"remainingEpAmount","type":"uint256"},{"internalType":"uint256","name":"hanRewardAmount","type":"uint256"}],"internalType":"struct HanepBonusStaking.Staker[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistArray","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hanToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hanTokenPerLpToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_newTokenQuota","type":"uint256"}],"name":"setTokenQuota","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenQuota","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalData","outputs":[{"internalType":"uint256","name":"epRewardReleased","type":"uint256"},{"internalType":"uint256","name":"hanRewardReleased","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"hanAmount","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":"address","name":"","type":"address"}],"name":"whitelistAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101006040526501275209157760c0908152506403b106932060e09081525069021e19e0c9bab24000006007553480156200003957600080fd5b50604051620036603803806200366083398181016040528101906200005f919062000315565b6001600081905550620000876200007b6200012260201b60201c565b6200012a60201b60201c565b6000600160146101000a81548160ff021916908315150217905550620000b2620001f060201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050620003df565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002006200012260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002266200028160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200027f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200027690620003bd565b60405180910390fd5b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002dd82620002b0565b9050919050565b620002ef81620002d0565b8114620002fb57600080fd5b50565b6000815190506200030f81620002e4565b92915050565b600080604083850312156200032f576200032e620002ab565b5b60006200033f85828601620002fe565b92505060206200035285828601620002fe565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620003a56020836200035c565b9150620003b2826200036d565b602082019050919050565b60006020820190508181036000830152620003d88162000396565b9050919050565b60805160a05160c05160e0516132086200045860003960008181610bba01528181610e11015281816110b9015281816113a80152611827015260008181610e6701526115bd0152600081816108a401528181610a6101528181610c39015261146d01526000818161095601526115e101526132086000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063819d4cc6116100de578063c1a5fcab11610097578063eb9922fa11610071578063eb9922fa146103cd578063ec10172d146103fd578063f2fde38b1461041b578063fe6fef441461043757610173565b8063c1a5fcab1461034f578063d1e78e881461036d578063e8940de21461039d57610173565b8063819d4cc6146102c75780638456cb59146102e35780638980f11f146102ed5780638da5cb5b14610309578063b88a802f14610327578063bee89f741461033157610173565b80633e9a9a24116101305780633e9a9a24146102145780633f4ba83a146102475780635ab7e6c7146102515780635c975abb146102815780636adb53a01461029f578063715018a6146102bd57610173565b8063050414bb14610178578063168cd7ae1461019457806318160ddd146101b25780632e1a7d4d146101d057806331430f8e146101ec5780633a4b66f11461020a575b600080fd5b610192600480360381019061018d91906123e4565b610453565b005b61019c610709565b6040516101a9919061246b565b60405180910390f35b6101ba61070f565b6040516101c7919061246b565b60405180910390f35b6101ea60048036038101906101e59190612486565b610715565b005b6101f4610a5f565b6040516102019190612512565b60405180910390f35b610212610a83565b005b61022e6004803603810190610229919061252d565b611046565b60405161023e949392919061255a565b60405180910390f35b61024f611076565b005b61026b6004803603810190610266919061252d565b611088565b604051610278919061246b565b60405180910390f35b6102896110a0565b60405161029691906125ba565b60405180910390f35b6102a76110b7565b6040516102b4919061246b565b60405180910390f35b6102c56110db565b005b6102e160048036038101906102dc91906125d5565b6110ef565b005b6102eb6111a3565b005b610307600480360381019061030291906125d5565b6111b5565b005b610311611279565b60405161031e9190612624565b60405180910390f35b61032f6112a3565b005b6103396115bb565b604051610346919061246b565b60405180910390f35b6103576115df565b6040516103649190612512565b60405180910390f35b610387600480360381019061038291906125d5565b611603565b604051610394919061246b565b60405180910390f35b6103b760048036038101906103b2919061252d565b611697565b6040516103c49190612765565b60405180910390f35b6103e760048036038101906103e2919061252d565b611767565b6040516103f4919061246b565b60405180910390f35b6104056118d9565b6040516104129190612845565b60405180910390f35b6104356004803603810190610430919061252d565b611967565b005b610451600480360381019061044c9190612486565b6119ea565b005b61045b611a40565b805182511461049f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610496906128ea565b60405180910390fd5b60005b82518110156107045760008382815181106104c0576104bf61290a565b5b6020026020010151905060008383815181106104df576104de61290a565b5b6020026020010151905060005b8381101561058f578273ffffffffffffffffffffffffffffffffffffffff1686828151811061051e5761051d61290a565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361057c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610573906129ab565b60405180910390fd5b8080610587906129fa565b9150506104ec565b506000805b60068054905081101561062e578373ffffffffffffffffffffffffffffffffffffffff16600682815481106105cc576105cb61290a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361061b576001915061062e565b8080610626906129fa565b915050610594565b5080610698576006839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106e79190612a42565b9250508190555050505080806106fc906129fa565b9150506104a2565b505050565b60075481565b60085481565b61071d611abe565b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106107705761076f61290a565b5b906000526020600020906005020190506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081600201544211610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090612ac2565b60405180910390fd5b81600001546008600082825461081f9190612ae2565b92505081905550816000015481600201600082825461083e9190612ae2565b92505081905550816003015481600001600082825461085d9190612a42565b92505081905550816004015481600101600082825461087c9190612a42565b92505081905550816004015481600301600082825461089b9190612ae2565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846003015485600001546108f39190612a42565b6040518363ffffffff1660e01b8152600401610910929190612b16565b6020604051808303816000875af115801561092f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109539190612b6b565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3384600401546040518363ffffffff1660e01b81526004016109b3929190612b16565b6020604051808303816000875af11580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190612b6b565b503373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58360000154604051610a41919061246b565b60405180910390a2610a5283611b0d565b5050610a5c611d65565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a8b611abe565b610a93611d6f565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600754600854600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b699190612a42565b1115610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba190612be4565b60405180910390fd5b670de0b6b3a76400006301e133807f0000000000000000000000000000000000000000000000000000000000000000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c239190612c04565b610c2d9190612c04565b610c379190612c75565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c909190612624565b602060405180830381865afa158015610cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd19190612cbb565b11610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612d5a565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90612dc6565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083600001819055504283600101819055506301e1338042610df99190612a42565b8360020181905550670de0b6b3a76400006301e133807f000000000000000000000000000000000000000000000000000000000000000083610e3b9190612c04565b610e459190612c04565b610e4f9190612c75565b8360030181905550670de0b6b3a76400006301e133807f000000000000000000000000000000000000000000000000000000000000000083610e919190612c04565b610e9b9190612c04565b610ea59190612c75565b83600401819055508260040154826003016000828254610ec59190612a42565b92505081905550600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002090600502016000909190919091506000820154816000015560018201548160010155600282015481600201556003820154816003015560048201548160040155505080826002016000828254610f7d9190612a42565b925050819055508060086000828254610f969190612a42565b92505081905550600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055610feb600633611db9565b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051611031919061246b565b60405180910390a2505050611044611d65565b565b60046020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b61107e611a40565b611086611f44565b565b60056020528060005260406000206000915090505481565b6000600160149054906101000a900460ff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6110e3611a40565b6110ed6000611fa7565b565b6110f7611a40565b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b815260040161113493929190612de6565b600060405180830381600087803b15801561114e57600080fd5b505af1158015611162573d6000803e3d6000fd5b505050507f57519b6a0997d7d44511836bcee0a36871aa79d445816f6c464abb0cd9d3f3e88282604051611197929190612b16565b60405180910390a15050565b6111ab611a40565b6111b361206d565b565b6111bd611a40565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016111f8929190612b16565b6020604051808303816000875af1158015611217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123b9190612b6b565b507f55350610fe57096d8c0ffa30beede987326bccfcb0b4415804164d0dd50ce8b1828260405161126d929190612b16565b60405180910390a15050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080600090505b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611461576000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061138b5761138a61290a565b5b906000526020600020906005020190506000670de0b6b3a76400007f000000000000000000000000000000000000000000000000000000000000000083600001546113d69190612c04565b8360010154426113e69190612ae2565b6113f09190612c04565b6113fa9190612c75565b9050816003015481111561141057816003015490505b600081111561144c5780846114259190612a42565b93508082600301600082825461143b9190612ae2565b925050819055504282600101819055505b50508080611459906129fa565b9150506112ee565b506000811115611574577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016114c6929190612b16565b6020604051808303816000875af11580156114e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115099190612b6b565b508082600001600082825461151e9190612a42565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04868260405161156b919061246b565b60405180910390a25b600081036115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90612e69565b60405180910390fd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106116575761165661290a565b5b90600052602060002090600502019050428160020154111561168b574281600201546116839190612ae2565b915050611691565b60009150505b92915050565b6060600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561175c57838290600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050815260200190600101906116f8565b505050509050919050565b60008060005b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156118bc576000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061180a5761180961290a565b5b906000526020600020906005020190506000670de0b6b3a76400007f000000000000000000000000000000000000000000000000000000000000000083600001546118559190612c04565b8360010154426118659190612ae2565b61186f9190612c04565b6118799190612c75565b9050816003015481111561188f57816003015490505b60008111156118a75780846118a49190612a42565b93505b505080806118b4906129fa565b91505061176d565b50600081036118cf5760009150506118d4565b809150505b919050565b6060600680548060200260200160405190810160405280929190818152602001828054801561195d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611913575b5050505050905090565b61196f611a40565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d590612efb565b60405180910390fd5b6119e781611fa7565b50565b6119f2611a40565b6008548111611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90612f67565b60405180910390fd5b8060078190555050565b611a486120cf565b73ffffffffffffffffffffffffffffffffffffffff16611a66611279565b73ffffffffffffffffffffffffffffffffffffffff1614611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390612fd3565b60405180910390fd5b565b600260005403611b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afa9061303f565b60405180910390fd5b6002600081905550565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b88906130ab565b60405180910390fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611c1f9190612ae2565b81548110611c3057611c2f61290a565b5b9060005260206000209060050201600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611c8f57611c8e61290a565b5b90600052602060002090600502016000820154816000015560018201548160010155600282015481600201556003820154816003015560048201548160040155905050600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480611d2157611d206130cb565b5b600190038181906000526020600020906005020160008082016000905560018201600090556002820160009055600382016000905560048201600090555050905550565b6001600081905550565b611d776110a0565b15611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90613146565b60405180910390fd5b565b60005b8280549050811015611f3f578173ffffffffffffffffffffffffffffffffffffffff16838281548110611df257611df161290a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f2c578260018480549050611e4a9190612ae2565b81548110611e5b57611e5a61290a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281548110611e9957611e9861290a565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082805480611ef257611ef16130cb565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611f3f565b8080611f37906129fa565b915050611dbc565b505050565b611f4c6120d7565b6000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f906120cf565b604051611f9d9190612624565b60405180910390a1565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612075611d6f565b60018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120b86120cf565b6040516120c59190612624565b60405180910390a1565b600033905090565b6120df6110a0565b61211e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612115906131b2565b60405180910390fd5b565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61218282612139565b810181811067ffffffffffffffff821117156121a1576121a061214a565b5b80604052505050565b60006121b4612120565b90506121c08282612179565b919050565b600067ffffffffffffffff8211156121e0576121df61214a565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612221826121f6565b9050919050565b61223181612216565b811461223c57600080fd5b50565b60008135905061224e81612228565b92915050565b6000612267612262846121c5565b6121aa565b9050808382526020820190506020840283018581111561228a576122896121f1565b5b835b818110156122b3578061229f888261223f565b84526020840193505060208101905061228c565b5050509392505050565b600082601f8301126122d2576122d1612134565b5b81356122e2848260208601612254565b91505092915050565b600067ffffffffffffffff8211156123065761230561214a565b5b602082029050602081019050919050565b6000819050919050565b61232a81612317565b811461233557600080fd5b50565b60008135905061234781612321565b92915050565b600061236061235b846122eb565b6121aa565b90508083825260208201905060208402830185811115612383576123826121f1565b5b835b818110156123ac57806123988882612338565b845260208401935050602081019050612385565b5050509392505050565b600082601f8301126123cb576123ca612134565b5b81356123db84826020860161234d565b91505092915050565b600080604083850312156123fb576123fa61212a565b5b600083013567ffffffffffffffff8111156124195761241861212f565b5b612425858286016122bd565b925050602083013567ffffffffffffffff8111156124465761244561212f565b5b612452858286016123b6565b9150509250929050565b61246581612317565b82525050565b6000602082019050612480600083018461245c565b92915050565b60006020828403121561249c5761249b61212a565b5b60006124aa84828501612338565b91505092915050565b6000819050919050565b60006124d86124d36124ce846121f6565b6124b3565b6121f6565b9050919050565b60006124ea826124bd565b9050919050565b60006124fc826124df565b9050919050565b61250c816124f1565b82525050565b60006020820190506125276000830184612503565b92915050565b6000602082840312156125435761254261212a565b5b60006125518482850161223f565b91505092915050565b600060808201905061256f600083018761245c565b61257c602083018661245c565b612589604083018561245c565b612596606083018461245c565b95945050505050565b60008115159050919050565b6125b48161259f565b82525050565b60006020820190506125cf60008301846125ab565b92915050565b600080604083850312156125ec576125eb61212a565b5b60006125fa8582860161223f565b925050602061260b85828601612338565b9150509250929050565b61261e81612216565b82525050565b60006020820190506126396000830184612615565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61267481612317565b82525050565b60a082016000820151612690600085018261266b565b5060208201516126a3602085018261266b565b5060408201516126b6604085018261266b565b5060608201516126c9606085018261266b565b5060808201516126dc608085018261266b565b50505050565b60006126ee838361267a565b60a08301905092915050565b6000602082019050919050565b60006127128261263f565b61271c818561264a565b93506127278361265b565b8060005b8381101561275857815161273f88826126e2565b975061274a836126fa565b92505060018101905061272b565b5085935050505092915050565b6000602082019050818103600083015261277f8184612707565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127bc81612216565b82525050565b60006127ce83836127b3565b60208301905092915050565b6000602082019050919050565b60006127f282612787565b6127fc8185612792565b9350612807836127a3565b8060005b8381101561283857815161281f88826127c2565b975061282a836127da565b92505060018101905061280b565b5085935050505092915050565b6000602082019050818103600083015261285f81846127e7565b905092915050565b600082825260208201905092915050565b7f4163636f756e747320616e6420616d6f756e747320617272617973206d75737460008201527f2068617665207468652073616d65206c656e6774680000000000000000000000602082015250565b60006128d4603583612867565b91506128df82612878565b604082019050919050565b60006020820190508181036000830152612903816128c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4475706c6963617465206163636f756e747320617265206e6f7420616c6c6f7760008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000612995602283612867565b91506129a082612939565b604082019050919050565b600060208201905081810360008301526129c481612988565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a0582612317565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a3757612a366129cb565b5b600182019050919050565b6000612a4d82612317565b9150612a5883612317565b9250828201905080821115612a7057612a6f6129cb565b5b92915050565b7f49742773206e6f74207468652074696d6520746f207769746864726177000000600082015250565b6000612aac601d83612867565b9150612ab782612a76565b602082019050919050565b60006020820190508181036000830152612adb81612a9f565b9050919050565b6000612aed82612317565b9150612af883612317565b9250828203905081811115612b1057612b0f6129cb565b5b92915050565b6000604082019050612b2b6000830185612615565b612b38602083018461245c565b9392505050565b612b488161259f565b8114612b5357600080fd5b50565b600081519050612b6581612b3f565b92915050565b600060208284031215612b8157612b8061212a565b5b6000612b8f84828501612b56565b91505092915050565b7f546f6f204d616e7920546f6b656e000000000000000000000000000000000000600082015250565b6000612bce600e83612867565b9150612bd982612b98565b602082019050919050565b60006020820190508181036000830152612bfd81612bc1565b9050919050565b6000612c0f82612317565b9150612c1a83612317565b9250828202612c2881612317565b91508282048414831517612c3f57612c3e6129cb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c8082612317565b9150612c8b83612317565b925082612c9b57612c9a612c46565b5b828204905092915050565b600081519050612cb581612321565b92915050565b600060208284031215612cd157612cd061212a565b5b6000612cdf84828501612ca6565b91505092915050565b7f546f74616c20616d6f756e74206f66207265776172647320697320746f6f206860008201527f6967680000000000000000000000000000000000000000000000000000000000602082015250565b6000612d44602383612867565b9150612d4f82612ce8565b604082019050919050565b60006020820190508181036000830152612d7381612d37565b9050919050565b7f4e6f7420612077686974656c6973746564207573657200000000000000000000600082015250565b6000612db0601683612867565b9150612dbb82612d7a565b602082019050919050565b60006020820190508181036000830152612ddf81612da3565b9050919050565b6000606082019050612dfb6000830186612615565b612e086020830185612615565b612e15604083018461245c565b949350505050565b7f54686572652773206e6f2072657761726420666f7220796f757220636c61696d600082015250565b6000612e53602083612867565b9150612e5e82612e1d565b602082019050919050565b60006020820190508181036000830152612e8281612e46565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ee5602683612867565b9150612ef082612e89565b604082019050919050565b60006020820190508181036000830152612f1481612ed8565b9050919050565b7f546f6f20536d616c6c2051756f74610000000000000000000000000000000000600082015250565b6000612f51600f83612867565b9150612f5c82612f1b565b602082019050919050565b60006020820190508181036000830152612f8081612f44565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612fbd602083612867565b9150612fc882612f87565b602082019050919050565b60006020820190508181036000830152612fec81612fb0565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613029601f83612867565b915061303482612ff3565b602082019050919050565b600060208201905081810360008301526130588161301c565b9050919050565b7f496e76616c696420696e64657800000000000000000000000000000000000000600082015250565b6000613095600d83612867565b91506130a08261305f565b602082019050919050565b600060208201905081810360008301526130c481613088565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613130601083612867565b915061313b826130fa565b602082019050919050565b6000602082019050818103600083015261315f81613123565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061319c601483612867565b91506131a782613166565b602082019050919050565b600060208201905081810360008301526131cb8161318f565b905091905056fea26469706673582212201917dd15fb474b09b3eb6982fa66e28597c9f886a6e97cd36a1fb95a601b5f3264736f6c6343000812003300000000000000000000000050bce64397c75488465253c0a034b8097fea6578000000000000000000000000c3248a1bd9d72fa3da6e6ba701e58cbf818354eb
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c8063819d4cc6116100de578063c1a5fcab11610097578063eb9922fa11610071578063eb9922fa146103cd578063ec10172d146103fd578063f2fde38b1461041b578063fe6fef441461043757610173565b8063c1a5fcab1461034f578063d1e78e881461036d578063e8940de21461039d57610173565b8063819d4cc6146102c75780638456cb59146102e35780638980f11f146102ed5780638da5cb5b14610309578063b88a802f14610327578063bee89f741461033157610173565b80633e9a9a24116101305780633e9a9a24146102145780633f4ba83a146102475780635ab7e6c7146102515780635c975abb146102815780636adb53a01461029f578063715018a6146102bd57610173565b8063050414bb14610178578063168cd7ae1461019457806318160ddd146101b25780632e1a7d4d146101d057806331430f8e146101ec5780633a4b66f11461020a575b600080fd5b610192600480360381019061018d91906123e4565b610453565b005b61019c610709565b6040516101a9919061246b565b60405180910390f35b6101ba61070f565b6040516101c7919061246b565b60405180910390f35b6101ea60048036038101906101e59190612486565b610715565b005b6101f4610a5f565b6040516102019190612512565b60405180910390f35b610212610a83565b005b61022e6004803603810190610229919061252d565b611046565b60405161023e949392919061255a565b60405180910390f35b61024f611076565b005b61026b6004803603810190610266919061252d565b611088565b604051610278919061246b565b60405180910390f35b6102896110a0565b60405161029691906125ba565b60405180910390f35b6102a76110b7565b6040516102b4919061246b565b60405180910390f35b6102c56110db565b005b6102e160048036038101906102dc91906125d5565b6110ef565b005b6102eb6111a3565b005b610307600480360381019061030291906125d5565b6111b5565b005b610311611279565b60405161031e9190612624565b60405180910390f35b61032f6112a3565b005b6103396115bb565b604051610346919061246b565b60405180910390f35b6103576115df565b6040516103649190612512565b60405180910390f35b610387600480360381019061038291906125d5565b611603565b604051610394919061246b565b60405180910390f35b6103b760048036038101906103b2919061252d565b611697565b6040516103c49190612765565b60405180910390f35b6103e760048036038101906103e2919061252d565b611767565b6040516103f4919061246b565b60405180910390f35b6104056118d9565b6040516104129190612845565b60405180910390f35b6104356004803603810190610430919061252d565b611967565b005b610451600480360381019061044c9190612486565b6119ea565b005b61045b611a40565b805182511461049f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610496906128ea565b60405180910390fd5b60005b82518110156107045760008382815181106104c0576104bf61290a565b5b6020026020010151905060008383815181106104df576104de61290a565b5b6020026020010151905060005b8381101561058f578273ffffffffffffffffffffffffffffffffffffffff1686828151811061051e5761051d61290a565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361057c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610573906129ab565b60405180910390fd5b8080610587906129fa565b9150506104ec565b506000805b60068054905081101561062e578373ffffffffffffffffffffffffffffffffffffffff16600682815481106105cc576105cb61290a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361061b576001915061062e565b8080610626906129fa565b915050610594565b5080610698576006839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106e79190612a42565b9250508190555050505080806106fc906129fa565b9150506104a2565b505050565b60075481565b60085481565b61071d611abe565b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106107705761076f61290a565b5b906000526020600020906005020190506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081600201544211610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090612ac2565b60405180910390fd5b81600001546008600082825461081f9190612ae2565b92505081905550816000015481600201600082825461083e9190612ae2565b92505081905550816003015481600001600082825461085d9190612a42565b92505081905550816004015481600101600082825461087c9190612a42565b92505081905550816004015481600301600082825461089b9190612ae2565b925050819055507f000000000000000000000000c3248a1bd9d72fa3da6e6ba701e58cbf818354eb73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846003015485600001546108f39190612a42565b6040518363ffffffff1660e01b8152600401610910929190612b16565b6020604051808303816000875af115801561092f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109539190612b6b565b507f00000000000000000000000050bce64397c75488465253c0a034b8097fea657873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3384600401546040518363ffffffff1660e01b81526004016109b3929190612b16565b6020604051808303816000875af11580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190612b6b565b503373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58360000154604051610a41919061246b565b60405180910390a2610a5283611b0d565b5050610a5c611d65565b50565b7f000000000000000000000000c3248a1bd9d72fa3da6e6ba701e58cbf818354eb81565b610a8b611abe565b610a93611d6f565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600754600854600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b699190612a42565b1115610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba190612be4565b60405180910390fd5b670de0b6b3a76400006301e133807f00000000000000000000000000000000000000000000000000000003b1069320600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c239190612c04565b610c2d9190612c04565b610c379190612c75565b7f000000000000000000000000c3248a1bd9d72fa3da6e6ba701e58cbf818354eb73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c909190612624565b602060405180830381865afa158015610cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd19190612cbb565b11610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890612d5a565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90612dc6565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083600001819055504283600101819055506301e1338042610df99190612a42565b8360020181905550670de0b6b3a76400006301e133807f00000000000000000000000000000000000000000000000000000003b106932083610e3b9190612c04565b610e459190612c04565b610e4f9190612c75565b8360030181905550670de0b6b3a76400006301e133807f000000000000000000000000000000000000000000000000000001275209157783610e919190612c04565b610e9b9190612c04565b610ea59190612c75565b83600401819055508260040154826003016000828254610ec59190612a42565b92505081905550600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002090600502016000909190919091506000820154816000015560018201548160010155600282015481600201556003820154816003015560048201548160040155505080826002016000828254610f7d9190612a42565b925050819055508060086000828254610f969190612a42565b92505081905550600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055610feb600633611db9565b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051611031919061246b565b60405180910390a2505050611044611d65565b565b60046020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b61107e611a40565b611086611f44565b565b60056020528060005260406000206000915090505481565b6000600160149054906101000a900460ff16905090565b7f00000000000000000000000000000000000000000000000000000003b106932081565b6110e3611a40565b6110ed6000611fa7565b565b6110f7611a40565b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b815260040161113493929190612de6565b600060405180830381600087803b15801561114e57600080fd5b505af1158015611162573d6000803e3d6000fd5b505050507f57519b6a0997d7d44511836bcee0a36871aa79d445816f6c464abb0cd9d3f3e88282604051611197929190612b16565b60405180910390a15050565b6111ab611a40565b6111b361206d565b565b6111bd611a40565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016111f8929190612b16565b6020604051808303816000875af1158015611217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123b9190612b6b565b507f55350610fe57096d8c0ffa30beede987326bccfcb0b4415804164d0dd50ce8b1828260405161126d929190612b16565b60405180910390a15050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080600090505b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611461576000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061138b5761138a61290a565b5b906000526020600020906005020190506000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000003b106932083600001546113d69190612c04565b8360010154426113e69190612ae2565b6113f09190612c04565b6113fa9190612c75565b9050816003015481111561141057816003015490505b600081111561144c5780846114259190612a42565b93508082600301600082825461143b9190612ae2565b925050819055504282600101819055505b50508080611459906129fa565b9150506112ee565b506000811115611574577f000000000000000000000000c3248a1bd9d72fa3da6e6ba701e58cbf818354eb73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016114c6929190612b16565b6020604051808303816000875af11580156114e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115099190612b6b565b508082600001600082825461151e9190612a42565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04868260405161156b919061246b565b60405180910390a25b600081036115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90612e69565b60405180910390fd5b5050565b7f000000000000000000000000000000000000000000000000000001275209157781565b7f00000000000000000000000050bce64397c75488465253c0a034b8097fea657881565b600080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106116575761165661290a565b5b90600052602060002090600502019050428160020154111561168b574281600201546116839190612ae2565b915050611691565b60009150505b92915050565b6060600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561175c57838290600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050815260200190600101906116f8565b505050509050919050565b60008060005b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156118bc576000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061180a5761180961290a565b5b906000526020600020906005020190506000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000003b106932083600001546118559190612c04565b8360010154426118659190612ae2565b61186f9190612c04565b6118799190612c75565b9050816003015481111561188f57816003015490505b60008111156118a75780846118a49190612a42565b93505b505080806118b4906129fa565b91505061176d565b50600081036118cf5760009150506118d4565b809150505b919050565b6060600680548060200260200160405190810160405280929190818152602001828054801561195d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611913575b5050505050905090565b61196f611a40565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d590612efb565b60405180910390fd5b6119e781611fa7565b50565b6119f2611a40565b6008548111611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90612f67565b60405180910390fd5b8060078190555050565b611a486120cf565b73ffffffffffffffffffffffffffffffffffffffff16611a66611279565b73ffffffffffffffffffffffffffffffffffffffff1614611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390612fd3565b60405180910390fd5b565b600260005403611b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afa9061303f565b60405180910390fd5b6002600081905550565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b88906130ab565b60405180910390fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611c1f9190612ae2565b81548110611c3057611c2f61290a565b5b9060005260206000209060050201600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611c8f57611c8e61290a565b5b90600052602060002090600502016000820154816000015560018201548160010155600282015481600201556003820154816003015560048201548160040155905050600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480611d2157611d206130cb565b5b600190038181906000526020600020906005020160008082016000905560018201600090556002820160009055600382016000905560048201600090555050905550565b6001600081905550565b611d776110a0565b15611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90613146565b60405180910390fd5b565b60005b8280549050811015611f3f578173ffffffffffffffffffffffffffffffffffffffff16838281548110611df257611df161290a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f2c578260018480549050611e4a9190612ae2565b81548110611e5b57611e5a61290a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281548110611e9957611e9861290a565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082805480611ef257611ef16130cb565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611f3f565b8080611f37906129fa565b915050611dbc565b505050565b611f4c6120d7565b6000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f906120cf565b604051611f9d9190612624565b60405180910390a1565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612075611d6f565b60018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120b86120cf565b6040516120c59190612624565b60405180910390a1565b600033905090565b6120df6110a0565b61211e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612115906131b2565b60405180910390fd5b565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61218282612139565b810181811067ffffffffffffffff821117156121a1576121a061214a565b5b80604052505050565b60006121b4612120565b90506121c08282612179565b919050565b600067ffffffffffffffff8211156121e0576121df61214a565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612221826121f6565b9050919050565b61223181612216565b811461223c57600080fd5b50565b60008135905061224e81612228565b92915050565b6000612267612262846121c5565b6121aa565b9050808382526020820190506020840283018581111561228a576122896121f1565b5b835b818110156122b3578061229f888261223f565b84526020840193505060208101905061228c565b5050509392505050565b600082601f8301126122d2576122d1612134565b5b81356122e2848260208601612254565b91505092915050565b600067ffffffffffffffff8211156123065761230561214a565b5b602082029050602081019050919050565b6000819050919050565b61232a81612317565b811461233557600080fd5b50565b60008135905061234781612321565b92915050565b600061236061235b846122eb565b6121aa565b90508083825260208201905060208402830185811115612383576123826121f1565b5b835b818110156123ac57806123988882612338565b845260208401935050602081019050612385565b5050509392505050565b600082601f8301126123cb576123ca612134565b5b81356123db84826020860161234d565b91505092915050565b600080604083850312156123fb576123fa61212a565b5b600083013567ffffffffffffffff8111156124195761241861212f565b5b612425858286016122bd565b925050602083013567ffffffffffffffff8111156124465761244561212f565b5b612452858286016123b6565b9150509250929050565b61246581612317565b82525050565b6000602082019050612480600083018461245c565b92915050565b60006020828403121561249c5761249b61212a565b5b60006124aa84828501612338565b91505092915050565b6000819050919050565b60006124d86124d36124ce846121f6565b6124b3565b6121f6565b9050919050565b60006124ea826124bd565b9050919050565b60006124fc826124df565b9050919050565b61250c816124f1565b82525050565b60006020820190506125276000830184612503565b92915050565b6000602082840312156125435761254261212a565b5b60006125518482850161223f565b91505092915050565b600060808201905061256f600083018761245c565b61257c602083018661245c565b612589604083018561245c565b612596606083018461245c565b95945050505050565b60008115159050919050565b6125b48161259f565b82525050565b60006020820190506125cf60008301846125ab565b92915050565b600080604083850312156125ec576125eb61212a565b5b60006125fa8582860161223f565b925050602061260b85828601612338565b9150509250929050565b61261e81612216565b82525050565b60006020820190506126396000830184612615565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61267481612317565b82525050565b60a082016000820151612690600085018261266b565b5060208201516126a3602085018261266b565b5060408201516126b6604085018261266b565b5060608201516126c9606085018261266b565b5060808201516126dc608085018261266b565b50505050565b60006126ee838361267a565b60a08301905092915050565b6000602082019050919050565b60006127128261263f565b61271c818561264a565b93506127278361265b565b8060005b8381101561275857815161273f88826126e2565b975061274a836126fa565b92505060018101905061272b565b5085935050505092915050565b6000602082019050818103600083015261277f8184612707565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127bc81612216565b82525050565b60006127ce83836127b3565b60208301905092915050565b6000602082019050919050565b60006127f282612787565b6127fc8185612792565b9350612807836127a3565b8060005b8381101561283857815161281f88826127c2565b975061282a836127da565b92505060018101905061280b565b5085935050505092915050565b6000602082019050818103600083015261285f81846127e7565b905092915050565b600082825260208201905092915050565b7f4163636f756e747320616e6420616d6f756e747320617272617973206d75737460008201527f2068617665207468652073616d65206c656e6774680000000000000000000000602082015250565b60006128d4603583612867565b91506128df82612878565b604082019050919050565b60006020820190508181036000830152612903816128c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4475706c6963617465206163636f756e747320617265206e6f7420616c6c6f7760008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000612995602283612867565b91506129a082612939565b604082019050919050565b600060208201905081810360008301526129c481612988565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a0582612317565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a3757612a366129cb565b5b600182019050919050565b6000612a4d82612317565b9150612a5883612317565b9250828201905080821115612a7057612a6f6129cb565b5b92915050565b7f49742773206e6f74207468652074696d6520746f207769746864726177000000600082015250565b6000612aac601d83612867565b9150612ab782612a76565b602082019050919050565b60006020820190508181036000830152612adb81612a9f565b9050919050565b6000612aed82612317565b9150612af883612317565b9250828203905081811115612b1057612b0f6129cb565b5b92915050565b6000604082019050612b2b6000830185612615565b612b38602083018461245c565b9392505050565b612b488161259f565b8114612b5357600080fd5b50565b600081519050612b6581612b3f565b92915050565b600060208284031215612b8157612b8061212a565b5b6000612b8f84828501612b56565b91505092915050565b7f546f6f204d616e7920546f6b656e000000000000000000000000000000000000600082015250565b6000612bce600e83612867565b9150612bd982612b98565b602082019050919050565b60006020820190508181036000830152612bfd81612bc1565b9050919050565b6000612c0f82612317565b9150612c1a83612317565b9250828202612c2881612317565b91508282048414831517612c3f57612c3e6129cb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c8082612317565b9150612c8b83612317565b925082612c9b57612c9a612c46565b5b828204905092915050565b600081519050612cb581612321565b92915050565b600060208284031215612cd157612cd061212a565b5b6000612cdf84828501612ca6565b91505092915050565b7f546f74616c20616d6f756e74206f66207265776172647320697320746f6f206860008201527f6967680000000000000000000000000000000000000000000000000000000000602082015250565b6000612d44602383612867565b9150612d4f82612ce8565b604082019050919050565b60006020820190508181036000830152612d7381612d37565b9050919050565b7f4e6f7420612077686974656c6973746564207573657200000000000000000000600082015250565b6000612db0601683612867565b9150612dbb82612d7a565b602082019050919050565b60006020820190508181036000830152612ddf81612da3565b9050919050565b6000606082019050612dfb6000830186612615565b612e086020830185612615565b612e15604083018461245c565b949350505050565b7f54686572652773206e6f2072657761726420666f7220796f757220636c61696d600082015250565b6000612e53602083612867565b9150612e5e82612e1d565b602082019050919050565b60006020820190508181036000830152612e8281612e46565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ee5602683612867565b9150612ef082612e89565b604082019050919050565b60006020820190508181036000830152612f1481612ed8565b9050919050565b7f546f6f20536d616c6c2051756f74610000000000000000000000000000000000600082015250565b6000612f51600f83612867565b9150612f5c82612f1b565b602082019050919050565b60006020820190508181036000830152612f8081612f44565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612fbd602083612867565b9150612fc882612f87565b602082019050919050565b60006020820190508181036000830152612fec81612fb0565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613029601f83612867565b915061303482612ff3565b602082019050919050565b600060208201905081810360008301526130588161301c565b9050919050565b7f496e76616c696420696e64657800000000000000000000000000000000000000600082015250565b6000613095600d83612867565b91506130a08261305f565b602082019050919050565b600060208201905081810360008301526130c481613088565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613130601083612867565b915061313b826130fa565b602082019050919050565b6000602082019050818103600083015261315f81613123565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061319c601483612867565b91506131a782613166565b602082019050919050565b600060208201905081810360008301526131cb8161318f565b905091905056fea26469706673582212201917dd15fb474b09b3eb6982fa66e28597c9f886a6e97cd36a1fb95a601b5f3264736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000050bce64397c75488465253c0a034b8097fea6578000000000000000000000000c3248a1bd9d72fa3da6e6ba701e58cbf818354eb
-----Decoded View---------------
Arg [0] : _hanToken (address): 0x50Bce64397C75488465253c0A034b8097FeA6578
Arg [1] : _epToken (address): 0xC3248A1bd9D72fa3DA6E6ba701E58CbF818354eB
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000050bce64397c75488465253c0a034b8097fea6578
Arg [1] : 000000000000000000000000c3248a1bd9d72fa3da6e6ba701e58cbf818354eb
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.