More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,586 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy | 2494194 | 43 mins ago | IN | 35 S | 0.000102 | ||||
Buy | 2478048 | 3 hrs ago | IN | 10 S | 0.000102 | ||||
Buy | 2475686 | 3 hrs ago | IN | 25 S | 0.00010201 | ||||
Buy | 2475657 | 3 hrs ago | IN | 25 S | 0.00010201 | ||||
Buy | 2474553 | 4 hrs ago | IN | 15 S | 0.00008604 | ||||
Buy | 2474518 | 4 hrs ago | IN | 5 S | 0.00008602 | ||||
Buy | 2462781 | 6 hrs ago | IN | 2 S | 0.00008281 | ||||
Buy | 2462755 | 6 hrs ago | IN | 3 S | 0.00008281 | ||||
Sell | 2443551 | 11 hrs ago | IN | 0 S | 0.00009558 | ||||
Sell | 2431725 | 14 hrs ago | IN | 0 S | 0.00009031 | ||||
Sell | 2431466 | 14 hrs ago | IN | 0 S | 0.00009033 | ||||
Sell | 2408233 | 20 hrs ago | IN | 0 S | 0.00009031 | ||||
Sell | 2407411 | 20 hrs ago | IN | 0 S | 0.00009396 | ||||
Buy | 2373316 | 26 hrs ago | IN | 3 S | 0.00008281 | ||||
Sell | 2373136 | 26 hrs ago | IN | 0 S | 0.00009555 | ||||
Buy | 2372419 | 26 hrs ago | IN | 1.4 S | 0.00008281 | ||||
Sell | 2372346 | 26 hrs ago | IN | 0 S | 0.00009555 | ||||
Sell | 2363765 | 28 hrs ago | IN | 0 S | 0.00029755 | ||||
Buy | 2363691 | 28 hrs ago | IN | 0.1 S | 0.00033634 | ||||
Sell | 2351264 | 30 hrs ago | IN | 0 S | 0.00009481 | ||||
Sell | 2346450 | 32 hrs ago | IN | 0 S | 0.00009033 | ||||
Buy | 2342256 | 32 hrs ago | IN | 7 S | 0.00008281 | ||||
Buy | 2341938 | 32 hrs ago | IN | 1 S | 0.00008281 | ||||
Sell | 2341780 | 32 hrs ago | IN | 0 S | 0.00009887 | ||||
Sell | 2341370 | 32 hrs ago | IN | 0 S | 0.00009554 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
2443551 | 11 hrs ago | 1.07130889 S | ||||
2431725 | 14 hrs ago | 524.64238745 S | ||||
2431466 | 14 hrs ago | 902.69277831 S | ||||
2408233 | 20 hrs ago | 32.017425 S | ||||
2407411 | 20 hrs ago | 0.95573858 S | ||||
2373136 | 26 hrs ago | 3.55310801 S | ||||
2372346 | 26 hrs ago | 2.41722256 S | ||||
2363765 | 28 hrs ago | 0.0970225 S | ||||
2351264 | 30 hrs ago | 9.3294785 S | ||||
2346450 | 32 hrs ago | 36.02546047 S | ||||
2341780 | 32 hrs ago | 5.3262592 S | ||||
2341370 | 32 hrs ago | 1.42168868 S | ||||
2324185 | 37 hrs ago | 37.98982476 S | ||||
2267768 | 2 days ago | 89.55864244 S | ||||
2260026 | 2 days ago | 0.35545289 S | ||||
2258760 | 2 days ago | 4.26821624 S | ||||
2258386 | 2 days ago | 0.28434122 S | ||||
2255104 | 2 days ago | 3.84396265 S | ||||
2252504 | 2 days ago | 0.35500153 S | ||||
2252187 | 2 days ago | 2.12958945 S | ||||
2237120 | 2 days ago | 65.78138495 S | ||||
2237079 | 2 days ago | 74.25011953 S | ||||
2229731 | 2 days ago | 86.96734049 S | ||||
2229693 | 2 days ago | 98.44993046 S | ||||
2224029 | 2 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Name:
SpookyLaunchpad
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.8.18; import { LibUtils } from "./libraries/LibUtils.sol"; import { LibTokens } from "./libraries/LibTokens.sol"; import { IwETH } from "./interfaces/IwETH.sol"; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { Token } from "./libraries/Token.sol"; import { INonfungiblePositionManager } from "./interfaces/INonFungiblePositionManager.sol"; import { Vault } from './Vault.sol'; struct Config { uint256 creationPrice; address nfpManager; //20B uint16 txFee; //2B uint16 launchFee; //2B uint16 farmRatioDenominator; //2B uint256 fakePoolEthMCapThreshold; //32B uint256 tokenSupply; uint256 fakePoolBaseEther; address weth; address v3staker; } struct FakePool { uint256 fakeEth; uint256 ethReserve; uint256 tokenReserve; address token; address pair; uint16 sellPenalty; bool locked; } struct IncentiveKey { address rewardToken; address pool; uint256 startTime; uint256 endTime; uint256 vestingPeriod; address refundee; } interface IUniV3Staker { function createIncentive(IncentiveKey memory key, uint256 reward) external; } contract SpookyLaunchpad is Ownable { event TokenCreated(address creator, address token, uint256 supply, string name, string symbol, string imageCid, string description, string[] links, uint256 price, LibTokens.LpStrategy lpStrategy); event TokenLaunched(address creator, address token, address pair); event Bought(address buyer, address token, uint256 ethIn, uint256 tokensOut, uint256 newPrice); event Sold(address seller, address token, uint256 ethOut, uint256 tokensIn, uint256 newPrice); event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to); // UNIV2 event for tracking event FakePoolCreated(address token, uint16 sellPenalty, uint256 ethReserve, uint256 tokenReserve); event FakePoolReserveChanged(address token, uint256 ethReserve, uint256 tokenReserve); event FakePoolMCapReached(address token); mapping(address => FakePool) public poolMap; Config public config; uint256 public proceeds; constructor() Ownable() { } function create(string calldata name, string calldata symbol, string calldata imageCid, string calldata description, string[] calldata links, uint16 sellPenalty, LibTokens.LpStrategy lpStrategy, uint256 initialBuy) external payable { require( bytes(name).length <= 18 && bytes(symbol).length <= 18 && bytes(description).length <= 512, "Invalid params" ); require(links.length < 5, "5 links max"); for (uint8 i = 0; i < links.length; i++) { require(bytes(links[i]).length <= 128, "link too long"); } uint256 supply = config.tokenSupply; Token token = new Token(); address tokenAddress = address(token); token.emboss(name, symbol, supply, address(this)); uint256 creationPrice = _create_FakePool(tokenAddress, supply, sellPenalty); LibTokens.Storage storage ts = LibTokens.store(); ts.creatorMap[tokenAddress] = msg.sender; ts.lpStrategyMap[tokenAddress] = lpStrategy; emit TokenCreated(msg.sender, tokenAddress, config.tokenSupply, name, symbol, imageCid, description, links, creationPrice, lpStrategy); uint256 eth = msg.value; uint256 creationEth = config.creationPrice; require(eth >= creationEth, "Not enough eth to pay the creation price!"); eth -= creationEth; gatherProceeds(creationEth); if (initialBuy > 0) { eth -= initialBuy; (uint256 tokensOut, uint256 newPrice) = _buy_FakePool(tokenAddress, initialBuy); Token(token).transfer(msg.sender, tokensOut); // Transfer tokens to buyer emit Bought(msg.sender, tokenAddress, initialBuy, tokensOut, newPrice); } if (eth > 0) { (bool sent,) = msg.sender.call{ value: eth }(""); // refund dust require(sent, "not sent!"); } } function quote(address token, uint256 amount, bool ethOut) public view returns(uint256) { return _quote_FakePool(token, amount, ethOut); } function buy(address token, uint256 min) external payable returns (uint256 tokensOut, uint256 newPrice) { (tokensOut, newPrice) = _buy_FakePool(token, msg.value); if (min != 0) require(tokensOut >= min, "amount out lower than min"); Token(token).transfer(msg.sender, tokensOut); // Transfer tokens to buyer emit Bought(msg.sender, token, msg.value, tokensOut, newPrice); emit Swap(address(this), msg.value, 0, 0, tokensOut, msg.sender); } function sell(address token, uint256 amount, uint256 min) external returns (uint256 ethOut, uint256 newPrice) { (ethOut, newPrice) = _sell_FakePool(token, amount); if (min != 0) require(ethOut >= min, "amount out lower than min"); Token(token).transferFrom(msg.sender, address(this), amount); // Transfer tokens from seller (bool sent,) = msg.sender.call{ value: ethOut }(""); require(sent, "eth send failed"); // Transfer eth to seller emit Sold(msg.sender, token, ethOut, amount, newPrice); emit Swap(msg.sender, 0, amount, ethOut, 0, address(this)); } function launch(address token, uint8 farmType) external onlyOwner payable returns ( uint256 tokenId, //0=no farm, 1=token farm 2=wnative farm uint128 liquidity, uint256 amount0, uint256 amount1 ){ (uint256 eth, uint256 tokens) = _launchstats_FakePool(token); uint256 launchFee = LibUtils.calculatePercentage(config.launchFee, eth); gatherProceeds(launchFee); eth -= launchFee; INonfungiblePositionManager nonfungiblePositionManager = INonfungiblePositionManager(config.nfpManager); IUniV3Staker v3staker = IUniV3Staker(config.v3staker); Token(token).approve(address(nonfungiblePositionManager), tokens); Token(token).launch(); LibTokens.Storage storage ts = LibTokens.store(); //LibTokens.LpStrategy lpStrategy = ts.lpStrategyMap[token]; address wethAdr = config.weth; IwETH(wethAdr).deposit{ value: eth }(); Token(wethAdr).approve(address(nonfungiblePositionManager), eth); uint amountFarm; if(farmType == 1) { amountFarm = tokens / config.farmRatioDenominator; tokens -= amountFarm; Token(token).approve(address(v3staker), amountFarm); } else if(farmType == 2) { amountFarm = eth / config.farmRatioDenominator; eth -= amountFarm; Token(wethAdr).approve(address(v3staker), amountFarm); } (address _token0, address _token1) = token < wethAdr ? (token, wethAdr) : (wethAdr, token); (uint _amount0, uint _amount1) = token < wethAdr ? (tokens, eth) : (eth, tokens); address pair = nonfungiblePositionManager.createAndInitializePoolIfNecessary(_token0, _token1, 3000, calculateSqrtPriceX96(_amount1, _amount0)); Vault vault = new Vault(); INonfungiblePositionManager.MintParams memory params = INonfungiblePositionManager.MintParams({ token0: _token0, token1: _token1, fee: 3000, tickLower: -887272 + 52, tickUpper: 887272 - 52, amount0Desired: _amount0, amount1Desired: _amount1, amount0Min: _amount0 * 9 / 10, amount1Min: _amount1 * 9 / 10, recipient: address(vault), deadline: block.timestamp }); (tokenId, liquidity, amount0, amount1) = nonfungiblePositionManager.mint(params); vault.setup(owner(), ts.creatorMap[token], tokenId); // create farm if(farmType != 0) { IncentiveKey memory incentive = IncentiveKey({ rewardToken: farmType == 1 ? token : wethAdr, pool: pair, startTime: block.timestamp + 1, endTime: (block.timestamp + 1 + 60 days), vestingPeriod: 72 hours, refundee: owner() }); v3staker.createIncentive(incentive, amountFarm); } setPool(token, pair); emit TokenLaunched(ts.creatorMap[token], token, pair); } function calculateSqrtPriceX96(uint256 amount0, uint256 amount1) public pure returns (uint160) { return (uint160)(sqrt(amount0 * (2**192 / amount1))); } function sqrt(uint256 x) internal pure returns (uint256 result) { if (x == 0) return 0; uint256 z = (x + 1) / 2; result = x; while (z < result) { result = z; z = (x / z + z) / 2; } } // // ==================================================================== // // // // =========================== FAKE POOLS ============================= // // // // ==================================================================== // // function getConfig() external view returns (Config memory) { return config; } function setConfig(Config memory _config) public onlyOwner { config = _config; } function swapExactTokensForETH(FakePool storage pool, uint256 tokens) internal returns (uint256) { uint256 out = getAmountOut(tokens, pool.tokenReserve, pool.ethReserve); pool.tokenReserve += tokens; pool.ethReserve -= out; emit FakePoolReserveChanged(pool.token, pool.ethReserve, pool.tokenReserve); return out; } function swapExactETHForTokens(FakePool storage pool, uint256 eth) internal returns (uint256) { uint256 out = getAmountOut(eth, pool.ethReserve, pool.tokenReserve); pool.tokenReserve -= out; pool.ethReserve += eth; emit FakePoolReserveChanged(pool.token, pool.ethReserve, pool.tokenReserve); return out; } function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) internal pure returns (uint256) { uint256 numerator = amountIn * reserveOut; uint256 denominator = reserveIn + amountIn; return numerator / denominator; } function price(FakePool storage pool, uint256 amount, bool ethOut) internal view returns (uint256) { if (ethOut) { return (amount * pool.ethReserve) / pool.tokenReserve; } else { return (amount * pool.tokenReserve) / pool.ethReserve; } } function checkMarketCapThreshold(FakePool storage pool) internal { uint256 p = price(pool, 1 ether, true); uint256 ethMcap = (config.tokenSupply * p) / 1 ether; if (ethMcap >= config.fakePoolEthMCapThreshold) { pool.locked = true; emit FakePoolMCapReached(pool.token); } } function calculateSellPenalty(FakePool storage pool, uint256 eth) internal view returns (uint256) { if (pool.sellPenalty == 0) return 0; return LibUtils.calculatePercentage(pool.sellPenalty, eth); } function deductSellPenalty(FakePool storage pool, uint256 eth) internal returns (uint256) { uint256 fee = calculateSellPenalty(pool, eth); if (fee == 0) { return eth; } else { pool.ethReserve += fee; // redistribute the penaltyFee back into the ether reserve return eth - fee; } } // PUBLIC function _quote_FakePool(address token, uint256 amount, bool ethOut) public view returns (uint256) { FakePool storage pool = poolMap[token]; if (ethOut) { // sell uint256 eth = getAmountOut(amount, pool.tokenReserve, pool.ethReserve); eth -= calculateTxFee(eth); eth -= calculateSellPenalty(pool, eth); return eth; } else { // buy uint256 txFee = calculateTxFee(amount); return getAmountOut(amount - txFee, pool.ethReserve, pool.tokenReserve); } } function _create_FakePool(address tokenAddress, uint256 supply, uint16 sellPenalty) internal returns (uint256) { require(sellPenalty <= 700, "sell penalty invalid"); FakePool storage pool = poolMap[tokenAddress]; uint fakeEth = config.fakePoolBaseEther; pool.token = tokenAddress; pool.fakeEth = fakeEth; pool.ethReserve = fakeEth; pool.tokenReserve = supply; pool.sellPenalty = sellPenalty; emit FakePoolCreated(tokenAddress, sellPenalty, pool.ethReserve, pool.tokenReserve); return price(pool, 1 ether, true); } function _launchstats_FakePool(address token) public view returns (uint256, uint256) { FakePool storage pool = poolMap[token]; require(pool.token != address(0)); return (pool.ethReserve - pool.fakeEth, pool.tokenReserve); } function _buy_FakePool(address token, uint amount) internal returns (uint256, uint256) { FakePool storage pool = poolMap[token]; require(pool.token != address(0) && !pool.locked, "pool is zero or locked!"); uint256 ethIn = deductTxFee(amount); uint256 tokensOut = swapExactETHForTokens(pool, ethIn); checkMarketCapThreshold(pool); return (tokensOut, price(pool, 1 ether, true)); } function _sell_FakePool(address token, uint256 amount) internal returns (uint256, uint256) { FakePool storage pool = poolMap[token]; require(pool.token != address(0) && !pool.locked); uint256 ethOut = swapExactTokensForETH(pool, amount); ethOut = deductTxFee(ethOut); ethOut = deductSellPenalty(pool, ethOut); require(pool.ethReserve >= pool.fakeEth, "no eth left in pool"); checkMarketCapThreshold(pool); return (ethOut, price(pool, 1 ether, true)); } function setPool(address _token, address _pair) internal { poolMap[_token].locked = true; poolMap[_token].pair = _pair; } function calculateTxFee(uint256 eth) public view returns (uint256) { return LibUtils.calculatePercentage(config.txFee, eth); } function gatherProceeds(uint256 amount) internal { proceeds += amount; } function deductTxFee(uint256 eth) internal returns (uint256) { uint256 fee = calculateTxFee(eth); gatherProceeds(fee); return eth - fee; } function reap() external onlyOwner { uint256 eth = proceeds; proceeds = 0; (bool sent,) = payable(msg.sender).call{ value: eth }(""); require(sent); } function unlock(address[] calldata assets) external onlyOwner { for (uint256 i = 0; i < assets.length; i++) { Token(assets[i]).transfer(msg.sender, Token(assets[i]).balanceOf(address(this))); } } function unlockEth(uint _value) external onlyOwner { (bool sent,) = payable(msg.sender).call{ value: _value }(""); require(sent); } function manualLock(address _pool, bool _lock) external onlyOwner { FakePool storage pool = poolMap[_pool]; pool.locked = _lock; } function manualLaunch(address token) external onlyOwner { Token(token).launch(); } }
// SPDX-License-Identifier: UNKNOWN pragma solidity ^0.8.18; library LibUtils { function calculatePercentage(uint16 fee, uint256 amount) internal pure returns (uint256) { return amount * fee / 1000; } function ethToUsd(uint256 usdcEthPrice, uint256 amountEth) internal pure returns (uint256) { uint256 ethAmount = amountEth; return ((ethAmount * usdcEthPrice) / (10**(8+18)) / (10**18)); } function usdToEth(uint256 usdcEthPrice, uint256 usdAmount) internal pure returns (uint256) { return ((10**18 * (10**8)) / usdcEthPrice) * usdAmount; } }
// SPDX-License-Identifier: UNKNOWN pragma solidity ^0.8.18; library LibTokens { bytes32 constant STORAGE_POSITION = keccak256("diamond.tokens.storage"); struct TeamAllocation { uint16 percentage; uint8 beneficiary; } enum LpStrategy { Burn, Vest } struct Storage { mapping(address => TeamAllocation) _unused_teamAllocMap; mapping(address => address) creatorMap; mapping(address => LpStrategy) lpStrategyMap; } function store() internal pure returns (Storage storage s) { bytes32 position = STORAGE_POSITION; assembly { s.slot := position } } }
// SPDX-License-Identifier: UNKNOWN pragma solidity ^0.8.18; interface IwETH { function deposit() external payable; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: UNKNOWN pragma solidity ^0.8.18; import { ERC20 } from "./ERC20.sol"; contract Token is ERC20 { string private _name; string private _symbol; string public junk = "junkdata"; address internal owner; bool internal launched = false; function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function emboss(string calldata n, string calldata s, uint256 supply, address d) external { require(totalSupply() == 0); owner = d; _name = n; _symbol = s; _mint(msg.sender, supply); } function launch() external { require(msg.sender == owner && launched == false); launched = true; } function _beforeTokenTransfer(address from, address to, uint256 /*amount*/) internal view override { if (!launched) { require(from == owner || to == owner, "transfer not allowed before launch"); } } }
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; } function mint(MintParams calldata params) external payable returns ( uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1 ); struct IncreaseLiquidityParams { uint256 tokenId; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } function increaseLiquidity(IncreaseLiquidityParams calldata params) external payable returns (uint128 liquidity, uint256 amount0, uint256 amount1); struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1); struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; } function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1); function createAndInitializePoolIfNecessary( address token0, address token1, uint24 fee, uint160 sqrtPriceX96 ) external payable returns (address pool); 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 ); function WETH9() external returns (address); function factory() external returns (address); }
// SPDX-License-Identifier: UNKNOWN pragma solidity ^0.8.18; interface IERC20 { function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); } interface IERC721Receiver { function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } interface Manager { function WETH9() external view returns (address); 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 memory params) external returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1); function collect(CollectParams calldata params) external returns (uint256 amount0, uint256 amount1); function safeTransferFrom(address from, address to, uint256 tokenId) external; } contract Vault is IERC721Receiver { address public owner; address public owner2; uint256 public tokenId; Manager public nfpm = Manager(0xf807Aca27B1550Fe778fD4E7013BB57480b17fAc); uint public withdrawTime; constructor() { } function setup(address _owner, address _owner2, uint _tokenId) external { require(owner == address(0)); owner = _owner; owner2 = _owner2; tokenId = _tokenId; withdrawTime = block.timestamp + 365 days; } function setNewOwner2(address newOwner) external { require(msg.sender == owner2 || msg.sender == owner); owner2 = newOwner; } function collectAndWithdraw(address token0, address token1) external { collectFees(); withdraw(token0, token1); } function collectFees() public { nfpm.collect( Manager.CollectParams({ tokenId: tokenId, recipient: address(this), amount0Max: type(uint128).max, amount1Max: type(uint128).max }) ); } function withdraw(address token0, address token1) public { uint amount0 = IERC20(token0).balanceOf(address(this)) / 2; uint amount1 = IERC20(token1).balanceOf(address(this)) / 2; IERC20(token0).transfer(owner, amount0); IERC20(token1).transfer(owner, amount1); IERC20(token0).transfer(owner2, IERC20(token0).balanceOf(address(this))); IERC20(token1).transfer(owner2, IERC20(token1).balanceOf(address(this))); } function withdraw2() external { require(msg.sender == owner); require(block.timestamp >= withdrawTime); nfpm.safeTransferFrom(address(this), owner, tokenId); } function onERC721Received( address operator, address from, uint256 id, bytes calldata data ) external override returns (bytes4) { require(tokenId == 0, "Vault: LOCKED"); tokenId = id; return IERC721Receiver.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Simple ERC20 + EIP-2612 implementation. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) /// /// @dev Note: /// - The ERC20 standard allows minting and transferring to and from the zero address, /// minting and transferring zero tokens, as well as self-approvals. /// For performance, this implementation WILL NOT revert for such actions. /// Please add any checks with overrides if desired. /// - The `permit` function uses the ecrecover precompile (0x1). /// /// If you are overriding: /// - NEVER violate the ERC20 invariant: /// the total sum of all balances must be equal to `totalSupply()`. /// - Check that the overridden function is actually used in the function you want to /// change the behavior of. Much of the code has been manually inlined for performance. abstract contract ERC20 { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The total supply has overflowed. error TotalSupplyOverflow(); /// @dev The allowance has overflowed. error AllowanceOverflow(); /// @dev The allowance has underflowed. error AllowanceUnderflow(); /// @dev Insufficient balance. error InsufficientBalance(); /// @dev Insufficient allowance. error InsufficientAllowance(); /// @dev The permit is invalid. error InvalidPermit(); /// @dev The permit has expired. error PermitExpired(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Emitted when `amount` tokens is transferred from `from` to `to`. event Transfer(address indexed from, address indexed to, uint256 amount); /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`. event Approval(address indexed owner, address indexed spender, uint256 amount); /// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`. uint256 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; /// @dev `keccak256(bytes("Approval(address,address,uint256)"))`. uint256 private constant _APPROVAL_EVENT_SIGNATURE = 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The storage slot for the total supply. uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c; /// @dev The balance slot of `owner` is given by: /// ``` /// mstore(0x0c, _BALANCE_SLOT_SEED) /// mstore(0x00, owner) /// let balanceSlot := keccak256(0x0c, 0x20) /// ``` uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2; /// @dev The allowance slot of (`owner`, `spender`) is given by: /// ``` /// mstore(0x20, spender) /// mstore(0x0c, _ALLOWANCE_SLOT_SEED) /// mstore(0x00, owner) /// let allowanceSlot := keccak256(0x0c, 0x34) /// ``` uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20; /// @dev The nonce slot of `owner` is given by: /// ``` /// mstore(0x0c, _NONCES_SLOT_SEED) /// mstore(0x00, owner) /// let nonceSlot := keccak256(0x0c, 0x20) /// ``` uint256 private constant _NONCES_SLOT_SEED = 0x38377508; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev `(_NONCES_SLOT_SEED << 16) | 0x1901`. uint256 private constant _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX = 0x383775081901; /// @dev `keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")`. bytes32 private constant _DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; /// @dev `keccak256("1")`. bytes32 private constant _VERSION_HASH = 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6; /// @dev `keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")`. bytes32 private constant _PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 METADATA */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the name of the token. function name() public view virtual returns (string memory); /// @dev Returns the symbol of the token. function symbol() public view virtual returns (string memory); /// @dev Returns the decimals places of the token. function decimals() public view virtual returns (uint8) { return 18; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the amount of tokens in existence. function totalSupply() public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { result := sload(_TOTAL_SUPPLY_SLOT) } } /// @dev Returns the amount of tokens owned by `owner`. function balanceOf(address owner) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, owner) result := sload(keccak256(0x0c, 0x20)) } } /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`. function allowance(address owner, address spender) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, owner) result := sload(keccak256(0x0c, 0x34)) } } /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens. /// /// Emits a {Approval} event. function approve(address spender, uint256 amount) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and store the amount. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x34), amount) // Emit the {Approval} event. mstore(0x00, amount) log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c))) } return true; } /// @dev Transfer `amount` tokens from the caller to `to`. /// /// Requirements: /// - `from` must at least have `amount`. /// /// Emits a {Transfer} event. function transfer(address to, uint256 amount) public virtual returns (bool) { _beforeTokenTransfer(msg.sender, to, amount); /// @solidity memory-safe-assembly assembly { // Compute the balance slot and load its value. mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, caller()) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Compute the balance slot of `to`. mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance of `to`. // Will not overflow because the sum of all user balances // cannot exceed the maximum uint256 value. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c))) } _afterTokenTransfer(msg.sender, to, amount); return true; } /// @dev Transfers `amount` tokens from `from` to `to`. /// /// Note: Does not update the allowance if it is the maximum uint256 value. /// /// Requirements: /// - `from` must at least have `amount`. /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`. /// /// Emits a {Transfer} event. function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) { _beforeTokenTransfer(from, to, amount); /// @solidity memory-safe-assembly assembly { let from_ := shl(96, from) // Compute the allowance slot and load its value. mstore(0x20, caller()) mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED)) let allowanceSlot := keccak256(0x0c, 0x34) let allowance_ := sload(allowanceSlot) // If the allowance is not the maximum uint256 value. if add(allowance_, 1) { // Revert if the amount to be transferred exceeds the allowance. if gt(amount, allowance_) { mstore(0x00, 0x13be252b) // `InsufficientAllowance()`. revert(0x1c, 0x04) } // Subtract and store the updated allowance. sstore(allowanceSlot, sub(allowance_, amount)) } // Compute the balance slot and load its value. mstore(0x0c, or(from_, _BALANCE_SLOT_SEED)) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Compute the balance slot of `to`. mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance of `to`. // Will not overflow because the sum of all user balances // cannot exceed the maximum uint256 value. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c))) } _afterTokenTransfer(from, to, amount); return true; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EIP-2612 */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev For more performance, override to return the constant value /// of `keccak256(bytes(name()))` if `name()` will never change. function _constantNameHash() internal view virtual returns (bytes32 result) {} /// @dev Returns the current nonce for `owner`. /// This value is used to compute the signature for EIP-2612 permit. function nonces(address owner) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { // Compute the nonce slot and load its value. mstore(0x0c, _NONCES_SLOT_SEED) mstore(0x00, owner) result := sload(keccak256(0x0c, 0x20)) } } /// @dev Sets `value` as the allowance of `spender` over the tokens of `owner`, /// authorized by a signed approval by `owner`. /// /// Emits a {Approval} event. function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { bytes32 nameHash = _constantNameHash(); // We simply calculate it on-the-fly to allow for cases where the `name` may change. if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name())); /// @solidity memory-safe-assembly assembly { // Revert if the block timestamp is greater than `deadline`. if gt(timestamp(), deadline) { mstore(0x00, 0x1a15a3cc) // `PermitExpired()`. revert(0x1c, 0x04) } let m := mload(0x40) // Grab the free memory pointer. // Clean the upper 96 bits. owner := shr(96, shl(96, owner)) spender := shr(96, shl(96, spender)) // Compute the nonce slot and load its value. mstore(0x0e, _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX) mstore(0x00, owner) let nonceSlot := keccak256(0x0c, 0x20) let nonceValue := sload(nonceSlot) // Prepare the domain separator. mstore(m, _DOMAIN_TYPEHASH) mstore(add(m, 0x20), nameHash) mstore(add(m, 0x40), _VERSION_HASH) mstore(add(m, 0x60), chainid()) mstore(add(m, 0x80), address()) mstore(0x2e, keccak256(m, 0xa0)) // Prepare the struct hash. mstore(m, _PERMIT_TYPEHASH) mstore(add(m, 0x20), owner) mstore(add(m, 0x40), spender) mstore(add(m, 0x60), value) mstore(add(m, 0x80), nonceValue) mstore(add(m, 0xa0), deadline) mstore(0x4e, keccak256(m, 0xc0)) // Prepare the ecrecover calldata. mstore(0x00, keccak256(0x2c, 0x42)) mstore(0x20, and(0xff, v)) mstore(0x40, r) mstore(0x60, s) let t := staticcall(gas(), 1, 0, 0x80, 0x20, 0x20) // If the ecrecover fails, the returndatasize will be 0x00, // `owner` will be checked if it equals the hash at 0x00, // which evaluates to false (i.e. 0), and we will revert. // If the ecrecover succeeds, the returndatasize will be 0x20, // `owner` will be compared against the returned address at 0x20. if iszero(eq(mload(returndatasize()), owner)) { mstore(0x00, 0xddafbaef) // `InvalidPermit()`. revert(0x1c, 0x04) } // Increment and store the updated nonce. sstore(nonceSlot, add(nonceValue, t)) // `t` is 1 if ecrecover succeeds. // Compute the allowance slot and store the value. // The `owner` is already at slot 0x20. mstore(0x40, or(shl(160, _ALLOWANCE_SLOT_SEED), spender)) sstore(keccak256(0x2c, 0x34), value) // Emit the {Approval} event. log3(add(m, 0x60), 0x20, _APPROVAL_EVENT_SIGNATURE, owner, spender) mstore(0x40, m) // Restore the free memory pointer. mstore(0x60, 0) // Restore the zero pointer. } } /// @dev Returns the EIP-712 domain separator for the EIP-2612 permit. function DOMAIN_SEPARATOR() public view virtual returns (bytes32 result) { bytes32 nameHash = _constantNameHash(); // We simply calculate it on-the-fly to allow for cases where the `name` may change. if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name())); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Grab the free memory pointer. mstore(m, _DOMAIN_TYPEHASH) mstore(add(m, 0x20), nameHash) mstore(add(m, 0x40), _VERSION_HASH) mstore(add(m, 0x60), chainid()) mstore(add(m, 0x80), address()) result := keccak256(m, 0xa0) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL MINT FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Mints `amount` tokens to `to`, increasing the total supply. /// /// Emits a {Transfer} event. function _mint(address to, uint256 amount) internal virtual { _beforeTokenTransfer(address(0), to, amount); /// @solidity memory-safe-assembly assembly { let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT) let totalSupplyAfter := add(totalSupplyBefore, amount) // Revert if the total supply overflows. if lt(totalSupplyAfter, totalSupplyBefore) { mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`. revert(0x1c, 0x04) } // Store the updated total supply. sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter) // Compute the balance slot and load its value. mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c))) } _afterTokenTransfer(address(0), to, amount); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL BURN FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Burns `amount` tokens from `from`, reducing the total supply. /// /// Emits a {Transfer} event. function _burn(address from, uint256 amount) internal virtual { _beforeTokenTransfer(from, address(0), amount); /// @solidity memory-safe-assembly assembly { // Compute the balance slot and load its value. mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, from) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Subtract and store the updated total supply. sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), amount)) // Emit the {Transfer} event. mstore(0x00, amount) log3(0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0) } _afterTokenTransfer(from, address(0), amount); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL TRANSFER FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Moves `amount` of tokens from `from` to `to`. function _transfer(address from, address to, uint256 amount) internal virtual { _beforeTokenTransfer(from, to, amount); /// @solidity memory-safe-assembly assembly { let from_ := shl(96, from) // Compute the balance slot and load its value. mstore(0x0c, or(from_, _BALANCE_SLOT_SEED)) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Compute the balance slot of `to`. mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance of `to`. // Will not overflow because the sum of all user balances // cannot exceed the maximum uint256 value. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c))) } _afterTokenTransfer(from, to, amount); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL ALLOWANCE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Updates the allowance of `owner` for `spender` based on spent `amount`. function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and load its value. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, owner) let allowanceSlot := keccak256(0x0c, 0x34) let allowance_ := sload(allowanceSlot) // If the allowance is not the maximum uint256 value. if add(allowance_, 1) { // Revert if the amount to be transferred exceeds the allowance. if gt(amount, allowance_) { mstore(0x00, 0x13be252b) // `InsufficientAllowance()`. revert(0x1c, 0x04) } // Subtract and store the updated allowance. sstore(allowanceSlot, sub(allowance_, amount)) } } } /// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`. /// /// Emits a {Approval} event. function _approve(address owner, address spender, uint256 amount) internal virtual { /// @solidity memory-safe-assembly assembly { let owner_ := shl(96, owner) // Compute the allowance slot and store the amount. mstore(0x20, spender) mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED)) sstore(keccak256(0x0c, 0x34), amount) // Emit the {Approval} event. mstore(0x00, amount) log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c))) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* HOOKS TO OVERRIDE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Hook that is called before any transfer of tokens. /// This includes minting and burning. function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /// @dev Hook that is called after any transfer of tokens. /// This includes minting and burning. function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} }
{ "remappings": [ "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "ds-test/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/", "openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/", "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "paris", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint16","name":"sellPenalty","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"ethReserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenReserve","type":"uint256"}],"name":"FakePoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"FakePoolMCapReached","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethReserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenReserve","type":"uint256"}],"name":"FakePoolReserveChanged","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":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"string","name":"imageCid","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"string[]","name":"links","type":"string[]"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"enum LibTokens.LpStrategy","name":"lpStrategy","type":"uint8"}],"name":"TokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"TokenLaunched","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"_launchstats_FakePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"ethOut","type":"bool"}],"name":"_quote_FakePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"}],"name":"buy","outputs":[{"internalType":"uint256","name":"tokensOut","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"calculateSqrtPriceX96","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"eth","type":"uint256"}],"name":"calculateTxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint256","name":"creationPrice","type":"uint256"},{"internalType":"address","name":"nfpManager","type":"address"},{"internalType":"uint16","name":"txFee","type":"uint16"},{"internalType":"uint16","name":"launchFee","type":"uint16"},{"internalType":"uint16","name":"farmRatioDenominator","type":"uint16"},{"internalType":"uint256","name":"fakePoolEthMCapThreshold","type":"uint256"},{"internalType":"uint256","name":"tokenSupply","type":"uint256"},{"internalType":"uint256","name":"fakePoolBaseEther","type":"uint256"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"address","name":"v3staker","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"imageCid","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string[]","name":"links","type":"string[]"},{"internalType":"uint16","name":"sellPenalty","type":"uint16"},{"internalType":"enum LibTokens.LpStrategy","name":"lpStrategy","type":"uint8"},{"internalType":"uint256","name":"initialBuy","type":"uint256"}],"name":"create","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getConfig","outputs":[{"components":[{"internalType":"uint256","name":"creationPrice","type":"uint256"},{"internalType":"address","name":"nfpManager","type":"address"},{"internalType":"uint16","name":"txFee","type":"uint16"},{"internalType":"uint16","name":"launchFee","type":"uint16"},{"internalType":"uint16","name":"farmRatioDenominator","type":"uint16"},{"internalType":"uint256","name":"fakePoolEthMCapThreshold","type":"uint256"},{"internalType":"uint256","name":"tokenSupply","type":"uint256"},{"internalType":"uint256","name":"fakePoolBaseEther","type":"uint256"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"address","name":"v3staker","type":"address"}],"internalType":"struct Config","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint8","name":"farmType","type":"uint8"}],"name":"launch","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"manualLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"bool","name":"_lock","type":"bool"}],"name":"manualLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolMap","outputs":[{"internalType":"uint256","name":"fakeEth","type":"uint256"},{"internalType":"uint256","name":"ethReserve","type":"uint256"},{"internalType":"uint256","name":"tokenReserve","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint16","name":"sellPenalty","type":"uint16"},{"internalType":"bool","name":"locked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proceeds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"ethOut","type":"bool"}],"name":"quote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"}],"name":"sell","outputs":[{"internalType":"uint256","name":"ethOut","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"creationPrice","type":"uint256"},{"internalType":"address","name":"nfpManager","type":"address"},{"internalType":"uint16","name":"txFee","type":"uint16"},{"internalType":"uint16","name":"launchFee","type":"uint16"},{"internalType":"uint16","name":"farmRatioDenominator","type":"uint16"},{"internalType":"uint256","name":"fakePoolEthMCapThreshold","type":"uint256"},{"internalType":"uint256","name":"tokenSupply","type":"uint256"},{"internalType":"uint256","name":"fakePoolBaseEther","type":"uint256"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"address","name":"v3staker","type":"address"}],"internalType":"struct Config","name":"_config","type":"tuple"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"unlockEth","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080806040523461005b5760008054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3613fda90816100618239f35b600080fdfe608060405260043610156200001357600080fd5b6000803560e01c80631683165f146200082d57806332f2bcf214620017b75780634a5e67a1146200174b57806353ae90fb146200171557806355b5ec6414620016f55780635b673532146200166a57806365d4b8b51462000d1657806368a008cf1462000c9f5780636a27246214620009ad578063706d4b881462000974578063715018a6146200091657806379502c55146200088e5780637e0eeadc146200085c5780638da5cb5b146200083357806392f87d7b146200082d578063a000bf4f14620007e2578063b75e23ed146200068b578063c3f909d41462000522578063c72896ac14620004e3578063cce7ec13146200039c578063d791de6314620001f55763f2fde38b146200012657600080fd5b34620001f2576020366003190112620001f2576200014362001f1a565b6200014d6200206f565b6001600160a01b039081169081156200019e57600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b80fd5b5034620001f25760209081600319360112620001f2576004356001600160401b03811162000398576200022d90369060040162001fb0565b9290620002396200206f565b825b84811062000247578380f35b6001600160a01b03602484826200026a62000264868b89620025c8565b620025ef565b16926200027d62000264868b89620025c8565b16604051928380926370a0823160e01b82523060048301525afa9081156200038d57918591879384916200034c575b5060405163a9059cbb60e01b8152336004820152602481019190915292839190829081604481015b03925af1801562000341576200030d575b506000198114620002f9576001016200023b565b634e487b7160e01b84526011600452602484fd5b6200033190843d861162000339575b6200032881836200204d565b8101906200210d565b5038620002e5565b503d6200031c565b6040513d87823e3d90fd5b92809294508391503d831162000385575b6200036981836200204d565b8101031262000381575185918591620002d4620002ac565b8580fd5b503d6200035d565b6040513d88823e3d90fd5b5080fd5b506040366003190112620001f257620003b462001f1a565b60243590620003c43482620023b3565b91909280620004ce575b5060405163a9059cbb60e01b815233600482015260248101849052602081604481886001600160a01b0387165af180156200034157604095927f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c928692620004ab575b5086513381526001600160a01b0391909116602082015234604082015260608101919091526080810184905260a090a18351903482528060208301528482015282606082015233907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260803092a382519182526020820152f35b620004c69060203d811162000339576200032881836200204d565b503862000431565b620004dc908410156200216a565b38620003ce565b5034620001f25780600319360112620001f257620005006200206f565b8080808060095481600955335af16200051862002127565b5015620001f25780f35b5034620001f25780600319360112620001f257610120604051620005468162002030565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015201526101406040516200058d8162002030565b6002549081815261ffff60035460018060a01b0381166020840152818160a01c166040840152818160b01c16606084015260c01c16608082015260045460a082015260055460c082015260065460e082015260018060a01b036007541661010082015260018060a01b036008541661012082015260405191825260018060a01b03602082015116602083015261ffff604082015116604083015261ffff606082015116606083015261ffff608082015116608083015260a081015160a083015260c081015160c083015260e081015160e083015260018060a01b036101008201511661010083015261012060018060a01b0391015116610120820152f35b5034620001f257610140366003190112620001f257604051620006ae8162002030565b60043581526001600160a01b036024358181168103620007dd576020830190815260443561ffff8082168203620007dd5760408501918252606435918183168303620007dd57606086019283526084359182168203620007dd576080860191825260a0860160a435815260c087019160c435835260e088019360e435855261010435958887168703620007dd576101008a019687526101243599898b168b03620007dd578998816101208b93019c8d52620007686200206f565b5160025551166003549361ffff60a01b905160a01b169161ffff60b01b905160b01b169261ffff60c01b905160c01b169365ffffffffffff60d01b16171717176003555160045551600555516006555116916001600160601b0360a01b92836007541617600755511690600854161760085580f35b600080fd5b5034620001f2576040366003190112620001f25760206001600160a01b03620008246200081e62000815602435620021b7565b600435620021e8565b6200220a565b16604051908152f35b62001f31565b5034620001f25780600319360112620001f257546040516001600160a01b039091168152602090f35b5034620001f2576020366003190112620001f2576200087a6200206f565b80808080600435335af16200051862002127565b5034620001f25780600319360112620001f257610140600254600354600454906005546006549060018060a01b03938460075416938560085416956040519788528116602088015261ffff90818160a01c166040890152818160b01c16606089015260c01c16608087015260a086015260c085015260e0840152610100830152610120820152f35b5034620001f25780600319360112620001f257620009336200206f565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034620001f2576020366003190112620001f25760206103e8620009a461ffff60035460a01c16600435620021e8565b04604051908152f35b5034620001f2576060366003190112620001f257620009cb62001f1a565b6001600160a01b038181168084526001602090815260408520600381015490931694604435939192602435928715158062000c8c575b1562000c885762000abd62000ab6857f13f11b6cdd938ad49b100c844181719a0daaa3f17146c3ee73b348cb26028b5c62000a859a9b600286019062000aad825492600189019e8f94855462000a7c62000a7362000a60838c620021e8565b62000a6c8c86620021fc565b90620021dd565b998a93620021fc565b809455620020e9565b80945560405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a1620025ab565b8262002575565b965481541162000c4d578062000ad762000add92620024f4565b62002346565b948062000c38575b506040516323b872dd60e01b8152336004820152306024820152604481018490529084908290606490829086905af1801562000c2d5762000c0b575b508080808088335af162000b3462002127565b501562000bd457604080513381526001600160a01b039790971660208801528681018690526060870183905260808701859052957f9be8a5ca22b7e6e81f04b5879f0248227bb770114291bd47dfaee4c3a82ad60e9060a090a1855191818352838301528486830152606082015230907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260803392a38351928352820152f35b60405162461bcd60e51b815260048101849052600f60248201526e195d1a081cd95b990819985a5b1959608a1b6044820152606490fd5b62000c2590843d861162000339576200032881836200204d565b503862000b21565b6040513d84823e3d90fd5b62000c46908710156200216a565b3862000ae5565b60405162461bcd60e51b81526004810186905260136024820152721b9bc8195d1a081b19599d081a5b881c1bdbdb606a1b6044820152606490fd5b8280fd5b5060ff600482015460b01c161562000a01565b5034620001f2576020366003190112620001f2578062000cbe62001f1a565b62000cc86200206f565b6001600160a01b0316803b1562000d13578180916004604051809481936301339c2160e01b83525af1801562000c2d5762000d005750f35b62000d0b906200201c565b620001f25780f35b50fd5b506040366003190112620001f25762000d2e62001f1a565b6024359060ff8216820362000c885762000d476200206f565b62000d528162002371565b80928562000d8c600354946103e862000d7361ffff8860b01c1683620021e8565b049062000d8382600954620021fc565b600955620020e9565b60085460405163095ea7b360e01b81526001600160a01b038781166004830152602482018790529295918316926020908290604490829088908a165af180156200163b5762001646575b506001600160a01b0384163b1562000c88576040516301339c2160e01b81528381600481836001600160a01b038a165af19081156200163b57849162001623575b50506007546001600160a01b031696873b156200142657604051630d0e30db60e41b815284816004818a8d5af1908115620003415785916200160b575b505060405163095ea7b360e01b81526001600160a01b038816600482015260248101879052602081604481888d5af180156200034157620015e7575b508360ff8a166001036200155857505062000ec162000eb961ffff60035460c01c1683620021dd565b8092620020e9565b60405163095ea7b360e01b81526001600160a01b03841660048201526024810183905290959060208180604481010381886001600160a01b038b165af18015620003415762001534575b505b6001600160a01b0385168811156200152a57849588905b6001600160a01b0387168a1115620015235791905b60206001600160a01b0362000f5d6200081e62000f5687620021b7565b86620021e8565b6040516309f56ab160e11b81526001600160a01b03808d1660048301528581166024830152610bb8604483015292909116606482015297889160849183918e165af1958615620014b5578c96620014d4575b506040518061093c8101106001600160401b0361093c83011117620014c05761093c6200260582398061093c810103908df0978815620014b55783600981020460091484151715620014a15782600981020460091483151715620014a15760405190816101608101106001600160401b0361016084011117620013d957600961014094600a82608098610164978396610160890160405260018060a01b0316885260018060a01b03166020880152610bb86040880152620d89b3196060880152620d89b48a8801528060a08801528360c0880152020460e0850152020461010082015260018060a01b03891661012082015242838201528c6040519a8b948593634418b22b60e11b855260018060a01b03815116600486015260018060a01b03602082015116602486015262ffffff6040820151166044860152606081015160020b60648601528781015160020b608486015260a081015160a486015260c081015160c486015260e081015160e486015261010081015161010486015260018060a01b0361012082015116610124860152015161014484015260018060a01b03165af1968715620014965789988a80978199829b6200142a575b5081546001600160a01b0390811690620011838a62001fe3565b5416906001600160a01b0383163b1562001426576040516365f2031160e11b81526001600160a01b0391821660048201529181166024830152604482018e905290918391839160649183918591165af1801562000c2d576200140a575b505060ff811662001297575b5050506001600160a01b038084168952600160205260409098206004018054600162ff000160a01b031916928916928317600160b01b179055506080966001600160801b0393927f3a2480ce53a8c9229556c140c60039b8c13bce2009773b802a638deec98eae1f92606092620012638362001fe3565b54169160405192835260018060a01b031660208301526040820152a160405194855216602084015260408301526060820152f35b60ff1660010362001403575083905b600142014211620013ef57624f1a0142016001420111620013ef578954604051906001600160a01b03166001600160401b0360c0830190811190831117620013d9578b9360c0830160405260018060a01b0316825260018060a01b0386166020830152600142016040830152624f1a01420160608301526203f480608083015260a0820152833b1562000c885760408051638d4502e760e01b815282516001600160a01b039081166004830152602084015181166024830152918301516044820152606083015160648201526080830151608482015260a0909201511660a482015260c481019190915291829060e490829084905af18015620013ce57620013b2575b808080620011ec565b620013be88916200201c565b620013ca5738620013a9565b8680fd5b6040513d8a823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b8a52601160045260248afd5b90620012a6565b62001415906200201c565b62001422578a38620011e0565b8a80fd5b8380fd5b9850995050985095506080853d6080116200148d575b816200144f608093836200204d565b8101031262001489578451956020860151986001600160801b038a168a0362001422578a60606040890151980151989a9798993862001169565b8880fd5b3d915062001440565b6040513d8b823e3d90fd5b634e487b7160e01b8d52601160045260248dfd5b6040513d8e823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b9095506020813d6020116200151a575b81620014f3602093836200204d565b810103126200151657516001600160a01b03811681036200151657943862000faf565b8b80fd5b3d9150620014e4565b9062000f39565b8795859062000f24565b620015509060203d60201162000339576200032881836200204d565b503862000f0b565b915094600260ff8a160362000f0d5790506200158262000eb961ffff60035460c01c1683620021dd565b60405163095ea7b360e01b81526001600160a01b038416600482015260248101839052602081604481888d5af180156200034157620015c3575b5062000f0d565b620015df9060203d60201162000339576200032881836200204d565b5038620015bc565b620016039060203d60201162000339576200032881836200204d565b503862000e90565b62001616906200201c565b6200142657833862000e54565b6200162e906200201c565b62000c8857823862000e17565b6040513d86823e3d90fd5b620016629060203d60201162000339576200032881836200204d565b503862000dd6565b5034620001f2576020366003190112620001f25760e0906001600160a01b039060ff90604090836200169b62001f1a565b1681526001602052208054926001820154916002810154600483600384015416920154936040519687526020870152604086015260608501528116608084015261ffff8160a01c1660a084015260b01c16151560c0820152f35b5034620001f25780600319360112620001f2576020600954604051908152f35b5034620001f2576020366003190112620001f25760406200173f6200173962001f1a565b62002371565b82519182526020820152f35b5034620001f2576040366003190112620001f2576200176962001f1a565b60243590811515809203620007dd57620017826200206f565b6001600160a01b03168252600160205260408220600401805460ff60b01b191660b09290921b60ff60b01b1691909117905580f35b50610100366003190112620001f2576004356001600160401b0381116200039857620017e890369060040162001f80565b6024356001600160401b03811162001426576200180a90369060040162001f80565b926044356001600160401b03811162000381576200182d90369060040162001f80565b906064356001600160401b03811162001f16576200185090369060040162001f80565b90916084356001600160401b03811162001f12576200187490369060040162001fb0565b94909661ffff60a4351660a435036200142257600260c4351015620014225760128911158062001f06575b8062001ef9575b1562001ec357600586101562001e90578a5b8660ff82161062001de9575060055499604051806110648101106001600160401b0361106483011117620014c05761106462002f41823980611064810103908df08015620014b5576001600160a01b03169a8c8c3b15620001f25780620019478e8c8f946200195b95604051968795869485936328869b1960e01b8552608060048601526084850191620020c8565b8281036003190160248401528a8c620020c8565b88604483015230606483015203925af1801562001ddc5762001dc6575b506102bc61ffff60a435161162001d8a578b8d9a989a528b8d60016020526040902091600654826001600160601b0360a01b60038601541617600385015580845580600185015581600285015560048401805461ffff60a01b60a43560a01b169061ffff60a01b191617905560405192835260a43561ffff1660208401526040830152606082015260807f6231ee9c84aaa3e6026eeb8f1f2dffe74e76ddeda12274e216d10df81013b7ae91a162001a309062002346565b9762001a3c8c62001fe3565b336001600160601b0360a01b8254161790558b6000527f37c7a69cb64276d9952a1cf15ae5474311c0ddadaf138ab6ce1b4a3e73db5625602052604060002060ff1981541660c43560ff161790556005549a6040519b8d8d3381526020015260408d01528b6101406060819201528c019062001ab892620020c8565b908a820360808c015262001acc92620020c8565b9088820360a08a015262001ae092620020c8565b9086820360c088015262001af492620020c8565b9284840360e086015280845260208401908060051b8501602001948389915b83831062001d21578a8a7f75028b0a037a0f08db1f929f961f295b07682033cdaf1697062e81cd6085f91b8b808c8c61010083015260c4356101208301520390a1600254349181831062001cca5762001b7c62001b72838695620020e9565b92600954620021fc565b60095560e435908162001be1575b50508062001b955750f35b81808092335af162001ba662002127565b501562001bb05780f35b60405162461bcd60e51b81526020600482015260096024820152686e6f742073656e742160b81b6044820152606490fd5b90918262001bef91620020e9565b9162001bfc8183620023b3565b60405163a9059cbb60e01b8152336004820152602481018390529391906020856044818a875af191821562001cbf577f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c9562001c909362001c9b575b50604080513381526001600160a01b0390951660208601528401949094526060830193909352608082019290925290819060a0820190565b0390a1838062001b8a565b62001cb79060203d60201162000339576200032881836200204d565b508962001c58565b6040513d89823e3d90fd5b60405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f7567682065746820746f2070617920746865206372656174696044820152686f6e2070726963652160b81b6064820152608490fd5b909192939496601f19828203018652601e19833603018835121562001422578288350190602082359201916001600160401b03811162001d8657803603831362001d865762001d776020928392600195620020c8565b99019601949301919062001b13565b8c80fd5b60405162461bcd60e51b81526020600482015260146024820152731cd95b1b081c195b985b1d1e481a5b9d985b1a5960621b6044820152606490fd5b62001dd4909d919d6200201c565b9b3862001978565b8e604051903d90823e3d90fd5b611fe08160051b16890135601e198a36030181121562001d8657890180356001600160401b03811162001e8c576020918282360391011362001e8c5760801062001e58575060ff80911690811462001e4457600101620018b8565b634e487b7160e01b8c52601160045260248cfd5b6064906040519062461bcd60e51b82526004820152600d60248201526c6c696e6b20746f6f206c6f6e6760981b6044820152fd5b8d80fd5b60405162461bcd60e51b815260206004820152600b60248201526a06a40d8d2dcd6e640dac2f60ab1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420706172616d7360901b6044820152606490fd5b50610200841115620018a6565b5060128a11156200189f565b8980fd5b8780fd5b600435906001600160a01b0382168203620007dd57565b34620007dd576060366003190112620007dd576004356001600160a01b0381168103620007dd57604435908115158203620007dd5760209162001f7891602435906200225c565b604051908152f35b9181601f84011215620007dd578235916001600160401b038311620007dd5760208381860195010111620007dd57565b9181601f84011215620007dd578235916001600160401b038311620007dd576020808501948460051b010111620007dd57565b6001600160a01b031660009081527f37c7a69cb64276d9952a1cf15ae5474311c0ddadaf138ab6ce1b4a3e73db56246020526040902090565b6001600160401b038111620013d957604052565b61014081019081106001600160401b03821117620013d957604052565b90601f801991011681019081106001600160401b03821117620013d957604052565b6000546001600160a01b031633036200208457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b908060209392818452848401376000828201840152601f01601f1916010190565b91908203918211620020f757565b634e487b7160e01b600052601160045260246000fd5b90816020910312620007dd57518015158103620007dd5790565b3d1562002165573d906001600160401b038211620013d9576040519162002159601f8201601f1916602001846200204d565b82523d6000602084013e565b606090565b156200217257565b60405162461bcd60e51b815260206004820152601960248201527f616d6f756e74206f7574206c6f776572207468616e206d696e000000000000006044820152606490fd5b8015620021c757600160c01b0490565b634e487b7160e01b600052601260045260246000fd5b8115620021c7570490565b81810292918115918404141715620020f757565b91908201809211620020f757565b90811562002256576001808301808411620020f757811c90835b8483106200223157505050565b909193506200224c84620022468184620021dd565b620021fc565b821c919062002224565b60009150565b6001600160a01b03166000908152600160205260409020909115620022df57620022d5620022cd620022ad620022dc9462000a6c600286015491620022a6600188015482620021e8565b92620021fc565b6103e8620022c561ffff60035460a01c1683620021e8565b0490620020e9565b809262002319565b90620020e9565b90565b62000a6c62002304620022dc936103e8620022c561ffff60035460a01c1683620021e8565b620022a66002600185015494015482620021e8565b6004015460a01c61ffff169081156200233f576103e8916200233b91620021e8565b0490565b5050600090565b6001810154670de0b6b3a76400009080820291820403620020f7576002620022dc92015490620021dd565b6001600160a01b03908116600090815260016020526040902060038101549092911615620007dd576002620023ad6001840154845490620020e9565b92015490565b6001600160a01b039081166000908152600160205260409020600381018054909493908316151580620024e1575b156200249c576200244694620022dc936200248e620024217f13f11b6cdd938ad49b100c844181719a0daaa3f17146c3ee73b348cb26028b5c94620025ab565b9160018601936200246385549460028901956200245a6200245288549e8f85620021e8565b62000a6c8585620021fc565b809e620020e9565b809755620021fc565b80955554169160405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a162000ad781620024f4565b60405162461bcd60e51b815260206004820152601760248201527f706f6f6c206973207a65726f206f72206c6f636b6564210000000000000000006044820152606490fd5b5060ff600483015460b01c1615620023e1565b670de0b6b3a7640000620025156200250c8362002346565b600554620021e8565b046004541115620025235750565b60048101805460ff60b01b1916600160b01b179055600301546040516001600160a01b039190911681527f96c3356711ed5fea211225a23108f7f27b7d4ee8f60bbfe05f98c018a6b3b51890602090a1565b62002581828262002319565b90816200258d57505090565b916001620022dc9301620025a3838254620021fc565b9055620020e9565b620022dc906103e862000d7361ffff60035460a01c1683620021e8565b9190811015620025d95760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b0381168103620007dd579056fe6080806040523461003c57600380546001600160a01b03191673f807aca27b1550fe778fd4e7013bb57480b17fac1790556108fa90816100428239f35b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c918263150b7a021461037c5750816317d70f7c1461035d57816345cb3dde1461033f5781634a41823b1461030d57816352709725146102e45781637303e913146102bb5781638da5cb5b14610293578163c87965721461027a578163cbe40622146101ee578163ea98847b1461013d57508063f5af5f95146100db5763f940e385146100a957600080fd5b346100d7573660031901126100d4576100d16100c3610426565b6100cb610441565b90610573565b80f35b80fd5b5080fd5b82346100d45760203660031901126100d4576100f5610426565b600154906001600160a01b039033828416148015610131575b1561012d5716906bffffffffffffffffffffffff60a01b161760015580f35b8380fd5b5081845416331461010e565b919050346101ea57826003193601126101ea5782546001600160a01b0390811692908490338590036100d757825442106100d757600354169360025490853b156101ea576064908386519788948593632142170760e11b85523089860152602485015260448401525af180156101e0576101b5578380f35b67ffffffffffffffff83116101cd5750523880808380f35b634e487b7160e01b845260419052602483fd5b82513d86823e3d90fd5b8280fd5b8390346100d75760603660031901126100d757610209610426565b610211610441565b83546001600160a01b039291908381166102765783926bffffffffffffffffffffffff60a01b948591169116178555169060015416176001556044356002556301e13380420190814211610263575580f35b634e487b7160e01b835260119052602482fd5b8580fd5b83346100d457806003193601126100d4576100d161048f565b5050346100d757816003193601126100d757905490516001600160a01b039091168152602090f35b5050346100d757816003193601126100d75760035490516001600160a01b039091168152602090f35b5050346100d757816003193601126100d75760015490516001600160a01b039091168152602090f35b5050346100d7573660031901126100d4576100d1610329610426565b610331610441565b9061033a61048f565b610573565b9050346101ea57826003193601126101ea5760209250549051908152f35b5050346100d757816003193601126100d7576020906002549051908152f35b915083346100d45760803660031901126100d457610398610426565b506103a1610441565b5060643567ffffffffffffffff8082116101ea57366023830112156101ea57818401359081116101ea57369101602401116100d457506002546103f5576044356002558251630a85bd0160e11b8152602090f35b62461bcd60e51b8252602090820152600d60248201526c15985d5b1d0e881313d0d2d151609a1b6044820152606490fd5b600435906001600160a01b038216820361043c57565b600080fd5b602435906001600160a01b038216820361043c57565b90601f8019910116810190811067ffffffffffffffff82111761047957604052565b634e487b7160e01b600052604160045260246000fd5b60018060a01b038060035416906002546040928351608081019080821067ffffffffffffffff83111761047957859360849285528152600060208201933085528583016fffffffffffffffffffffffffffffffff9081815281606086019181835289519a8b998a9863fc6f786560e01b8a525160048a01525116602488015251166044860152511660648401525af180156105505761052c575050565b813d8311610549575b61053f8183610457565b8101031261043c57565b503d610535565b82513d6000823e3d90fd5b9081602091031261043c5751801515810361043c5790565b604080516370a0823160e01b8082523060048084019190915260209591946001600160a01b03908116928785602481875afa9485156107db57600095610895575b50811692855187815230848201528881602481885afa90811561084057600091610868575b50600054875163a9059cbb60e01b8082529185166001600160a01b031686820190815260019890981c602089015290968a908290819060400103816000875af1801561081857918a9161065e9361084b575b5060005489518981529086166001600160a01b031687820190815260019290921c60208301529283918291604090910190565b03816000895af1801561084057610823575b5081600154169086519088825230858301528982602481845afa91821561081857908a92916000926107e6575b5088518881526001600160a01b0390941686850190815260208101929092528391829060009082906040015b03925af180156107db576107be575b506001541692845195865230828701528686602481865afa9586156107b35790879493929160009761077a575b506000906107338751988996879586948552840160209093929193604081019460018060a01b031681520152565b03925af19081156107705750610747575050565b8161076692903d10610769575b61075e8183610457565b81019061055b565b50565b503d610754565b513d6000823e3d90fd5b9192939482819892983d83116107ac575b6107958183610457565b810103126100d45750519486939291906000610705565b503d61078b565b85513d6000823e3d90fd5b6107d490883d8a116107695761075e8183610457565b50386106d8565b86513d6000823e3d90fd5b91909282813d8311610811575b6107fd8183610457565b810103126100d457505189916106c961069d565b503d6107f3565b88513d6000823e3d90fd5b61083990893d8b116107695761075e8183610457565b5038610670565b87513d6000823e3d90fd5b61086190833d85116107695761075e8183610457565b503861062b565b908982813d831161088e575b61087e8183610457565b810103126100d4575051386105d9565b503d610874565b90948882813d83116108bd575b6108ac8183610457565b810103126100d457505193816105b4565b503d6108a256fea2646970667358221220b2eacaf4f6bdff744cf25dca974d415a638494bbf8a247bd94cabf9e159dbf6264736f6c63430008120033608080604052346100d5576002546001908181811c911680156100cb575b60208210146100b557601f811161006c575b7f6a756e6b646174610000000000000000000000000000000000000000000000106002556003805460ff60a01b19169055610f8983816100db8239f35b6002600052601f0160051c7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace908101905b8181106100aa575061002f565b60008155820161009d565b634e487b7160e01b600052602260045260246000fd5b90607f169061001d565b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c91826301339c2114610d3857826306fdde0314610c8757508163095ea7b314610c1d57816318160ddd14610bf657816323b872dd14610a9257816328869b191461068d578163313ce567146106715781633644e515146105e957816370a08231146105b55781637ecebe001461058157816395d89b41146104bc5781639df89605146103bf578163a9059cbb146102a3578163d505accf1461010a575063dd62ed3e146100ca57600080fd5b346101065780600319360112610106576020916100e5610dcd565b906100ee610de8565b8452637f5e9f20600c52526034600c20549051908152f35b5080fd5b8383346101065760e036600319011261010657610125610dcd565b61012d610de8565b60443590606435916084359460ff8616860361029f5761014b610e66565b9384516020809601208142116102935782519760c060018060a01b03809916988997169965383775081901600e52878c5288600c2094855480957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f84528b84019081528d8985017fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc68152606086019c8d469052608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988525252898b525260a082015220604e526042602c208a5260ff16865260a435835260c435606052858060808b60015afa90873d5103610287577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259798999a50019055866303faf4f960a51b1790526034602c2055a380f35b8a63ddafbaef8b52601cfd5b89631a15a3cc8a52601cfd5b8680fd5b8284346103bc57816003193601126103bc576102bd610dcd565b6024359160035460ff8160a01c161561033f575b506387a211a2600c5233815260209485600c2090815490818611610334575084900390555282600c208181540190558252600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8480a35160018152f35b63f4d678b88452601cfd5b6001600160a01b039081163381149182156103b0575b50501561036257856102d1565b835162461bcd60e51b8152602081870152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b84161490508680610355565b80fd5b838334610106578160031936011261010657805190826002546103e181610e2c565b8085529060019081811690811561049e5750600114610443575b5050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b0390f35b634e487b7160e01b815260418552602490fd5b6002865290915084907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b8383106104855750506020915083010185806103fb565b81816020929493945483858a010152019101919061046e565b9150506020925060ff191682850152151560051b83010185806103fb565b8383346101065781600319360112610106578051908260018054906104e082610e2c565b8086529181811690811561049e5750600114610527575050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b80865290915084907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8383106105685750506020915083010185806103fb565b81816020929493945483858a0101520191019190610551565b5050346101065760203660031901126101065760209161059f610dcd565b906338377508600c525281600c20549051908152f35b505034610106576020366003190112610106576020916105d3610dcd565b906387a211a2600c525281600c20549051908152f35b50503461010657816003193601126101065760209060a0610608610e66565b8381519101208251907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252848201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc683820152466060820152306080820152209051908152f35b5050346101065781600319360112610106576020905160128152f35b905034610a8e576080366003190112610a8e5767ffffffffffffffff8135818111610a8a576106bf9036908401610dfe565b60249491943583811161029f576106d99036908601610dfe565b604435966001600160a01b0360643581811697919590889003610a86576805345cdf77eb68f44c978854610a82576bffffffffffffffffffffffff60a01b6003541617600355818111610a6f57806107318c54610e2c565b93601f94858111610a14575b508c908d8684116001146109a35792610998575b50508160011b916000199060031b1c1916178a555b821161098557819060019361077b8554610e2c565b828111610916575b508a918311600114610899578a9261088e575b5050600019600383901b1c191690821b1790555b60035460ff8160a01c161561081f575b5050508054918383019283106108145750556387a211a2600c523382526020600c20818154019055602052600c5160601c817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a380f35b63e5cfe9578552601cfd5b168015908115610884575b50156108375780806107ba565b5162461bcd60e51b8152602081840152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b905033143861082a565b013590503880610796565b848b528493507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf691601f1984168c5b8181106108fe575084116108e4575b505050811b0190556107aa565b0135600019600384901b60f8161c191690553880806108d7565b828401358555879690940193602092830192016108c8565b90919250848b527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68380860160051c8201926020871061097c575b91869588929594930160051c01915b82811061096e575050610783565b8d8155869550879101610960565b92508192610951565b634e487b7160e01b895260418752602489fd5b013590503880610751565b925090601f198416838052600080516020610f34833981519152935b8181106109fc57509084600195949392106109e2575b505050811b018a55610766565b0135600019600384901b60f8161c191690553880806109d5565b919360206001819287870135815501950192016109bf565b9091508c8052600080516020610f348339815191528580850160051c82019260208610610a66575b859493910160051c909101908e5b828210610a5857505061073d565b81558493506001018e610a4a565b92508192610a3c565b634e487b7160e01b8b526041895260248bfd5b8b80fd5b8a80fd5b8480fd5b8280fd5b8284346103bc5760603660031901126103bc57610aad610dcd565b90610ab6610de8565b6044359060035460ff8160a01c1615610b77575b508360601b92602096338852600c94637f5e9f208117865260348620805460018101610b54575b50506387a211a217855287852090815490818611610334575084900390555284822080548201905584525160601c906001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8480a35160018152f35b808711610b6b5786900390556387a211a28a610af1565b836313be252b8652601cfd5b6001600160a01b039081168582168114918215610bea575b505015610b9c5786610aca565b845162461bcd60e51b8152602081880152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b83161490508780610b8f565b5050346101065781600319360112610106576020906805345cdf77eb68f44c549051908152f35b505034610106578060031936011261010657602091610c3a610dcd565b602435908452637f5e9f20600c52338252806034600c20558152602c5160601c907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b84908434610a8e5782600319360112610a8e57828354610ca681610e2c565b8085529060019081811690811561049e5750600114610cf0575050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b8580529091508490600080516020610f348339815191525b838310610d1f5750506020915083010185806103fb565b81816020929493945483858a0101520191019190610d08565b84346103bc57806003193601126103bc57600354336001600160a01b0382161480610d76575b156101065760ff60a01b1916600160a01b1760035580f35b5060ff8160a01c1615610d5e565b6020808252825181830181905290939260005b828110610db957505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610d97565b600435906001600160a01b0382168203610de357565b600080fd5b602435906001600160a01b0382168203610de357565b9181601f84011215610de35782359167ffffffffffffffff8311610de35760208381860195010111610de357565b90600182811c92168015610e5c575b6020831014610e4657565b634e487b7160e01b600052602260045260246000fd5b91607f1691610e3b565b6040519060008054610e7781610e2c565b80855290600190818116908115610f155750600114610ecd575b5050829003601f01601f1916820167ffffffffffffffff811183821017610eb757604052565b634e487b7160e01b600052604160045260246000fd5b6000808052919250600080516020610f348339815191525b838310610efc575050602091508301013880610e91565b81816020929493945483858a0101520191019190610ee5565b9150506020925060ff191682850152151560051b8301013880610e9156fe290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563a26469706673582212208f9bf288b987c5af0ece277a334832c942609ba1f8cf36b0792ec82fef1fb4c964736f6c63430008120033a26469706673582212207ce7445468468cf2707c17cfad2258576201bb5ee26dba52bd26a0ac655b66f764736f6c63430008120033
Deployed Bytecode
0x608060405260043610156200001357600080fd5b6000803560e01c80631683165f146200082d57806332f2bcf214620017b75780634a5e67a1146200174b57806353ae90fb146200171557806355b5ec6414620016f55780635b673532146200166a57806365d4b8b51462000d1657806368a008cf1462000c9f5780636a27246214620009ad578063706d4b881462000974578063715018a6146200091657806379502c55146200088e5780637e0eeadc146200085c5780638da5cb5b146200083357806392f87d7b146200082d578063a000bf4f14620007e2578063b75e23ed146200068b578063c3f909d41462000522578063c72896ac14620004e3578063cce7ec13146200039c578063d791de6314620001f55763f2fde38b146200012657600080fd5b34620001f2576020366003190112620001f2576200014362001f1a565b6200014d6200206f565b6001600160a01b039081169081156200019e57600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b80fd5b5034620001f25760209081600319360112620001f2576004356001600160401b03811162000398576200022d90369060040162001fb0565b9290620002396200206f565b825b84811062000247578380f35b6001600160a01b03602484826200026a62000264868b89620025c8565b620025ef565b16926200027d62000264868b89620025c8565b16604051928380926370a0823160e01b82523060048301525afa9081156200038d57918591879384916200034c575b5060405163a9059cbb60e01b8152336004820152602481019190915292839190829081604481015b03925af1801562000341576200030d575b506000198114620002f9576001016200023b565b634e487b7160e01b84526011600452602484fd5b6200033190843d861162000339575b6200032881836200204d565b8101906200210d565b5038620002e5565b503d6200031c565b6040513d87823e3d90fd5b92809294508391503d831162000385575b6200036981836200204d565b8101031262000381575185918591620002d4620002ac565b8580fd5b503d6200035d565b6040513d88823e3d90fd5b5080fd5b506040366003190112620001f257620003b462001f1a565b60243590620003c43482620023b3565b91909280620004ce575b5060405163a9059cbb60e01b815233600482015260248101849052602081604481886001600160a01b0387165af180156200034157604095927f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c928692620004ab575b5086513381526001600160a01b0391909116602082015234604082015260608101919091526080810184905260a090a18351903482528060208301528482015282606082015233907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260803092a382519182526020820152f35b620004c69060203d811162000339576200032881836200204d565b503862000431565b620004dc908410156200216a565b38620003ce565b5034620001f25780600319360112620001f257620005006200206f565b8080808060095481600955335af16200051862002127565b5015620001f25780f35b5034620001f25780600319360112620001f257610120604051620005468162002030565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015201526101406040516200058d8162002030565b6002549081815261ffff60035460018060a01b0381166020840152818160a01c166040840152818160b01c16606084015260c01c16608082015260045460a082015260055460c082015260065460e082015260018060a01b036007541661010082015260018060a01b036008541661012082015260405191825260018060a01b03602082015116602083015261ffff604082015116604083015261ffff606082015116606083015261ffff608082015116608083015260a081015160a083015260c081015160c083015260e081015160e083015260018060a01b036101008201511661010083015261012060018060a01b0391015116610120820152f35b5034620001f257610140366003190112620001f257604051620006ae8162002030565b60043581526001600160a01b036024358181168103620007dd576020830190815260443561ffff8082168203620007dd5760408501918252606435918183168303620007dd57606086019283526084359182168203620007dd576080860191825260a0860160a435815260c087019160c435835260e088019360e435855261010435958887168703620007dd576101008a019687526101243599898b168b03620007dd578998816101208b93019c8d52620007686200206f565b5160025551166003549361ffff60a01b905160a01b169161ffff60b01b905160b01b169261ffff60c01b905160c01b169365ffffffffffff60d01b16171717176003555160045551600555516006555116916001600160601b0360a01b92836007541617600755511690600854161760085580f35b600080fd5b5034620001f2576040366003190112620001f25760206001600160a01b03620008246200081e62000815602435620021b7565b600435620021e8565b6200220a565b16604051908152f35b62001f31565b5034620001f25780600319360112620001f257546040516001600160a01b039091168152602090f35b5034620001f2576020366003190112620001f2576200087a6200206f565b80808080600435335af16200051862002127565b5034620001f25780600319360112620001f257610140600254600354600454906005546006549060018060a01b03938460075416938560085416956040519788528116602088015261ffff90818160a01c166040890152818160b01c16606089015260c01c16608087015260a086015260c085015260e0840152610100830152610120820152f35b5034620001f25780600319360112620001f257620009336200206f565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034620001f2576020366003190112620001f25760206103e8620009a461ffff60035460a01c16600435620021e8565b04604051908152f35b5034620001f2576060366003190112620001f257620009cb62001f1a565b6001600160a01b038181168084526001602090815260408520600381015490931694604435939192602435928715158062000c8c575b1562000c885762000abd62000ab6857f13f11b6cdd938ad49b100c844181719a0daaa3f17146c3ee73b348cb26028b5c62000a859a9b600286019062000aad825492600189019e8f94855462000a7c62000a7362000a60838c620021e8565b62000a6c8c86620021fc565b90620021dd565b998a93620021fc565b809455620020e9565b80945560405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a1620025ab565b8262002575565b965481541162000c4d578062000ad762000add92620024f4565b62002346565b948062000c38575b506040516323b872dd60e01b8152336004820152306024820152604481018490529084908290606490829086905af1801562000c2d5762000c0b575b508080808088335af162000b3462002127565b501562000bd457604080513381526001600160a01b039790971660208801528681018690526060870183905260808701859052957f9be8a5ca22b7e6e81f04b5879f0248227bb770114291bd47dfaee4c3a82ad60e9060a090a1855191818352838301528486830152606082015230907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260803392a38351928352820152f35b60405162461bcd60e51b815260048101849052600f60248201526e195d1a081cd95b990819985a5b1959608a1b6044820152606490fd5b62000c2590843d861162000339576200032881836200204d565b503862000b21565b6040513d84823e3d90fd5b62000c46908710156200216a565b3862000ae5565b60405162461bcd60e51b81526004810186905260136024820152721b9bc8195d1a081b19599d081a5b881c1bdbdb606a1b6044820152606490fd5b8280fd5b5060ff600482015460b01c161562000a01565b5034620001f2576020366003190112620001f2578062000cbe62001f1a565b62000cc86200206f565b6001600160a01b0316803b1562000d13578180916004604051809481936301339c2160e01b83525af1801562000c2d5762000d005750f35b62000d0b906200201c565b620001f25780f35b50fd5b506040366003190112620001f25762000d2e62001f1a565b6024359060ff8216820362000c885762000d476200206f565b62000d528162002371565b80928562000d8c600354946103e862000d7361ffff8860b01c1683620021e8565b049062000d8382600954620021fc565b600955620020e9565b60085460405163095ea7b360e01b81526001600160a01b038781166004830152602482018790529295918316926020908290604490829088908a165af180156200163b5762001646575b506001600160a01b0384163b1562000c88576040516301339c2160e01b81528381600481836001600160a01b038a165af19081156200163b57849162001623575b50506007546001600160a01b031696873b156200142657604051630d0e30db60e41b815284816004818a8d5af1908115620003415785916200160b575b505060405163095ea7b360e01b81526001600160a01b038816600482015260248101879052602081604481888d5af180156200034157620015e7575b508360ff8a166001036200155857505062000ec162000eb961ffff60035460c01c1683620021dd565b8092620020e9565b60405163095ea7b360e01b81526001600160a01b03841660048201526024810183905290959060208180604481010381886001600160a01b038b165af18015620003415762001534575b505b6001600160a01b0385168811156200152a57849588905b6001600160a01b0387168a1115620015235791905b60206001600160a01b0362000f5d6200081e62000f5687620021b7565b86620021e8565b6040516309f56ab160e11b81526001600160a01b03808d1660048301528581166024830152610bb8604483015292909116606482015297889160849183918e165af1958615620014b5578c96620014d4575b506040518061093c8101106001600160401b0361093c83011117620014c05761093c6200260582398061093c810103908df0978815620014b55783600981020460091484151715620014a15782600981020460091483151715620014a15760405190816101608101106001600160401b0361016084011117620013d957600961014094600a82608098610164978396610160890160405260018060a01b0316885260018060a01b03166020880152610bb86040880152620d89b3196060880152620d89b48a8801528060a08801528360c0880152020460e0850152020461010082015260018060a01b03891661012082015242838201528c6040519a8b948593634418b22b60e11b855260018060a01b03815116600486015260018060a01b03602082015116602486015262ffffff6040820151166044860152606081015160020b60648601528781015160020b608486015260a081015160a486015260c081015160c486015260e081015160e486015261010081015161010486015260018060a01b0361012082015116610124860152015161014484015260018060a01b03165af1968715620014965789988a80978199829b6200142a575b5081546001600160a01b0390811690620011838a62001fe3565b5416906001600160a01b0383163b1562001426576040516365f2031160e11b81526001600160a01b0391821660048201529181166024830152604482018e905290918391839160649183918591165af1801562000c2d576200140a575b505060ff811662001297575b5050506001600160a01b038084168952600160205260409098206004018054600162ff000160a01b031916928916928317600160b01b179055506080966001600160801b0393927f3a2480ce53a8c9229556c140c60039b8c13bce2009773b802a638deec98eae1f92606092620012638362001fe3565b54169160405192835260018060a01b031660208301526040820152a160405194855216602084015260408301526060820152f35b60ff1660010362001403575083905b600142014211620013ef57624f1a0142016001420111620013ef578954604051906001600160a01b03166001600160401b0360c0830190811190831117620013d9578b9360c0830160405260018060a01b0316825260018060a01b0386166020830152600142016040830152624f1a01420160608301526203f480608083015260a0820152833b1562000c885760408051638d4502e760e01b815282516001600160a01b039081166004830152602084015181166024830152918301516044820152606083015160648201526080830151608482015260a0909201511660a482015260c481019190915291829060e490829084905af18015620013ce57620013b2575b808080620011ec565b620013be88916200201c565b620013ca5738620013a9565b8680fd5b6040513d8a823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b8a52601160045260248afd5b90620012a6565b62001415906200201c565b62001422578a38620011e0565b8a80fd5b8380fd5b9850995050985095506080853d6080116200148d575b816200144f608093836200204d565b8101031262001489578451956020860151986001600160801b038a168a0362001422578a60606040890151980151989a9798993862001169565b8880fd5b3d915062001440565b6040513d8b823e3d90fd5b634e487b7160e01b8d52601160045260248dfd5b6040513d8e823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b9095506020813d6020116200151a575b81620014f3602093836200204d565b810103126200151657516001600160a01b03811681036200151657943862000faf565b8b80fd5b3d9150620014e4565b9062000f39565b8795859062000f24565b620015509060203d60201162000339576200032881836200204d565b503862000f0b565b915094600260ff8a160362000f0d5790506200158262000eb961ffff60035460c01c1683620021dd565b60405163095ea7b360e01b81526001600160a01b038416600482015260248101839052602081604481888d5af180156200034157620015c3575b5062000f0d565b620015df9060203d60201162000339576200032881836200204d565b5038620015bc565b620016039060203d60201162000339576200032881836200204d565b503862000e90565b62001616906200201c565b6200142657833862000e54565b6200162e906200201c565b62000c8857823862000e17565b6040513d86823e3d90fd5b620016629060203d60201162000339576200032881836200204d565b503862000dd6565b5034620001f2576020366003190112620001f25760e0906001600160a01b039060ff90604090836200169b62001f1a565b1681526001602052208054926001820154916002810154600483600384015416920154936040519687526020870152604086015260608501528116608084015261ffff8160a01c1660a084015260b01c16151560c0820152f35b5034620001f25780600319360112620001f2576020600954604051908152f35b5034620001f2576020366003190112620001f25760406200173f6200173962001f1a565b62002371565b82519182526020820152f35b5034620001f2576040366003190112620001f2576200176962001f1a565b60243590811515809203620007dd57620017826200206f565b6001600160a01b03168252600160205260408220600401805460ff60b01b191660b09290921b60ff60b01b1691909117905580f35b50610100366003190112620001f2576004356001600160401b0381116200039857620017e890369060040162001f80565b6024356001600160401b03811162001426576200180a90369060040162001f80565b926044356001600160401b03811162000381576200182d90369060040162001f80565b906064356001600160401b03811162001f16576200185090369060040162001f80565b90916084356001600160401b03811162001f12576200187490369060040162001fb0565b94909661ffff60a4351660a435036200142257600260c4351015620014225760128911158062001f06575b8062001ef9575b1562001ec357600586101562001e90578a5b8660ff82161062001de9575060055499604051806110648101106001600160401b0361106483011117620014c05761106462002f41823980611064810103908df08015620014b5576001600160a01b03169a8c8c3b15620001f25780620019478e8c8f946200195b95604051968795869485936328869b1960e01b8552608060048601526084850191620020c8565b8281036003190160248401528a8c620020c8565b88604483015230606483015203925af1801562001ddc5762001dc6575b506102bc61ffff60a435161162001d8a578b8d9a989a528b8d60016020526040902091600654826001600160601b0360a01b60038601541617600385015580845580600185015581600285015560048401805461ffff60a01b60a43560a01b169061ffff60a01b191617905560405192835260a43561ffff1660208401526040830152606082015260807f6231ee9c84aaa3e6026eeb8f1f2dffe74e76ddeda12274e216d10df81013b7ae91a162001a309062002346565b9762001a3c8c62001fe3565b336001600160601b0360a01b8254161790558b6000527f37c7a69cb64276d9952a1cf15ae5474311c0ddadaf138ab6ce1b4a3e73db5625602052604060002060ff1981541660c43560ff161790556005549a6040519b8d8d3381526020015260408d01528b6101406060819201528c019062001ab892620020c8565b908a820360808c015262001acc92620020c8565b9088820360a08a015262001ae092620020c8565b9086820360c088015262001af492620020c8565b9284840360e086015280845260208401908060051b8501602001948389915b83831062001d21578a8a7f75028b0a037a0f08db1f929f961f295b07682033cdaf1697062e81cd6085f91b8b808c8c61010083015260c4356101208301520390a1600254349181831062001cca5762001b7c62001b72838695620020e9565b92600954620021fc565b60095560e435908162001be1575b50508062001b955750f35b81808092335af162001ba662002127565b501562001bb05780f35b60405162461bcd60e51b81526020600482015260096024820152686e6f742073656e742160b81b6044820152606490fd5b90918262001bef91620020e9565b9162001bfc8183620023b3565b60405163a9059cbb60e01b8152336004820152602481018390529391906020856044818a875af191821562001cbf577f7ce543d1780f3bdc3dac42da06c95da802653cd1b212b8d74ec3e3c33ad7095c9562001c909362001c9b575b50604080513381526001600160a01b0390951660208601528401949094526060830193909352608082019290925290819060a0820190565b0390a1838062001b8a565b62001cb79060203d60201162000339576200032881836200204d565b508962001c58565b6040513d89823e3d90fd5b60405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f7567682065746820746f2070617920746865206372656174696044820152686f6e2070726963652160b81b6064820152608490fd5b909192939496601f19828203018652601e19833603018835121562001422578288350190602082359201916001600160401b03811162001d8657803603831362001d865762001d776020928392600195620020c8565b99019601949301919062001b13565b8c80fd5b60405162461bcd60e51b81526020600482015260146024820152731cd95b1b081c195b985b1d1e481a5b9d985b1a5960621b6044820152606490fd5b62001dd4909d919d6200201c565b9b3862001978565b8e604051903d90823e3d90fd5b611fe08160051b16890135601e198a36030181121562001d8657890180356001600160401b03811162001e8c576020918282360391011362001e8c5760801062001e58575060ff80911690811462001e4457600101620018b8565b634e487b7160e01b8c52601160045260248cfd5b6064906040519062461bcd60e51b82526004820152600d60248201526c6c696e6b20746f6f206c6f6e6760981b6044820152fd5b8d80fd5b60405162461bcd60e51b815260206004820152600b60248201526a06a40d8d2dcd6e640dac2f60ab1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420706172616d7360901b6044820152606490fd5b50610200841115620018a6565b5060128a11156200189f565b8980fd5b8780fd5b600435906001600160a01b0382168203620007dd57565b34620007dd576060366003190112620007dd576004356001600160a01b0381168103620007dd57604435908115158203620007dd5760209162001f7891602435906200225c565b604051908152f35b9181601f84011215620007dd578235916001600160401b038311620007dd5760208381860195010111620007dd57565b9181601f84011215620007dd578235916001600160401b038311620007dd576020808501948460051b010111620007dd57565b6001600160a01b031660009081527f37c7a69cb64276d9952a1cf15ae5474311c0ddadaf138ab6ce1b4a3e73db56246020526040902090565b6001600160401b038111620013d957604052565b61014081019081106001600160401b03821117620013d957604052565b90601f801991011681019081106001600160401b03821117620013d957604052565b6000546001600160a01b031633036200208457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b908060209392818452848401376000828201840152601f01601f1916010190565b91908203918211620020f757565b634e487b7160e01b600052601160045260246000fd5b90816020910312620007dd57518015158103620007dd5790565b3d1562002165573d906001600160401b038211620013d9576040519162002159601f8201601f1916602001846200204d565b82523d6000602084013e565b606090565b156200217257565b60405162461bcd60e51b815260206004820152601960248201527f616d6f756e74206f7574206c6f776572207468616e206d696e000000000000006044820152606490fd5b8015620021c757600160c01b0490565b634e487b7160e01b600052601260045260246000fd5b8115620021c7570490565b81810292918115918404141715620020f757565b91908201809211620020f757565b90811562002256576001808301808411620020f757811c90835b8483106200223157505050565b909193506200224c84620022468184620021dd565b620021fc565b821c919062002224565b60009150565b6001600160a01b03166000908152600160205260409020909115620022df57620022d5620022cd620022ad620022dc9462000a6c600286015491620022a6600188015482620021e8565b92620021fc565b6103e8620022c561ffff60035460a01c1683620021e8565b0490620020e9565b809262002319565b90620020e9565b90565b62000a6c62002304620022dc936103e8620022c561ffff60035460a01c1683620021e8565b620022a66002600185015494015482620021e8565b6004015460a01c61ffff169081156200233f576103e8916200233b91620021e8565b0490565b5050600090565b6001810154670de0b6b3a76400009080820291820403620020f7576002620022dc92015490620021dd565b6001600160a01b03908116600090815260016020526040902060038101549092911615620007dd576002620023ad6001840154845490620020e9565b92015490565b6001600160a01b039081166000908152600160205260409020600381018054909493908316151580620024e1575b156200249c576200244694620022dc936200248e620024217f13f11b6cdd938ad49b100c844181719a0daaa3f17146c3ee73b348cb26028b5c94620025ab565b9160018601936200246385549460028901956200245a6200245288549e8f85620021e8565b62000a6c8585620021fc565b809e620020e9565b809755620021fc565b80955554169160405193849384604091949392606082019560018060a01b0316825260208201520152565b0390a162000ad781620024f4565b60405162461bcd60e51b815260206004820152601760248201527f706f6f6c206973207a65726f206f72206c6f636b6564210000000000000000006044820152606490fd5b5060ff600483015460b01c1615620023e1565b670de0b6b3a7640000620025156200250c8362002346565b600554620021e8565b046004541115620025235750565b60048101805460ff60b01b1916600160b01b179055600301546040516001600160a01b039190911681527f96c3356711ed5fea211225a23108f7f27b7d4ee8f60bbfe05f98c018a6b3b51890602090a1565b62002581828262002319565b90816200258d57505090565b916001620022dc9301620025a3838254620021fc565b9055620020e9565b620022dc906103e862000d7361ffff60035460a01c1683620021e8565b9190811015620025d95760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b0381168103620007dd579056fe6080806040523461003c57600380546001600160a01b03191673f807aca27b1550fe778fd4e7013bb57480b17fac1790556108fa90816100428239f35b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c918263150b7a021461037c5750816317d70f7c1461035d57816345cb3dde1461033f5781634a41823b1461030d57816352709725146102e45781637303e913146102bb5781638da5cb5b14610293578163c87965721461027a578163cbe40622146101ee578163ea98847b1461013d57508063f5af5f95146100db5763f940e385146100a957600080fd5b346100d7573660031901126100d4576100d16100c3610426565b6100cb610441565b90610573565b80f35b80fd5b5080fd5b82346100d45760203660031901126100d4576100f5610426565b600154906001600160a01b039033828416148015610131575b1561012d5716906bffffffffffffffffffffffff60a01b161760015580f35b8380fd5b5081845416331461010e565b919050346101ea57826003193601126101ea5782546001600160a01b0390811692908490338590036100d757825442106100d757600354169360025490853b156101ea576064908386519788948593632142170760e11b85523089860152602485015260448401525af180156101e0576101b5578380f35b67ffffffffffffffff83116101cd5750523880808380f35b634e487b7160e01b845260419052602483fd5b82513d86823e3d90fd5b8280fd5b8390346100d75760603660031901126100d757610209610426565b610211610441565b83546001600160a01b039291908381166102765783926bffffffffffffffffffffffff60a01b948591169116178555169060015416176001556044356002556301e13380420190814211610263575580f35b634e487b7160e01b835260119052602482fd5b8580fd5b83346100d457806003193601126100d4576100d161048f565b5050346100d757816003193601126100d757905490516001600160a01b039091168152602090f35b5050346100d757816003193601126100d75760035490516001600160a01b039091168152602090f35b5050346100d757816003193601126100d75760015490516001600160a01b039091168152602090f35b5050346100d7573660031901126100d4576100d1610329610426565b610331610441565b9061033a61048f565b610573565b9050346101ea57826003193601126101ea5760209250549051908152f35b5050346100d757816003193601126100d7576020906002549051908152f35b915083346100d45760803660031901126100d457610398610426565b506103a1610441565b5060643567ffffffffffffffff8082116101ea57366023830112156101ea57818401359081116101ea57369101602401116100d457506002546103f5576044356002558251630a85bd0160e11b8152602090f35b62461bcd60e51b8252602090820152600d60248201526c15985d5b1d0e881313d0d2d151609a1b6044820152606490fd5b600435906001600160a01b038216820361043c57565b600080fd5b602435906001600160a01b038216820361043c57565b90601f8019910116810190811067ffffffffffffffff82111761047957604052565b634e487b7160e01b600052604160045260246000fd5b60018060a01b038060035416906002546040928351608081019080821067ffffffffffffffff83111761047957859360849285528152600060208201933085528583016fffffffffffffffffffffffffffffffff9081815281606086019181835289519a8b998a9863fc6f786560e01b8a525160048a01525116602488015251166044860152511660648401525af180156105505761052c575050565b813d8311610549575b61053f8183610457565b8101031261043c57565b503d610535565b82513d6000823e3d90fd5b9081602091031261043c5751801515810361043c5790565b604080516370a0823160e01b8082523060048084019190915260209591946001600160a01b03908116928785602481875afa9485156107db57600095610895575b50811692855187815230848201528881602481885afa90811561084057600091610868575b50600054875163a9059cbb60e01b8082529185166001600160a01b031686820190815260019890981c602089015290968a908290819060400103816000875af1801561081857918a9161065e9361084b575b5060005489518981529086166001600160a01b031687820190815260019290921c60208301529283918291604090910190565b03816000895af1801561084057610823575b5081600154169086519088825230858301528982602481845afa91821561081857908a92916000926107e6575b5088518881526001600160a01b0390941686850190815260208101929092528391829060009082906040015b03925af180156107db576107be575b506001541692845195865230828701528686602481865afa9586156107b35790879493929160009761077a575b506000906107338751988996879586948552840160209093929193604081019460018060a01b031681520152565b03925af19081156107705750610747575050565b8161076692903d10610769575b61075e8183610457565b81019061055b565b50565b503d610754565b513d6000823e3d90fd5b9192939482819892983d83116107ac575b6107958183610457565b810103126100d45750519486939291906000610705565b503d61078b565b85513d6000823e3d90fd5b6107d490883d8a116107695761075e8183610457565b50386106d8565b86513d6000823e3d90fd5b91909282813d8311610811575b6107fd8183610457565b810103126100d457505189916106c961069d565b503d6107f3565b88513d6000823e3d90fd5b61083990893d8b116107695761075e8183610457565b5038610670565b87513d6000823e3d90fd5b61086190833d85116107695761075e8183610457565b503861062b565b908982813d831161088e575b61087e8183610457565b810103126100d4575051386105d9565b503d610874565b90948882813d83116108bd575b6108ac8183610457565b810103126100d457505193816105b4565b503d6108a256fea2646970667358221220b2eacaf4f6bdff744cf25dca974d415a638494bbf8a247bd94cabf9e159dbf6264736f6c63430008120033608080604052346100d5576002546001908181811c911680156100cb575b60208210146100b557601f811161006c575b7f6a756e6b646174610000000000000000000000000000000000000000000000106002556003805460ff60a01b19169055610f8983816100db8239f35b6002600052601f0160051c7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace908101905b8181106100aa575061002f565b60008155820161009d565b634e487b7160e01b600052602260045260246000fd5b90607f169061001d565b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c91826301339c2114610d3857826306fdde0314610c8757508163095ea7b314610c1d57816318160ddd14610bf657816323b872dd14610a9257816328869b191461068d578163313ce567146106715781633644e515146105e957816370a08231146105b55781637ecebe001461058157816395d89b41146104bc5781639df89605146103bf578163a9059cbb146102a3578163d505accf1461010a575063dd62ed3e146100ca57600080fd5b346101065780600319360112610106576020916100e5610dcd565b906100ee610de8565b8452637f5e9f20600c52526034600c20549051908152f35b5080fd5b8383346101065760e036600319011261010657610125610dcd565b61012d610de8565b60443590606435916084359460ff8616860361029f5761014b610e66565b9384516020809601208142116102935782519760c060018060a01b03809916988997169965383775081901600e52878c5288600c2094855480957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f84528b84019081528d8985017fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc68152606086019c8d469052608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988525252898b525260a082015220604e526042602c208a5260ff16865260a435835260c435606052858060808b60015afa90873d5103610287577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259798999a50019055866303faf4f960a51b1790526034602c2055a380f35b8a63ddafbaef8b52601cfd5b89631a15a3cc8a52601cfd5b8680fd5b8284346103bc57816003193601126103bc576102bd610dcd565b6024359160035460ff8160a01c161561033f575b506387a211a2600c5233815260209485600c2090815490818611610334575084900390555282600c208181540190558252600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8480a35160018152f35b63f4d678b88452601cfd5b6001600160a01b039081163381149182156103b0575b50501561036257856102d1565b835162461bcd60e51b8152602081870152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b84161490508680610355565b80fd5b838334610106578160031936011261010657805190826002546103e181610e2c565b8085529060019081811690811561049e5750600114610443575b5050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b0390f35b634e487b7160e01b815260418552602490fd5b6002865290915084907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b8383106104855750506020915083010185806103fb565b81816020929493945483858a010152019101919061046e565b9150506020925060ff191682850152151560051b83010185806103fb565b8383346101065781600319360112610106578051908260018054906104e082610e2c565b8086529181811690811561049e5750600114610527575050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b80865290915084907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8383106105685750506020915083010185806103fb565b81816020929493945483858a0101520191019190610551565b5050346101065760203660031901126101065760209161059f610dcd565b906338377508600c525281600c20549051908152f35b505034610106576020366003190112610106576020916105d3610dcd565b906387a211a2600c525281600c20549051908152f35b50503461010657816003193601126101065760209060a0610608610e66565b8381519101208251907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252848201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc683820152466060820152306080820152209051908152f35b5050346101065781600319360112610106576020905160128152f35b905034610a8e576080366003190112610a8e5767ffffffffffffffff8135818111610a8a576106bf9036908401610dfe565b60249491943583811161029f576106d99036908601610dfe565b604435966001600160a01b0360643581811697919590889003610a86576805345cdf77eb68f44c978854610a82576bffffffffffffffffffffffff60a01b6003541617600355818111610a6f57806107318c54610e2c565b93601f94858111610a14575b508c908d8684116001146109a35792610998575b50508160011b916000199060031b1c1916178a555b821161098557819060019361077b8554610e2c565b828111610916575b508a918311600114610899578a9261088e575b5050600019600383901b1c191690821b1790555b60035460ff8160a01c161561081f575b5050508054918383019283106108145750556387a211a2600c523382526020600c20818154019055602052600c5160601c817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a380f35b63e5cfe9578552601cfd5b168015908115610884575b50156108375780806107ba565b5162461bcd60e51b8152602081840152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b905033143861082a565b013590503880610796565b848b528493507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf691601f1984168c5b8181106108fe575084116108e4575b505050811b0190556107aa565b0135600019600384901b60f8161c191690553880806108d7565b828401358555879690940193602092830192016108c8565b90919250848b527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68380860160051c8201926020871061097c575b91869588929594930160051c01915b82811061096e575050610783565b8d8155869550879101610960565b92508192610951565b634e487b7160e01b895260418752602489fd5b013590503880610751565b925090601f198416838052600080516020610f34833981519152935b8181106109fc57509084600195949392106109e2575b505050811b018a55610766565b0135600019600384901b60f8161c191690553880806109d5565b919360206001819287870135815501950192016109bf565b9091508c8052600080516020610f348339815191528580850160051c82019260208610610a66575b859493910160051c909101908e5b828210610a5857505061073d565b81558493506001018e610a4a565b92508192610a3c565b634e487b7160e01b8b526041895260248bfd5b8b80fd5b8a80fd5b8480fd5b8280fd5b8284346103bc5760603660031901126103bc57610aad610dcd565b90610ab6610de8565b6044359060035460ff8160a01c1615610b77575b508360601b92602096338852600c94637f5e9f208117865260348620805460018101610b54575b50506387a211a217855287852090815490818611610334575084900390555284822080548201905584525160601c906001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8480a35160018152f35b808711610b6b5786900390556387a211a28a610af1565b836313be252b8652601cfd5b6001600160a01b039081168582168114918215610bea575b505015610b9c5786610aca565b845162461bcd60e51b8152602081880152602260248201527f7472616e73666572206e6f7420616c6c6f776564206265666f7265206c61756e6044820152610c6d60f31b6064820152608490fd5b83161490508780610b8f565b5050346101065781600319360112610106576020906805345cdf77eb68f44c549051908152f35b505034610106578060031936011261010657602091610c3a610dcd565b602435908452637f5e9f20600c52338252806034600c20558152602c5160601c907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b84908434610a8e5782600319360112610a8e57828354610ca681610e2c565b8085529060019081811690811561049e5750600114610cf0575050829003601f01601f191682019267ffffffffffffffff841183851017610430575082918261042c925282610d84565b8580529091508490600080516020610f348339815191525b838310610d1f5750506020915083010185806103fb565b81816020929493945483858a0101520191019190610d08565b84346103bc57806003193601126103bc57600354336001600160a01b0382161480610d76575b156101065760ff60a01b1916600160a01b1760035580f35b5060ff8160a01c1615610d5e565b6020808252825181830181905290939260005b828110610db957505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610d97565b600435906001600160a01b0382168203610de357565b600080fd5b602435906001600160a01b0382168203610de357565b9181601f84011215610de35782359167ffffffffffffffff8311610de35760208381860195010111610de357565b90600182811c92168015610e5c575b6020831014610e4657565b634e487b7160e01b600052602260045260246000fd5b91607f1691610e3b565b6040519060008054610e7781610e2c565b80855290600190818116908115610f155750600114610ecd575b5050829003601f01601f1916820167ffffffffffffffff811183821017610eb757604052565b634e487b7160e01b600052604160045260246000fd5b6000808052919250600080516020610f348339815191525b838310610efc575050602091508301013880610e91565b81816020929493945483858a0101520191019190610ee5565b9150506020925060ff191682850152151560051b8301013880610e9156fe290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563a26469706673582212208f9bf288b987c5af0ece277a334832c942609ba1f8cf36b0792ec82fef1fb4c964736f6c63430008120033a26469706673582212207ce7445468468cf2707c17cfad2258576201bb5ee26dba52bd26a0ac655b66f764736f6c63430008120033
Deployed Bytecode Sourcemap
1196:12820:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;1196:12820:2;;;;2162:22:0;;1196:12820:2;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;2566:40:0;1196:12820:2;2566:40:0;;1196:12820:2;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;1063:62:0;;;;:::i;:::-;13516:13:2;13531:17;;;;;;1196:12820;;;13550:3;-1:-1:-1;;;;;1196:12820:2;13566:9;1196:12820;13566:9;;;;;;:::i;:::-;;:::i;:::-;1196:12820;13604:9;;;;;;;:::i;:::-;1196:12820;;;;;;;;;;13598:41;;13633:4;1196:12820;13598:41;;1196:12820;13598:41;;;;;;;;;;;;;;;;13550:3;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;13560:80:2;;13586:10;1196:12820;13560:80;;1196:12820;;;;;;;;;;;;;;;;;;13560:80;;;;;;;;;;;13550:3;-1:-1:-1;;;1196:12820:2;;;;;;13516:13;;1196:12820;-1:-1:-1;;;1196:12820:2;;;;;;;;13560:80;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;1196:12820;;;;;;;;;13598:41;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1196:12820;;;;;;;;;13560:80;13598:41;;1196:12820;;;;13598:41;;;;;;1196:12820;;;;;;;;;;;;;;-1:-1:-1;1196:12820:2;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;;;4201:9;4180:31;4201:9;4180:31;;:::i;:::-;4220:8;;;;4216:68;;1196:12820;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;4289:44:2;;4311:10;1196:12820;4289:44;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;4289:44;;;;;;1196:12820;4289:44;;4370:57;4289:44;;;;;1196:12820;-1:-1:-1;1196:12820:2;;4311:10;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;4201:9;1196:12820;;;;;;;;;;;;;;;;;;;4370:57;1196:12820;;4201:9;;1196:12820;;;;;;;;;;;;;;;;4311:10;4449:4;4436:59;1196:12820;4449:4;4436:59;;1196:12820;;;;;;;;;;4289:44;;;1196:12820;4289:44;;;;;;;;;:::i;:::-;;;;;4216:68;4230:54;4238:16;;;;4230:54;:::i;:::-;4216:68;;;1196:12820;;;;;;;;;;;;;1063:62:0;;:::i;:::-;1196:12820:2;;;;13336:8;1196:12820;;13336:8;1196:12820;13387:10;13379:42;;;;:::i;:::-;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8595:6;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1063:62:0;;:::i;:::-;1196:12820:2;8674:16;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;-1:-1:-1;;;;;7966:34:2;7971:28;7982:16;1196:12820;;7982:16;:::i;:::-;1196:12820;;7971:28;:::i;:::-;7966:34;:::i;:::-;1196:12820;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;1063:62:0;;:::i;:::-;1196:12820:2;;;;;;13729:10;13721:45;;;;:::i;1196:12820::-;;;;;;;;;;;;;;2141:20;1196:12820;;;;;;2141:20;1196:12820;2141:20;1196:12820;;;;;;;;;2141:20;1196:12820;;;;2141:20;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1063:62:0;;:::i;:::-;1196:12820:2;;;-1:-1:-1;;;;;;1196:12820:2;;;;-1:-1:-1;;;;;1196:12820:2;2566:40:0;1196:12820:2;;2566:40:0;1196:12820:2;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;197:4:8;182:12;1196:12820:2;;;;;;;;182:12:8;:::i;:::-;1196:12820:2;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;12446:10;;1196:12820;;;;;;;;;;;;;12446:24;;;;:40;;1196:12820;;;;12589:31;12557:19;8833:17;8934:70;8903:22;8833:17;;;;;1196:12820;8934:70;1196:12820;;8852:15;1196:12820;8852:15;;1196:12820;;;;;8872:27;9557:23;9479:21;;;;:::i;:::-;9526:20;;;;:::i;:::-;9557:23;;:::i;:::-;8872:27;;;;:::i;:::-;1196:12820;;;8903:22;:::i;:::-;1196:12820;;;;;8934:70;;;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;8934:70;;;;12557:19;:::i;:::-;12589:31;;:::i;:::-;1196:12820;;;;-1:-1:-1;1196:12820:2;;12716:4;;12742:26;12716:4;;:::i;:::-;12742:26;:::i;:::-;4675:8;;4671:65;;1196:12820;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;4741:60:2;;4767:10;1196:12820;4741:60;;1196:12820;4787:4;1196:12820;;;;;;;;;;;;;;;;;;;4787:4;;4741:60;;;;;;;;1196:12820;4767:10;;;;;;;4851:36;;;;:::i;:::-;;1196:12820;;;;;;4767:10;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;4956:49;;1196:12820;;4956:49;1196:12820;;;;;;;;;;;;;;;;;;;4787:4;4767:10;5014:53;1196:12820;4767:10;5014:53;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;4741:60;;;;;;;;;;;;;:::i;:::-;;;;;;1196:12820;;;;;;;;;4671:65;4685:51;4693:13;;;;4685:51;:::i;:::-;4671:65;;;1196:12820;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;12446:40;12475:11;1196:12820;;12475:11;;1196:12820;;;;12474:12;12446:40;;1196:12820;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;1196:12820:2;13988:21;;;;;1196:12820;;;;;;;;;;;;;13988:21;;;;;;;;;;1196:12820;;13988:21;;;;:::i;:::-;1196:12820;;13988:21;1196:12820;13988:21;1196:12820;;;-1:-1:-1;1196:12820:2;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;;;;;;;;;;;1063:62:0;;:::i;:::-;5362:28:2;;;:::i;:::-;5330:60;1196:12820;;5503:16;1196:12820;;;197:4:8;182:12;1196:12820:2;;;;;182:12:8;;:::i;:::-;1196:12820:2;;13108:18;1196:12820;13108:18;1196:12820;13108:18;:::i;:::-;;1196:12820;5503:16;:::i;:::-;5668:15;1196:12820;;;-1:-1:-1;;;5689:65:2;;-1:-1:-1;;;;;1196:12820:2;;;;5689:65;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;5689:65;;;;;;;;1196:12820;-1:-1:-1;;;;;;1196:12820:2;;5758:21;;;;1196:12820;;-1:-1:-1;;;5758:21:2;;1196:12820;;;;;-1:-1:-1;;;;;1196:12820:2;;5758:21;;;;;;;;;;;1196:12820;-1:-1:-1;;5919:11:2;1196:12820;-1:-1:-1;;;;;1196:12820:2;;5934:38;;;;;1196:12820;;-1:-1:-1;;;5934:38:2;;;1196:12820;;;5934:38;;;;;;;;;;;;;1196:12820;-1:-1:-1;;1196:12820:2;;-1:-1:-1;;;5976:64:2;;-1:-1:-1;;;;;1196:12820:2;;;5976:64;;1196:12820;;;;;;;;;;;5976:64;;;;;;;;;;1196:12820;-1:-1:-1;6047:15:2;1196:12820;;;;6069:13;5448:16;;1196:12820;;6143:20;6102:36;1196:12820;;;;;;6102:36;;:::i;:::-;6143:20;;;:::i;:::-;1196:12820;;-1:-1:-1;;;6168:51:2;;-1:-1:-1;;;;;1196:12820:2;;;6168:51;;1196:12820;;;;;;;;;;;;;;;;6168:51;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;6168:51;;;;;;;;6066:318;;;-1:-1:-1;;;;;1196:12820:2;;6426:15;-1:-1:-1;1196:12820:2;;;6426:53;;;;;-1:-1:-1;;;;;1196:12820:2;;6426:15;-1:-1:-1;1196:12820:2;;;6516:47;;;1196:12820;-1:-1:-1;;;;;7966:34:2;7971:28;7982:16;;;:::i;:::-;7971:28;;:::i;7966:34::-;1196:12820;;-1:-1:-1;;;6589:128:2;;-1:-1:-1;;;;;1196:12820:2;;;;6589:128;;1196:12820;;;;;;;;6669:4;1196:12820;;;;;;;;;;;;;;;;;;;;;6589:128;;;;;;;;;;;6516:47;1196:12820;;;6735:11;;;;;-1:-1:-1;;;;;6735:11:2;;;;;;;;;;;;;;;;;;;;;;;;1196:12820;13108:18;1196:12820;;;13108:18;1196:12820;;;;;;;;13108:18;1196:12820;;;13108:18;1196:12820;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;13108:18;6820:444;1196:12820;7130:2;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;6820:444;;1196:12820;6669:4;1196:12820;6820:444;;1196:12820;6965:12;;1196:12820;6820:444;;1196:12820;7002:11;6820:444;;;1196:12820;6820:444;1196:12820;6820:444;;1196:12820;6820:444;;;;1196:12820;;;;6820:444;;1196:12820;;;6820:444;;;1196:12820;;;;;;;;6820:444;;;1196:12820;7238:15;6820:444;;;1196:12820;;;;;;;;;;;;7310:39;;1196:12820;;;;;;;;;7310:39;;1196:12820;;;;;;;6820:444;;1196:12820;;;;;;;;6820:444;;1196:12820;;;;;;;6820:444;;1196:12820;;;;;;;6820:444;;;1196:12820;;;;;;;;6820:444;;1196:12820;;;;;6820:444;;;1196:12820;;;;;;6820:444;;1196:12820;;;;;6820:444;;;1196:12820;;;;;;;;;;6820:444;;;1196:12820;;;;;;6820:444;1196:12820;;;;;;;;;;;7310:39;;;;;;;;;;;;;;;;;;6516:47;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;;;1196:12820:2;;;;7374:20;;;:::i;:::-;1196:12820;;;-1:-1:-1;;;;;1196:12820:2;;7353:51;;;;1196:12820;;-1:-1:-1;;;7353:51:2;;-1:-1:-1;;;;;1196:12820:2;;;;7353:51;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;7353:51;;;;;;;;6516:47;1196:12820;;;;;7427:331;;6516:47;-1:-1:-1;;;;;;;;1196:12820:2;;;;;;;;;;;;;12846:22;1196:12820;;-1:-1:-1;;;;;;1196:12820:2;;;;;;;-1:-1:-1;;;1196:12820:2;;;-1:-1:-1;1196:12820:2;;-1:-1:-1;;;;;1196:12820:2;;7792:48;;1196:12820;;7806:20;1196:12820;7806:20;:::i;:::-;1196:12820;;;;;;;;;;;;;;;;;;;;;;7792:48;1196:12820;;;;;;;;;;;;;;;;;;;7427:331;1196:12820;;;6069:13;5448:16;;7514:31;;;;1196:12820;7238:15;1196:12820;7238:15;1196:12820;;;;7238:15;1196:12820;;7238:15;1196:12820;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;-1:-1:-1;;;;;6820:444:2;1196:12820;;;;;;;-1:-1:-1;1196:12820:2;;;;;6820:444;1196:12820;;;;;;;;;;;;;;;;;;;;7482:219;;1196:12820;;7238:15;1196:12820;;7482:219;;1196:12820;;7238:15;1196:12820;;7482:219;;1196:12820;7664:8;1196:12820;7482:219;;1196:12820;;7482:219;;1196:12820;7706:47;;;;;1196:12820;;;-1:-1:-1;;;7706:47:2;;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;;7706:47;;1196:12820;;7482:219;;1196:12820;;;;;;;7482:219;;;1196:12820;;;;;;7482:219;;1196:12820;;;;;;7482:219;;1196:12820;;;;;;7482:219;;;1196:12820;;;;;;;;;;;;;;;;;;;;;;7706:47;;;;;;;;7514:31;7427:331;;;;;7706:47;;;;;:::i;:::-;1196:12820;;7706:47;;;1196:12820;;;;7706:47;1196:12820;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;7514:31;;;;7353:51;;;;:::i;:::-;1196:12820;;7353:51;;;;1196:12820;;;;7353:51;1196:12820;;;7310:39;;;;;;;;;;1196:12820;7310:39;;1196:12820;7310:39;;;;;;1196:12820;7310:39;;;:::i;:::-;;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;7310:39;;;;;;;;1196:12820;;;;7310:39;;;-1:-1:-1;7310:39:2;;;1196:12820;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;6735:11;1196:12820;;;;;;;;;6735:11;-1:-1:-1;;;1196:12820:2;;;;;;;;6589:128;;;;1196:12820;6589:128;;1196:12820;6589:128;;;;;;1196:12820;6589:128;;;:::i;:::-;;;1196:12820;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;6589:128;;;;1196:12820;;;;6589:128;;;-1:-1:-1;6589:128:2;;6516:47;;;;6426:53;;;;;;;6168:51;;;1196:12820;6168:51;1196:12820;6168:51;;;;;;;:::i;:::-;;;;;6066:318;1196:12820;;;5448:6;1196:12820;;;6233:13;6066:318;6230:154;1196:12820;;6304:17;6266:33;1196:12820;;;;;;6266:33;;:::i;6304:17::-;1196:12820;;-1:-1:-1;;;6326:53:2;;-1:-1:-1;;;;;1196:12820:2;;;6326:53;;1196:12820;;;;;;;;;;;6326:53;;;;;;;;;;6230:154;;6066:318;;6326:53;;;1196:12820;6326:53;1196:12820;6326:53;;;;;;;:::i;:::-;;;;;5976:64;;;1196:12820;5976:64;1196:12820;5976:64;;;;;;;:::i;:::-;;;;;5934:38;;;;:::i;:::-;1196:12820;;5934:38;;;;5758:21;;;;:::i;:::-;1196:12820;;5758:21;;;;;1196:12820;;;;;;;;;5689:65;;;1196:12820;5689:65;1196:12820;5689:65;;;;;;;:::i;:::-;;;;;1196:12820;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;:::i;:::-;;;;;;;;;;2092:43;1196:12820;2092:43;;1196:12820;2092:43;;;;1196:12820;;2092:43;1196:12820;2092:43;;1196:12820;;2092:43;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2164:23;1196:12820;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;;:::i;:::-;;;;;;;;;;;;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;13902:11;1196:12820;;-1:-1:-1;;;;1196:12820:2;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;-1:-1:-1;1196:12820:2;;-1:-1:-1;;1196:12820:2;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;2492:2;2470:24;;;:57;;;1196:12820;2470:96;;;1196:12820;;;;2620:1;2605:16;;1196:12820;;;2646:11;2659:16;1196:12820;;;;2659:16;;;1196:12820;2620:1;1196:12820;;;;2805:11;;;;;-1:-1:-1;;;;;2805:11:2;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;2861:49;;;;;;1196:12820;;;;;;;;;;;;;;;;;;;;2861:49;;1196:12820;;2861:49;;1196:12820;;;;;;:::i;:::-;;;;-1:-1:-1;;1196:12820:2;;;;;;;;:::i;:::-;;;;;;2904:4;1196:12820;;;;2861:49;;;;;;;;;;2641:106;1196:12820;11267:3;1196:12820;;;;11252:18;1196:12820;;;;;;;;;;;;;;;;;11364:24;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;11392:10;;1196:12820;;;;11392:10;;1196:12820;;;;11447:15;1196:12820;11447:15;;1196:12820;11476:17;1196:12820;11476:17;;1196:12820;;11506:16;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11546:78;;;11636:26;;;:::i;:::-;3048:27;;;;:::i;:::-;3078:10;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;3092:16;1196:12820;;;;;;;;;;;;;;;;;2620:1;1196:12820;;;;3078:10;;;;1196:12820;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2620:1;1196:12820;;;;;;;;;;;;;;;;;3148:129;1196:12820;;;;;;;;;;;;;;3148:129;;;1196:12820;;3296:9;;3364:18;;;1196:12820;;13108:18;3433;;;;;:::i;:::-;1196:12820;13108:18;1196:12820;13108:18;:::i;:::-;;1196:12820;;;3491:14;;3487:289;;1196:12820;3784:7;;;3780:117;;1196:12820;;3780:117;3078:10;;;;;3813:33;;;;:::i;:::-;;1196:12820;;;3780:117;1196:12820;;;;-1:-1:-1;;;1196:12820:2;;;;;;;13108:18;1196:12820;;;;-1:-1:-1;;;1196:12820:2;;;;;;;3487:289;3512:17;;;;;;:::i;:::-;3575:39;;;;;:::i;:::-;1196:12820;;-1:-1:-1;;;3624:44:2;;3078:10;1196:12820;3624:44;;1196:12820;;;;;;;;;;;;;;3624:44;1196:12820;3624:44;;;;;;;3706:65;3624:44;3706:65;3624:44;;;3487:289;-1:-1:-1;1196:12820:2;;;3078:10;1196:12820;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3706:65;;;;3487:289;;;;3624:44;;;1196:12820;3624:44;1196:12820;3624:44;;;;;;;:::i;:::-;;;;;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;2861:49;;;;;;;:::i;:::-;;;;;;1196:12820;;;;;;;;;;;2677:3;1196:12820;;2620:1;1196:12820;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;-1:-1:-1;1196:12820:2;;2677:3;1196:12820;;;;;;;;;;;2646:11;;1196:12820;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;;;;;;2470:96;2534:32;2563:3;2534:32;;;2470:96;;:57;2501:26;2492:2;2501:26;;;2470:57;;1196:12820;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;:::o;:::-;;;;;;-1:-1:-1;;1196:12820:2;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;1196:12820:2;;;;;3048:13;1196:12820;;;;;;:::o;:::-;-1:-1:-1;;;;;1196:12820:2;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;:::o;1359:130:0:-;1273:6;1196:12820:2;-1:-1:-1;;;;;1196:12820:2;734:10:1;1422:23:0;1196:12820:2;;1359:130:0:o;1196:12820:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1196:12820:2;;;;;;;;-1:-1:-1;;1196:12820:2;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;;;;;-1:-1:-1;;1196:12820:2;;;;;:::i;:::-;;;;-1:-1:-1;1196:12820:2;;;;:::o;:::-;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1196:12820:2;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8014:250::-;;8092:6;;8088:20;;8135:1;1196:12820;;;;;;;;;;8151:10;;8178;;;;;;8014:250;;;:::o;8171:87::-;8204:10;;;;8233:9;8204:10;8233:5;;;;:::i;:::-;:9;:::i;:::-;1196:12820;;;;8171:87;;8088:20;8097:1;;-1:-1:-1;8100:8:2:o;10652:474::-;-1:-1:-1;;;;;1196:12820:2;-1:-1:-1;1196:12820:2;;;;;;;;;10652:474;;10797:326;;;10935:31;10897:26;9557:23;10928:38;10857:17;9526:20;10857:17;;;1196:12820;10876:15;9479:21;1196:12820;10876:15;;1196:12820;9479:21;;:::i;:::-;9526:20;;:::i;9557:23::-;197:4:8;182:12;1196:12820:2;13030:12;1196:12820;;;;182:12:8;;:::i;:::-;1196:12820:2;10897:26;;:::i;:::-;10935:31;;;:::i;:::-;10928:38;;:::i;:::-;10971:10;:::o;10797:326::-;9526:20;11067:14;9557:23;1196:12820;197:4:8;182:12;1196:12820:2;13030:12;1196:12820;;;;182:12:8;;:::i;11067:14:2:-;9479:21;11100:17;1196:12820;11083:15;;1196:12820;11100:17;;1196:12820;9479:21;;:::i;10132:203::-;10238:16;;1196:12820;;;;;;10238:21;;10234:35;;197:4:8;182:12;;;;:::i;:::-;1196:12820:2;10132:203;:::o;10234:35::-;10261:8;;-1:-1:-1;10261:8:2;:::o;9587:250::-;11324:7;9724:15;;1196:12820;11648:7;1196:12820;;;;;;;;;;9743:17;9714:46;9743:17;;1196:12820;9714:46;;:::i;11669:230::-;-1:-1:-1;;;;;1196:12820:2;;;-1:-1:-1;1196:12820:2;;;;;;;;;11808:10;;;1196:12820;;;11669:230;1196:12820;11808:24;1196:12820;;11877:17;11845:30;1196:12820;11845:15;;1196:12820;;;11845:30;;:::i;:::-;11877:17;;1196:12820;11669:230;:::o;11902:396::-;-1:-1:-1;;;;;1196:12820:2;;;-1:-1:-1;1196:12820:2;;;;;;;;;12043:10;;;1196:12820;;12043:10;;11902:396;;1196:12820;;12043:24;;;:40;;11902:396;1196:12820;;;9479:21;12132:19;12267:26;12132:19;9253:70;12132:19;9253:70;12132:19;;:::i;:::-;9155:15;1196:12820;9155:15;;1196:12820;9222:22;1196:12820;;9172:17;;;;1196:12820;9194:24;9557:23;1196:12820;;9479:21;;;;:::i;:::-;9526:20;;;;:::i;9557:23::-;9194:24;;;:::i;:::-;1196:12820;;;9222:22;:::i;:::-;1196:12820;;;;;;;;9253:70;;;;1196:12820;;;;;;;;;;;;;;;;;;;;;;;;9253:70;;;;12238:4;;;:::i;1196:12820::-;;;-1:-1:-1;;;1196:12820:2;;;;;;;;;;;;;;;;;;;;12043:40;12072:11;1196:12820;12072:11;;;1196:12820;;;;12071:12;12043:40;;9840:289;9934:7;9971:22;9922:26;;;:::i;:::-;9971:18;1196:12820;9971:22;:::i;:::-;1196:12820;10024:31;1196:12820;-1:-1:-1;10013:42:2;10009:117;;9840:289;:::o;10009:117::-;10024:31;10062:11;;1196:12820;;-1:-1:-1;;;;1196:12820:2;-1:-1:-1;;;1196:12820:2;;;9971:18;10110:10;1196:12820;;;-1:-1:-1;;;;;1196:12820:2;;;;;;10090:31;;1196:12820;;10090:31;9840:289::o;10338:298::-;10446:31;;;;:::i;:::-;10485:8;;;;10500:10;;;:::o;10481:152::-;10526:15;;10619:9;10526:15;;:22;1196:12820;;;10526:22;:::i;:::-;1196:12820;;10619:9;:::i;13133:145::-;13265:9;13133:145;197:4:8;182:12;1196:12820:2;13030:12;1196:12820;;;;182:12:8;;:::i;1196:12820:2:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;1196:12820:2;;;;;;;:::o
Swarm Source
ipfs://7ce7445468468cf2707c17cfad2258576201bb5ee26dba52bd26a0ac655b66f7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.