Source Code
EVM
Latest 10 from a total of 10 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Collect Rewards | 18384548 | 145 days ago | IN | 0 ETH | 0.00002802 | ||||
| Update Creator R... | 17800598 | 152 days ago | IN | 0 ETH | 0.00000793 | ||||
| Update Creator R... | 17393053 | 157 days ago | IN | 0 ETH | 0.00000795 | ||||
| Collect Rewards | 17123247 | 160 days ago | IN | 0 ETH | 0.00002915 | ||||
| Update Creator R... | 16904497 | 163 days ago | IN | 0 ETH | 0.00001214 | ||||
| Update Creator R... | 16904484 | 163 days ago | IN | 0 ETH | 0.0000072 | ||||
| Collect Rewards | 16899822 | 163 days ago | IN | 0 ETH | 0.00002679 | ||||
| Collect Rewards | 16832881 | 164 days ago | IN | 0 ETH | 0.00002804 | ||||
| Collect Rewards | 16749927 | 165 days ago | IN | 0 ETH | 0.00002665 | ||||
| Collect Rewards | 16749626 | 165 days ago | IN | 0 ETH | 0.00002954 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 16301964 | 170 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LpLockerv2
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 20000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {IClanker} from "./interfaces/IClanker.sol";
import {ILpLockerv2} from "./interfaces/ILpLockerv2.sol";
import {INonfungiblePositionManager} from "./interfaces/uniswapv3.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
contract LpLockerv2 is Ownable, ILpLockerv2 {
string public constant version = "0.0.2";
address public positionManager;
address public factory;
uint256 public constant TEAM_REWARD = 20;
uint256 public immutable MAX_CREATOR_REWARD;
address public teamRecipient;
mapping(uint256 => TokenRewardInfo) public tokenRewards;
mapping(uint256 => address) public teamOverrideRewardRecipientForToken;
mapping(address => uint256[]) public creatorTokenIds;
constructor(
address owner_, // owner of the contract
address tokenFactory_, // Address of the clanker factory
address positionManager_, // Address of the position manager
address teamRecipient_ // address to receive team portion of the rewards
) Ownable(owner_) {
factory = tokenFactory_;
positionManager = positionManager_;
teamRecipient = teamRecipient_;
// match the factory's max creator reward
MAX_CREATOR_REWARD = IClanker(factory).MAX_CREATOR_REWARD();
if (MAX_CREATOR_REWARD == 0) {
revert MaxCreatorRewardNotSet();
}
// ensure the max creator reward and team reward add up to 100
if (MAX_CREATOR_REWARD + TEAM_REWARD != 100) {
revert InvalidMaxCreatorReward();
}
// ensure the team recipient is not the zero address
if (teamRecipient == address(0)) {
revert InvalidTeamRecipient();
}
}
modifier onlyFactory() {
if (msg.sender != factory) {
revert NotAllowed(msg.sender);
}
_;
}
// Set the override team reward recipient for a token
function setOverrideTeamRewardRecipientForToken(uint256 tokenId, address newTeamRecipient)
external
{
if (msg.sender != owner() && msg.sender != factory) {
revert NotAllowed(msg.sender);
}
address oldTeamRecipient = teamOverrideRewardRecipientForToken[tokenId];
teamOverrideRewardRecipientForToken[tokenId] = newTeamRecipient;
emit TeamOverrideRewardRecipientUpdated(tokenId, oldTeamRecipient, newTeamRecipient);
}
// Update the default team recipient
function updateTeamRecipient(address newRecipient) external onlyOwner {
address oldTeamRecipient = teamRecipient;
teamRecipient = newRecipient;
// ensure the team recipient is not the zero address
if (teamRecipient == address(0)) {
revert InvalidTeamRecipient();
}
emit TeamRecipientUpdated(oldTeamRecipient, newRecipient);
}
// Add a token reward, this is called by the factory when a token is created
function addTokenReward(TokenRewardInfo memory tokenRewardInfo) external onlyFactory {
// check that the token id is not already known
if (tokenRewards[tokenRewardInfo.lpTokenId].lpTokenId != 0) {
revert AlreadyKnownTokenId(tokenRewardInfo.lpTokenId);
}
// check that the creator reward is not greater than the max creator reward or zero
if (
tokenRewardInfo.creatorReward > MAX_CREATOR_REWARD || tokenRewardInfo.creatorReward == 0
) {
revert InvalidCreatorReward(tokenRewardInfo.creatorReward);
}
tokenRewards[tokenRewardInfo.lpTokenId] = tokenRewardInfo;
creatorTokenIds[tokenRewardInfo.creator.admin].push(tokenRewardInfo.lpTokenId);
emit TokenRewardAdded(
tokenRewardInfo.lpTokenId,
tokenRewardInfo.creatorReward,
tokenRewardInfo.creator.admin,
tokenRewardInfo.interfacer.admin
);
}
// Collect rewards for a token
function collectRewards(uint256 tokenId) public {
address teamRecipient_ = teamOverrideRewardRecipientForToken[tokenId];
if (teamRecipient_ == address(0)) {
teamRecipient_ = teamRecipient;
}
address creatorRecipient_ = tokenRewards[tokenId].creator.recipient;
if (creatorRecipient_ == address(0)) {
creatorRecipient_ = teamRecipient_;
}
address interfaceRecipient_ = tokenRewards[tokenId].interfacer.recipient;
if (interfaceRecipient_ == address(0)) {
interfaceRecipient_ = teamRecipient_;
}
// collect the rewards
INonfungiblePositionManager nonfungiblePositionManager =
INonfungiblePositionManager(positionManager);
(uint256 amount0, uint256 amount1) = nonfungiblePositionManager.collect(
INonfungiblePositionManager.CollectParams({
recipient: address(this),
amount0Max: type(uint128).max,
amount1Max: type(uint128).max,
tokenId: tokenId
})
);
(,, address token0, address token1,,,,,,,,) = nonfungiblePositionManager.positions(tokenId);
IERC20 rewardToken0 = IERC20(token0);
IERC20 rewardToken1 = IERC20(token1);
uint256 creatorReward = tokenRewards[tokenId].creatorReward;
// figure out the rewards distribution
uint256 teamReward0 = (amount0 * TEAM_REWARD) / 100;
uint256 teamReward1 = (amount1 * TEAM_REWARD) / 100;
rewardToken0.transfer(teamRecipient_, teamReward0);
rewardToken1.transfer(teamRecipient_, teamReward1);
uint256 interfaceReward0;
uint256 interfaceReward1;
uint256 creatorReward0;
uint256 creatorReward1;
if (creatorReward == MAX_CREATOR_REWARD) {
// if the creator reward is max, then there is no interface reward
creatorReward0 = amount0 - teamReward0;
creatorReward1 = amount1 - teamReward1;
rewardToken0.transfer(creatorRecipient_, creatorReward0);
rewardToken1.transfer(creatorRecipient_, creatorReward1);
} else {
// we have both a creator and interface reward
creatorReward0 = (amount0 * creatorReward) / 100;
creatorReward1 = (amount1 * creatorReward) / 100;
interfaceReward0 = amount0 - teamReward0 - creatorReward0;
interfaceReward1 = amount1 - teamReward1 - creatorReward1;
rewardToken0.transfer(interfaceRecipient_, interfaceReward0);
rewardToken1.transfer(interfaceRecipient_, interfaceReward1);
rewardToken0.transfer(creatorRecipient_, creatorReward0);
rewardToken1.transfer(creatorRecipient_, creatorReward1);
}
emit ClaimedRewards({
lpTokenId: tokenId,
creatorRecipient: creatorRecipient_,
interfaceRecipient: interfaceRecipient_,
teamRecipient: teamRecipient_,
token0: token0,
token1: token1,
teamReward0: teamReward0,
teamReward1: teamReward1,
interfaceReward0: interfaceReward0,
interfaceReward1: interfaceReward1,
creatorReward0: creatorReward0,
creatorReward1: creatorReward1
});
}
// Get the token ids for a creator (using the admin address)
function getLpTokenIdsForCreator(address user) public view returns (uint256[] memory) {
return creatorTokenIds[user];
}
// Replace the creator reward recipient
function updateCreatorRewardRecipient(uint256 tokenId, address newRecipient) external {
TokenRewardInfo memory tokenRewardInfo = tokenRewards[tokenId];
// Only admin can replace the reward recipient
if (msg.sender != tokenRewardInfo.creator.admin) {
revert NotAllowed(msg.sender);
}
// Add the new recipient
address oldRecipient = tokenRewards[tokenId].creator.recipient;
tokenRewards[tokenId].creator.recipient = newRecipient;
emit CreatorRewardRecipientUpdated(tokenId, oldRecipient, newRecipient);
}
// Replace the interface reward recipient
function updateInterfaceRewardRecipient(uint256 tokenId, address newRecipient) external {
TokenRewardInfo memory tokenRewardInfo = tokenRewards[tokenId];
// Only admin can replace the reward recipient
if (msg.sender != tokenRewardInfo.interfacer.admin) {
revert NotAllowed(msg.sender);
}
// Add the new recipient
address oldRecipient = tokenRewards[tokenId].interfacer.recipient;
tokenRewards[tokenId].interfacer.recipient = newRecipient;
emit InterfaceRewardRecipientUpdated(tokenId, oldRecipient, newRecipient);
}
// Replace the interface reward admin
function updateInterfaceRewardAdmin(uint256 tokenId, address newAdmin) external {
TokenRewardInfo memory tokenRewardInfo = tokenRewards[tokenId];
// Only admin can replace the reward admin
if (msg.sender != tokenRewardInfo.interfacer.admin) {
revert NotAllowed(msg.sender);
}
// Add the new admin
address oldAdmin = tokenRewards[tokenId].interfacer.admin;
tokenRewards[tokenId].interfacer.admin = newAdmin;
emit InterfaceRewardRecipientAdminUpdated(tokenId, oldAdmin, newAdmin);
}
// Replace the creator reward admin
function updateCreatorRewardAdmin(uint256 tokenId, address newAdmin) external {
TokenRewardInfo memory tokenRewardInfo = tokenRewards[tokenId];
// Only admin can replace the admin
if (msg.sender != tokenRewardInfo.creator.admin) {
revert NotAllowed(msg.sender);
}
// Remove the tokenId from _creatorTokenIds
uint256 length = creatorTokenIds[tokenRewardInfo.creator.admin].length;
for (uint256 i = 0; i < length; i++) {
if (creatorTokenIds[tokenRewardInfo.creator.admin][i] == tokenRewardInfo.lpTokenId) {
// Swap with the last element
creatorTokenIds[tokenRewardInfo.creator.admin][i] =
creatorTokenIds[tokenRewardInfo.creator.admin][length - 1];
// Pop the last element
creatorTokenIds[tokenRewardInfo.creator.admin].pop();
break;
}
}
// push the token id to the new admin
creatorTokenIds[newAdmin].push(tokenRewardInfo.lpTokenId);
address oldAdmin = tokenRewards[tokenId].creator.admin;
tokenRewards[tokenId].creator.admin = newAdmin;
emit CreatorRewardRecipientAdminUpdated(tokenId, oldAdmin, newAdmin);
}
// Enable contract to receive LP Tokens
function onERC721Received(address, address from, uint256 id, bytes calldata)
external
override
returns (bytes4)
{
// Only Clanker Factory can send NFTs here
if (from != factory) {
revert NotAllowed(from);
}
emit Received(from, id);
return IERC721Receiver.onERC721Received.selector;
}
// Withdraw ETH from the contract
function withdrawETH(address recipient) public onlyOwner {
(bool success,) = payable(recipient).call{value: address(this).balance}("");
require(success, "ETH transfer failed");
}
// Withdraw ERC20 tokens from the contract
function withdrawERC20(address token, address recipient) public onlyOwner {
IERC20 token_ = IERC20(token);
token_.transfer(recipient, token_.balanceOf(address(this)));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
interface IClanker {
/// @notice When an unauthorized user calls a function
error Unauthorized();
/// @notice When the factory is deprecated
error Deprecated();
/// @notice When a tokenId is not found
error NotFound();
/// @notice When the tick spacing is invalid
error InvalidTick();
/// @notice When the vault percentage is invalid
error InvalidVaultConfiguration();
/// @notice When the function is only valid on the originating chain
error OnlyOriginatingChain();
/// @notice When the function is only valid on a non-originating chain
error OnlyNonOriginatingChains();
/// @notice When the creator reward is invalid (greater than 80%)
error InvalidCreatorReward();
/// @notice When the creator information is invalid
error InvalidCreatorInfo();
/// @notice When the interface information is invalid
error InvalidInterfaceInfo();
/// @notice When the team reward recipient is invalid
error ZeroTeamRewardRecipient();
struct TokenConfig {
string name;
string symbol;
bytes32 salt;
string image;
string metadata;
string context;
uint256 originatingChainId;
}
struct VaultConfig {
uint8 vaultPercentage;
uint256 vaultDuration;
}
struct PoolConfig {
address pairedToken;
int24 tickIfToken0IsNewToken;
}
struct InitialBuyConfig {
uint24 pairedTokenPoolFee;
uint256 pairedTokenSwapAmountOutMinimum;
}
struct RewardsConfig {
uint256 creatorReward;
address creatorAdmin;
address creatorRewardRecipient;
address interfaceAdmin;
address interfaceRewardRecipient;
}
struct DeploymentConfig {
TokenConfig tokenConfig;
VaultConfig vaultConfig;
PoolConfig poolConfig;
InitialBuyConfig initialBuyConfig;
RewardsConfig rewardsConfig;
}
struct DeploymentInfo {
address token;
uint256 positionId;
address locker;
}
event TokenCreated(
address indexed tokenAddress,
address indexed creatorAdmin,
address indexed interfaceAdmin,
address creatorRewardRecipient,
address interfaceRewardRecipient,
uint256 positionId,
string name,
string symbol,
int24 startingTickIfToken0IsNewToken,
string metadata,
uint256 amountTokensBought,
uint256 vaultDuration,
uint8 vaultPercentage,
address msgSender
);
event VaultUpdated(address oldVault, address newVault);
event LiquidityLockerUpdated(address oldLocker, address newLocker);
event ClankerDeployerUpdated(address oldClankerDeployer, address newClankerDeployer);
event SetDeprecated(bool deprecated);
event SetAdmin(address admin, bool isAdmin);
function MAX_CREATOR_REWARD() external pure returns (uint256);
function TOKEN_SUPPLY() external pure returns (uint256);
function deprecated() external view returns (bool);
function admins(address) external view returns (bool);
function getTokensDeployedByUser(address user)
external
view
returns (DeploymentInfo[] memory);
function updateLiquidityLocker(address newLocker) external;
function updateVault(address newVault) external;
function setDeprecated(bool deprecated_) external;
function setAdmin(address admin, bool isAdmin) external;
function claimRewards(address token) external;
function deployTokenWithCustomTeamRewardRecipient(
DeploymentConfig memory deploymentConfig,
address teamRewardRecipient
) external payable returns (address tokenAddress, uint256 positionId);
function deployToken(DeploymentConfig memory deploymentConfig)
external
payable
returns (address tokenAddress, uint256 positionId);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
interface ILpLockerv2 is IERC721Receiver {
error NotAllowed(address user);
error AlreadyKnownTokenId(uint256 tokenId);
error InvalidCreatorReward(uint256 creatorReward);
error MaxCreatorRewardNotSet();
error InvalidMaxCreatorReward();
error InvalidTeamRecipient();
event ClaimedRewards(
uint256 indexed lpTokenId,
address indexed creatorRecipient,
address indexed interfaceRecipient,
address teamRecipient,
address token0,
address token1,
uint256 creatorReward0,
uint256 creatorReward1,
uint256 interfaceReward0,
uint256 interfaceReward1,
uint256 teamReward0,
uint256 teamReward1
);
event Received(address indexed from, uint256 tokenId);
event CreatorRewardRecipientUpdated(
uint256 indexed lpTokenId, address indexed oldRecipient, address newRecipient
);
event CreatorRewardRecipientAdminUpdated(
uint256 indexed lpTokenId, address indexed oldAdmin, address newAdmin
);
event InterfaceRewardRecipientUpdated(
uint256 indexed lpTokenId, address indexed oldRecipient, address newRecipient
);
event InterfaceRewardRecipientAdminUpdated(
uint256 indexed lpTokenId, address indexed oldAdmin, address newAdmin
);
event TeamOverrideRewardRecipientUpdated(
uint256 indexed lpTokenId, address indexed oldRecipient, address newRecipient
);
event TeamRecipientUpdated(address indexed oldRecipient, address newRecipient);
event TokenRewardAdded(
uint256 lpTokenId,
uint256 creatorReward,
address indexed creator,
address indexed interfacer
);
struct RewardRecipient {
address admin;
address recipient;
}
struct TokenRewardInfo {
uint256 lpTokenId;
uint256 creatorReward;
RewardRecipient creator;
RewardRecipient interfacer;
}
function TEAM_REWARD() external pure returns (uint256);
function MAX_CREATOR_REWARD() external view returns (uint256);
function teamRecipient() external view returns (address);
function tokenRewards(uint256)
external
view
returns (
uint256 lpTokenId,
uint256 creatorReward,
RewardRecipient memory creator,
RewardRecipient memory interfacer
);
function teamOverrideRewardRecipientForToken(uint256) external view returns (address);
function creatorTokenIds(address, uint256) external view returns (uint256);
function setOverrideTeamRewardRecipientForToken(uint256 tokenId, address newTeamRecipient)
external;
function addTokenReward(TokenRewardInfo memory tokenRewardInfo) external;
function collectRewards(uint256 tokenId) external;
function getLpTokenIdsForCreator(address user) external view returns (uint256[] memory);
function updateTeamRecipient(address newRecipient) external;
function updateCreatorRewardRecipient(uint256 tokenId, address newRecipient) external;
function updateInterfaceRewardRecipient(uint256 tokenId, address newRecipient) external;
function updateInterfaceRewardAdmin(uint256 tokenId, address newAdmin) external;
function updateCreatorRewardAdmin(uint256 tokenId, address newAdmin) external;
function withdrawETH(address recipient) external;
function withdrawERC20(address token, address recipient) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// Condensed interfaces for uniswap v3
interface INonfungiblePositionManager {
struct MintParams {
address token0;
address token1;
uint24 fee;
int24 tickLower;
int24 tickUpper;
uint256 amount0Desired;
uint256 amount1Desired;
uint256 amount0Min;
uint256 amount1Min;
address recipient;
uint256 deadline;
}
struct CollectParams {
uint256 tokenId;
address recipient;
uint128 amount0Max;
uint128 amount1Max;
}
function mint(MintParams calldata params)
external
payable
returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1);
function collect(CollectParams calldata params)
external
payable
returns (uint256 amount0, uint256 amount1);
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function positions(uint256 tokenId)
external
view
returns (
uint96 nonce,
address operator,
address token0,
address token1,
uint24 fee,
int24 tickLower,
int24 tickUpper,
uint128 liquidity,
uint256 feeGrowthInside0LastX128,
uint256 feeGrowthInside1LastX128,
uint128 tokensOwed0,
uint128 tokensOwed1
);
}
interface IUniswapV3Factory {
function createPool(address tokenA, address tokenB, uint24 fee)
external
returns (address pool);
function feeAmountTickSpacing(uint24 fee) external view returns (int24);
}
interface IUniswapV3Pool {
function initialize(uint160 sqrtPriceX96) external;
}
interface ISwapRouter {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
function exactInputSingle(ExactInputSingleParams calldata params)
external
payable
returns (uint256 amountOut);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.20;
/**
* @title ERC-721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC-721 asset contracts.
*/
interface IERC721Receiver {
/**
* @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 `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@uniswap/v3-core/=lib/v3-core/",
"@solady/=lib/optimism/packages/contracts-bedrock/lib/solady/src/",
"@solady-v0.0.245/=lib/optimism/packages/contracts-bedrock/lib/solady/src/",
"@contracts-bedrock/=lib/optimism/packages/contracts-bedrock/",
"ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"solady/=lib/solady/src/",
"v3-core/=lib/v3-core/"
],
"optimizer": {
"enabled": true,
"runs": 20000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": true
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"tokenFactory_","type":"address"},{"internalType":"address","name":"positionManager_","type":"address"},{"internalType":"address","name":"teamRecipient_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AlreadyKnownTokenId","type":"error"},{"inputs":[{"internalType":"uint256","name":"creatorReward","type":"uint256"}],"name":"InvalidCreatorReward","type":"error"},{"inputs":[],"name":"InvalidMaxCreatorReward","type":"error"},{"inputs":[],"name":"InvalidTeamRecipient","type":"error"},{"inputs":[],"name":"MaxCreatorRewardNotSet","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"NotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"creatorRecipient","type":"address"},{"indexed":true,"internalType":"address","name":"interfaceRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"teamRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"token0","type":"address"},{"indexed":false,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint256","name":"creatorReward0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creatorReward1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interfaceReward0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interfaceReward1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"teamReward0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"teamReward1","type":"uint256"}],"name":"ClaimedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"CreatorRewardRecipientAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"newRecipient","type":"address"}],"name":"CreatorRewardRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"InterfaceRewardRecipientAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"newRecipient","type":"address"}],"name":"InterfaceRewardRecipientUpdated","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"newRecipient","type":"address"}],"name":"TeamOverrideRewardRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"newRecipient","type":"address"}],"name":"TeamRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creatorReward","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"interfacer","type":"address"}],"name":"TokenRewardAdded","type":"event"},{"inputs":[],"name":"MAX_CREATOR_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"internalType":"uint256","name":"creatorReward","type":"uint256"},{"components":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"internalType":"struct ILpLockerv2.RewardRecipient","name":"creator","type":"tuple"},{"components":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"internalType":"struct ILpLockerv2.RewardRecipient","name":"interfacer","type":"tuple"}],"internalType":"struct ILpLockerv2.TokenRewardInfo","name":"tokenRewardInfo","type":"tuple"}],"name":"addTokenReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"collectRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"creatorTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getLpTokenIdsForCreator","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"newTeamRecipient","type":"address"}],"name":"setOverrideTeamRewardRecipientForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"teamOverrideRewardRecipientForToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenRewards","outputs":[{"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"internalType":"uint256","name":"creatorReward","type":"uint256"},{"components":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"internalType":"struct ILpLockerv2.RewardRecipient","name":"creator","type":"tuple"},{"components":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"internalType":"struct ILpLockerv2.RewardRecipient","name":"interfacer","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"newAdmin","type":"address"}],"name":"updateCreatorRewardAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"newRecipient","type":"address"}],"name":"updateCreatorRewardRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"newAdmin","type":"address"}],"name":"updateInterfaceRewardAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"newRecipient","type":"address"}],"name":"updateInterfaceRewardRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"updateTeamRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a080604052346101c75760808161229b803803809161001f82856101f1565b8339810103126101c75761003281610228565b61003e60208301610228565b90610057606061005060408601610228565b9401610228565b906001600160a01b031680156101de575f80546001600160a01b031981168317825560405194602094869460049486949293926001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600280546001600160a01b039283166001600160a01b03199182168117909255600180549a84169a82169a909a179099556003805493909216929098168217905563fa3ebd0160e01b8252955afa9081156101d3575f9161019d575b5080608052801561018e576014810180911161017a5760640361016b571561015c5760405161205e908161023d823960805181818161013b0152818161078701526110fb0152f35b634c8372a160e11b5f5260045ffd5b630e96c16960e11b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b631a5221c360e11b5f5260045ffd5b90506020813d6020116101cb575b816101b8602093836101f1565b810103126101c757515f610114565b5f80fd5b3d91506101ab565b6040513d5f823e3d90fd5b631e4fbdf760e01b5f525f60045260245ffd5b601f909101601f19168101906001600160401b0382119082101761021457604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c75756fe6080806040526004361015610012575f80fd5b5f3560e01c9081630af50d8914611dbb575080630b7f008c14611a825780630fdd25d61461199d57806310eee734146118ef57806313949da014611819578063150b7a0214611717578063248877101461160d5780633201b11e146115ab57806337ad4d8b1461157857806354fd4d50146114e457806358444129146114c9578063680e9f3814611408578063690d8320146112dc5780636fb3656614610f90578063715018a614610f14578063791b98bc14610ee15780638da5cb5b14610eaf5780639456fbcc14610d70578063b18486d7146104ad578063c45a01551461047a578063cade97af1461036f578063e0d1e2c314610230578063f2fde38b146101625763fa3ebd0114610124575f80fd5b3461015e575f60031936011261015e5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b5f80fd5b3461015e57602060031936011261015e5773ffffffffffffffffffffffffffffffffffffffff610190611e1a565b610198611fdc565b1680156102045773ffffffffffffffffffffffffffffffffffffffff5f54827fffffffffffffffffffffffff00000000000000000000000000000000000000008216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b3461015e57604060031936011261015e5760043561024c611df7565b9073ffffffffffffffffffffffffffffffffffffffff5f54163314158061034d575b61032157805f5260056020527f738c56464623de6f60d29c92993e87611767748914c7d99fef999de27dc7bad0602073ffffffffffffffffffffffffffffffffffffffff60405f20541693835f526005825260405f2073ffffffffffffffffffffffffffffffffffffffff82167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905573ffffffffffffffffffffffffffffffffffffffff60405191168152a3005b7ffa5cd00f000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b5073ffffffffffffffffffffffffffffffffffffffff6002541633141561026e565b3461015e57604060031936011261015e5760043561038b611df7565b90805f52600460205273ffffffffffffffffffffffffffffffffffffffff60405f206040516103b981611e3d565b815481526001820154602082015260606103e860046103da60028601611eb6565b946040850195865201611eb6565b9101525151163303610321575f8181526004602090815260409182902060030180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff968716908117909255925190815291909316927f8b82c83824d9033277aa41c543b5e53662a3b944a80fdc9b01ff1b7a4d737ca291a3005b3461015e575f60031936011261015e57602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b3461015e57602060031936011261015e57600435805f52600560205273ffffffffffffffffffffffffffffffffffffffff60405f2054168015610d51575b815f52600460205273ffffffffffffffffffffffffffffffffffffffff600360405f20015416918215610d48575b805f52600460205273ffffffffffffffffffffffffffffffffffffffff600560405f200154168015610d41575b73ffffffffffffffffffffffffffffffffffffffff6001541660405161056b81611e3d565b8381526fffffffffffffffffffffffffffffffff60208201308152816040840181815273ffffffffffffffffffffffffffffffffffffffff6060860193838552604051967ffc6f78650000000000000000000000000000000000000000000000000000000088525160048801525116602486015251166044840152511660648201526040816084815f865af1908115610971575f905f92610d02575b50610180602493604051948580927f99fbab880000000000000000000000000000000000000000000000000000000082528960048301525afa928315610971575f905f94610c28575b5073ffffffffffffffffffffffffffffffffffffffff809116931690855f526004602052600160405f200154916014820282810460141483151715610bfb576064900493601481029181830460141482151715610bfb576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b166004820152602481018790526064909304966020846044815f855af19384156109715761076994610bde575b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c1660048201526024810189905293602090859081906044820190565b03815f865af1928315610971578c948994610bc1575b50875f965f987f000000000000000000000000000000000000000000000000000000000000000081145f146109975750916107ca6107c260209361082295611f2e565b968792611f2e565b9660405193849283927fa9059cbb000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03815f865af1801561097157858e6108949360209361097c575b5060405193849283927fa9059cbb000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03815f875af1801561097157610942575b505b6040519a73ffffffffffffffffffffffffffffffffffffffff168b5260208b015260408a01526060890152608088015260a087015260c086015260e085015261010084015273ffffffffffffffffffffffffffffffffffffffff169273ffffffffffffffffffffffffffffffffffffffff16916101207ff18d15fcfcdd756d5e1fe9c0379d1f5acb552fdf231bc052916d1817b4b941e591a4005b6109639060203d60201161096a575b61095b8183611e75565b810190611f65565b508c6108a5565b503d610951565b6040513d5f823e3d90fd5b61099290843d861161096a5761095b8183611e75565b61083c565b6109dd949950819398506109d2929750806109d26064806109bf6109d7956109c99c97611fc9565b04998a938d611fc9565b04998a96611f2e565b611f2e565b97611f2e565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a166004820152602481018690529095906020816044815f865af1801561097157610ba4575b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a166004820152602481018790526020816044815f875af1801561097157848e610afd9360209361097c575060405193849283927fa9059cbb000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03815f865af1801561097157858e610b6e9360209361097c575060405193849283927fa9059cbb000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03815f875af1801561097157610b85575b506108a7565b610b9d9060203d60201161096a5761095b8183611e75565b508c610b7f565b610bbc9060203d60201161096a5761095b8183611e75565b610a3e565b610bd99060203d60201161096a5761095b8183611e75565b61077f565b610bf69060203d60201161096a5761095b8183611e75565b610710565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b935050610180833d8211610cfa575b81610c456101809383611e75565b8101031261015e5782516bffffffffffffffffffffffff81160361015e57610c6f60208401611f7d565b50610c7c60408401611f7d565b610c8860608501611f7d565b93608081015162ffffff81160361015e5773ffffffffffffffffffffffffffffffffffffffff91610cf261016083610cc360a0879601611f9e565b50610cd060c08201611f9e565b50610cdd60e08201611fac565b50610ceb6101408201611fac565b5001611fac565b509150610650565b3d9150610c37565b929150506040823d604011610d39575b81610d1f60409383611e75565b8101031261015e5781516020909201519091610180610607565b3d9150610d12565b5081610546565b91508091610519565b5073ffffffffffffffffffffffffffffffffffffffff600354166104eb565b3461015e57604060031936011261015e57610d89611e1a565b73ffffffffffffffffffffffffffffffffffffffff610da6611df7565b91610daf611fdc565b1690604051907f70a08231000000000000000000000000000000000000000000000000000000008252306004830152602082602481865afa918215610971575f92610e79575b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024810191909152906020908290815f81604481015b03925af1801561097157610e5f57005b610e779060203d60201161096a5761095b8183611e75565b005b91506020823d602011610ea7575b81610e9460209383611e75565b8101031261015e57905190610e4f610df5565b3d9150610e87565b3461015e575f60031936011261015e57602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b3461015e575f60031936011261015e57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b3461015e575f60031936011261015e57610f2c611fdc565b5f73ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461015e5760c060031936011261015e57604051610fad81611e3d565b60043581526020810190602435825260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc36011261015e5760405191610ff383611e59565b60443573ffffffffffffffffffffffffffffffffffffffff8116810361015e57835260643573ffffffffffffffffffffffffffffffffffffffff8116810361015e5760208401526040820192835260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261015e576040519161107883611e59565b60843573ffffffffffffffffffffffffffffffffffffffff8116810361015e57835260a43573ffffffffffffffffffffffffffffffffffffffff8116810361015e5760208401526060810192835273ffffffffffffffffffffffffffffffffffffffff6002541633036103215780515f52600460205260405f20546112b05781517f0000000000000000000000000000000000000000000000000000000000000000811180156112a8575b61127d57507fa825a93a934d13b1aa1603bb96058f0fe57f01306803bd7df2c8b259ccf8d5b79173ffffffffffffffffffffffffffffffffffffffff8083604094515f52600460205281855f20825181558551600182015589519082825116836002830191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905582602083015116836003830191167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790558260058160208d5182815116836004880191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055015116920191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905551165f526006602052611264855f20825190611f3b565b51925196515116945151169482519182526020820152a3005b7f55a71794000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b508015611123565b517fab51f9c7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b3461015e57602060031936011261015e575f8080806112f9611e1a565b611301611fdc565b73ffffffffffffffffffffffffffffffffffffffff4791165af13d15611403573d67ffffffffffffffff81116113d65760405190611367601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200183611e75565b81525f60203d92013e5b1561137857005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f455448207472616e73666572206661696c6564000000000000000000000000006044820152fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611371565b3461015e57602060031936011261015e5773ffffffffffffffffffffffffffffffffffffffff611436611e1a565b165f52600660205260405f20604051806020835491828152019081935f5260205f20905f5b8181106114b35750505081611471910382611e75565b604051918291602083019060208452518091526040830191905f5b81811061149a575050500390f35b825184528594506020938401939092019160010161148c565b825484526020909301926001928301920161145b565b3461015e575f60031936011261015e57602060405160148152f35b3461015e575f60031936011261015e5760408051906115038183611e75565b6005825260208201917f302e302e3200000000000000000000000000000000000000000000000000000083527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8351948593602085525180918160208701528686015e5f85828601015201168101030190f35b3461015e575f60031936011261015e57602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b3461015e57604060031936011261015e576115c4611e1a565b73ffffffffffffffffffffffffffffffffffffffff60243591165f52600660205260405f20805482101561015e576020916115fe91611eec565b90549060031b1c604051908152f35b3461015e57604060031936011261015e57600435611629611df7565b90805f52600460205273ffffffffffffffffffffffffffffffffffffffff606060405f2061168460046040519261165f84611e3d565b805484526001810154602085015261167960028201611eb6565b604085015201611eb6565b918291015251163303610321575f8181526004602081815260409283902090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff968716908117909255925190815291909316927f81c087afd6e0515c84a3516ff82c92e261554d53c3e85ed966d4405df38ebb5a91a3005b3461015e57608060031936011261015e57611730611e1a565b50611739611df7565b60643567ffffffffffffffff811161015e573660238201121561015e57806004013567ffffffffffffffff811161015e573691016024011161015e5773ffffffffffffffffffffffffffffffffffffffff806002541691169081036117ee577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460206040516044358152a260206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b7ffa5cd00f000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b3461015e57602060031936011261015e57611832611e1a565b61183a611fdc565b73ffffffffffffffffffffffffffffffffffffffff600354911690817fffffffffffffffffffffffff000000000000000000000000000000000000000082161760035581156118c757602073ffffffffffffffffffffffffffffffffffffffff7f9c8d2fbc53c8a056ff82dd9584168baaa1205b29a5236d0f57f280606bb9c89a926040519485521692a2005b7f9906e542000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015e57602060031936011261015e576004355f52600460205260c060405f2061199b81549161196f600182015491611937600461193060028401611eb6565b9201611eb6565b926040519586526020860152604085019073ffffffffffffffffffffffffffffffffffffffff60208092828151168552015116910152565b608083019073ffffffffffffffffffffffffffffffffffffffff60208092828151168552015116910152565bf35b3461015e57604060031936011261015e576004356119b9611df7565b90805f52600460205273ffffffffffffffffffffffffffffffffffffffff606060405f206119ef60046040519261165f84611e3d565b918291015251163303610321575f8181526004602090815260409182902060050180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff968716908117909255925190815291909316927f34c04f2dce83f7e45ef1b0c14cdb5dea1c3f7dcaf9bdf0f0965a5c7d12911a2691a3005b3461015e57604060031936011261015e57600435611a9e611df7565b90805f52600460205260405f209060405192611ab984611e3d565b8254845260018301546020850152611ae66004611ad860028601611eb6565b946040870195865201611eb6565b606085015273ffffffffffffffffffffffffffffffffffffffff8351511633036103215773ffffffffffffffffffffffffffffffffffffffff835151165f52600660205260405f20545f5b818110611bec575b8584611b6a73ffffffffffffffffffffffffffffffffffffffff861692835f52600660205260405f20905190611f3b565b5f8181526004602090815260409182902060020180547fffffffffffffffffffffffff000000000000000000000000000000000000000081168617909155915193845273ffffffffffffffffffffffffffffffffffffffff909116927fb3f139d249876e05e0c358b24a29fbba14f5a620809b85bf6de5e6db0edf217c9190a3005b73ffffffffffffffffffffffffffffffffffffffff855151165f526006602052611c198160405f20611eec565b90549060031b1c865114611c2f57600101611b31565b73ffffffffffffffffffffffffffffffffffffffff85929394955151165f52600660205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401938411610bfb57611cc4611ca773ffffffffffffffffffffffffffffffffffffffff95611cfa94611eec565b90549060031b1c9185855151165f52600660205260405f20611eec565b9091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83549160031b92831b921b1916179055565b5151165f52600660205260405f20908154908115611d8e57611b6a927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff930190611d598282611eec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555908392611b39565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b3461015e57602060031936011261015e576020906004355f526005825273ffffffffffffffffffffffffffffffffffffffff60405f2054168152f35b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361015e57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015e57565b6080810190811067ffffffffffffffff8211176113d657604052565b6040810190811067ffffffffffffffff8211176113d657604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113d657604052565b90604051611ec381611e59565b602073ffffffffffffffffffffffffffffffffffffffff60018395828154168552015416910152565b8054821015611f01575f5260205f2001905f90565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b91908203918211610bfb57565b90815491680100000000000000008310156113d65782611cc4916001611f6395018155611eec565b565b9081602091031261015e5751801515810361015e5790565b519073ffffffffffffffffffffffffffffffffffffffff8216820361015e57565b51908160020b820361015e57565b51906fffffffffffffffffffffffffffffffff8216820361015e57565b81810292918115918404141715610bfb57565b73ffffffffffffffffffffffffffffffffffffffff5f54163303611ffc57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea26469706673582212208f188e1c344921738f1510f26084bd3eeb698d5426d7873774821d924432cb3264736f6c634300081c003300000000000000000000000033c85749429e9e062bdc50c58ef5e2019d9857e6000000000000000000000000043ac6264f5a45c7518dc480b348da41bdabbac2000000000000000000000000fa928d3abc512383b8e5e77edd2d5678696084f900000000000000000000000033c85749429e9e062bdc50c58ef5e2019d9857e6
Deployed Bytecode
0x6080806040526004361015610012575f80fd5b5f3560e01c9081630af50d8914611dbb575080630b7f008c14611a825780630fdd25d61461199d57806310eee734146118ef57806313949da014611819578063150b7a0214611717578063248877101461160d5780633201b11e146115ab57806337ad4d8b1461157857806354fd4d50146114e457806358444129146114c9578063680e9f3814611408578063690d8320146112dc5780636fb3656614610f90578063715018a614610f14578063791b98bc14610ee15780638da5cb5b14610eaf5780639456fbcc14610d70578063b18486d7146104ad578063c45a01551461047a578063cade97af1461036f578063e0d1e2c314610230578063f2fde38b146101625763fa3ebd0114610124575f80fd5b3461015e575f60031936011261015e5760206040517f00000000000000000000000000000000000000000000000000000000000000508152f35b5f80fd5b3461015e57602060031936011261015e5773ffffffffffffffffffffffffffffffffffffffff610190611e1a565b610198611fdc565b1680156102045773ffffffffffffffffffffffffffffffffffffffff5f54827fffffffffffffffffffffffff00000000000000000000000000000000000000008216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b3461015e57604060031936011261015e5760043561024c611df7565b9073ffffffffffffffffffffffffffffffffffffffff5f54163314158061034d575b61032157805f5260056020527f738c56464623de6f60d29c92993e87611767748914c7d99fef999de27dc7bad0602073ffffffffffffffffffffffffffffffffffffffff60405f20541693835f526005825260405f2073ffffffffffffffffffffffffffffffffffffffff82167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905573ffffffffffffffffffffffffffffffffffffffff60405191168152a3005b7ffa5cd00f000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b5073ffffffffffffffffffffffffffffffffffffffff6002541633141561026e565b3461015e57604060031936011261015e5760043561038b611df7565b90805f52600460205273ffffffffffffffffffffffffffffffffffffffff60405f206040516103b981611e3d565b815481526001820154602082015260606103e860046103da60028601611eb6565b946040850195865201611eb6565b9101525151163303610321575f8181526004602090815260409182902060030180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff968716908117909255925190815291909316927f8b82c83824d9033277aa41c543b5e53662a3b944a80fdc9b01ff1b7a4d737ca291a3005b3461015e575f60031936011261015e57602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b3461015e57602060031936011261015e57600435805f52600560205273ffffffffffffffffffffffffffffffffffffffff60405f2054168015610d51575b815f52600460205273ffffffffffffffffffffffffffffffffffffffff600360405f20015416918215610d48575b805f52600460205273ffffffffffffffffffffffffffffffffffffffff600560405f200154168015610d41575b73ffffffffffffffffffffffffffffffffffffffff6001541660405161056b81611e3d565b8381526fffffffffffffffffffffffffffffffff60208201308152816040840181815273ffffffffffffffffffffffffffffffffffffffff6060860193838552604051967ffc6f78650000000000000000000000000000000000000000000000000000000088525160048801525116602486015251166044840152511660648201526040816084815f865af1908115610971575f905f92610d02575b50610180602493604051948580927f99fbab880000000000000000000000000000000000000000000000000000000082528960048301525afa928315610971575f905f94610c28575b5073ffffffffffffffffffffffffffffffffffffffff809116931690855f526004602052600160405f200154916014820282810460141483151715610bfb576064900493601481029181830460141482151715610bfb576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b166004820152602481018790526064909304966020846044815f855af19384156109715761076994610bde575b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c1660048201526024810189905293602090859081906044820190565b03815f865af1928315610971578c948994610bc1575b50875f965f987f000000000000000000000000000000000000000000000000000000000000005081145f146109975750916107ca6107c260209361082295611f2e565b968792611f2e565b9660405193849283927fa9059cbb000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03815f865af1801561097157858e6108949360209361097c575b5060405193849283927fa9059cbb000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03815f875af1801561097157610942575b505b6040519a73ffffffffffffffffffffffffffffffffffffffff168b5260208b015260408a01526060890152608088015260a087015260c086015260e085015261010084015273ffffffffffffffffffffffffffffffffffffffff169273ffffffffffffffffffffffffffffffffffffffff16916101207ff18d15fcfcdd756d5e1fe9c0379d1f5acb552fdf231bc052916d1817b4b941e591a4005b6109639060203d60201161096a575b61095b8183611e75565b810190611f65565b508c6108a5565b503d610951565b6040513d5f823e3d90fd5b61099290843d861161096a5761095b8183611e75565b61083c565b6109dd949950819398506109d2929750806109d26064806109bf6109d7956109c99c97611fc9565b04998a938d611fc9565b04998a96611f2e565b611f2e565b97611f2e565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a166004820152602481018690529095906020816044815f865af1801561097157610ba4575b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a166004820152602481018790526020816044815f875af1801561097157848e610afd9360209361097c575060405193849283927fa9059cbb000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03815f865af1801561097157858e610b6e9360209361097c575060405193849283927fa9059cbb000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03815f875af1801561097157610b85575b506108a7565b610b9d9060203d60201161096a5761095b8183611e75565b508c610b7f565b610bbc9060203d60201161096a5761095b8183611e75565b610a3e565b610bd99060203d60201161096a5761095b8183611e75565b61077f565b610bf69060203d60201161096a5761095b8183611e75565b610710565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b935050610180833d8211610cfa575b81610c456101809383611e75565b8101031261015e5782516bffffffffffffffffffffffff81160361015e57610c6f60208401611f7d565b50610c7c60408401611f7d565b610c8860608501611f7d565b93608081015162ffffff81160361015e5773ffffffffffffffffffffffffffffffffffffffff91610cf261016083610cc360a0879601611f9e565b50610cd060c08201611f9e565b50610cdd60e08201611fac565b50610ceb6101408201611fac565b5001611fac565b509150610650565b3d9150610c37565b929150506040823d604011610d39575b81610d1f60409383611e75565b8101031261015e5781516020909201519091610180610607565b3d9150610d12565b5081610546565b91508091610519565b5073ffffffffffffffffffffffffffffffffffffffff600354166104eb565b3461015e57604060031936011261015e57610d89611e1a565b73ffffffffffffffffffffffffffffffffffffffff610da6611df7565b91610daf611fdc565b1690604051907f70a08231000000000000000000000000000000000000000000000000000000008252306004830152602082602481865afa918215610971575f92610e79575b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024810191909152906020908290815f81604481015b03925af1801561097157610e5f57005b610e779060203d60201161096a5761095b8183611e75565b005b91506020823d602011610ea7575b81610e9460209383611e75565b8101031261015e57905190610e4f610df5565b3d9150610e87565b3461015e575f60031936011261015e57602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b3461015e575f60031936011261015e57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b3461015e575f60031936011261015e57610f2c611fdc565b5f73ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461015e5760c060031936011261015e57604051610fad81611e3d565b60043581526020810190602435825260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc36011261015e5760405191610ff383611e59565b60443573ffffffffffffffffffffffffffffffffffffffff8116810361015e57835260643573ffffffffffffffffffffffffffffffffffffffff8116810361015e5760208401526040820192835260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261015e576040519161107883611e59565b60843573ffffffffffffffffffffffffffffffffffffffff8116810361015e57835260a43573ffffffffffffffffffffffffffffffffffffffff8116810361015e5760208401526060810192835273ffffffffffffffffffffffffffffffffffffffff6002541633036103215780515f52600460205260405f20546112b05781517f0000000000000000000000000000000000000000000000000000000000000050811180156112a8575b61127d57507fa825a93a934d13b1aa1603bb96058f0fe57f01306803bd7df2c8b259ccf8d5b79173ffffffffffffffffffffffffffffffffffffffff8083604094515f52600460205281855f20825181558551600182015589519082825116836002830191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905582602083015116836003830191167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790558260058160208d5182815116836004880191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055015116920191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905551165f526006602052611264855f20825190611f3b565b51925196515116945151169482519182526020820152a3005b7f55a71794000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b508015611123565b517fab51f9c7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b3461015e57602060031936011261015e575f8080806112f9611e1a565b611301611fdc565b73ffffffffffffffffffffffffffffffffffffffff4791165af13d15611403573d67ffffffffffffffff81116113d65760405190611367601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200183611e75565b81525f60203d92013e5b1561137857005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f455448207472616e73666572206661696c6564000000000000000000000000006044820152fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611371565b3461015e57602060031936011261015e5773ffffffffffffffffffffffffffffffffffffffff611436611e1a565b165f52600660205260405f20604051806020835491828152019081935f5260205f20905f5b8181106114b35750505081611471910382611e75565b604051918291602083019060208452518091526040830191905f5b81811061149a575050500390f35b825184528594506020938401939092019160010161148c565b825484526020909301926001928301920161145b565b3461015e575f60031936011261015e57602060405160148152f35b3461015e575f60031936011261015e5760408051906115038183611e75565b6005825260208201917f302e302e3200000000000000000000000000000000000000000000000000000083527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8351948593602085525180918160208701528686015e5f85828601015201168101030190f35b3461015e575f60031936011261015e57602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b3461015e57604060031936011261015e576115c4611e1a565b73ffffffffffffffffffffffffffffffffffffffff60243591165f52600660205260405f20805482101561015e576020916115fe91611eec565b90549060031b1c604051908152f35b3461015e57604060031936011261015e57600435611629611df7565b90805f52600460205273ffffffffffffffffffffffffffffffffffffffff606060405f2061168460046040519261165f84611e3d565b805484526001810154602085015261167960028201611eb6565b604085015201611eb6565b918291015251163303610321575f8181526004602081815260409283902090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff968716908117909255925190815291909316927f81c087afd6e0515c84a3516ff82c92e261554d53c3e85ed966d4405df38ebb5a91a3005b3461015e57608060031936011261015e57611730611e1a565b50611739611df7565b60643567ffffffffffffffff811161015e573660238201121561015e57806004013567ffffffffffffffff811161015e573691016024011161015e5773ffffffffffffffffffffffffffffffffffffffff806002541691169081036117ee577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460206040516044358152a260206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b7ffa5cd00f000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b3461015e57602060031936011261015e57611832611e1a565b61183a611fdc565b73ffffffffffffffffffffffffffffffffffffffff600354911690817fffffffffffffffffffffffff000000000000000000000000000000000000000082161760035581156118c757602073ffffffffffffffffffffffffffffffffffffffff7f9c8d2fbc53c8a056ff82dd9584168baaa1205b29a5236d0f57f280606bb9c89a926040519485521692a2005b7f9906e542000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015e57602060031936011261015e576004355f52600460205260c060405f2061199b81549161196f600182015491611937600461193060028401611eb6565b9201611eb6565b926040519586526020860152604085019073ffffffffffffffffffffffffffffffffffffffff60208092828151168552015116910152565b608083019073ffffffffffffffffffffffffffffffffffffffff60208092828151168552015116910152565bf35b3461015e57604060031936011261015e576004356119b9611df7565b90805f52600460205273ffffffffffffffffffffffffffffffffffffffff606060405f206119ef60046040519261165f84611e3d565b918291015251163303610321575f8181526004602090815260409182902060050180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff968716908117909255925190815291909316927f34c04f2dce83f7e45ef1b0c14cdb5dea1c3f7dcaf9bdf0f0965a5c7d12911a2691a3005b3461015e57604060031936011261015e57600435611a9e611df7565b90805f52600460205260405f209060405192611ab984611e3d565b8254845260018301546020850152611ae66004611ad860028601611eb6565b946040870195865201611eb6565b606085015273ffffffffffffffffffffffffffffffffffffffff8351511633036103215773ffffffffffffffffffffffffffffffffffffffff835151165f52600660205260405f20545f5b818110611bec575b8584611b6a73ffffffffffffffffffffffffffffffffffffffff861692835f52600660205260405f20905190611f3b565b5f8181526004602090815260409182902060020180547fffffffffffffffffffffffff000000000000000000000000000000000000000081168617909155915193845273ffffffffffffffffffffffffffffffffffffffff909116927fb3f139d249876e05e0c358b24a29fbba14f5a620809b85bf6de5e6db0edf217c9190a3005b73ffffffffffffffffffffffffffffffffffffffff855151165f526006602052611c198160405f20611eec565b90549060031b1c865114611c2f57600101611b31565b73ffffffffffffffffffffffffffffffffffffffff85929394955151165f52600660205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401938411610bfb57611cc4611ca773ffffffffffffffffffffffffffffffffffffffff95611cfa94611eec565b90549060031b1c9185855151165f52600660205260405f20611eec565b9091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83549160031b92831b921b1916179055565b5151165f52600660205260405f20908154908115611d8e57611b6a927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff930190611d598282611eec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555908392611b39565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b3461015e57602060031936011261015e576020906004355f526005825273ffffffffffffffffffffffffffffffffffffffff60405f2054168152f35b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361015e57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361015e57565b6080810190811067ffffffffffffffff8211176113d657604052565b6040810190811067ffffffffffffffff8211176113d657604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113d657604052565b90604051611ec381611e59565b602073ffffffffffffffffffffffffffffffffffffffff60018395828154168552015416910152565b8054821015611f01575f5260205f2001905f90565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b91908203918211610bfb57565b90815491680100000000000000008310156113d65782611cc4916001611f6395018155611eec565b565b9081602091031261015e5751801515810361015e5790565b519073ffffffffffffffffffffffffffffffffffffffff8216820361015e57565b51908160020b820361015e57565b51906fffffffffffffffffffffffffffffffff8216820361015e57565b81810292918115918404141715610bfb57565b73ffffffffffffffffffffffffffffffffffffffff5f54163303611ffc57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea26469706673582212208f188e1c344921738f1510f26084bd3eeb698d5426d7873774821d924432cb3264736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000033c85749429e9e062bdc50c58ef5e2019d9857e6000000000000000000000000043ac6264f5a45c7518dc480b348da41bdabbac2000000000000000000000000fa928d3abc512383b8e5e77edd2d5678696084f900000000000000000000000033c85749429e9e062bdc50c58ef5e2019d9857e6
-----Decoded View---------------
Arg [0] : owner_ (address): 0x33c85749429e9e062BDC50c58Ef5E2019d9857E6
Arg [1] : tokenFactory_ (address): 0x043ac6264F5A45c7518DC480b348Da41bdabbac2
Arg [2] : positionManager_ (address): 0xfA928D3ABc512383b8E5E77edd2d5678696084F9
Arg [3] : teamRecipient_ (address): 0x33c85749429e9e062BDC50c58Ef5E2019d9857E6
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000033c85749429e9e062bdc50c58ef5e2019d9857e6
Arg [1] : 000000000000000000000000043ac6264f5a45c7518dc480b348da41bdabbac2
Arg [2] : 000000000000000000000000fa928d3abc512383b8e5e77edd2d5678696084f9
Arg [3] : 00000000000000000000000033c85749429e9e062bdc50c58ef5e2019d9857e6
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.