Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14375024 | 989 days ago | IN | 0 ETH | 0.1527437 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
HyphenLiquidityFarming
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// $$\ $$\ $$\ $$\ $$\ $$\ $$$$$$$$\ $$\ // $$ | \__| \__| $$ |\__| $$ | $$ _____| \__| // $$ | $$\ $$$$$$\ $$\ $$\ $$\ $$$$$$$ |$$\ $$$$$$\ $$\ $$\ $$ | $$$$$$\ $$$$$$\ $$$$$$\$$$$\ $$\ $$$$$$$\ $$$$$$\ // $$ | $$ |$$ __$$\ $$ | $$ |$$ |$$ __$$ |$$ |\_$$ _| $$ | $$ | $$$$$\ \____$$\ $$ __$$\ $$ _$$ _$$\ $$ |$$ __$$\ $$ __$$\ // $$ | $$ |$$ / $$ |$$ | $$ |$$ |$$ / $$ |$$ | $$ | $$ | $$ | $$ __|$$$$$$$ |$$ | \__|$$ / $$ / $$ |$$ |$$ | $$ |$$ / $$ | // $$ | $$ |$$ | $$ |$$ | $$ |$$ |$$ | $$ |$$ | $$ |$$\ $$ | $$ | $$ | $$ __$$ |$$ | $$ | $$ | $$ |$$ |$$ | $$ |$$ | $$ | // $$$$$$$$\ $$ |\$$$$$$$ |\$$$$$$ |$$ |\$$$$$$$ |$$ | \$$$$ |\$$$$$$$ | $$ | \$$$$$$$ |$$ | $$ | $$ | $$ |$$ |$$ | $$ |\$$$$$$$ | // \________|\__| \____$$ | \______/ \__| \_______|\__| \____/ \____$$ | \__| \_______|\__| \__| \__| \__|\__|\__| \__| \____$$ | // $$ | $$\ $$ | $$\ $$ | // $$ | \$$$$$$ | \$$$$$$ | // \__| \______/ \______/ // // SPDX-License-Identifier: MIT pragma solidity 0.8.0; import "@openzeppelin/contracts-upgradeable/interfaces/IERC721ReceiverUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import "./metatx/ERC2771ContextUpgradeable.sol"; import "../security/Pausable.sol"; import "./interfaces/ILPToken.sol"; import "./interfaces/ILiquidityProviders.sol"; contract HyphenLiquidityFarming is Initializable, ERC2771ContextUpgradeable, OwnableUpgradeable, Pausable, ReentrancyGuardUpgradeable, IERC721ReceiverUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; ILPToken public lpToken; ILiquidityProviders public liquidityProviders; struct NFTInfo { address payable staker; uint256 rewardDebt; uint256 unpaidRewards; bool isStaked; } struct PoolInfo { uint256 accTokenPerShare; uint256 lastRewardTime; } struct RewardsPerSecondEntry { uint256 rewardsPerSecond; uint256 timestamp; } /// @notice Mapping to track the rewarder pool. mapping(address => PoolInfo) public poolInfo; /// @notice Info of each NFT that is staked. mapping(uint256 => NFTInfo) public nftInfo; /// @notice Reward Token mapping(address => address) public rewardTokens; /// @notice Staker => NFTs staked mapping(address => uint256[]) public nftIdsStaked; /// @notice Token => Total Shares Staked mapping(address => uint256) public totalSharesStaked; /// @notice Token => Reward Rate Updation history mapping(address => RewardsPerSecondEntry[]) public rewardRateLog; uint256 private constant ACC_TOKEN_PRECISION = 1e12; address internal constant NATIVE = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; event LogDeposit(address indexed user, address indexed baseToken, uint256 nftId); event LogWithdraw(address indexed user, address baseToken, uint256 nftId, address indexed to); event LogOnReward(address indexed user, address indexed baseToken, uint256 amount, address indexed to); event LogUpdatePool(address indexed baseToken, uint256 lastRewardTime, uint256 lpSupply, uint256 accToken1PerShare); event LogRewardPerSecond(address indexed baseToken, uint256 rewardPerSecond); event LogRewardPoolInitialized(address _baseToken, address _rewardToken, uint256 _rewardPerSecond); event LogNativeReceived(address indexed sender, uint256 value); event LiquidityProviderUpdated(address indexed liquidityProviders); function initialize( address _trustedForwarder, address _pauser, ILiquidityProviders _liquidityProviders, ILPToken _lpToken ) public initializer { __ERC2771Context_init(_trustedForwarder); __Ownable_init(); __Pausable_init(_pauser); __ReentrancyGuard_init(); liquidityProviders = _liquidityProviders; lpToken = _lpToken; } /// @notice Initialize the rewarder pool. /// @param _baseToken Base token to be used for the rewarder pool. /// @param _rewardToken Reward token to be used for the rewarder pool. /// @param _rewardPerSecond Reward rate per base token. function initalizeRewardPool( address _baseToken, address _rewardToken, uint256 _rewardPerSecond ) external onlyOwner { require(rewardTokens[_baseToken] == address(0), "ERR__POOL_ALREADY_INITIALIZED"); require(_baseToken != address(0), "ERR__BASE_TOKEN_IS_ZERO"); require(_rewardToken != address(0), "ERR_REWARD_TOKEN_IS_ZERO"); rewardTokens[_baseToken] = _rewardToken; rewardRateLog[_baseToken].push(RewardsPerSecondEntry(_rewardPerSecond, block.timestamp)); emit LogRewardPoolInitialized(_baseToken, _rewardToken, _rewardPerSecond); } function updateLiquidityProvider(ILiquidityProviders _liquidityProviders) external onlyOwner { require(address(_liquidityProviders) != address(0), "ERR__LIQUIDITY_PROVIDER_IS_ZERO"); liquidityProviders = _liquidityProviders; emit LiquidityProviderUpdated(address(liquidityProviders)); } function _sendErc20AndGetSentAmount( IERC20Upgradeable _token, uint256 _amount, address _to ) private returns (uint256) { uint256 beforeBalance = _token.balanceOf(address(this)); _token.safeTransfer(_to, _amount); return beforeBalance - _token.balanceOf(address(this)); } /// @notice Update the reward state of a nft, and if possible send reward funds to _to. /// @param _nftId NFT ID that is being locked /// @param _to Address to which rewards will be credited. function _sendRewardsForNft(uint256 _nftId, address payable _to) internal { NFTInfo storage nft = nftInfo[_nftId]; require(nft.isStaked, "ERR__NFT_NOT_STAKED"); (address baseToken, , uint256 amount) = lpToken.tokenMetadata(_nftId); amount /= liquidityProviders.BASE_DIVISOR(); PoolInfo memory pool = updatePool(baseToken); uint256 pending; uint256 amountSent; if (amount > 0) { pending = ((amount * pool.accTokenPerShare) / ACC_TOKEN_PRECISION) - nft.rewardDebt + nft.unpaidRewards; if (rewardTokens[baseToken] == NATIVE) { uint256 balance = address(this).balance; if (pending > balance) { unchecked { nft.unpaidRewards = pending - balance; } (bool success, ) = _to.call{value: balance}(""); require(success, "ERR__NATIVE_TRANSFER_FAILED"); amountSent = balance; } else { nft.unpaidRewards = 0; (bool success, ) = _to.call{value: pending}(""); require(success, "ERR__NATIVE_TRANSFER_FAILED"); amountSent = pending; } } else { IERC20Upgradeable rewardToken = IERC20Upgradeable(rewardTokens[baseToken]); uint256 balance = rewardToken.balanceOf(address(this)); if (pending > balance) { unchecked { nft.unpaidRewards = pending - balance; } amountSent = _sendErc20AndGetSentAmount(rewardToken, balance, _to); } else { nft.unpaidRewards = 0; amountSent = _sendErc20AndGetSentAmount(rewardToken, pending, _to); } } } nft.rewardDebt = (amount * pool.accTokenPerShare) / ACC_TOKEN_PRECISION; emit LogOnReward(_msgSender(), baseToken, amountSent, _to); } /// @notice Sets the sushi per second to be distributed. Can only be called by the owner. /// @param _rewardPerSecond The amount of Sushi to be distributed per second. function setRewardPerSecond(address _baseToken, uint256 _rewardPerSecond) external onlyOwner { rewardRateLog[_baseToken].push(RewardsPerSecondEntry(_rewardPerSecond, block.timestamp)); emit LogRewardPerSecond(_baseToken, _rewardPerSecond); } /// @notice Allows owner to reclaim/withdraw any tokens (including reward tokens) held by this contract /// @param _token Token to reclaim, use 0x00 for Ethereum /// @param _amount Amount of tokens to reclaim /// @param _to Receiver of the tokens, first of his name, rightful heir to the lost tokens, /// reightful owner of the extra tokens, and ether, protector of mistaken transfers, mother of token reclaimers, /// the Khaleesi of the Great Token Sea, the Unburnt, the Breaker of blockchains. function reclaimTokens( address _token, uint256 _amount, address payable _to ) external onlyOwner { require(_to != address(0), "ERR__TO_IS_ZERO"); require(_amount != 0, "ERR__AMOUNT_IS_ZERO"); if (_token == NATIVE) { (bool success, ) = payable(_to).call{value: _amount}(""); require(success, "ERR__NATIVE_TRANSFER_FAILED"); } else { IERC20Upgradeable(_token).safeTransfer(_to, _amount); } } /// @notice Deposit LP tokens /// @param _nftId LP token nftId to deposit. function deposit(uint256 _nftId, address payable _to) external whenNotPaused nonReentrant { address msgSender = _msgSender(); require(_to != address(0), "ERR__TO_IS_ZERO"); require( lpToken.isApprovedForAll(msgSender, address(this)) || lpToken.getApproved(_nftId) == address(this), "ERR__NOT_APPROVED" ); NFTInfo storage nft = nftInfo[_nftId]; require(!nft.isStaked, "ERR__NFT_ALREADY_STAKED"); (address baseToken, , uint256 amount) = lpToken.tokenMetadata(_nftId); amount /= liquidityProviders.BASE_DIVISOR(); require(rewardTokens[baseToken] != address(0), "ERR__POOL_NOT_INITIALIZED"); require(rewardRateLog[baseToken].length != 0, "ERR__POOL_NOT_INITIALIZED"); lpToken.safeTransferFrom(msgSender, address(this), _nftId); PoolInfo memory pool = updatePool(baseToken); nft.isStaked = true; nft.staker = _to; nft.rewardDebt = (amount * pool.accTokenPerShare) / ACC_TOKEN_PRECISION; nftIdsStaked[_to].push(_nftId); totalSharesStaked[baseToken] += amount; emit LogDeposit(msgSender, baseToken, _nftId); } /// @notice Withdraw LP tokens /// @param _nftId LP token nftId to withdraw. /// @param _to The receiver of `amount` withdraw benefit. function withdraw(uint256 _nftId, address payable _to) external whenNotPaused nonReentrant { address msgSender = _msgSender(); uint256 nftsStakedLength = nftIdsStaked[msgSender].length; uint256 index; for (index = 0; index < nftsStakedLength; ++index) { if (nftIdsStaked[msgSender][index] == _nftId) { break; } } require(index != nftsStakedLength, "ERR__NFT_NOT_STAKED"); nftIdsStaked[msgSender][index] = nftIdsStaked[msgSender][nftIdsStaked[msgSender].length - 1]; nftIdsStaked[msgSender].pop(); _sendRewardsForNft(_nftId, _to); delete nftInfo[_nftId]; (address baseToken, , uint256 amount) = lpToken.tokenMetadata(_nftId); amount /= liquidityProviders.BASE_DIVISOR(); totalSharesStaked[baseToken] -= amount; lpToken.safeTransferFrom(address(this), msgSender, _nftId); emit LogWithdraw(msgSender, baseToken, _nftId, _to); } /// @notice Extract all rewards without withdrawing LP tokens /// @param _nftId LP token nftId for which rewards are to be withdrawn /// @param _to The receiver of withdraw benefit. function extractRewards(uint256 _nftId, address payable _to) external whenNotPaused nonReentrant { require(nftInfo[_nftId].staker == _msgSender(), "ERR__NOT_OWNER"); _sendRewardsForNft(_nftId, _to); } /// @notice Calculates an up to date value of accTokenPerShare /// @notice An updated value of accTokenPerShare is comitted to storage every time a new NFT is deposited, withdrawn or rewards are extracted function getUpdatedAccTokenPerShare(address _baseToken) public view returns (uint256) { uint256 accumulator = 0; uint256 lastUpdatedTime = poolInfo[_baseToken].lastRewardTime; uint256 counter = block.timestamp; uint256 i = rewardRateLog[_baseToken].length - 1; while (true) { if (lastUpdatedTime >= counter) { break; } unchecked { accumulator += rewardRateLog[_baseToken][i].rewardsPerSecond * (counter - max(lastUpdatedTime, rewardRateLog[_baseToken][i].timestamp)); } counter = rewardRateLog[_baseToken][i].timestamp; if (i == 0) { break; } --i; } // We know that during all the periods that were included in the current iterations, // the value of totalSharesStaked[_baseToken] would not have changed, as we only consider the // updates to the pool that happened after the lastUpdatedTime. accumulator = (accumulator * ACC_TOKEN_PRECISION) / totalSharesStaked[_baseToken]; return accumulator + poolInfo[_baseToken].accTokenPerShare; } /// @notice View function to see pending Token /// @param _nftId NFT for which pending tokens are to be viewed /// @return pending reward for a given user. function pendingToken(uint256 _nftId) external view returns (uint256) { NFTInfo storage nft = nftInfo[_nftId]; if (!nft.isStaked) { return 0; } (address baseToken, , uint256 amount) = lpToken.tokenMetadata(_nftId); amount /= liquidityProviders.BASE_DIVISOR(); PoolInfo memory pool = poolInfo[baseToken]; uint256 accToken1PerShare = pool.accTokenPerShare; if (block.timestamp > pool.lastRewardTime && totalSharesStaked[baseToken] != 0) { accToken1PerShare = getUpdatedAccTokenPerShare(baseToken); } return ((amount * accToken1PerShare) / ACC_TOKEN_PRECISION) - nft.rewardDebt + nft.unpaidRewards; } /// @notice Update reward variables of the given pool. /// @return pool Returns the pool that was updated. function updatePool(address _baseToken) public whenNotPaused returns (PoolInfo memory pool) { pool = poolInfo[_baseToken]; if (block.timestamp > pool.lastRewardTime) { if (totalSharesStaked[_baseToken] > 0) { pool.accTokenPerShare = getUpdatedAccTokenPerShare(_baseToken); } pool.lastRewardTime = block.timestamp; poolInfo[_baseToken] = pool; emit LogUpdatePool(_baseToken, pool.lastRewardTime, totalSharesStaked[_baseToken], pool.accTokenPerShare); } } /// @notice View function to see the tokens staked by a given user. /// @param _user Address of user. function getNftIdsStaked(address _user) external view returns (uint256[] memory nftIds) { nftIds = nftIdsStaked[_user]; } function getRewardRatePerSecond(address _baseToken) external view returns (uint256) { return rewardRateLog[_baseToken][rewardRateLog[_baseToken].length - 1].rewardsPerSecond; } function onERC721Received( address, address, uint256, bytes calldata ) external pure override(IERC721ReceiverUpgradeable) returns (bytes4) { return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")); } function _msgSender() internal view virtual override(ContextUpgradeable, ERC2771ContextUpgradeable) returns (address sender) { return ERC2771ContextUpgradeable._msgSender(); } function _msgData() internal view virtual override(ContextUpgradeable, ERC2771ContextUpgradeable) returns (bytes calldata) { return ERC2771ContextUpgradeable._msgData(); } receive() external payable { emit LogNativeReceived(_msgSender(), msg.value); } function max(uint256 _a, uint256 _b) private pure returns (uint256) { return _a >= _b ? _a : _b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../token/ERC721/IERC721ReceiverUpgradeable.sol";
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _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; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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.8.0; import "../IERC20Upgradeable.sol"; import "../../../utils/AddressUpgradeable.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using AddressUpgradeable for address; function safeTransfer( IERC20Upgradeable token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20Upgradeable token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20Upgradeable token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20Upgradeable token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20Upgradeable token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @dev Context variant with ERC2771 support. * Here _trustedForwarder is made internal instead of private * so it can be changed via Child contracts with a setter method. */ abstract contract ERC2771ContextUpgradeable is Initializable, ContextUpgradeable { address internal _trustedForwarder; function __ERC2771Context_init(address trustedForwarder) internal initializer { __Context_init_unchained(); __ERC2771Context_init_unchained(trustedForwarder); } function __ERC2771Context_init_unchained(address trustedForwarder) internal initializer { _trustedForwarder = trustedForwarder; } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return forwarder == _trustedForwarder; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.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 Initializable, PausableUpgradeable { address private _pauser; event PauserChanged(address indexed previousPauser, address indexed newPauser); /** * @dev The pausable constructor sets the original `pauser` of the contract to the sender * account & Initializes the contract in unpaused state.. */ function __Pausable_init(address pauser) internal initializer { require(pauser != address(0), "Pauser Address cannot be 0"); __Pausable_init(); _pauser = pauser; } /** * @return true if `msg.sender` is the owner of the contract. */ function isPauser(address pauser) public view returns (bool) { return pauser == _pauser; } /** * @dev Throws if called by any account other than the pauser. */ modifier onlyPauser() { require(isPauser(msg.sender), "Only pauser is allowed to perform this operation"); _; } /** * @dev Allows the current pauser to transfer control of the contract to a newPauser. * @param newPauser The address to transfer pauserShip to. */ function changePauser(address newPauser) public onlyPauser { _changePauser(newPauser); } /** * @dev Transfers control of the contract to a newPauser. * @param newPauser The address to transfer ownership to. */ function _changePauser(address newPauser) internal { require(newPauser != address(0)); emit PauserChanged(_pauser, newPauser); _pauser = newPauser; } function renouncePauser() external virtual onlyPauser { emit PauserChanged(_pauser, address(0)); _pauser = address(0); } function pause() public onlyPauser { _pause(); } function unpause() public onlyPauser { _unpause(); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; import "../structures/LpTokenMetadata.sol"; interface ILPToken { function approve(address to, uint256 tokenId) external; function balanceOf(address _owner) external view returns (uint256); function exists(uint256 _tokenId) external view returns (bool); function getAllNftIdsByUser(address _owner) external view returns (uint256[] memory); function getApproved(uint256 tokenId) external view returns (address); function initialize( string memory _name, string memory _symbol, address _trustedForwarder ) external; function isApprovedForAll(address _owner, address operator) external view returns (bool); function isTrustedForwarder(address forwarder) external view returns (bool); function liquidityPoolAddress() external view returns (address); function mint(address _to) external returns (uint256); function name() external view returns (string memory); function owner() external view returns (address); function ownerOf(uint256 tokenId) external view returns (address); function paused() external view returns (bool); function renounceOwnership() external; function safeTransferFrom( address from, address to, uint256 tokenId ) external; function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) external; function setApprovalForAll(address operator, bool approved) external; function setLiquidityPool(address _lpm) external; function setWhiteListPeriodManager(address _whiteListPeriodManager) external; function supportsInterface(bytes4 interfaceId) external view returns (bool); function symbol() external view returns (string memory); function tokenByIndex(uint256 index) external view returns (uint256); function tokenMetadata(uint256) external view returns ( address token, uint256 totalSuppliedLiquidity, uint256 totalShares ); function tokenOfOwnerByIndex(address _owner, uint256 index) external view returns (uint256); function tokenURI(uint256 tokenId) external view returns (string memory); function totalSupply() external view returns (uint256); function transferFrom( address from, address to, uint256 tokenId ) external; function transferOwnership(address newOwner) external; function updateTokenMetadata(uint256 _tokenId, LpTokenMetadata memory _lpTokenMetadata) external; function whiteListPeriodManager() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; interface ILiquidityProviders { function BASE_DIVISOR() external view returns (uint256); function initialize(address _trustedForwarder, address _lpToken) external; function addLPFee(address _token, uint256 _amount) external; function addNativeLiquidity() external; function addTokenLiquidity(address _token, uint256 _amount) external; function claimFee(uint256 _nftId) external; function getFeeAccumulatedOnNft(uint256 _nftId) external view returns (uint256); function getSuppliedLiquidityByToken(address tokenAddress) external view returns (uint256); function getTokenPriceInLPShares(address _baseToken) external view returns (uint256); function getTotalLPFeeByToken(address tokenAddress) external view returns (uint256); function getTotalReserveByToken(address tokenAddress) external view returns (uint256); function getSuppliedLiquidity(uint256 _nftId) external view returns (uint256); function increaseNativeLiquidity(uint256 _nftId) external; function increaseTokenLiquidity(uint256 _nftId, uint256 _amount) external; function isTrustedForwarder(address forwarder) external view returns (bool); function owner() external view returns (address); function paused() external view returns (bool); function removeLiquidity(uint256 _nftId, uint256 amount) external; function renounceOwnership() external; function setLiquidityPool(address _liquidityPool) external; function setLpToken(address _lpToken) external; function setWhiteListPeriodManager(address _whiteListPeriodManager) external; function sharesToTokenAmount(uint256 _shares, address _tokenAddress) external view returns (uint256); function totalLPFees(address) external view returns (uint256); function totalLiquidity(address) external view returns (uint256); function totalReserve(address) external view returns (uint256); function totalSharesMinted(address) external view returns (uint256); function transferOwnership(address newOwner) external; function whiteListPeriodManager() external view returns (address); function increaseCurrentLiquidity(address tokenAddress, uint256 amount) external; function decreaseCurrentLiquidity(address tokenAddress, uint256 amount) external; function getCurrentLiquidity(address tokenAddress) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.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 PausableUpgradeable is Initializable, ContextUpgradeable { /** * @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. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _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()); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; struct LpTokenMetadata { address token; uint256 suppliedLiquidity; uint256 shares; }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"liquidityProviders","type":"address"}],"name":"LiquidityProviderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"LogDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"LogNativeReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"LogOnReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardPerSecond","type":"uint256"}],"name":"LogRewardPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_baseToken","type":"address"},{"indexed":false,"internalType":"address","name":"_rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"LogRewardPoolInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accToken1PerShare","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"LogWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousPauser","type":"address"},{"indexed":true,"internalType":"address","name":"newPauser","type":"address"}],"name":"PauserChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"newPauser","type":"address"}],"name":"changePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"extractRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNftIdsStaked","outputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"}],"name":"getRewardRatePerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"}],"name":"getUpdatedAccTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"initalizeRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedForwarder","type":"address"},{"internalType":"address","name":"_pauser","type":"address"},{"internalType":"contract ILiquidityProviders","name":"_liquidityProviders","type":"address"},{"internalType":"contract ILPToken","name":"_lpToken","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pauser","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityProviders","outputs":[{"internalType":"contract ILiquidityProviders","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"contract ILPToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIdsStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftInfo","outputs":[{"internalType":"address payable","name":"staker","type":"address"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"unpaidRewards","type":"uint256"},{"internalType":"bool","name":"isStaked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","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":"uint256","name":"_nftId","type":"uint256"}],"name":"pendingToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"reclaimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardRateLog","outputs":[{"internalType":"uint256","name":"rewardsPerSecond","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"setRewardPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalSharesStaked","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":"contract ILiquidityProviders","name":"_liquidityProviders","type":"address"}],"name":"updateLiquidityProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"}],"internalType":"struct HyphenLiquidityFarming.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50613651806100206000396000f3fe6080604052600436106101e65760003560e01c8063715018a611610102578063c1ea386811610095578063ddc6459811610064578063ddc64598146105d9578063f2fde38b146105f9578063f5ab16cc14610619578063f8c8765e1461063957610235565b8063c1ea38681461054c578063c82b882c1461056c578063cd5c645c1461058c578063ce8efa0e146105ac57610235565b8063964efe81116100d1578063964efe81146104d75780639673d01b146104f75780639a7b5f1114610517578063a2419a6b1461053757610235565b8063715018a61461046b5780637b46c54f146104805780638456cb59146104ad5780638da5cb5b146104c257610235565b806346cf889c1161017a5780635fcbd285116101495780635fcbd285146103f45780636b5399b8146104165780636e553f65146104365780636ef8d66d1461045657610235565b806346cf889c1461036557806346fbf68e14610392578063572b6c05146103bf5780635c975abb146103df57610235565b80631f8bc790116101b65780631f8bc790146102e057806322b5c821146103105780632cd271e7146103305780633f4ba83a1461035057610235565b8062f714ce1461023a578063150b7a021461025c57806318a1f5641461029257806319c78b43146102b257610235565b36610235576101f3610659565b6001600160a01b03167fdc5856b3d7b3107afc1a59863f377452f210536a45526c9b4ea9c9b02980e6d63460405161022b91906134f3565b60405180910390a2005b600080fd5b34801561024657600080fd5b5061025a610255366004612e6a565b610669565b005b34801561026857600080fd5b5061027c610277366004612cde565b610a9e565b6040516102899190612f97565b60405180910390f35b34801561029e57600080fd5b5061025a6102ad366004612c9e565b610ac8565b3480156102be57600080fd5b506102d26102cd366004612d78565b610c37565b6040516102899291906134fc565b3480156102ec57600080fd5b506103006102fb366004612e3a565b610c74565b6040516102899493929190612ec9565b34801561031c57600080fd5b5061025a61032b366004612d78565b610caa565b34801561033c57600080fd5b5061025a61034b366004612c0b565b610d72565b34801561035c57600080fd5b5061025a610da3565b34801561037157600080fd5b50610385610380366004612c0b565b610dd2565b60405161028991906134f3565b34801561039e57600080fd5b506103b26103ad366004612c0b565b610fa2565b6040516102899190612f8c565b3480156103cb57600080fd5b506103b26103da366004612c0b565b610fb6565b3480156103eb57600080fd5b506103b2610fca565b34801561040057600080fd5b50610409610fd3565b6040516102899190612eb5565b34801561042257600080fd5b50610385610431366004612c0b565b610fe2565b34801561044257600080fd5b5061025a610451366004612e6a565b610ff5565b34801561046257600080fd5b5061025a6114b5565b34801561047757600080fd5b5061025a611524565b34801561048c57600080fd5b506104a061049b366004612c0b565b61156d565b60405161028991906134dc565b3480156104b957600080fd5b5061025a611679565b3480156104ce57600080fd5b506104096116a6565b3480156104e357600080fd5b506103856104f2366004612c0b565b6116b5565b34801561050357600080fd5b50610385610512366004612e3a565b611713565b34801561052357600080fd5b506102d2610532366004612c0b565b6118fe565b34801561054357600080fd5b50610409611917565b34801561055857600080fd5b5061025a610567366004612da3565b611926565b34801561057857600080fd5b50610385610587366004612d78565b611a68565b34801561059857600080fd5b5061025a6105a7366004612c0b565b611a9a565b3480156105b857600080fd5b506105cc6105c7366004612c0b565b611b4f565b6040516102899190612f48565b3480156105e557600080fd5b5061025a6105f4366004612e6a565b611bbc565b34801561060557600080fd5b5061025a610614366004612c0b565b611c5d565b34801561062557600080fd5b50610409610634366004612c0b565b611ccb565b34801561064557600080fd5b5061025a610654366004612c43565b611ce7565b6000610663611db2565b90505b90565b610671610fca565b156106975760405162461bcd60e51b815260040161068e90613107565b60405180910390fd5b600260ca5414156106ba5760405162461bcd60e51b815260040161068e906133f1565b600260ca5560006106c9610659565b6001600160a01b038116600090815261010160205260408120549192505b81811015610751576001600160a01b03831660009081526101016020526040902080548691908390811061072b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154141561074157610751565b61074a816135d5565b90506106e7565b818114156107715760405162461bcd60e51b815260040161068e906134af565b6001600160a01b038316600090815261010160205260409020805461079890600190613577565b815481106107b657634e487b7160e01b600052603260045260246000fd5b90600052602060002001546101016000856001600160a01b03166001600160a01b03168152602001908152602001600020828154811061080657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b03851681526101019091526040902080548061084a57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905561086a8585611de0565b600085815260ff602052604080822080546001600160a01b03191681556001810183905560028101839055600301805460ff1916905560fc549051630348a6db60e51b815282916001600160a01b031690636914db60906108cf908a906004016134f3565b60606040518083038186803b1580156108e757600080fd5b505afa1580156108fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091f9190612de4565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b15801561096857600080fd5b505afa15801561097c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a09190612e52565b6109aa9082613538565b6001600160a01b038316600090815261010260205260408120805492935083929091906109d8908490613577565b909155505060fc54604051632142170760e11b81526001600160a01b03909116906342842e0e90610a1190309089908c90600401612f0b565b600060405180830381600087803b158015610a2b57600080fd5b505af1158015610a3f573d6000803e3d6000fd5b50505050856001600160a01b0316856001600160a01b03167f48ce91f1a4c01bb1d97a89b885877d2c4654fd733041b4ea000924fb306a8038848a604051610a88929190612f2f565b60405180910390a35050600160ca555050505050565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b610ad0610659565b6001600160a01b0316610ae16116a6565b6001600160a01b031614610b075760405162461bcd60e51b815260040161068e90613243565b6001600160a01b03838116600090815261010060205260409020541615610b405760405162461bcd60e51b815260040161068e9061300d565b6001600160a01b038316610b665760405162461bcd60e51b815260040161068e90613370565b6001600160a01b038216610b8c5760405162461bcd60e51b815260040161068e90613131565b6001600160a01b0383811660009081526101006020908152604080832080546001600160a01b03191694871694909417909355610103815282822083518085018552858152428184019081528254600181810185559386529390942090516002909302019182559151910155517f7c250d928c82e44e43a3f894c7ea93f9be918af0d8f6b945fdcce8445bfb452290610c2a90859085908590612f0b565b60405180910390a1505050565b6101036020528160005260406000208181548110610c5457600080fd5b600091825260209091206002909102018054600190910154909250905082565b60ff6020819052600091825260409091208054600182015460028301546003909301546001600160a01b03909216939092911684565b610cb2610659565b6001600160a01b0316610cc36116a6565b6001600160a01b031614610ce95760405162461bcd60e51b815260040161068e90613243565b6001600160a01b038216600081815261010360209081526040808320815180830183528681524281850190815282546001818101855593875294909520905160029094020192835592519190920155517f4c0d746c25d43d18da7b1762d9676c9256f91be526076a4e67d37a24624adcef90610d669084906134f3565b60405180910390a25050565b610d7b33610fa2565b610d975760405162461bcd60e51b815260040161068e9061345f565b610da08161222b565b50565b610dac33610fa2565b610dc85760405162461bcd60e51b815260040161068e9061345f565b610dd061229a565b565b6001600160a01b038116600090815260fe602090815260408083206001908101546101039093529083205483929142918491610e0d91613577565b90505b818310610e1c57610f3d565b6001600160a01b0386166000908152610103602052604090208054610e7291859184908110610e5b57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154612308565b6001600160a01b03871660009081526101036020526040902080549184039183908110610eaf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015402840193506101036000876001600160a01b03166001600160a01b031681526020019081526020016000208181548110610f0b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015491508060001415610f2d57610f3d565b610f36816135be565b9050610e10565b6001600160a01b03861660009081526101026020526040902054610f6664e8d4a5100086613558565b610f709190613538565b6001600160a01b038716600090815260fe6020526040902054909450610f969085613520565b9450505050505b919050565b60c9546001600160a01b0390811691161490565b6033546001600160a01b0390811691161490565b60975460ff1690565b60fc546001600160a01b031681565b6101026020526000908152604090205481565b610ffd610fca565b1561101a5760405162461bcd60e51b815260040161068e90613107565b600260ca54141561103d5760405162461bcd60e51b815260040161068e906133f1565b600260ca55600061104c610659565b90506001600160a01b0382166110745760405162461bcd60e51b815260040161068e906131e3565b60fc5460405163e985e9c560e01b81526001600160a01b039091169063e985e9c5906110a69084903090600401612ef1565b60206040518083038186803b1580156110be57600080fd5b505afa1580156110d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f69190612e1a565b80611187575060fc5460405163020604bf60e21b815230916001600160a01b03169063081812fc9061112c9087906004016134f3565b60206040518083038186803b15801561114457600080fd5b505afa158015611158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117c9190612c27565b6001600160a01b0316145b6111a35760405162461bcd60e51b815260040161068e90613345565b600083815260ff602081905260409091206003810154909116156111d95760405162461bcd60e51b815260040161068e9061320c565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db609061120e9089906004016134f3565b60606040518083038186803b15801561122657600080fd5b505afa15801561123a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125e9190612de4565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b1580156112a757600080fd5b505afa1580156112bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112df9190612e52565b6112e99082613538565b6001600160a01b0383811660009081526101006020526040902054919250166113245760405162461bcd60e51b815260040161068e906132af565b6001600160a01b0382166000908152610103602052604090205461135a5760405162461bcd60e51b815260040161068e906132af565b60fc54604051632142170760e11b81526001600160a01b03909116906342842e0e9061138e90879030908b90600401612f0b565b600060405180830381600087803b1580156113a857600080fd5b505af11580156113bc573d6000803e3d6000fd5b5050505060006113cb8361156d565b60038501805460ff1916600117905584546001600160a01b0388166001600160a01b0319909116178555805190915064e8d4a510009061140b9084613558565b6114159190613538565b6001808601919091556001600160a01b038088166000908152610101602090815260408083208054958601815583528183209094018b90559186168152610102909152908120805484929061146b908490613520565b92505081905550826001600160a01b0316856001600160a01b03167f5c8d1f77b6233deba47b516a690497af4c7f1be42a768e331832cb02b3400d6b89604051610a8891906134f3565b6114be33610fa2565b6114da5760405162461bcd60e51b815260040161068e9061345f565b60c9546040516000916001600160a01b0316907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a811908390a360c980546001600160a01b0319169055565b61152c610659565b6001600160a01b031661153d6116a6565b6001600160a01b0316146115635760405162461bcd60e51b815260040161068e90613243565b610dd06000612321565b611575612bf1565b61157d610fca565b1561159a5760405162461bcd60e51b815260040161068e90613107565b506001600160a01b038116600090815260fe602090815260409182902082518084019093528054835260010154908201819052421115610f9d576001600160a01b03821660009081526101026020526040902054156115ff576115fc82610dd2565b81525b4260208083019182526001600160a01b038416600081815260fe835260408082208651815594516001909501859055610102909352829020548451925191937ffa4534c55db3b65cd96eafe03e5ce9fd87638590f49d5907978ff8489ea66ecb9361166c9391929161350a565b60405180910390a2919050565b61168233610fa2565b61169e5760405162461bcd60e51b815260040161068e9061345f565b610dd0612373565b6065546001600160a01b031690565b6001600160a01b03811660009081526101036020526040812080546116dc90600190613577565b815481106116fa57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600001549050919050565b600081815260ff6020819052604082206003810154909116611739576000915050610f9d565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db609061176e9088906004016134f3565b60606040518083038186803b15801561178657600080fd5b505afa15801561179a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117be9190612de4565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b15801561180757600080fd5b505afa15801561181b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183f9190612e52565b6118499082613538565b6001600160a01b038316600090815260fe602090815260409182902082518084019093528054808452600190910154918301829052929350909190421180156118aa57506001600160a01b0384166000908152610102602052604090205415155b156118bb576118b884610dd2565b90505b6002850154600186015464e8d4a510006118d58487613558565b6118df9190613538565b6118e99190613577565b6118f39190613520565b979650505050505050565b60fe602052600090815260409020805460019091015482565b60fd546001600160a01b031681565b61192e610659565b6001600160a01b031661193f6116a6565b6001600160a01b0316146119655760405162461bcd60e51b815260040161068e90613243565b6001600160a01b03811661198b5760405162461bcd60e51b815260040161068e906131e3565b816119a85760405162461bcd60e51b815260040161068e90613168565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611a4f576000816001600160a01b0316836040516119e690610666565b60006040518083038185875af1925050503d8060008114611a23576040519150601f19603f3d011682016040523d82523d6000602084013e611a28565b606091505b5050905080611a495760405162461bcd60e51b815260040161068e90613044565b50611a63565b611a636001600160a01b03841682846123ce565b505050565b6101016020528160005260406000208181548110611a8557600080fd5b90600052602060002001600091509150505481565b611aa2610659565b6001600160a01b0316611ab36116a6565b6001600160a01b031614611ad95760405162461bcd60e51b815260040161068e90613243565b6001600160a01b038116611aff5760405162461bcd60e51b815260040161068e90613428565b60fd80546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fc4c228afa62bc2b81cbfa4764a417d7a0cb5267d32f5e3e34b34e35f44aa1ff390600090a250565b6001600160a01b03811660009081526101016020908152604091829020805483518184028101840190945280845260609392830182828015611bb057602002820191906000526020600020905b815481526020019060010190808311611b9c575b50505050509050919050565b611bc4610fca565b15611be15760405162461bcd60e51b815260040161068e90613107565b600260ca541415611c045760405162461bcd60e51b815260040161068e906133f1565b600260ca55611c11610659565b600083815260ff60205260409020546001600160a01b03908116911614611c4a5760405162461bcd60e51b815260040161068e906132e6565b611c548282611de0565b5050600160ca55565b611c65610659565b6001600160a01b0316611c766116a6565b6001600160a01b031614611c9c5760405162461bcd60e51b815260040161068e90613243565b6001600160a01b038116611cc25760405162461bcd60e51b815260040161068e9061307b565b610da081612321565b610100602052600090815260409020546001600160a01b031681565b600054610100900460ff1680611d00575060005460ff16155b611d1c5760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff16158015611d47576000805460ff1961ff0019909116610100171660011790555b611d5085612424565b611d586124ab565b611d618461252f565b611d696125ed565b60fd80546001600160a01b038086166001600160a01b03199283161790925560fc8054928516929091169190911790558015611dab576000805461ff00191690555b5050505050565b6000611dbd33610fb6565b15611dd1575060131936013560601c610666565b611dd9612655565b9050610666565b600082815260ff602081905260409091206003810154909116611e155760405162461bcd60e51b815260040161068e906134af565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db6090611e4a9088906004016134f3565b60606040518083038186803b158015611e6257600080fd5b505afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a9190612de4565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b158015611ee357600080fd5b505afa158015611ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1b9190612e52565b611f259082613538565b90506000611f328361156d565b905060008083156121a95760028601546001870154845164e8d4a5100090611f5a9088613558565b611f649190613538565b611f6e9190613577565b611f789190613520565b6001600160a01b03868116600090815261010060205260409020549193501673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156120dc57478083111561204b5780830387600201819055506000886001600160a01b031682604051611fdf90610666565b60006040518083038185875af1925050503d806000811461201c576040519150601f19603f3d011682016040523d82523d6000602084013e612021565b606091505b50509050806120425760405162461bcd60e51b815260040161068e90613044565b819250506120d6565b600087600201819055506000886001600160a01b03168460405161206e90610666565b60006040518083038185875af1925050503d80600081146120ab576040519150601f19603f3d011682016040523d82523d6000602084013e6120b0565b606091505b50509050806120d15760405162461bcd60e51b815260040161068e90613044565b839250505b506121a9565b6001600160a01b03808616600090815261010060205260408082205490516370a0823160e01b815292169182906370a082319061211d903090600401612eb5565b60206040518083038186803b15801561213557600080fd5b505afa158015612149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216d9190612e52565b90508084111561219157808403600289015561218a82828b612659565b92506121a6565b600060028901556121a382858b612659565b92505b50505b825164e8d4a51000906121bc9086613558565b6121c69190613538565b60018701556001600160a01b038088169086166121e1610659565b6001600160a01b03167f9a10eacd1c879d4cddc2387cfbc23057de5f4d554a91e9eb7e07c66ead11c9df8460405161221991906134f3565b60405180910390a45050505050505050565b6001600160a01b03811661223e57600080fd5b60c9546040516001600160a01b038084169216907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a81190600090a360c980546001600160a01b0319166001600160a01b0392909216919091179055565b6122a2610fca565b6122be5760405162461bcd60e51b815260040161068e90612fdf565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122f1610659565b6040516122fe9190612eb5565b60405180910390a1565b600081831015612318578161231a565b825b9392505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61237b610fca565b156123985760405162461bcd60e51b815260040161068e90613107565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122f1610659565b611a638363a9059cbb60e01b84846040516024016123ed929190612f2f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261277d565b600054610100900460ff168061243d575060005460ff16155b6124595760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff16158015612484576000805460ff1961ff0019909116610100171660011790555b61248c61280c565b6124958261287f565b80156124a7576000805461ff00191690555b5050565b600054610100900460ff16806124c4575060005460ff16155b6124e05760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561250b576000805460ff1961ff0019909116610100171660011790555b61251361280c565b61251b61290f565b8015610da0576000805461ff001916905550565b600054610100900460ff1680612548575060005460ff16155b6125645760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561258f576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0382166125b55760405162461bcd60e51b815260040161068e90613278565b6125bd61297f565b60c980546001600160a01b0319166001600160a01b03841617905580156124a7576000805461ff00191690555050565b600054610100900460ff1680612606575060005460ff16155b6126225760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561264d576000805460ff1961ff0019909116610100171660011790555b61251b6129ef565b3390565b600080846001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016126889190612eb5565b60206040518083038186803b1580156126a057600080fd5b505afa1580156126b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d89190612e52565b90506126ee6001600160a01b03861684866123ce565b6040516370a0823160e01b81526001600160a01b038616906370a082319061271a903090600401612eb5565b60206040518083038186803b15801561273257600080fd5b505afa158015612746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276a9190612e52565b6127749082613577565b95945050505050565b60006127d2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a689092919063ffffffff16565b805190915015611a6357808060200190518101906127f09190612e1a565b611a635760405162461bcd60e51b815260040161068e906133a7565b600054610100900460ff1680612825575060005460ff16155b6128415760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561251b576000805460ff1961ff0019909116610100171660011790558015610da0576000805461ff001916905550565b600054610100900460ff1680612898575060005460ff16155b6128b45760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff161580156128df576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b03841617905580156124a7576000805461ff00191690555050565b600054610100900460ff1680612928575060005460ff16155b6129445760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561296f576000805460ff1961ff0019909116610100171660011790555b61251b61297a610659565b612321565b600054610100900460ff1680612998575060005460ff16155b6129b45760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff161580156129df576000805460ff1961ff0019909116610100171660011790555b6129e761280c565b61251b612a7f565b600054610100900460ff1680612a08575060005460ff16155b612a245760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff16158015612a4f576000805460ff1961ff0019909116610100171660011790555b600160ca558015610da0576000805461ff001916905550565b6060612a778484600085612afd565b949350505050565b600054610100900460ff1680612a98575060005460ff16155b612ab45760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff16158015612adf576000805460ff1961ff0019909116610100171660011790555b6097805460ff191690558015610da0576000805461ff001916905550565b606082471015612b1f5760405162461bcd60e51b815260040161068e906130c1565b612b2885612bb2565b612b445760405162461bcd60e51b815260040161068e9061330e565b600080866001600160a01b03168587604051612b609190612e99565b60006040518083038185875af1925050503d8060008114612b9d576040519150601f19603f3d011682016040523d82523d6000602084013e612ba2565b606091505b50915091506118f3828286612bb8565b3b151590565b60608315612bc757508161231a565b825115612bd75782518084602001fd5b8160405162461bcd60e51b815260040161068e9190612fac565b604051806040016040528060008152602001600081525090565b600060208284031215612c1c578081fd5b813561231a81613606565b600060208284031215612c38578081fd5b815161231a81613606565b60008060008060808587031215612c58578283fd5b8435612c6381613606565b93506020850135612c7381613606565b92506040850135612c8381613606565b91506060850135612c9381613606565b939692955090935050565b600080600060608486031215612cb2578283fd5b8335612cbd81613606565b92506020840135612ccd81613606565b929592945050506040919091013590565b600080600080600060808688031215612cf5578081fd5b8535612d0081613606565b94506020860135612d1081613606565b935060408601359250606086013567ffffffffffffffff80821115612d33578283fd5b818801915088601f830112612d46578283fd5b813581811115612d54578384fd5b896020828501011115612d65578384fd5b9699959850939650602001949392505050565b60008060408385031215612d8a578182fd5b8235612d9581613606565b946020939093013593505050565b600080600060608486031215612db7578283fd5b8335612dc281613606565b9250602084013591506040840135612dd981613606565b809150509250925092565b600080600060608486031215612df8578283fd5b8351612e0381613606565b602085015160409095015190969495509392505050565b600060208284031215612e2b578081fd5b8151801515811461231a578182fd5b600060208284031215612e4b578081fd5b5035919050565b600060208284031215612e63578081fd5b5051919050565b60008060408385031215612e7c578182fd5b823591506020830135612e8e81613606565b809150509250929050565b60008251612eab81846020870161358e565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03949094168452602084019290925260408301521515606082015260800190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015612f8057835183529284019291840191600101612f64565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152612fcb81604085016020870161358e565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252601d908201527f4552525f5f504f4f4c5f414c52454144595f494e495449414c495a4544000000604082015260600190565b6020808252601b908201527f4552525f5f4e41544956455f5452414e534645525f4641494c45440000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526018908201527f4552525f5245574152445f544f4b454e5f49535f5a45524f0000000000000000604082015260600190565b6020808252601390820152724552525f5f414d4f554e545f49535f5a45524f60681b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252600f908201526e4552525f5f544f5f49535f5a45524f60881b604082015260600190565b60208082526017908201527f4552525f5f4e46545f414c52454144595f5354414b4544000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f50617573657220416464726573732063616e6e6f742062652030000000000000604082015260600190565b60208082526019908201527f4552525f5f504f4f4c5f4e4f545f494e495449414c495a454400000000000000604082015260600190565b6020808252600e908201526d22a9292fafa727aa2fa7aba722a960911b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526011908201527011549497d7d393d517d054141493d59151607a1b604082015260600190565b60208082526017908201527f4552525f5f424153455f544f4b454e5f49535f5a45524f000000000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f4552525f5f4c49515549444954595f50524f56494445525f49535f5a45524f00604082015260600190565b60208082526030908201527f4f6e6c792070617573657220697320616c6c6f77656420746f20706572666f7260408201526f36903a3434b99037b832b930ba34b7b760811b606082015260800190565b60208082526013908201527211549497d7d3919517d393d517d4d51052d151606a1b604082015260600190565b815181526020918201519181019190915260400190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60008219821115613533576135336135f0565b500190565b60008261355357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613572576135726135f0565b500290565b600082821015613589576135896135f0565b500390565b60005b838110156135a9578181015183820152602001613591565b838111156135b8576000848401525b50505050565b6000816135cd576135cd6135f0565b506000190190565b60006000198214156135e9576135e96135f0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610da057600080fdfea26469706673582212208a11c574b4428ac7f5d1b7aa5cc307c9dcf9bc2aab08cfcfde0cc7af94b1f5c964736f6c63430008000033
Deployed Bytecode
0x6080604052600436106101e65760003560e01c8063715018a611610102578063c1ea386811610095578063ddc6459811610064578063ddc64598146105d9578063f2fde38b146105f9578063f5ab16cc14610619578063f8c8765e1461063957610235565b8063c1ea38681461054c578063c82b882c1461056c578063cd5c645c1461058c578063ce8efa0e146105ac57610235565b8063964efe81116100d1578063964efe81146104d75780639673d01b146104f75780639a7b5f1114610517578063a2419a6b1461053757610235565b8063715018a61461046b5780637b46c54f146104805780638456cb59146104ad5780638da5cb5b146104c257610235565b806346cf889c1161017a5780635fcbd285116101495780635fcbd285146103f45780636b5399b8146104165780636e553f65146104365780636ef8d66d1461045657610235565b806346cf889c1461036557806346fbf68e14610392578063572b6c05146103bf5780635c975abb146103df57610235565b80631f8bc790116101b65780631f8bc790146102e057806322b5c821146103105780632cd271e7146103305780633f4ba83a1461035057610235565b8062f714ce1461023a578063150b7a021461025c57806318a1f5641461029257806319c78b43146102b257610235565b36610235576101f3610659565b6001600160a01b03167fdc5856b3d7b3107afc1a59863f377452f210536a45526c9b4ea9c9b02980e6d63460405161022b91906134f3565b60405180910390a2005b600080fd5b34801561024657600080fd5b5061025a610255366004612e6a565b610669565b005b34801561026857600080fd5b5061027c610277366004612cde565b610a9e565b6040516102899190612f97565b60405180910390f35b34801561029e57600080fd5b5061025a6102ad366004612c9e565b610ac8565b3480156102be57600080fd5b506102d26102cd366004612d78565b610c37565b6040516102899291906134fc565b3480156102ec57600080fd5b506103006102fb366004612e3a565b610c74565b6040516102899493929190612ec9565b34801561031c57600080fd5b5061025a61032b366004612d78565b610caa565b34801561033c57600080fd5b5061025a61034b366004612c0b565b610d72565b34801561035c57600080fd5b5061025a610da3565b34801561037157600080fd5b50610385610380366004612c0b565b610dd2565b60405161028991906134f3565b34801561039e57600080fd5b506103b26103ad366004612c0b565b610fa2565b6040516102899190612f8c565b3480156103cb57600080fd5b506103b26103da366004612c0b565b610fb6565b3480156103eb57600080fd5b506103b2610fca565b34801561040057600080fd5b50610409610fd3565b6040516102899190612eb5565b34801561042257600080fd5b50610385610431366004612c0b565b610fe2565b34801561044257600080fd5b5061025a610451366004612e6a565b610ff5565b34801561046257600080fd5b5061025a6114b5565b34801561047757600080fd5b5061025a611524565b34801561048c57600080fd5b506104a061049b366004612c0b565b61156d565b60405161028991906134dc565b3480156104b957600080fd5b5061025a611679565b3480156104ce57600080fd5b506104096116a6565b3480156104e357600080fd5b506103856104f2366004612c0b565b6116b5565b34801561050357600080fd5b50610385610512366004612e3a565b611713565b34801561052357600080fd5b506102d2610532366004612c0b565b6118fe565b34801561054357600080fd5b50610409611917565b34801561055857600080fd5b5061025a610567366004612da3565b611926565b34801561057857600080fd5b50610385610587366004612d78565b611a68565b34801561059857600080fd5b5061025a6105a7366004612c0b565b611a9a565b3480156105b857600080fd5b506105cc6105c7366004612c0b565b611b4f565b6040516102899190612f48565b3480156105e557600080fd5b5061025a6105f4366004612e6a565b611bbc565b34801561060557600080fd5b5061025a610614366004612c0b565b611c5d565b34801561062557600080fd5b50610409610634366004612c0b565b611ccb565b34801561064557600080fd5b5061025a610654366004612c43565b611ce7565b6000610663611db2565b90505b90565b610671610fca565b156106975760405162461bcd60e51b815260040161068e90613107565b60405180910390fd5b600260ca5414156106ba5760405162461bcd60e51b815260040161068e906133f1565b600260ca5560006106c9610659565b6001600160a01b038116600090815261010160205260408120549192505b81811015610751576001600160a01b03831660009081526101016020526040902080548691908390811061072b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154141561074157610751565b61074a816135d5565b90506106e7565b818114156107715760405162461bcd60e51b815260040161068e906134af565b6001600160a01b038316600090815261010160205260409020805461079890600190613577565b815481106107b657634e487b7160e01b600052603260045260246000fd5b90600052602060002001546101016000856001600160a01b03166001600160a01b03168152602001908152602001600020828154811061080657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b03851681526101019091526040902080548061084a57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905561086a8585611de0565b600085815260ff602052604080822080546001600160a01b03191681556001810183905560028101839055600301805460ff1916905560fc549051630348a6db60e51b815282916001600160a01b031690636914db60906108cf908a906004016134f3565b60606040518083038186803b1580156108e757600080fd5b505afa1580156108fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091f9190612de4565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b15801561096857600080fd5b505afa15801561097c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a09190612e52565b6109aa9082613538565b6001600160a01b038316600090815261010260205260408120805492935083929091906109d8908490613577565b909155505060fc54604051632142170760e11b81526001600160a01b03909116906342842e0e90610a1190309089908c90600401612f0b565b600060405180830381600087803b158015610a2b57600080fd5b505af1158015610a3f573d6000803e3d6000fd5b50505050856001600160a01b0316856001600160a01b03167f48ce91f1a4c01bb1d97a89b885877d2c4654fd733041b4ea000924fb306a8038848a604051610a88929190612f2f565b60405180910390a35050600160ca555050505050565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b610ad0610659565b6001600160a01b0316610ae16116a6565b6001600160a01b031614610b075760405162461bcd60e51b815260040161068e90613243565b6001600160a01b03838116600090815261010060205260409020541615610b405760405162461bcd60e51b815260040161068e9061300d565b6001600160a01b038316610b665760405162461bcd60e51b815260040161068e90613370565b6001600160a01b038216610b8c5760405162461bcd60e51b815260040161068e90613131565b6001600160a01b0383811660009081526101006020908152604080832080546001600160a01b03191694871694909417909355610103815282822083518085018552858152428184019081528254600181810185559386529390942090516002909302019182559151910155517f7c250d928c82e44e43a3f894c7ea93f9be918af0d8f6b945fdcce8445bfb452290610c2a90859085908590612f0b565b60405180910390a1505050565b6101036020528160005260406000208181548110610c5457600080fd5b600091825260209091206002909102018054600190910154909250905082565b60ff6020819052600091825260409091208054600182015460028301546003909301546001600160a01b03909216939092911684565b610cb2610659565b6001600160a01b0316610cc36116a6565b6001600160a01b031614610ce95760405162461bcd60e51b815260040161068e90613243565b6001600160a01b038216600081815261010360209081526040808320815180830183528681524281850190815282546001818101855593875294909520905160029094020192835592519190920155517f4c0d746c25d43d18da7b1762d9676c9256f91be526076a4e67d37a24624adcef90610d669084906134f3565b60405180910390a25050565b610d7b33610fa2565b610d975760405162461bcd60e51b815260040161068e9061345f565b610da08161222b565b50565b610dac33610fa2565b610dc85760405162461bcd60e51b815260040161068e9061345f565b610dd061229a565b565b6001600160a01b038116600090815260fe602090815260408083206001908101546101039093529083205483929142918491610e0d91613577565b90505b818310610e1c57610f3d565b6001600160a01b0386166000908152610103602052604090208054610e7291859184908110610e5b57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154612308565b6001600160a01b03871660009081526101036020526040902080549184039183908110610eaf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015402840193506101036000876001600160a01b03166001600160a01b031681526020019081526020016000208181548110610f0b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015491508060001415610f2d57610f3d565b610f36816135be565b9050610e10565b6001600160a01b03861660009081526101026020526040902054610f6664e8d4a5100086613558565b610f709190613538565b6001600160a01b038716600090815260fe6020526040902054909450610f969085613520565b9450505050505b919050565b60c9546001600160a01b0390811691161490565b6033546001600160a01b0390811691161490565b60975460ff1690565b60fc546001600160a01b031681565b6101026020526000908152604090205481565b610ffd610fca565b1561101a5760405162461bcd60e51b815260040161068e90613107565b600260ca54141561103d5760405162461bcd60e51b815260040161068e906133f1565b600260ca55600061104c610659565b90506001600160a01b0382166110745760405162461bcd60e51b815260040161068e906131e3565b60fc5460405163e985e9c560e01b81526001600160a01b039091169063e985e9c5906110a69084903090600401612ef1565b60206040518083038186803b1580156110be57600080fd5b505afa1580156110d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f69190612e1a565b80611187575060fc5460405163020604bf60e21b815230916001600160a01b03169063081812fc9061112c9087906004016134f3565b60206040518083038186803b15801561114457600080fd5b505afa158015611158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117c9190612c27565b6001600160a01b0316145b6111a35760405162461bcd60e51b815260040161068e90613345565b600083815260ff602081905260409091206003810154909116156111d95760405162461bcd60e51b815260040161068e9061320c565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db609061120e9089906004016134f3565b60606040518083038186803b15801561122657600080fd5b505afa15801561123a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125e9190612de4565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b1580156112a757600080fd5b505afa1580156112bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112df9190612e52565b6112e99082613538565b6001600160a01b0383811660009081526101006020526040902054919250166113245760405162461bcd60e51b815260040161068e906132af565b6001600160a01b0382166000908152610103602052604090205461135a5760405162461bcd60e51b815260040161068e906132af565b60fc54604051632142170760e11b81526001600160a01b03909116906342842e0e9061138e90879030908b90600401612f0b565b600060405180830381600087803b1580156113a857600080fd5b505af11580156113bc573d6000803e3d6000fd5b5050505060006113cb8361156d565b60038501805460ff1916600117905584546001600160a01b0388166001600160a01b0319909116178555805190915064e8d4a510009061140b9084613558565b6114159190613538565b6001808601919091556001600160a01b038088166000908152610101602090815260408083208054958601815583528183209094018b90559186168152610102909152908120805484929061146b908490613520565b92505081905550826001600160a01b0316856001600160a01b03167f5c8d1f77b6233deba47b516a690497af4c7f1be42a768e331832cb02b3400d6b89604051610a8891906134f3565b6114be33610fa2565b6114da5760405162461bcd60e51b815260040161068e9061345f565b60c9546040516000916001600160a01b0316907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a811908390a360c980546001600160a01b0319169055565b61152c610659565b6001600160a01b031661153d6116a6565b6001600160a01b0316146115635760405162461bcd60e51b815260040161068e90613243565b610dd06000612321565b611575612bf1565b61157d610fca565b1561159a5760405162461bcd60e51b815260040161068e90613107565b506001600160a01b038116600090815260fe602090815260409182902082518084019093528054835260010154908201819052421115610f9d576001600160a01b03821660009081526101026020526040902054156115ff576115fc82610dd2565b81525b4260208083019182526001600160a01b038416600081815260fe835260408082208651815594516001909501859055610102909352829020548451925191937ffa4534c55db3b65cd96eafe03e5ce9fd87638590f49d5907978ff8489ea66ecb9361166c9391929161350a565b60405180910390a2919050565b61168233610fa2565b61169e5760405162461bcd60e51b815260040161068e9061345f565b610dd0612373565b6065546001600160a01b031690565b6001600160a01b03811660009081526101036020526040812080546116dc90600190613577565b815481106116fa57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600001549050919050565b600081815260ff6020819052604082206003810154909116611739576000915050610f9d565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db609061176e9088906004016134f3565b60606040518083038186803b15801561178657600080fd5b505afa15801561179a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117be9190612de4565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b15801561180757600080fd5b505afa15801561181b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183f9190612e52565b6118499082613538565b6001600160a01b038316600090815260fe602090815260409182902082518084019093528054808452600190910154918301829052929350909190421180156118aa57506001600160a01b0384166000908152610102602052604090205415155b156118bb576118b884610dd2565b90505b6002850154600186015464e8d4a510006118d58487613558565b6118df9190613538565b6118e99190613577565b6118f39190613520565b979650505050505050565b60fe602052600090815260409020805460019091015482565b60fd546001600160a01b031681565b61192e610659565b6001600160a01b031661193f6116a6565b6001600160a01b0316146119655760405162461bcd60e51b815260040161068e90613243565b6001600160a01b03811661198b5760405162461bcd60e51b815260040161068e906131e3565b816119a85760405162461bcd60e51b815260040161068e90613168565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611a4f576000816001600160a01b0316836040516119e690610666565b60006040518083038185875af1925050503d8060008114611a23576040519150601f19603f3d011682016040523d82523d6000602084013e611a28565b606091505b5050905080611a495760405162461bcd60e51b815260040161068e90613044565b50611a63565b611a636001600160a01b03841682846123ce565b505050565b6101016020528160005260406000208181548110611a8557600080fd5b90600052602060002001600091509150505481565b611aa2610659565b6001600160a01b0316611ab36116a6565b6001600160a01b031614611ad95760405162461bcd60e51b815260040161068e90613243565b6001600160a01b038116611aff5760405162461bcd60e51b815260040161068e90613428565b60fd80546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fc4c228afa62bc2b81cbfa4764a417d7a0cb5267d32f5e3e34b34e35f44aa1ff390600090a250565b6001600160a01b03811660009081526101016020908152604091829020805483518184028101840190945280845260609392830182828015611bb057602002820191906000526020600020905b815481526020019060010190808311611b9c575b50505050509050919050565b611bc4610fca565b15611be15760405162461bcd60e51b815260040161068e90613107565b600260ca541415611c045760405162461bcd60e51b815260040161068e906133f1565b600260ca55611c11610659565b600083815260ff60205260409020546001600160a01b03908116911614611c4a5760405162461bcd60e51b815260040161068e906132e6565b611c548282611de0565b5050600160ca55565b611c65610659565b6001600160a01b0316611c766116a6565b6001600160a01b031614611c9c5760405162461bcd60e51b815260040161068e90613243565b6001600160a01b038116611cc25760405162461bcd60e51b815260040161068e9061307b565b610da081612321565b610100602052600090815260409020546001600160a01b031681565b600054610100900460ff1680611d00575060005460ff16155b611d1c5760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff16158015611d47576000805460ff1961ff0019909116610100171660011790555b611d5085612424565b611d586124ab565b611d618461252f565b611d696125ed565b60fd80546001600160a01b038086166001600160a01b03199283161790925560fc8054928516929091169190911790558015611dab576000805461ff00191690555b5050505050565b6000611dbd33610fb6565b15611dd1575060131936013560601c610666565b611dd9612655565b9050610666565b600082815260ff602081905260409091206003810154909116611e155760405162461bcd60e51b815260040161068e906134af565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db6090611e4a9088906004016134f3565b60606040518083038186803b158015611e6257600080fd5b505afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a9190612de4565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b158015611ee357600080fd5b505afa158015611ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1b9190612e52565b611f259082613538565b90506000611f328361156d565b905060008083156121a95760028601546001870154845164e8d4a5100090611f5a9088613558565b611f649190613538565b611f6e9190613577565b611f789190613520565b6001600160a01b03868116600090815261010060205260409020549193501673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156120dc57478083111561204b5780830387600201819055506000886001600160a01b031682604051611fdf90610666565b60006040518083038185875af1925050503d806000811461201c576040519150601f19603f3d011682016040523d82523d6000602084013e612021565b606091505b50509050806120425760405162461bcd60e51b815260040161068e90613044565b819250506120d6565b600087600201819055506000886001600160a01b03168460405161206e90610666565b60006040518083038185875af1925050503d80600081146120ab576040519150601f19603f3d011682016040523d82523d6000602084013e6120b0565b606091505b50509050806120d15760405162461bcd60e51b815260040161068e90613044565b839250505b506121a9565b6001600160a01b03808616600090815261010060205260408082205490516370a0823160e01b815292169182906370a082319061211d903090600401612eb5565b60206040518083038186803b15801561213557600080fd5b505afa158015612149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216d9190612e52565b90508084111561219157808403600289015561218a82828b612659565b92506121a6565b600060028901556121a382858b612659565b92505b50505b825164e8d4a51000906121bc9086613558565b6121c69190613538565b60018701556001600160a01b038088169086166121e1610659565b6001600160a01b03167f9a10eacd1c879d4cddc2387cfbc23057de5f4d554a91e9eb7e07c66ead11c9df8460405161221991906134f3565b60405180910390a45050505050505050565b6001600160a01b03811661223e57600080fd5b60c9546040516001600160a01b038084169216907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a81190600090a360c980546001600160a01b0319166001600160a01b0392909216919091179055565b6122a2610fca565b6122be5760405162461bcd60e51b815260040161068e90612fdf565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122f1610659565b6040516122fe9190612eb5565b60405180910390a1565b600081831015612318578161231a565b825b9392505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61237b610fca565b156123985760405162461bcd60e51b815260040161068e90613107565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122f1610659565b611a638363a9059cbb60e01b84846040516024016123ed929190612f2f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261277d565b600054610100900460ff168061243d575060005460ff16155b6124595760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff16158015612484576000805460ff1961ff0019909116610100171660011790555b61248c61280c565b6124958261287f565b80156124a7576000805461ff00191690555b5050565b600054610100900460ff16806124c4575060005460ff16155b6124e05760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561250b576000805460ff1961ff0019909116610100171660011790555b61251361280c565b61251b61290f565b8015610da0576000805461ff001916905550565b600054610100900460ff1680612548575060005460ff16155b6125645760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561258f576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0382166125b55760405162461bcd60e51b815260040161068e90613278565b6125bd61297f565b60c980546001600160a01b0319166001600160a01b03841617905580156124a7576000805461ff00191690555050565b600054610100900460ff1680612606575060005460ff16155b6126225760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561264d576000805460ff1961ff0019909116610100171660011790555b61251b6129ef565b3390565b600080846001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016126889190612eb5565b60206040518083038186803b1580156126a057600080fd5b505afa1580156126b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d89190612e52565b90506126ee6001600160a01b03861684866123ce565b6040516370a0823160e01b81526001600160a01b038616906370a082319061271a903090600401612eb5565b60206040518083038186803b15801561273257600080fd5b505afa158015612746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276a9190612e52565b6127749082613577565b95945050505050565b60006127d2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a689092919063ffffffff16565b805190915015611a6357808060200190518101906127f09190612e1a565b611a635760405162461bcd60e51b815260040161068e906133a7565b600054610100900460ff1680612825575060005460ff16155b6128415760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561251b576000805460ff1961ff0019909116610100171660011790558015610da0576000805461ff001916905550565b600054610100900460ff1680612898575060005460ff16155b6128b45760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff161580156128df576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b03841617905580156124a7576000805461ff00191690555050565b600054610100900460ff1680612928575060005460ff16155b6129445760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff1615801561296f576000805460ff1961ff0019909116610100171660011790555b61251b61297a610659565b612321565b600054610100900460ff1680612998575060005460ff16155b6129b45760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff161580156129df576000805460ff1961ff0019909116610100171660011790555b6129e761280c565b61251b612a7f565b600054610100900460ff1680612a08575060005460ff16155b612a245760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff16158015612a4f576000805460ff1961ff0019909116610100171660011790555b600160ca558015610da0576000805461ff001916905550565b6060612a778484600085612afd565b949350505050565b600054610100900460ff1680612a98575060005460ff16155b612ab45760405162461bcd60e51b815260040161068e90613195565b600054610100900460ff16158015612adf576000805460ff1961ff0019909116610100171660011790555b6097805460ff191690558015610da0576000805461ff001916905550565b606082471015612b1f5760405162461bcd60e51b815260040161068e906130c1565b612b2885612bb2565b612b445760405162461bcd60e51b815260040161068e9061330e565b600080866001600160a01b03168587604051612b609190612e99565b60006040518083038185875af1925050503d8060008114612b9d576040519150601f19603f3d011682016040523d82523d6000602084013e612ba2565b606091505b50915091506118f3828286612bb8565b3b151590565b60608315612bc757508161231a565b825115612bd75782518084602001fd5b8160405162461bcd60e51b815260040161068e9190612fac565b604051806040016040528060008152602001600081525090565b600060208284031215612c1c578081fd5b813561231a81613606565b600060208284031215612c38578081fd5b815161231a81613606565b60008060008060808587031215612c58578283fd5b8435612c6381613606565b93506020850135612c7381613606565b92506040850135612c8381613606565b91506060850135612c9381613606565b939692955090935050565b600080600060608486031215612cb2578283fd5b8335612cbd81613606565b92506020840135612ccd81613606565b929592945050506040919091013590565b600080600080600060808688031215612cf5578081fd5b8535612d0081613606565b94506020860135612d1081613606565b935060408601359250606086013567ffffffffffffffff80821115612d33578283fd5b818801915088601f830112612d46578283fd5b813581811115612d54578384fd5b896020828501011115612d65578384fd5b9699959850939650602001949392505050565b60008060408385031215612d8a578182fd5b8235612d9581613606565b946020939093013593505050565b600080600060608486031215612db7578283fd5b8335612dc281613606565b9250602084013591506040840135612dd981613606565b809150509250925092565b600080600060608486031215612df8578283fd5b8351612e0381613606565b602085015160409095015190969495509392505050565b600060208284031215612e2b578081fd5b8151801515811461231a578182fd5b600060208284031215612e4b578081fd5b5035919050565b600060208284031215612e63578081fd5b5051919050565b60008060408385031215612e7c578182fd5b823591506020830135612e8e81613606565b809150509250929050565b60008251612eab81846020870161358e565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03949094168452602084019290925260408301521515606082015260800190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015612f8057835183529284019291840191600101612f64565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152612fcb81604085016020870161358e565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252601d908201527f4552525f5f504f4f4c5f414c52454144595f494e495449414c495a4544000000604082015260600190565b6020808252601b908201527f4552525f5f4e41544956455f5452414e534645525f4641494c45440000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526018908201527f4552525f5245574152445f544f4b454e5f49535f5a45524f0000000000000000604082015260600190565b6020808252601390820152724552525f5f414d4f554e545f49535f5a45524f60681b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252600f908201526e4552525f5f544f5f49535f5a45524f60881b604082015260600190565b60208082526017908201527f4552525f5f4e46545f414c52454144595f5354414b4544000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f50617573657220416464726573732063616e6e6f742062652030000000000000604082015260600190565b60208082526019908201527f4552525f5f504f4f4c5f4e4f545f494e495449414c495a454400000000000000604082015260600190565b6020808252600e908201526d22a9292fafa727aa2fa7aba722a960911b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526011908201527011549497d7d393d517d054141493d59151607a1b604082015260600190565b60208082526017908201527f4552525f5f424153455f544f4b454e5f49535f5a45524f000000000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f4552525f5f4c49515549444954595f50524f56494445525f49535f5a45524f00604082015260600190565b60208082526030908201527f4f6e6c792070617573657220697320616c6c6f77656420746f20706572666f7260408201526f36903a3434b99037b832b930ba34b7b760811b606082015260800190565b60208082526013908201527211549497d7d3919517d393d517d4d51052d151606a1b604082015260600190565b815181526020918201519181019190915260400190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60008219821115613533576135336135f0565b500190565b60008261355357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613572576135726135f0565b500290565b600082821015613589576135896135f0565b500390565b60005b838110156135a9578181015183820152602001613591565b838111156135b8576000848401525b50505050565b6000816135cd576135cd6135f0565b506000190190565b60006000198214156135e9576135e96135f0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610da057600080fdfea26469706673582212208a11c574b4428ac7f5d1b7aa5cc307c9dcf9bc2aab08cfcfde0cc7af94b1f5c964736f6c63430008000033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.