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 | 14762492 | 929 days ago | IN | 0 ETH | 0.48842205 |
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; } function setTrustedForwarder(address _tf) external onlyOwner { _setTrustedForwarder(_tf); } /// @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 { require(_rewardPerSecond <= 10**40, "ERR__REWARD_PER_SECOND_TOO_HIGH"); 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 { uint256 index = getStakedNftIndex(_msgSender(), _nftId); _withdraw(_nftId, _to, index); } function getStakedNftIndex(address _staker, uint256 _nftId) public view returns (uint256) { uint256 nftsStakedLength = nftIdsStaked[_staker].length; uint256 index; unchecked { for (index = 0; index < nftsStakedLength; ++index) { if (nftIdsStaked[_staker][index] == _nftId) { return index; } } } revert("ERR__NFT_NOT_STAKED"); } function _withdraw( uint256 _nftId, address payable _to, uint256 _index ) private { address msgSender = _msgSender(); require(nftIdsStaked[msgSender][_index] == _nftId, "ERR__NOT_OWNER"); require(nftInfo[_nftId].staker == msgSender, "ERR__NOT_OWNER"); require(nftInfo[_nftId].unpaidRewards == 0, "ERR__UNPAID_REWARDS_EXIST"); 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); } function withdrawV2( uint256 _nftId, address payable _to, uint256 _index ) external whenNotPaused nonReentrant { _withdraw(_nftId, _to, _index); } /// @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 (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 { event TrustedForwarderChanged(address indexed _tf); 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(); } } function _setTrustedForwarder(address _tf) internal virtual { require(_tf != address(0), "TrustedForwarder can't be 0"); _trustedForwarder = _tf; emit TrustedForwarderChanged(_tf); } 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 whenNotPaused { _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 whenNotPaused { 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":true,"internalType":"address","name":"_tf","type":"address"}],"name":"TrustedForwarderChanged","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":"_staker","type":"address"},{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"getStakedNftIndex","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":"_tf","type":"address"}],"name":"setTrustedForwarder","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"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"withdrawV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b506139f6806100206000396000f3fe6080604052600436106102075760003560e01c8063715018a611610118578063c82b882c116100a0578063ddc645981161006f578063ddc645981461063a578063ea1503521461065a578063f2fde38b1461067a578063f5ab16cc1461069a578063f8c8765e146106ba57610256565b8063c82b882c146105ad578063cd5c645c146105cd578063ce8efa0e146105ed578063da7422281461061a57610256565b8063964efe81116100e7578063964efe81146105185780639673d01b146105385780639a7b5f1114610558578063a2419a6b14610578578063c1ea38681461058d57610256565b8063715018a6146104ac5780637b46c54f146104c15780638456cb59146104ee5780638da5cb5b1461050357610256565b80633f4ba83a1161019b5780635c975abb1161016a5780635c975abb146104205780635fcbd285146104355780636b5399b8146104575780636e553f65146104775780636ef8d66d1461049757610256565b80633f4ba83a1461039e57806346cf889c146103b357806346fbf68e146103d3578063572b6c051461040057610256565b80631f8bc790116101d75780631f8bc7901461030157806322b5c821146103315780632a55b2f8146103515780632cd271e71461037e57610256565b8062f714ce1461025b578063150b7a021461027d57806318a1f564146102b357806319c78b43146102d357610256565b36610256576102146106da565b6001600160a01b03167fdc5856b3d7b3107afc1a59863f377452f210536a45526c9b4ea9c9b02980e6d63460405161024c91906138b3565b60405180910390a2005b600080fd5b34801561026757600080fd5b5061027b61027636600461315f565b6106ea565b005b34801561028957600080fd5b5061029d610298366004612fd3565b61076a565b6040516102aa91906132b2565b60405180910390f35b3480156102bf57600080fd5b5061027b6102ce366004612f93565b610794565b3480156102df57600080fd5b506102f36102ee36600461306d565b610903565b6040516102aa9291906138bc565b34801561030d57600080fd5b5061032161031c36600461312f565b610940565b6040516102aa94939291906131e4565b34801561033d57600080fd5b5061027b61034c36600461306d565b610976565b34801561035d57600080fd5b5061037161036c36600461306d565b610a6f565b6040516102aa91906138b3565b34801561038a57600080fd5b5061027b610399366004612f00565b610b0f565b3480156103aa57600080fd5b5061027b610b65565b3480156103bf57600080fd5b506103716103ce366004612f00565b610b94565b3480156103df57600080fd5b506103f36103ee366004612f00565b610d64565b6040516102aa91906132a7565b34801561040c57600080fd5b506103f361041b366004612f00565b610d78565b34801561042c57600080fd5b506103f3610d8c565b34801561044157600080fd5b5061044a610d95565b6040516102aa91906131d0565b34801561046357600080fd5b50610371610472366004612f00565b610da4565b34801561048357600080fd5b5061027b61049236600461315f565b610db7565b3480156104a357600080fd5b5061027b61128d565b3480156104b857600080fd5b5061027b611321565b3480156104cd57600080fd5b506104e16104dc366004612f00565b61136a565b6040516102aa919061389c565b3480156104fa57600080fd5b5061027b61145f565b34801561050f57600080fd5b5061044a61148c565b34801561052457600080fd5b50610371610533366004612f00565b61149b565b34801561054457600080fd5b5061037161055336600461312f565b6114f9565b34801561056457600080fd5b506102f3610573366004612f00565b6116e4565b34801561058457600080fd5b5061044a6116fd565b34801561059957600080fd5b5061027b6105a8366004613098565b61170c565b3480156105b957600080fd5b506103716105c836600461306d565b61184e565b3480156105d957600080fd5b5061027b6105e8366004612f00565b611880565b3480156105f957600080fd5b5061060d610608366004612f00565b611935565b6040516102aa9190613263565b34801561062657600080fd5b5061027b610635366004612f00565b6119a2565b34801561064657600080fd5b5061027b61065536600461315f565b6119ea565b34801561066657600080fd5b5061027b61067536600461318e565b611a8b565b34801561068657600080fd5b5061027b610695366004612f00565b611ae3565b3480156106a657600080fd5b5061044a6106b5366004612f00565b611b51565b3480156106c657600080fd5b5061027b6106d5366004612f38565b611b6d565b60006106e4611c38565b90505b90565b6106f2610d8c565b156107185760405162461bcd60e51b815260040161070f906134c7565b60405180910390fd5b600260ca54141561073b5760405162461bcd60e51b815260040161070f906137b1565b600260ca55600061075361074d6106da565b84610a6f565b9050610760838383611c66565b5050600160ca5550565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b61079c6106da565b6001600160a01b03166107ad61148c565b6001600160a01b0316146107d35760405162461bcd60e51b815260040161070f90613603565b6001600160a01b0383811660009081526101006020526040902054161561080c5760405162461bcd60e51b815260040161070f90613328565b6001600160a01b0383166108325760405162461bcd60e51b815260040161070f90613730565b6001600160a01b0382166108585760405162461bcd60e51b815260040161070f906134f1565b6001600160a01b0383811660009081526101006020908152604080832080546001600160a01b03191694871694909417909355610103815282822083518085018552858152428184019081528254600181810185559386529390942090516002909302019182559151910155517f7c250d928c82e44e43a3f894c7ea93f9be918af0d8f6b945fdcce8445bfb4522906108f690859085908590613226565b60405180910390a1505050565b610103602052816000526040600020818154811061092057600080fd5b600091825260209091206002909102018054600190910154909250905082565b60ff6020819052600091825260409091208054600182015460028301546003909301546001600160a01b03909216939092911684565b61097e6106da565b6001600160a01b031661098f61148c565b6001600160a01b0316146109b55760405162461bcd60e51b815260040161070f90613603565b701d6329f1c35ca4bfabb9f56100000000008111156109e65760405162461bcd60e51b815260040161070f90613396565b6001600160a01b038216600081815261010360209081526040808320815180830183528681524281850190815282546001818101855593875294909520905160029094020192835592519190920155517f4c0d746c25d43d18da7b1762d9676c9256f91be526076a4e67d37a24624adcef90610a639084906138b3565b60405180910390a25050565b6001600160a01b03821660009081526101016020526040812054815b81811015610af1576001600160a01b038516600090815261010160205260409020805485919083908110610acf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001541415610ae9579150610b099050565b600101610a8b565b60405162461bcd60e51b815260040161070f9061386f565b92915050565b610b1833610d64565b610b345760405162461bcd60e51b815260040161070f9061381f565b610b3c610d8c565b15610b595760405162461bcd60e51b815260040161070f906134c7565b610b6281612065565b50565b610b6e33610d64565b610b8a5760405162461bcd60e51b815260040161070f9061381f565b610b926120d4565b565b6001600160a01b038116600090815260fe602090815260408083206001908101546101039093529083205483929142918491610bcf91613937565b90505b818310610bde57610cff565b6001600160a01b0386166000908152610103602052604090208054610c3491859184908110610c1d57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154612142565b6001600160a01b03871660009081526101036020526040902080549184039183908110610c7157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015402840193506101036000876001600160a01b03166001600160a01b031681526020019081526020016000208181548110610ccd57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015491508060001415610cef57610cff565b610cf88161397e565b9050610bd2565b6001600160a01b03861660009081526101026020526040902054610d2864e8d4a5100086613918565b610d3291906138f8565b6001600160a01b038716600090815260fe6020526040902054909450610d5890856138e0565b9450505050505b919050565b60c9546001600160a01b0390811691161490565b6033546001600160a01b0390811691161490565b60975460ff1690565b60fc546001600160a01b031681565b6101026020526000908152604090205481565b610dbf610d8c565b15610ddc5760405162461bcd60e51b815260040161070f906134c7565b600260ca541415610dff5760405162461bcd60e51b815260040161070f906137b1565b600260ca556000610e0e6106da565b90506001600160a01b038216610e365760405162461bcd60e51b815260040161070f906135a3565b60fc5460405163e985e9c560e01b81526001600160a01b039091169063e985e9c590610e68908490309060040161320c565b60206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb8919061310f565b80610f49575060fc5460405163020604bf60e21b815230916001600160a01b03169063081812fc90610eee9087906004016138b3565b60206040518083038186803b158015610f0657600080fd5b505afa158015610f1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3e9190612f1c565b6001600160a01b0316145b610f655760405162461bcd60e51b815260040161070f90613705565b600083815260ff60208190526040909120600381015490911615610f9b5760405162461bcd60e51b815260040161070f906135cc565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db6090610fd09089906004016138b3565b60606040518083038186803b158015610fe857600080fd5b505afa158015610ffc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102091906130d9565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b15801561106957600080fd5b505afa15801561107d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a19190613147565b6110ab90826138f8565b6001600160a01b0383811660009081526101006020526040902054919250166110e65760405162461bcd60e51b815260040161070f9061366f565b6001600160a01b0382166000908152610103602052604090205461111c5760405162461bcd60e51b815260040161070f9061366f565b60fc54604051632142170760e11b81526001600160a01b03909116906342842e0e9061115090879030908b90600401613226565b600060405180830381600087803b15801561116a57600080fd5b505af115801561117e573d6000803e3d6000fd5b50505050600061118d8361136a565b60038501805460ff1916600117905584546001600160a01b0388166001600160a01b0319909116178555805190915064e8d4a51000906111cd9084613918565b6111d791906138f8565b6001808601919091556001600160a01b038088166000908152610101602090815260408083208054958601815583528183209094018b90559186168152610102909152908120805484929061122d9084906138e0565b92505081905550826001600160a01b0316856001600160a01b03167f5c8d1f77b6233deba47b516a690497af4c7f1be42a768e331832cb02b3400d6b8960405161127791906138b3565b60405180910390a35050600160ca555050505050565b61129633610d64565b6112b25760405162461bcd60e51b815260040161070f9061381f565b6112ba610d8c565b156112d75760405162461bcd60e51b815260040161070f906134c7565b60c9546040516000916001600160a01b0316907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a811908390a360c980546001600160a01b0319169055565b6113296106da565b6001600160a01b031661133a61148c565b6001600160a01b0316146113605760405162461bcd60e51b815260040161070f90613603565b610b92600061215b565b611372612ee6565b61137a610d8c565b156113975760405162461bcd60e51b815260040161070f906134c7565b506001600160a01b038116600081815260fe60209081526040808320815180830183528154815260019091015481840152938352610102909152902054156113e5576113e282610b94565b81525b4260208083019182526001600160a01b038416600081815260fe835260408082208651815594516001909501859055610102909352829020548451925191937ffa4534c55db3b65cd96eafe03e5ce9fd87638590f49d5907978ff8489ea66ecb93611452939192916138ca565b60405180910390a2919050565b61146833610d64565b6114845760405162461bcd60e51b815260040161070f9061381f565b610b926121ad565b6065546001600160a01b031690565b6001600160a01b03811660009081526101036020526040812080546114c290600190613937565b815481106114e057634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600001549050919050565b600081815260ff602081905260408220600381015490911661151f576000915050610d5f565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db60906115549088906004016138b3565b60606040518083038186803b15801561156c57600080fd5b505afa158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a491906130d9565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b1580156115ed57600080fd5b505afa158015611601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116259190613147565b61162f90826138f8565b6001600160a01b038316600090815260fe6020908152604091829020825180840190935280548084526001909101549183018290529293509091904211801561169057506001600160a01b0384166000908152610102602052604090205415155b156116a15761169e84610b94565b90505b6002850154600186015464e8d4a510006116bb8487613918565b6116c591906138f8565b6116cf9190613937565b6116d991906138e0565b979650505050505050565b60fe602052600090815260409020805460019091015482565b60fd546001600160a01b031681565b6117146106da565b6001600160a01b031661172561148c565b6001600160a01b03161461174b5760405162461bcd60e51b815260040161070f90613603565b6001600160a01b0381166117715760405162461bcd60e51b815260040161070f906135a3565b8161178e5760405162461bcd60e51b815260040161070f90613528565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611835576000816001600160a01b0316836040516117cc906106e7565b60006040518083038185875af1925050503d8060008114611809576040519150601f19603f3d011682016040523d82523d6000602084013e61180e565b606091505b505090508061182f5760405162461bcd60e51b815260040161070f9061335f565b50611849565b6118496001600160a01b0384168284612208565b505050565b610101602052816000526040600020818154811061186b57600080fd5b90600052602060002001600091509150505481565b6118886106da565b6001600160a01b031661189961148c565b6001600160a01b0316146118bf5760405162461bcd60e51b815260040161070f90613603565b6001600160a01b0381166118e55760405162461bcd60e51b815260040161070f906137e8565b60fd80546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fc4c228afa62bc2b81cbfa4764a417d7a0cb5267d32f5e3e34b34e35f44aa1ff390600090a250565b6001600160a01b0381166000908152610101602090815260409182902080548351818402810184019094528084526060939283018282801561199657602002820191906000526020600020905b815481526020019060010190808311611982575b50505050509050919050565b6119aa6106da565b6001600160a01b03166119bb61148c565b6001600160a01b0316146119e15760405162461bcd60e51b815260040161070f90613603565b610b628161225e565b6119f2610d8c565b15611a0f5760405162461bcd60e51b815260040161070f906134c7565b600260ca541415611a325760405162461bcd60e51b815260040161070f906137b1565b600260ca55611a3f6106da565b600083815260ff60205260409020546001600160a01b03908116911614611a785760405162461bcd60e51b815260040161070f906136a6565b611a8282826122ce565b5050600160ca55565b611a93610d8c565b15611ab05760405162461bcd60e51b815260040161070f906134c7565b600260ca541415611ad35760405162461bcd60e51b815260040161070f906137b1565b600260ca55610760838383611c66565b611aeb6106da565b6001600160a01b0316611afc61148c565b6001600160a01b031614611b225760405162461bcd60e51b815260040161070f90613603565b6001600160a01b038116611b485760405162461bcd60e51b815260040161070f906133cd565b610b628161215b565b610100602052600090815260409020546001600160a01b031681565b600054610100900460ff1680611b86575060005460ff16155b611ba25760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015611bcd576000805460ff1961ff0019909116610100171660011790555b611bd685612719565b611bde6127a0565b611be784612824565b611bef6128e2565b60fd80546001600160a01b038086166001600160a01b03199283161790925560fc8054928516929091169190911790558015611c31576000805461ff00191690555b5050505050565b6000611c4333610d78565b15611c57575060131936013560601c6106e7565b611c5f61294a565b90506106e7565b6000611c706106da565b6001600160a01b0381166000908152610101602052604090208054919250859184908110611cae57634e487b7160e01b600052603260045260246000fd5b906000526020600020015414611cd65760405162461bcd60e51b815260040161070f906136a6565b600084815260ff60205260409020546001600160a01b03828116911614611d0f5760405162461bcd60e51b815260040161070f906136a6565b600084815260ff602052604090206002015415611d3e5760405162461bcd60e51b815260040161070f90613413565b6001600160a01b0381166000908152610101602052604090208054611d6590600190613937565b81548110611d8357634e487b7160e01b600052603260045260246000fd5b90600052602060002001546101016000836001600160a01b03166001600160a01b031681526020019081526020016000208381548110611dd357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b038316815261010190915260409020805480611e1757634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055611e3784846122ce565b600084815260ff602052604080822080546001600160a01b03191681556001810183905560028101839055600301805460ff1916905560fc549051630348a6db60e51b815282916001600160a01b031690636914db6090611e9c9089906004016138b3565b60606040518083038186803b158015611eb457600080fd5b505afa158015611ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eec91906130d9565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b158015611f3557600080fd5b505afa158015611f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6d9190613147565b611f7790826138f8565b6001600160a01b03831660009081526101026020526040812080549293508392909190611fa5908490613937565b909155505060fc54604051632142170760e11b81526001600160a01b03909116906342842e0e90611fde90309087908b90600401613226565b600060405180830381600087803b158015611ff857600080fd5b505af115801561200c573d6000803e3d6000fd5b50505050846001600160a01b0316836001600160a01b03167f48ce91f1a4c01bb1d97a89b885877d2c4654fd733041b4ea000924fb306a8038848960405161205592919061324a565b60405180910390a3505050505050565b6001600160a01b03811661207857600080fd5b60c9546040516001600160a01b038084169216907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a81190600090a360c980546001600160a01b0319166001600160a01b0392909216919091179055565b6120dc610d8c565b6120f85760405162461bcd60e51b815260040161070f906132fa565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61212b6106da565b60405161213891906131d0565b60405180910390a1565b6000818310156121525781612154565b825b9392505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6121b5610d8c565b156121d25760405162461bcd60e51b815260040161070f906134c7565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861212b6106da565b6118498363a9059cbb60e01b848460405160240161222792919061324a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261294e565b6001600160a01b0381166122845760405162461bcd60e51b815260040161070f9061344a565b603380546001600160a01b0319166001600160a01b0383169081179091556040517f871264f4293af7d2865ae7eae628b228f4991c57cb45b39c99f0b774ebe2901890600090a250565b600082815260ff6020819052604090912060038101549091166123035760405162461bcd60e51b815260040161070f9061386f565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db60906123389088906004016138b3565b60606040518083038186803b15801561235057600080fd5b505afa158015612364573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238891906130d9565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b1580156123d157600080fd5b505afa1580156123e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124099190613147565b61241390826138f8565b905060006124208361136a565b905060008083156126975760028601546001870154845164e8d4a51000906124489088613918565b61245291906138f8565b61245c9190613937565b61246691906138e0565b6001600160a01b03868116600090815261010060205260409020549193501673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156125ca5747808311156125395780830387600201819055506000886001600160a01b0316826040516124cd906106e7565b60006040518083038185875af1925050503d806000811461250a576040519150601f19603f3d011682016040523d82523d6000602084013e61250f565b606091505b50509050806125305760405162461bcd60e51b815260040161070f9061335f565b819250506125c4565b600087600201819055506000886001600160a01b03168460405161255c906106e7565b60006040518083038185875af1925050503d8060008114612599576040519150601f19603f3d011682016040523d82523d6000602084013e61259e565b606091505b50509050806125bf5760405162461bcd60e51b815260040161070f9061335f565b839250505b50612697565b6001600160a01b03808616600090815261010060205260408082205490516370a0823160e01b815292169182906370a082319061260b9030906004016131d0565b60206040518083038186803b15801561262357600080fd5b505afa158015612637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265b9190613147565b90508084111561267f57808403600289015561267882828b6129dd565b9250612694565b6000600289015561269182858b6129dd565b92505b50505b825164e8d4a51000906126aa9086613918565b6126b491906138f8565b60018701556001600160a01b038088169086166126cf6106da565b6001600160a01b03167f9a10eacd1c879d4cddc2387cfbc23057de5f4d554a91e9eb7e07c66ead11c9df8460405161270791906138b3565b60405180910390a45050505050505050565b600054610100900460ff1680612732575060005460ff16155b61274e5760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612779576000805460ff1961ff0019909116610100171660011790555b612781612b01565b61278a82612b74565b801561279c576000805461ff00191690555b5050565b600054610100900460ff16806127b9575060005460ff16155b6127d55760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612800576000805460ff1961ff0019909116610100171660011790555b612808612b01565b612810612c04565b8015610b62576000805461ff001916905550565b600054610100900460ff168061283d575060005460ff16155b6128595760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612884576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0382166128aa5760405162461bcd60e51b815260040161070f90613638565b6128b2612c74565b60c980546001600160a01b0319166001600160a01b038416179055801561279c576000805461ff00191690555050565b600054610100900460ff16806128fb575060005460ff16155b6129175760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612942576000805460ff1961ff0019909116610100171660011790555b612810612ce4565b3390565b60006129a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d5d9092919063ffffffff16565b80519091501561184957808060200190518101906129c1919061310f565b6118495760405162461bcd60e51b815260040161070f90613767565b600080846001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a0c91906131d0565b60206040518083038186803b158015612a2457600080fd5b505afa158015612a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5c9190613147565b9050612a726001600160a01b0386168486612208565b6040516370a0823160e01b81526001600160a01b038616906370a0823190612a9e9030906004016131d0565b60206040518083038186803b158015612ab657600080fd5b505afa158015612aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aee9190613147565b612af89082613937565b95945050505050565b600054610100900460ff1680612b1a575060005460ff16155b612b365760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612810576000805460ff1961ff0019909116610100171660011790558015610b62576000805461ff001916905550565b600054610100900460ff1680612b8d575060005460ff16155b612ba95760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612bd4576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b038416179055801561279c576000805461ff00191690555050565b600054610100900460ff1680612c1d575060005460ff16155b612c395760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612c64576000805460ff1961ff0019909116610100171660011790555b612810612c6f6106da565b61215b565b600054610100900460ff1680612c8d575060005460ff16155b612ca95760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612cd4576000805460ff1961ff0019909116610100171660011790555b612cdc612b01565b612810612d74565b600054610100900460ff1680612cfd575060005460ff16155b612d195760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612d44576000805460ff1961ff0019909116610100171660011790555b600160ca558015610b62576000805461ff001916905550565b6060612d6c8484600085612df2565b949350505050565b600054610100900460ff1680612d8d575060005460ff16155b612da95760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612dd4576000805460ff1961ff0019909116610100171660011790555b6097805460ff191690558015610b62576000805461ff001916905550565b606082471015612e145760405162461bcd60e51b815260040161070f90613481565b612e1d85612ea7565b612e395760405162461bcd60e51b815260040161070f906136ce565b600080866001600160a01b03168587604051612e5591906131b4565b60006040518083038185875af1925050503d8060008114612e92576040519150601f19603f3d011682016040523d82523d6000602084013e612e97565b606091505b50915091506116d9828286612ead565b3b151590565b60608315612ebc575081612154565b825115612ecc5782518084602001fd5b8160405162461bcd60e51b815260040161070f91906132c7565b604051806040016040528060008152602001600081525090565b600060208284031215612f11578081fd5b8135612154816139ab565b600060208284031215612f2d578081fd5b8151612154816139ab565b60008060008060808587031215612f4d578283fd5b8435612f58816139ab565b93506020850135612f68816139ab565b92506040850135612f78816139ab565b91506060850135612f88816139ab565b939692955090935050565b600080600060608486031215612fa7578283fd5b8335612fb2816139ab565b92506020840135612fc2816139ab565b929592945050506040919091013590565b600080600080600060808688031215612fea578081fd5b8535612ff5816139ab565b94506020860135613005816139ab565b935060408601359250606086013567ffffffffffffffff80821115613028578283fd5b818801915088601f83011261303b578283fd5b813581811115613049578384fd5b89602082850101111561305a578384fd5b9699959850939650602001949392505050565b6000806040838503121561307f578182fd5b823561308a816139ab565b946020939093013593505050565b6000806000606084860312156130ac578283fd5b83356130b7816139ab565b92506020840135915060408401356130ce816139ab565b809150509250925092565b6000806000606084860312156130ed578283fd5b83516130f8816139ab565b602085015160409095015190969495509392505050565b600060208284031215613120578081fd5b81518015158114612154578182fd5b600060208284031215613140578081fd5b5035919050565b600060208284031215613158578081fd5b5051919050565b60008060408385031215613171578182fd5b823591506020830135613183816139ab565b809150509250929050565b6000806000606084860312156131a2578081fd5b833592506020840135612fc2816139ab565b600082516131c681846020870161394e565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03949094168452602084019290925260408301521515606082015260800190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561329b5783518352928401929184019160010161327f565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526132e681604085016020870161394e565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252601d908201527f4552525f5f504f4f4c5f414c52454144595f494e495449414c495a4544000000604082015260600190565b6020808252601b908201527f4552525f5f4e41544956455f5452414e534645525f4641494c45440000000000604082015260600190565b6020808252601f908201527f4552525f5f5245574152445f5045525f5345434f4e445f544f4f5f4849474800604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526019908201527f4552525f5f554e504149445f524557415244535f455849535400000000000000604082015260600190565b6020808252601b908201527f54727573746564466f727761726465722063616e277420626520300000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526018908201527f4552525f5245574152445f544f4b454e5f49535f5a45524f0000000000000000604082015260600190565b6020808252601390820152724552525f5f414d4f554e545f49535f5a45524f60681b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252600f908201526e4552525f5f544f5f49535f5a45524f60881b604082015260600190565b60208082526017908201527f4552525f5f4e46545f414c52454144595f5354414b4544000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f50617573657220416464726573732063616e6e6f742062652030000000000000604082015260600190565b60208082526019908201527f4552525f5f504f4f4c5f4e4f545f494e495449414c495a454400000000000000604082015260600190565b6020808252600e908201526d22a9292fafa727aa2fa7aba722a960911b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526011908201527011549497d7d393d517d054141493d59151607a1b604082015260600190565b60208082526017908201527f4552525f5f424153455f544f4b454e5f49535f5a45524f000000000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f4552525f5f4c49515549444954595f50524f56494445525f49535f5a45524f00604082015260600190565b60208082526030908201527f4f6e6c792070617573657220697320616c6c6f77656420746f20706572666f7260408201526f36903a3434b99037b832b930ba34b7b760811b606082015260800190565b60208082526013908201527211549497d7d3919517d393d517d4d51052d151606a1b604082015260600190565b815181526020918201519181019190915260400190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b600082198211156138f3576138f3613995565b500190565b60008261391357634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561393257613932613995565b500290565b60008282101561394957613949613995565b500390565b60005b83811015613969578181015183820152602001613951565b83811115613978576000848401525b50505050565b60008161398d5761398d613995565b506000190190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610b6257600080fdfea26469706673582212201cce19402cae7aa54f66cdbbd286e062b0a2a4999011c6f34150393d634ee2ca64736f6c63430008000033
Deployed Bytecode
0x6080604052600436106102075760003560e01c8063715018a611610118578063c82b882c116100a0578063ddc645981161006f578063ddc645981461063a578063ea1503521461065a578063f2fde38b1461067a578063f5ab16cc1461069a578063f8c8765e146106ba57610256565b8063c82b882c146105ad578063cd5c645c146105cd578063ce8efa0e146105ed578063da7422281461061a57610256565b8063964efe81116100e7578063964efe81146105185780639673d01b146105385780639a7b5f1114610558578063a2419a6b14610578578063c1ea38681461058d57610256565b8063715018a6146104ac5780637b46c54f146104c15780638456cb59146104ee5780638da5cb5b1461050357610256565b80633f4ba83a1161019b5780635c975abb1161016a5780635c975abb146104205780635fcbd285146104355780636b5399b8146104575780636e553f65146104775780636ef8d66d1461049757610256565b80633f4ba83a1461039e57806346cf889c146103b357806346fbf68e146103d3578063572b6c051461040057610256565b80631f8bc790116101d75780631f8bc7901461030157806322b5c821146103315780632a55b2f8146103515780632cd271e71461037e57610256565b8062f714ce1461025b578063150b7a021461027d57806318a1f564146102b357806319c78b43146102d357610256565b36610256576102146106da565b6001600160a01b03167fdc5856b3d7b3107afc1a59863f377452f210536a45526c9b4ea9c9b02980e6d63460405161024c91906138b3565b60405180910390a2005b600080fd5b34801561026757600080fd5b5061027b61027636600461315f565b6106ea565b005b34801561028957600080fd5b5061029d610298366004612fd3565b61076a565b6040516102aa91906132b2565b60405180910390f35b3480156102bf57600080fd5b5061027b6102ce366004612f93565b610794565b3480156102df57600080fd5b506102f36102ee36600461306d565b610903565b6040516102aa9291906138bc565b34801561030d57600080fd5b5061032161031c36600461312f565b610940565b6040516102aa94939291906131e4565b34801561033d57600080fd5b5061027b61034c36600461306d565b610976565b34801561035d57600080fd5b5061037161036c36600461306d565b610a6f565b6040516102aa91906138b3565b34801561038a57600080fd5b5061027b610399366004612f00565b610b0f565b3480156103aa57600080fd5b5061027b610b65565b3480156103bf57600080fd5b506103716103ce366004612f00565b610b94565b3480156103df57600080fd5b506103f36103ee366004612f00565b610d64565b6040516102aa91906132a7565b34801561040c57600080fd5b506103f361041b366004612f00565b610d78565b34801561042c57600080fd5b506103f3610d8c565b34801561044157600080fd5b5061044a610d95565b6040516102aa91906131d0565b34801561046357600080fd5b50610371610472366004612f00565b610da4565b34801561048357600080fd5b5061027b61049236600461315f565b610db7565b3480156104a357600080fd5b5061027b61128d565b3480156104b857600080fd5b5061027b611321565b3480156104cd57600080fd5b506104e16104dc366004612f00565b61136a565b6040516102aa919061389c565b3480156104fa57600080fd5b5061027b61145f565b34801561050f57600080fd5b5061044a61148c565b34801561052457600080fd5b50610371610533366004612f00565b61149b565b34801561054457600080fd5b5061037161055336600461312f565b6114f9565b34801561056457600080fd5b506102f3610573366004612f00565b6116e4565b34801561058457600080fd5b5061044a6116fd565b34801561059957600080fd5b5061027b6105a8366004613098565b61170c565b3480156105b957600080fd5b506103716105c836600461306d565b61184e565b3480156105d957600080fd5b5061027b6105e8366004612f00565b611880565b3480156105f957600080fd5b5061060d610608366004612f00565b611935565b6040516102aa9190613263565b34801561062657600080fd5b5061027b610635366004612f00565b6119a2565b34801561064657600080fd5b5061027b61065536600461315f565b6119ea565b34801561066657600080fd5b5061027b61067536600461318e565b611a8b565b34801561068657600080fd5b5061027b610695366004612f00565b611ae3565b3480156106a657600080fd5b5061044a6106b5366004612f00565b611b51565b3480156106c657600080fd5b5061027b6106d5366004612f38565b611b6d565b60006106e4611c38565b90505b90565b6106f2610d8c565b156107185760405162461bcd60e51b815260040161070f906134c7565b60405180910390fd5b600260ca54141561073b5760405162461bcd60e51b815260040161070f906137b1565b600260ca55600061075361074d6106da565b84610a6f565b9050610760838383611c66565b5050600160ca5550565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b61079c6106da565b6001600160a01b03166107ad61148c565b6001600160a01b0316146107d35760405162461bcd60e51b815260040161070f90613603565b6001600160a01b0383811660009081526101006020526040902054161561080c5760405162461bcd60e51b815260040161070f90613328565b6001600160a01b0383166108325760405162461bcd60e51b815260040161070f90613730565b6001600160a01b0382166108585760405162461bcd60e51b815260040161070f906134f1565b6001600160a01b0383811660009081526101006020908152604080832080546001600160a01b03191694871694909417909355610103815282822083518085018552858152428184019081528254600181810185559386529390942090516002909302019182559151910155517f7c250d928c82e44e43a3f894c7ea93f9be918af0d8f6b945fdcce8445bfb4522906108f690859085908590613226565b60405180910390a1505050565b610103602052816000526040600020818154811061092057600080fd5b600091825260209091206002909102018054600190910154909250905082565b60ff6020819052600091825260409091208054600182015460028301546003909301546001600160a01b03909216939092911684565b61097e6106da565b6001600160a01b031661098f61148c565b6001600160a01b0316146109b55760405162461bcd60e51b815260040161070f90613603565b701d6329f1c35ca4bfabb9f56100000000008111156109e65760405162461bcd60e51b815260040161070f90613396565b6001600160a01b038216600081815261010360209081526040808320815180830183528681524281850190815282546001818101855593875294909520905160029094020192835592519190920155517f4c0d746c25d43d18da7b1762d9676c9256f91be526076a4e67d37a24624adcef90610a639084906138b3565b60405180910390a25050565b6001600160a01b03821660009081526101016020526040812054815b81811015610af1576001600160a01b038516600090815261010160205260409020805485919083908110610acf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001541415610ae9579150610b099050565b600101610a8b565b60405162461bcd60e51b815260040161070f9061386f565b92915050565b610b1833610d64565b610b345760405162461bcd60e51b815260040161070f9061381f565b610b3c610d8c565b15610b595760405162461bcd60e51b815260040161070f906134c7565b610b6281612065565b50565b610b6e33610d64565b610b8a5760405162461bcd60e51b815260040161070f9061381f565b610b926120d4565b565b6001600160a01b038116600090815260fe602090815260408083206001908101546101039093529083205483929142918491610bcf91613937565b90505b818310610bde57610cff565b6001600160a01b0386166000908152610103602052604090208054610c3491859184908110610c1d57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154612142565b6001600160a01b03871660009081526101036020526040902080549184039183908110610c7157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015402840193506101036000876001600160a01b03166001600160a01b031681526020019081526020016000208181548110610ccd57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015491508060001415610cef57610cff565b610cf88161397e565b9050610bd2565b6001600160a01b03861660009081526101026020526040902054610d2864e8d4a5100086613918565b610d3291906138f8565b6001600160a01b038716600090815260fe6020526040902054909450610d5890856138e0565b9450505050505b919050565b60c9546001600160a01b0390811691161490565b6033546001600160a01b0390811691161490565b60975460ff1690565b60fc546001600160a01b031681565b6101026020526000908152604090205481565b610dbf610d8c565b15610ddc5760405162461bcd60e51b815260040161070f906134c7565b600260ca541415610dff5760405162461bcd60e51b815260040161070f906137b1565b600260ca556000610e0e6106da565b90506001600160a01b038216610e365760405162461bcd60e51b815260040161070f906135a3565b60fc5460405163e985e9c560e01b81526001600160a01b039091169063e985e9c590610e68908490309060040161320c565b60206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb8919061310f565b80610f49575060fc5460405163020604bf60e21b815230916001600160a01b03169063081812fc90610eee9087906004016138b3565b60206040518083038186803b158015610f0657600080fd5b505afa158015610f1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3e9190612f1c565b6001600160a01b0316145b610f655760405162461bcd60e51b815260040161070f90613705565b600083815260ff60208190526040909120600381015490911615610f9b5760405162461bcd60e51b815260040161070f906135cc565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db6090610fd09089906004016138b3565b60606040518083038186803b158015610fe857600080fd5b505afa158015610ffc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102091906130d9565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b15801561106957600080fd5b505afa15801561107d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a19190613147565b6110ab90826138f8565b6001600160a01b0383811660009081526101006020526040902054919250166110e65760405162461bcd60e51b815260040161070f9061366f565b6001600160a01b0382166000908152610103602052604090205461111c5760405162461bcd60e51b815260040161070f9061366f565b60fc54604051632142170760e11b81526001600160a01b03909116906342842e0e9061115090879030908b90600401613226565b600060405180830381600087803b15801561116a57600080fd5b505af115801561117e573d6000803e3d6000fd5b50505050600061118d8361136a565b60038501805460ff1916600117905584546001600160a01b0388166001600160a01b0319909116178555805190915064e8d4a51000906111cd9084613918565b6111d791906138f8565b6001808601919091556001600160a01b038088166000908152610101602090815260408083208054958601815583528183209094018b90559186168152610102909152908120805484929061122d9084906138e0565b92505081905550826001600160a01b0316856001600160a01b03167f5c8d1f77b6233deba47b516a690497af4c7f1be42a768e331832cb02b3400d6b8960405161127791906138b3565b60405180910390a35050600160ca555050505050565b61129633610d64565b6112b25760405162461bcd60e51b815260040161070f9061381f565b6112ba610d8c565b156112d75760405162461bcd60e51b815260040161070f906134c7565b60c9546040516000916001600160a01b0316907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a811908390a360c980546001600160a01b0319169055565b6113296106da565b6001600160a01b031661133a61148c565b6001600160a01b0316146113605760405162461bcd60e51b815260040161070f90613603565b610b92600061215b565b611372612ee6565b61137a610d8c565b156113975760405162461bcd60e51b815260040161070f906134c7565b506001600160a01b038116600081815260fe60209081526040808320815180830183528154815260019091015481840152938352610102909152902054156113e5576113e282610b94565b81525b4260208083019182526001600160a01b038416600081815260fe835260408082208651815594516001909501859055610102909352829020548451925191937ffa4534c55db3b65cd96eafe03e5ce9fd87638590f49d5907978ff8489ea66ecb93611452939192916138ca565b60405180910390a2919050565b61146833610d64565b6114845760405162461bcd60e51b815260040161070f9061381f565b610b926121ad565b6065546001600160a01b031690565b6001600160a01b03811660009081526101036020526040812080546114c290600190613937565b815481106114e057634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600001549050919050565b600081815260ff602081905260408220600381015490911661151f576000915050610d5f565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db60906115549088906004016138b3565b60606040518083038186803b15801561156c57600080fd5b505afa158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a491906130d9565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b1580156115ed57600080fd5b505afa158015611601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116259190613147565b61162f90826138f8565b6001600160a01b038316600090815260fe6020908152604091829020825180840190935280548084526001909101549183018290529293509091904211801561169057506001600160a01b0384166000908152610102602052604090205415155b156116a15761169e84610b94565b90505b6002850154600186015464e8d4a510006116bb8487613918565b6116c591906138f8565b6116cf9190613937565b6116d991906138e0565b979650505050505050565b60fe602052600090815260409020805460019091015482565b60fd546001600160a01b031681565b6117146106da565b6001600160a01b031661172561148c565b6001600160a01b03161461174b5760405162461bcd60e51b815260040161070f90613603565b6001600160a01b0381166117715760405162461bcd60e51b815260040161070f906135a3565b8161178e5760405162461bcd60e51b815260040161070f90613528565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611835576000816001600160a01b0316836040516117cc906106e7565b60006040518083038185875af1925050503d8060008114611809576040519150601f19603f3d011682016040523d82523d6000602084013e61180e565b606091505b505090508061182f5760405162461bcd60e51b815260040161070f9061335f565b50611849565b6118496001600160a01b0384168284612208565b505050565b610101602052816000526040600020818154811061186b57600080fd5b90600052602060002001600091509150505481565b6118886106da565b6001600160a01b031661189961148c565b6001600160a01b0316146118bf5760405162461bcd60e51b815260040161070f90613603565b6001600160a01b0381166118e55760405162461bcd60e51b815260040161070f906137e8565b60fd80546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fc4c228afa62bc2b81cbfa4764a417d7a0cb5267d32f5e3e34b34e35f44aa1ff390600090a250565b6001600160a01b0381166000908152610101602090815260409182902080548351818402810184019094528084526060939283018282801561199657602002820191906000526020600020905b815481526020019060010190808311611982575b50505050509050919050565b6119aa6106da565b6001600160a01b03166119bb61148c565b6001600160a01b0316146119e15760405162461bcd60e51b815260040161070f90613603565b610b628161225e565b6119f2610d8c565b15611a0f5760405162461bcd60e51b815260040161070f906134c7565b600260ca541415611a325760405162461bcd60e51b815260040161070f906137b1565b600260ca55611a3f6106da565b600083815260ff60205260409020546001600160a01b03908116911614611a785760405162461bcd60e51b815260040161070f906136a6565b611a8282826122ce565b5050600160ca55565b611a93610d8c565b15611ab05760405162461bcd60e51b815260040161070f906134c7565b600260ca541415611ad35760405162461bcd60e51b815260040161070f906137b1565b600260ca55610760838383611c66565b611aeb6106da565b6001600160a01b0316611afc61148c565b6001600160a01b031614611b225760405162461bcd60e51b815260040161070f90613603565b6001600160a01b038116611b485760405162461bcd60e51b815260040161070f906133cd565b610b628161215b565b610100602052600090815260409020546001600160a01b031681565b600054610100900460ff1680611b86575060005460ff16155b611ba25760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015611bcd576000805460ff1961ff0019909116610100171660011790555b611bd685612719565b611bde6127a0565b611be784612824565b611bef6128e2565b60fd80546001600160a01b038086166001600160a01b03199283161790925560fc8054928516929091169190911790558015611c31576000805461ff00191690555b5050505050565b6000611c4333610d78565b15611c57575060131936013560601c6106e7565b611c5f61294a565b90506106e7565b6000611c706106da565b6001600160a01b0381166000908152610101602052604090208054919250859184908110611cae57634e487b7160e01b600052603260045260246000fd5b906000526020600020015414611cd65760405162461bcd60e51b815260040161070f906136a6565b600084815260ff60205260409020546001600160a01b03828116911614611d0f5760405162461bcd60e51b815260040161070f906136a6565b600084815260ff602052604090206002015415611d3e5760405162461bcd60e51b815260040161070f90613413565b6001600160a01b0381166000908152610101602052604090208054611d6590600190613937565b81548110611d8357634e487b7160e01b600052603260045260246000fd5b90600052602060002001546101016000836001600160a01b03166001600160a01b031681526020019081526020016000208381548110611dd357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b038316815261010190915260409020805480611e1757634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055611e3784846122ce565b600084815260ff602052604080822080546001600160a01b03191681556001810183905560028101839055600301805460ff1916905560fc549051630348a6db60e51b815282916001600160a01b031690636914db6090611e9c9089906004016138b3565b60606040518083038186803b158015611eb457600080fd5b505afa158015611ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eec91906130d9565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b158015611f3557600080fd5b505afa158015611f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6d9190613147565b611f7790826138f8565b6001600160a01b03831660009081526101026020526040812080549293508392909190611fa5908490613937565b909155505060fc54604051632142170760e11b81526001600160a01b03909116906342842e0e90611fde90309087908b90600401613226565b600060405180830381600087803b158015611ff857600080fd5b505af115801561200c573d6000803e3d6000fd5b50505050846001600160a01b0316836001600160a01b03167f48ce91f1a4c01bb1d97a89b885877d2c4654fd733041b4ea000924fb306a8038848960405161205592919061324a565b60405180910390a3505050505050565b6001600160a01b03811661207857600080fd5b60c9546040516001600160a01b038084169216907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a81190600090a360c980546001600160a01b0319166001600160a01b0392909216919091179055565b6120dc610d8c565b6120f85760405162461bcd60e51b815260040161070f906132fa565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61212b6106da565b60405161213891906131d0565b60405180910390a1565b6000818310156121525781612154565b825b9392505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6121b5610d8c565b156121d25760405162461bcd60e51b815260040161070f906134c7565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861212b6106da565b6118498363a9059cbb60e01b848460405160240161222792919061324a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261294e565b6001600160a01b0381166122845760405162461bcd60e51b815260040161070f9061344a565b603380546001600160a01b0319166001600160a01b0383169081179091556040517f871264f4293af7d2865ae7eae628b228f4991c57cb45b39c99f0b774ebe2901890600090a250565b600082815260ff6020819052604090912060038101549091166123035760405162461bcd60e51b815260040161070f9061386f565b60fc54604051630348a6db60e51b815260009182916001600160a01b0390911690636914db60906123389088906004016138b3565b60606040518083038186803b15801561235057600080fd5b505afa158015612364573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238891906130d9565b60fd5460408051630fb5dc4560e21b815290519496509194506001600160a01b031692633ed7711492506004808301926020929190829003018186803b1580156123d157600080fd5b505afa1580156123e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124099190613147565b61241390826138f8565b905060006124208361136a565b905060008083156126975760028601546001870154845164e8d4a51000906124489088613918565b61245291906138f8565b61245c9190613937565b61246691906138e0565b6001600160a01b03868116600090815261010060205260409020549193501673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156125ca5747808311156125395780830387600201819055506000886001600160a01b0316826040516124cd906106e7565b60006040518083038185875af1925050503d806000811461250a576040519150601f19603f3d011682016040523d82523d6000602084013e61250f565b606091505b50509050806125305760405162461bcd60e51b815260040161070f9061335f565b819250506125c4565b600087600201819055506000886001600160a01b03168460405161255c906106e7565b60006040518083038185875af1925050503d8060008114612599576040519150601f19603f3d011682016040523d82523d6000602084013e61259e565b606091505b50509050806125bf5760405162461bcd60e51b815260040161070f9061335f565b839250505b50612697565b6001600160a01b03808616600090815261010060205260408082205490516370a0823160e01b815292169182906370a082319061260b9030906004016131d0565b60206040518083038186803b15801561262357600080fd5b505afa158015612637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265b9190613147565b90508084111561267f57808403600289015561267882828b6129dd565b9250612694565b6000600289015561269182858b6129dd565b92505b50505b825164e8d4a51000906126aa9086613918565b6126b491906138f8565b60018701556001600160a01b038088169086166126cf6106da565b6001600160a01b03167f9a10eacd1c879d4cddc2387cfbc23057de5f4d554a91e9eb7e07c66ead11c9df8460405161270791906138b3565b60405180910390a45050505050505050565b600054610100900460ff1680612732575060005460ff16155b61274e5760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612779576000805460ff1961ff0019909116610100171660011790555b612781612b01565b61278a82612b74565b801561279c576000805461ff00191690555b5050565b600054610100900460ff16806127b9575060005460ff16155b6127d55760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612800576000805460ff1961ff0019909116610100171660011790555b612808612b01565b612810612c04565b8015610b62576000805461ff001916905550565b600054610100900460ff168061283d575060005460ff16155b6128595760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612884576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0382166128aa5760405162461bcd60e51b815260040161070f90613638565b6128b2612c74565b60c980546001600160a01b0319166001600160a01b038416179055801561279c576000805461ff00191690555050565b600054610100900460ff16806128fb575060005460ff16155b6129175760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612942576000805460ff1961ff0019909116610100171660011790555b612810612ce4565b3390565b60006129a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d5d9092919063ffffffff16565b80519091501561184957808060200190518101906129c1919061310f565b6118495760405162461bcd60e51b815260040161070f90613767565b600080846001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a0c91906131d0565b60206040518083038186803b158015612a2457600080fd5b505afa158015612a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5c9190613147565b9050612a726001600160a01b0386168486612208565b6040516370a0823160e01b81526001600160a01b038616906370a0823190612a9e9030906004016131d0565b60206040518083038186803b158015612ab657600080fd5b505afa158015612aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aee9190613147565b612af89082613937565b95945050505050565b600054610100900460ff1680612b1a575060005460ff16155b612b365760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612810576000805460ff1961ff0019909116610100171660011790558015610b62576000805461ff001916905550565b600054610100900460ff1680612b8d575060005460ff16155b612ba95760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612bd4576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b038416179055801561279c576000805461ff00191690555050565b600054610100900460ff1680612c1d575060005460ff16155b612c395760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612c64576000805460ff1961ff0019909116610100171660011790555b612810612c6f6106da565b61215b565b600054610100900460ff1680612c8d575060005460ff16155b612ca95760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612cd4576000805460ff1961ff0019909116610100171660011790555b612cdc612b01565b612810612d74565b600054610100900460ff1680612cfd575060005460ff16155b612d195760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612d44576000805460ff1961ff0019909116610100171660011790555b600160ca558015610b62576000805461ff001916905550565b6060612d6c8484600085612df2565b949350505050565b600054610100900460ff1680612d8d575060005460ff16155b612da95760405162461bcd60e51b815260040161070f90613555565b600054610100900460ff16158015612dd4576000805460ff1961ff0019909116610100171660011790555b6097805460ff191690558015610b62576000805461ff001916905550565b606082471015612e145760405162461bcd60e51b815260040161070f90613481565b612e1d85612ea7565b612e395760405162461bcd60e51b815260040161070f906136ce565b600080866001600160a01b03168587604051612e5591906131b4565b60006040518083038185875af1925050503d8060008114612e92576040519150601f19603f3d011682016040523d82523d6000602084013e612e97565b606091505b50915091506116d9828286612ead565b3b151590565b60608315612ebc575081612154565b825115612ecc5782518084602001fd5b8160405162461bcd60e51b815260040161070f91906132c7565b604051806040016040528060008152602001600081525090565b600060208284031215612f11578081fd5b8135612154816139ab565b600060208284031215612f2d578081fd5b8151612154816139ab565b60008060008060808587031215612f4d578283fd5b8435612f58816139ab565b93506020850135612f68816139ab565b92506040850135612f78816139ab565b91506060850135612f88816139ab565b939692955090935050565b600080600060608486031215612fa7578283fd5b8335612fb2816139ab565b92506020840135612fc2816139ab565b929592945050506040919091013590565b600080600080600060808688031215612fea578081fd5b8535612ff5816139ab565b94506020860135613005816139ab565b935060408601359250606086013567ffffffffffffffff80821115613028578283fd5b818801915088601f83011261303b578283fd5b813581811115613049578384fd5b89602082850101111561305a578384fd5b9699959850939650602001949392505050565b6000806040838503121561307f578182fd5b823561308a816139ab565b946020939093013593505050565b6000806000606084860312156130ac578283fd5b83356130b7816139ab565b92506020840135915060408401356130ce816139ab565b809150509250925092565b6000806000606084860312156130ed578283fd5b83516130f8816139ab565b602085015160409095015190969495509392505050565b600060208284031215613120578081fd5b81518015158114612154578182fd5b600060208284031215613140578081fd5b5035919050565b600060208284031215613158578081fd5b5051919050565b60008060408385031215613171578182fd5b823591506020830135613183816139ab565b809150509250929050565b6000806000606084860312156131a2578081fd5b833592506020840135612fc2816139ab565b600082516131c681846020870161394e565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03949094168452602084019290925260408301521515606082015260800190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561329b5783518352928401929184019160010161327f565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526132e681604085016020870161394e565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252601d908201527f4552525f5f504f4f4c5f414c52454144595f494e495449414c495a4544000000604082015260600190565b6020808252601b908201527f4552525f5f4e41544956455f5452414e534645525f4641494c45440000000000604082015260600190565b6020808252601f908201527f4552525f5f5245574152445f5045525f5345434f4e445f544f4f5f4849474800604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526019908201527f4552525f5f554e504149445f524557415244535f455849535400000000000000604082015260600190565b6020808252601b908201527f54727573746564466f727761726465722063616e277420626520300000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526018908201527f4552525f5245574152445f544f4b454e5f49535f5a45524f0000000000000000604082015260600190565b6020808252601390820152724552525f5f414d4f554e545f49535f5a45524f60681b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252600f908201526e4552525f5f544f5f49535f5a45524f60881b604082015260600190565b60208082526017908201527f4552525f5f4e46545f414c52454144595f5354414b4544000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f50617573657220416464726573732063616e6e6f742062652030000000000000604082015260600190565b60208082526019908201527f4552525f5f504f4f4c5f4e4f545f494e495449414c495a454400000000000000604082015260600190565b6020808252600e908201526d22a9292fafa727aa2fa7aba722a960911b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526011908201527011549497d7d393d517d054141493d59151607a1b604082015260600190565b60208082526017908201527f4552525f5f424153455f544f4b454e5f49535f5a45524f000000000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f4552525f5f4c49515549444954595f50524f56494445525f49535f5a45524f00604082015260600190565b60208082526030908201527f4f6e6c792070617573657220697320616c6c6f77656420746f20706572666f7260408201526f36903a3434b99037b832b930ba34b7b760811b606082015260800190565b60208082526013908201527211549497d7d3919517d393d517d4d51052d151606a1b604082015260600190565b815181526020918201519181019190915260400190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b600082198211156138f3576138f3613995565b500190565b60008261391357634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561393257613932613995565b500290565b60008282101561394957613949613995565b500390565b60005b83811015613969578181015183820152602001613951565b83811115613978576000848401525b50505050565b60008161398d5761398d613995565b506000190190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610b6257600080fdfea26469706673582212201cce19402cae7aa54f66cdbbd286e062b0a2a4999011c6f34150393d634ee2ca64736f6c63430008000033
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.