Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Staking
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
Yes with 10000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.27; import "./IUniswapV3.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function percentageOf(uint a, uint b) internal pure returns (uint256) { require(b > 0); return a * b / 100; } function percentageOf10000(uint a, uint b) internal pure returns (uint256) { require(b > 0); return a * b / 10000; } } interface IToken { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint); function mint(address to, uint256 amount) external; function burn(uint256 amount) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface INft { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function transferFrom( address from, address to, uint256 tokenId ) external; function approve(address to, uint256 tokenId) external; function setApprovalForAll(address operator, bool _approved) external; function getApproved(uint256 tokenId) external view returns (address operator); function isApprovedForAll(address owner, address operator) external view returns (bool); } library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } function deposit(address _weth, uint256 _value) internal { (bool success, ) = _weth.call{value: _value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } function withdraw(address _weth, uint256 _value) internal { (bool success, bytes memory data) = _weth.call(abi.encodeWithSelector(0x2e1a7d4d, _value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::withdraw: withdraw failed' ); } } abstract contract BaseStake is Ownable { struct Pool { address erc721; uint duration; uint reward; } bytes32[] keys; mapping(bytes32 => Pool) values; mapping(bytes32 => uint256) indexOf; mapping(bytes32 => bool) inserted; uint private poolCounter; function get(bytes32 key) internal view returns (bytes32, address, uint, uint) { Pool memory val = values[key]; return (key, val.erc721, val.duration, val.reward); } function getKeyAtIndex(uint256 index) internal view returns (bytes32) { return keys[index]; } function size() internal view returns (uint256) { return keys.length; } function push( uint counter, address erc721, uint duration, uint reward) private { bytes32 key = keccak256(abi.encode(counter, erc721, duration, reward)); Pool memory val = Pool(erc721, duration, reward); if (inserted[key]) { values[key] = val; } else { inserted[key] = true; values[key] = val; indexOf[key] = keys.length; keys.push(key); } } function remove(bytes32 key) private { if (!inserted[key]) { return; } delete inserted[key]; delete values[key]; uint256 index = indexOf[key]; bytes32 lastKey = keys[keys.length - 1]; indexOf[lastKey] = index; delete indexOf[key]; keys[index] = lastKey; keys.pop(); } function _addPool(address erc721, uint duration, uint reward) internal { push(poolCounter, erc721, duration, reward); poolCounter += 1; } function _removePool(bytes32 key) internal { remove(key); } function getPools(bytes32 key) public view virtual returns (bytes32, address, uint, uint) { (bytes32 id, address nft, uint duration, uint reward) = get(key); return (id, nft, duration, reward); } function getPools() public view virtual returns (bytes32[] memory, address[] memory, uint[] memory, uint[] memory) { uint poolSize = size(); bytes32[] memory ids = new bytes32[](poolSize); address[] memory erc721 = new address[](poolSize); uint[] memory durations = new uint[](poolSize); uint[] memory rewards = new uint[](poolSize); for (uint256 i = 0; i < size(); i++) { bytes32 key = getKeyAtIndex(i); (bytes32 id, address nft, uint duration, uint reward) = get(key); ids[i] = id; erc721[i] = nft; durations[i] = duration; rewards[i] = reward; } return (ids, erc721, durations, rewards); } } contract Staking is BaseStake { using SafeMath for uint; struct Vesting { bytes32 uid; address erc721; uint tokenId; bytes32 poolId; uint duration; uint startDate; uint endDate; uint reward; } event LogStake(address sender, uint createdAt, bytes32 uid, address erc721, uint tokenId, bytes32 poolId, uint duration, uint startDate, uint endDate, uint reward); event LogUnstake(address sender, uint createdAt, bytes32 uid, address erc721, uint tokenId, bytes32 poolId, uint duration, uint startDate, uint endDate, uint reward); uint constant EXTRA_PERCENT = 10; bool public initiated; bool public paused; address public stakingToken; address public stakingNft; uint256 private decimal; mapping(bytes32 => Vesting) private staker; uint private stakerCount; constructor() BaseStake() { } modifier whenNotPaused() { require(!paused, "paused"); _; } function init(address erc20, address erc721, uint256 duration) onlyOwner external { require(!initiated, "already initiated"); stakingToken = erc20; stakingNft = erc721; decimal = 10 ** IToken(erc20).decimals(); _addPool(stakingNft, 10 * duration, 750 * decimal); _addPool(stakingNft, 30 * duration, 3500 * decimal); _addPool(stakingNft, 90 * duration, 16500 * decimal); initiated = true; } function withdraw(address erc721, uint256 tokenId) external onlyOwner { INft(erc721).transferFrom(address(this), owner(), tokenId); } function collectFees(address positionManager, uint256 tokenId) external onlyOwner { INonfungiblePositionManager manager = INonfungiblePositionManager(positionManager); (,,address token0,address token1,,,,,,,,) = manager.positions(tokenId); INonfungiblePositionManager.CollectParams memory params = INonfungiblePositionManager.CollectParams({ tokenId: tokenId, recipient: address(this), amount0Max: type(uint128).max, amount1Max: type(uint128).max }); (uint256 amount0, uint256 amount1) = manager.collect(params); if (amount0 > 0) { IToken(token0).transfer(owner(), amount0); } if (amount1 > 0) { IToken(token1).transfer(owner(), amount1); } } function pause(bool enable) onlyOwner external { paused = enable; } function addPool(address[] memory erc721, uint256[] memory duration, uint256[] memory reward) onlyOwner external { for (uint256 i = 0; i < erc721.length; i++) { _addPool(erc721[i], duration[i], reward[i]); } } function removePool(bytes32[] memory ids) onlyOwner external { for (uint256 i = 0; i < ids.length; i++) { _removePool(ids[i]); } } function stake(bytes32 poolId, address[] memory erc721, uint256[] memory tokenId, bool[] memory hasExtra) whenNotPaused external { require(erc721.length > 0 && erc721.length == tokenId.length && erc721.length == hasExtra.length, "input error"); require(balance() > 0, "pool empty"); (bytes32 _poolId, address _nft, uint _duration, uint _reward) = get(poolId); for (uint256 i = 0; i < erc721.length; i++) { bytes32 uid = nftHash(erc721[i], tokenId[i]); require(poolId == _poolId && erc721[i] == _nft, "pool not found"); require(staker[uid].uid == bytes32(0), "already staked"); require(INft(erc721[i]).ownerOf(tokenId[i]) == msg.sender, "not owner"); uint reward = _reward; if(stakingNft == erc721[i] && hasExtra[i]) { uint extra = reward.percentageOf(EXTRA_PERCENT); reward += extra; } Vesting memory item = Vesting(uid, erc721[i], tokenId[i], poolId, _duration, block.timestamp, block.timestamp + _duration, reward); staker[uid] = item; logStake(item); stakerCount += 1; } } function claimAndStake(address[] memory erc721, uint256[] memory tokenId) whenNotPaused external { require(erc721.length > 0 && erc721.length == tokenId.length, "input error"); require(balance() > 0, "pool empty"); uint totalReward = 0; for (uint256 i = 0; i < erc721.length; i++) { require(INft(erc721[i]).ownerOf(tokenId[i]) == msg.sender, "not owner"); bytes32 uid = nftHash(erc721[i], tokenId[i]); Vesting memory current = staker[uid]; require(current.uid != bytes32(0), "not staked"); require(block.timestamp > current.endDate, "not reached yet"); (bytes32 _poolId, , ,) = get(current.poolId); require(current.poolId == _poolId && current.erc721 == erc721[i], "pool not found"); logUnstake(current); totalReward += current.reward; Vesting memory item = Vesting(uid, erc721[i], tokenId[i], current.poolId, current.duration, block.timestamp, block.timestamp + current.duration, current.reward); staker[uid] = item; logStake(item); } sendReward(stakingToken, msg.sender, totalReward); } function unstake(address[] memory erc721, uint256[] memory tokenId) external { require(erc721.length > 0 && erc721.length == tokenId.length, "input error"); uint totalReward = 0; for (uint256 i = 0; i < erc721.length; i++) { require(INft(erc721[i]).ownerOf(tokenId[i]) == msg.sender, "not owner"); Vesting memory current = staker[nftHash(erc721[i], tokenId[i])]; require(current.uid != bytes32(0), "not staked"); require(block.timestamp > current.endDate, "not reached yet"); logUnstake(current); totalReward += current.reward; stakerCount -= 1; delete staker[current.uid]; } sendReward(stakingToken, msg.sender, totalReward); } function balance() public view returns (uint256) { return IToken(stakingToken).balanceOf(address(this)); } function logStake(Vesting memory data) private { emit LogStake(msg.sender, block.timestamp, data.uid, data.erc721, data.tokenId, data.poolId, data.duration, data.startDate, data.endDate, data.reward); } function logUnstake(Vesting memory data) private { emit LogUnstake(msg.sender, block.timestamp, data.uid, data.erc721, data.tokenId, data.poolId, data.duration, data.startDate, data.endDate, data.reward); } function nftHash(address nft, uint256 tokenId) private pure returns (bytes32) { return keccak256(abi.encode(nft, tokenId)); } function sendReward(address erc20, address recipient, uint amount) private returns (uint256) { uint _balance = balance(); if(_balance == 0 || amount == 0) { return 0; } if(_balance >= amount) { TransferHelper.safeTransfer(erc20, recipient, amount); return amount; } TransferHelper.safeTransfer(erc20, recipient, _balance); return _balance; } function participants() public view returns (uint256) { return stakerCount; } function vesting(address erc721, uint256 tokenId) public view returns (Vesting memory data) { return staker[nftHash(erc721, tokenId)]; } function vestings(address[] calldata erc721, uint256[] calldata tokenId) public view returns (Vesting[] memory data) { data = new Vesting[](erc721.length); for (uint256 i = 0; i < erc721.length; i++) { data[i] = staker[nftHash(erc721[i], tokenId[i])]; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; interface IUniswapV3Factory { /// @notice Returns the pool address for a given pair of tokens and a fee, or address 0 if it does not exist /// @dev tokenA and tokenB may be passed in either token0/token1 or token1/token0 order /// @param tokenA The contract address of either token0 or token1 /// @param tokenB The contract address of the other token /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip /// @return pool The pool address function getPool( address tokenA, address tokenB, uint24 fee ) external view returns (address pool); } interface INonfungiblePositionManager { /// @notice Emitted when liquidity is increased for a position NFT /// @dev Also emitted when a token is minted /// @param tokenId The ID of the token for which liquidity was increased /// @param liquidity The amount by which liquidity for the NFT position was increased /// @param amount0 The amount of token0 that was paid for the increase in liquidity /// @param amount1 The amount of token1 that was paid for the increase in liquidity event IncreaseLiquidity(uint256 indexed tokenId, uint128 liquidity, uint256 amount0, uint256 amount1); /// @notice Emitted when liquidity is decreased for a position NFT /// @param tokenId The ID of the token for which liquidity was decreased /// @param liquidity The amount by which liquidity for the NFT position was decreased /// @param amount0 The amount of token0 that was accounted for the decrease in liquidity /// @param amount1 The amount of token1 that was accounted for the decrease in liquidity event DecreaseLiquidity(uint256 indexed tokenId, uint128 liquidity, uint256 amount0, uint256 amount1); /// @notice Emitted when tokens are collected for a position NFT /// @dev The amounts reported may not be exactly equivalent to the amounts transferred, due to rounding behavior /// @param tokenId The ID of the token for which underlying tokens were collected /// @param recipient The address of the account that received the collected tokens /// @param amount0 The amount of token0 owed to the position that was collected /// @param amount1 The amount of token1 owed to the position that was collected event Collect(uint256 indexed tokenId, address recipient, uint256 amount0, uint256 amount1); /// @notice Returns the position information associated with a given token ID. /// @dev Throws if the token ID is not valid. /// @param tokenId The ID of the token that represents the position /// @return nonce The nonce for permits /// @return operator The address that is approved for spending /// @return token0 The address of the token0 for a specific pool /// @return token1 The address of the token1 for a specific pool /// @return fee The fee associated with the pool /// @return tickLower The lower end of the tick range for the position /// @return tickUpper The higher end of the tick range for the position /// @return liquidity The liquidity of the position /// @return feeGrowthInside0LastX128 The fee growth of token0 as of the last action on the individual position /// @return feeGrowthInside1LastX128 The fee growth of token1 as of the last action on the individual position /// @return tokensOwed0 The uncollected amount of token0 owed to the position as of the last computation /// @return tokensOwed1 The uncollected amount of token1 owed to the position as of the last computation 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 ); struct MintParams { address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; } /// @notice Creates a new position wrapped in a NFT /// @dev Call this when the pool does exist and is initialized. Note that if the pool is created but not initialized /// a method does not exist, i.e. the pool is assumed to be initialized. /// @param params The params necessary to mint a position, encoded as `MintParams` in calldata /// @return tokenId The ID of the token that represents the minted position /// @return liquidity The amount of liquidity for this position /// @return amount0 The amount of token0 /// @return amount1 The amount of token1 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; } /// @notice Increases the amount of liquidity in a position, with tokens paid by the `msg.sender` /// @param params tokenId The ID of the token for which liquidity is being increased, /// amount0Desired The desired amount of token0 to be spent, /// amount1Desired The desired amount of token1 to be spent, /// amount0Min The minimum amount of token0 to spend, which serves as a slippage check, /// amount1Min The minimum amount of token1 to spend, which serves as a slippage check, /// deadline The time by which the transaction must be included to effect the change /// @return liquidity The new liquidity amount as a result of the increase /// @return amount0 The amount of token0 to acheive resulting liquidity /// @return amount1 The amount of token1 to acheive resulting liquidity 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; } /// @notice Decreases the amount of liquidity in a position and accounts it to the position /// @param params tokenId The ID of the token for which liquidity is being decreased, /// amount The amount by which liquidity will be decreased, /// amount0Min The minimum amount of token0 that should be accounted for the burned liquidity, /// amount1Min The minimum amount of token1 that should be accounted for the burned liquidity, /// deadline The time by which the transaction must be included to effect the change /// @return amount0 The amount of token0 accounted to the position's tokens owed /// @return amount1 The amount of token1 accounted to the position's tokens owed function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1); struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; } /// @notice Collects up to a maximum amount of fees owed to a specific position to the recipient /// @param params tokenId The ID of the NFT for which tokens are being collected, /// recipient The account that should receive the tokens, /// amount0Max The maximum amount of token0 to collect, /// amount1Max The maximum amount of token1 to collect /// @return amount0 The amount of fees collected in token0 /// @return amount1 The amount of fees collected in token1 function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1); /// @notice Burns a token ID, which deletes it from the NFT contract. The token must have 0 liquidity and all tokens /// must be collected first. /// @param tokenId The ID of the token that is being burned function burn(uint256 tokenId) external payable; function ownerOf(uint256 tokenId) external view returns (address); } interface ISwapRouter { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// factory v3 function factory() external view returns (address); /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); function multicall(bytes[] calldata data) external returns (bytes[] calldata results); }
{ "optimizer": { "enabled": true, "runs": 10000 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"createdAt","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"uid","type":"bytes32"},{"indexed":false,"internalType":"address","name":"erc721","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"poolId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"LogStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"createdAt","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"uid","type":"bytes32"},{"indexed":false,"internalType":"address","name":"erc721","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"poolId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"LogUnstake","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"},{"inputs":[{"internalType":"address[]","name":"erc721","type":"address[]"},{"internalType":"uint256[]","name":"duration","type":"uint256[]"},{"internalType":"uint256[]","name":"reward","type":"uint256[]"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"erc721","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"claimAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"positionManager","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"collectFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPools","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"},{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getPools","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"address","name":"erc721","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initiated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"participants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"ids","type":"bytes32[]"}],"name":"removePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"address[]","name":"erc721","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"bool[]","name":"hasExtra","type":"bool[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingNft","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"erc721","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc721","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"vesting","outputs":[{"components":[{"internalType":"bytes32","name":"uid","type":"bytes32"},{"internalType":"address","name":"erc721","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"internalType":"struct Staking.Vesting","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"erc721","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"vestings","outputs":[{"components":[{"internalType":"bytes32","name":"uid","type":"bytes32"},{"internalType":"address","name":"erc721","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"internalType":"struct Staking.Vesting[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc721","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052348015600f57600080fd5b50601733601b565b606b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6134d78061007a6000396000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806372f702f3116100d8578063b69ef8a81161008c578063e5b4752211610066578063e5b4752214610350578063f2fde38b14610363578063f3fef3a31461037657600080fd5b8063b69ef8a8146102fa578063bcca1e0414610302578063cfa4a6a61461031557600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c95780639f118536146102da578063a033fcd4146102e757600080fd5b806372f702f31461029d57806386863ec6146102b657600080fd5b80635c975abb1161013a5780636b130999116101145780636b130999146102635780636c4470fb14610283578063715018a61461029557600080fd5b80635c975abb146101fe578063673a2a1f146102205780636982d8151461023857600080fd5b80630f3da1181161016b5780630f3da118146101af578063143ee5b9146101c25780633628a8ed146101eb57600080fd5b806302329a29146101875780630666c6811461019c575b600080fd5b61019a6101953660046128a7565b610389565b005b61019a6101aa366004612966565b61041f565b61019a6101bd366004612ae5565b6104b3565b6101d56101d0366004612b79565b61057d565b6040516101e29190612ba5565b60405180910390f35b61019a6101f9366004612c06565b61066b565b60065461021090610100900460ff1681565b60405190151581526020016101e2565b610228610c4a565b6040516101e29493929190612cab565b60075461024b906001600160a01b031681565b6040516001600160a01b0390911681526020016101e2565b610276610271366004612daa565b610e9b565b6040516101e29190612e1b565b600a545b6040519081526020016101e2565b61019a611077565b60065461024b906201000090046001600160a01b031681565b61019a6102c4366004612ebc565b6110dd565b6000546001600160a01b031661024b565b6006546102109060ff1681565b61019a6102f5366004612b79565b611331565b610287611656565b61019a610310366004612c06565b6116e7565b610328610323366004612efd565b611a3d565b604080519485526001600160a01b0390931660208501529183015260608201526080016101e2565b61019a61035e366004612f16565b611aa6565b61019a610371366004613016565b611ff0565b61019a610384366004612b79565b6120d2565b6000546001600160a01b031633146103e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60068054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6000546001600160a01b031633146104795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b60005b81518110156104af576104a782828151811061049a5761049a613033565b60200260200101516121d1565b60010161047c565b5050565b6000546001600160a01b0316331461050d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b60005b83518110156105775761056f84828151811061052e5761052e613033565b602002602001015184838151811061054857610548613033565b602002602001015184848151811061056257610562613033565b60200260200101516121da565b600101610510565b50505050565b60408051610100810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905260e0840183905284516001600160a01b03881681840152808601879052855180820387018152910190945283519301929092209091600991815260208082019290925260409081016000208151610100810183528154815260018201546001600160a01b0316938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460e082015290505b92915050565b600654610100900460ff16156106c35760405162461bcd60e51b815260206004820152600660248201527f706175736564000000000000000000000000000000000000000000000000000060448201526064016103df565b600082511180156106d5575080518251145b6107215760405162461bcd60e51b815260206004820152600b60248201527f696e707574206572726f7200000000000000000000000000000000000000000060448201526064016103df565b600061072b611656565b116107785760405162461bcd60e51b815260206004820152600a60248201527f706f6f6c20656d7074790000000000000000000000000000000000000000000060448201526064016103df565b6000805b8351811015610c2c57336001600160a01b03168482815181106107a1576107a1613033565b60200260200101516001600160a01b0316636352211e8584815181106107c9576107c9613033565b60200260200101516040518263ffffffff1660e01b81526004016107ef91815260200190565b602060405180830381865afa15801561080c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108309190613072565b6001600160a01b0316146108865760405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064016103df565b60006108fc85838151811061089d5761089d613033565b60200260200101518584815181106108b7576108b7613033565b6020026020010151604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b600081815260096020908152604091829020825161010081018452815480825260018301546001600160a01b0316938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e0830152919250906109be5760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b65640000000000000000000000000000000000000000000060448201526064016103df565b8060c001514211610a115760405162461bcd60e51b815260206004820152600f60248201527f6e6f74207265616368656420796574000000000000000000000000000000000060448201526064016103df565b606081810180516000818152600260208181526040928390208351968701845280546001600160a01b0316875260018101549187019190915201549301929092525181148015610a8f5750868481518110610a6e57610a6e613033565b60200260200101516001600160a01b031682602001516001600160a01b0316145b610adb5760405162461bcd60e51b815260206004820152600e60248201527f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000060448201526064016103df565b610ae482612205565b60e0820151610af390866130be565b94506000604051806101000160405280858152602001898781518110610b1b57610b1b613033565b60200260200101516001600160a01b03168152602001888781518110610b4357610b43613033565b602002602001015181526020018460600151815260200184608001518152602001428152602001846080015142610b7a91906130be565b815260e08581015160209283015260008781526009835260409081902084518155928401516001840180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039092169190911790558301516002830155606083015160038301556080830151600483015560a0830151600583015560c083015160068301558201516007909101559050610c1c816122b4565b50506001909201915061077c9050565b50600654610577906201000090046001600160a01b0316338361235c565b6060806060806000610c5b60015490565b905060008167ffffffffffffffff811115610c7857610c786128c4565b604051908082528060200260200182016040528015610ca1578160200160208202803683370190505b50905060008267ffffffffffffffff811115610cbf57610cbf6128c4565b604051908082528060200260200182016040528015610ce8578160200160208202803683370190505b50905060008367ffffffffffffffff811115610d0657610d066128c4565b604051908082528060200260200182016040528015610d2f578160200160208202803683370190505b50905060008467ffffffffffffffff811115610d4d57610d4d6128c4565b604051908082528060200260200182016040528015610d76578160200160208202803683370190505b50905060005b600154811015610e8b576000610d91826123b3565b9050600080600080610de385600081815260026020818152604092839020835160608101855281546001600160a01b031680825260018301549382018490529190930154929093018290529293919291565b9350935093509350838a8781518110610dfe57610dfe613033565b60200260200101818152505082898781518110610e1d57610e1d613033565b60200260200101906001600160a01b031690816001600160a01b03168152505081888781518110610e5057610e50613033565b60200260200101818152505080878781518110610e6f57610e6f613033565b6020908102919091010152505060019093019250610d7c915050565b5092989197509550909350915050565b60608367ffffffffffffffff811115610eb657610eb66128c4565b604051908082528060200260200182016040528015610f4357816020015b604080516101008101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181610ed45790505b50905060005b8481101561106e5760096000610fd5888885818110610f6a57610f6a613033565b9050602002016020810190610f7f9190613016565b878786818110610f9157610f91613033565b90506020020135604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b815260208082019290925260409081016000208151610100810183528154815260018201546001600160a01b0316938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460e0820152825183908390811061105b5761105b613033565b6020908102919091010152600101610f49565b50949350505050565b6000546001600160a01b031633146110d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b6110db60006123da565b565b6000546001600160a01b031633146111375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b60065460ff161561118a5760405162461bcd60e51b815260206004820152601160248201527f616c726561647920696e6974696174656400000000000000000000000000000060448201526064016103df565b600680547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0386811691820292909217909255600780547fffffffffffffffffffffffff000000000000000000000000000000000000000016918516919091179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa15801561124c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127091906130d1565b61127b90600a61320d565b6008556007546112ad906001600160a01b031661129983600a613219565b6008546112a8906102ee613219565b6121da565b6007546112d7906001600160a01b03166112c883601e613219565b6008546112a890610dac613219565b600754611301906001600160a01b03166112f283605a613219565b6008546112a890614074613219565b5050600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b6000546001600160a01b0316331461138b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b6040517f99fbab8800000000000000000000000000000000000000000000000000000000815260048101829052829060009081906001600160a01b038416906399fbab889060240161018060405180830381865afa1580156113f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114159190613275565b5050604080516080810182528f81523060208201526fffffffffffffffffffffffffffffffff818301819052606082015290517ffc6f7865000000000000000000000000000000000000000000000000000000008152989c50969a509598506000975087966001600160a01b038d16965063fc6f786595506114a1945089935060040191506133579050565b60408051808303816000875af11580156114bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e391906133b4565b9092509050811561159a57846001600160a01b031663a9059cbb61150f6000546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af1158015611574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159891906133d8565b505b801561164c57836001600160a01b031663a9059cbb6115c16000546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164a91906133d8565b505b5050505050505050565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916201000090046001600160a01b0316906370a0823190602401602060405180830381865afa1580156116be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e291906130d1565b905090565b600082511180156116f9575080518251145b6117455760405162461bcd60e51b815260206004820152600b60248201527f696e707574206572726f7200000000000000000000000000000000000000000060448201526064016103df565b6000805b8351811015610c2c57336001600160a01b031684828151811061176e5761176e613033565b60200260200101516001600160a01b0316636352211e85848151811061179657611796613033565b60200260200101516040518263ffffffff1660e01b81526004016117bc91815260200190565b602060405180830381865afa1580156117d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fd9190613072565b6001600160a01b0316146118535760405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064016103df565b60006009600061188887858151811061186e5761186e613033565b60200260200101518786815181106108b7576108b7613033565b81526020808201929092526040908101600020815161010081018352815480825260018301546001600160a01b0316948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460e082015291506119495760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b65640000000000000000000000000000000000000000000060448201526064016103df565b8060c00151421161199c5760405162461bcd60e51b815260206004820152600f60248201527f6e6f74207265616368656420796574000000000000000000000000000000000060448201526064016103df565b6119a581612205565b60e08101516119b490846130be565b92506001600a60008282546119c991906133f5565b9091555050516000908152600960205260408120818155600180820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600282018390556003820183905560048201839055600582018390556006820183905560079091019190915501611749565b600080600080600080600080611a9389600081815260026020818152604092839020835160608101855281546001600160a01b031680825260018301549382018490529190930154929093018290529293919291565b929c919b50995090975095505050505050565b600654610100900460ff1615611afe5760405162461bcd60e51b815260206004820152600660248201527f706175736564000000000000000000000000000000000000000000000000000060448201526064016103df565b60008351118015611b10575081518351145b8015611b1d575080518351145b611b695760405162461bcd60e51b815260206004820152600b60248201527f696e707574206572726f7200000000000000000000000000000000000000000060448201526064016103df565b6000611b73611656565b11611bc05760405162461bcd60e51b815260206004820152600a60248201527f706f6f6c20656d7074790000000000000000000000000000000000000000000060448201526064016103df565b600080600080611c1088600081815260026020818152604092839020835160608101855281546001600160a01b031680825260018301549382018490529190930154929093018290529293919291565b935093509350935060005b875181101561164a576000611c55898381518110611c3b57611c3b613033565b60200260200101518984815181106108b7576108b7613033565b9050858a148015611c905750846001600160a01b0316898381518110611c7d57611c7d613033565b60200260200101516001600160a01b0316145b611cdc5760405162461bcd60e51b815260206004820152600e60248201527f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000060448201526064016103df565b60008181526009602052604090205415611d385760405162461bcd60e51b815260206004820152600e60248201527f616c7265616479207374616b656400000000000000000000000000000000000060448201526064016103df565b336001600160a01b0316898381518110611d5457611d54613033565b60200260200101516001600160a01b0316636352211e8a8581518110611d7c57611d7c613033565b60200260200101516040518263ffffffff1660e01b8152600401611da291815260200190565b602060405180830381865afa158015611dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de39190613072565b6001600160a01b031614611e395760405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064016103df565b6000839050898381518110611e5057611e50613033565b60209081029190910101516007546001600160a01b039081169116148015611e8e5750878381518110611e8557611e85613033565b60200260200101515b15611eb0576000611ea082600a612442565b9050611eac81836130be565b9150505b60006040518061010001604052808481526020018c8681518110611ed657611ed6613033565b60200260200101516001600160a01b031681526020018b8681518110611efe57611efe613033565b602002602001015181526020018d81526020018781526020014281526020018742611f2991906130be565b8152602090810184905260008581526009825260409081902083518155918301516001830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039092169190911790558201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e08201516007909101559050611fc9816122b4565b6001600a6000828254611fdc91906130be565b909155505060019093019250611c1b915050565b6000546001600160a01b0316331461204a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b6001600160a01b0381166120c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103df565b6120cf816123da565b50565b6000546001600160a01b0316331461212c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b816001600160a01b03166323b872dd3061214e6000546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b1580156121b557600080fd5b505af11580156121c9573d6000803e3d6000fd5b505050505050565b6120cf81612466565b6121e8600554848484612592565b6001600560008282546121fb91906130be565b9091555050505050565b805160208083015160408085015160608087015160808089015160a0808b015160c0808d015160e0808f01518b51338152429e81019e909e529a8d019d909d526001600160a01b03909a16968b0196909652928901959095529387019190915290850191909152938301939093526101008201526101208101919091527f4ad4e00f7548f7da9a1763c1d447789dbf141b8b91b13b01df350ab643423ed890610140015b60405180910390a150565b805160208083015160408085015160608087015160808089015160a0808b015160c0808d015160e0808f01518b51338152429e81019e909e529a8d019d909d526001600160a01b03909a16968b0196909652928901959095529387019190915290850191909152938301939093526101008201526101208101919091527f9eb120f0fdd9bcf5e5901cd6709f4c7d3d3d01d0752036bb5b71d4630ae00ac890610140016122a9565b600080612367611656565b9050801580612374575082155b156123835760009150506123ac565b82811061239e5761239585858561272a565b829150506123ac565b6123a985858361272a565b90505b9392505050565b6000600182815481106123c8576123c8613033565b90600052602060002001549050919050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080821161245057600080fd5b606461245c8385613219565b6123ac9190613408565b60008181526004602052604090205460ff1661247f5750565b600081815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280835281842080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018181018690559101849055600390925282205481549092919061250a9082906133f5565b8154811061251a5761251a613033565b6000918252602080832090910154808352600390915260408083208590558583528220919091556001805491925082918490811061255a5761255a613033565b600091825260209091200155600180548061257757612577613443565b60019003818190600052602060002001600090559055505050565b6040805160208082018790526001600160a01b0386168284018190526060830186905260808084018690528451808503909101815260a084018086528151918401919091206101008501865291815260c0840187905260e0909301859052600081815260049092529290205460ff161561266157600082815260026020818152604092839020845181547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178155908401516001820155918301519101556121c9565b6000828152600460209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911681179091556002808452828520865181547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390911617815586850151818401559583015195019490945583546003909252822081905580830183559190527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6015550505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916127b49190613472565b6000604051808303816000865af19150503d80600081146127f1576040519150601f19603f3d011682016040523d82523d6000602084013e6127f6565b606091505b509150915081801561282057508051158061282057508080602001905181019061282091906133d8565b6128925760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016103df565b5050505050565b80151581146120cf57600080fd5b6000602082840312156128b957600080fd5b81356123ac81612899565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561293a5761293a6128c4565b604052919050565b600067ffffffffffffffff82111561295c5761295c6128c4565b5060051b60200190565b60006020828403121561297857600080fd5b813567ffffffffffffffff81111561298f57600080fd5b8201601f810184136129a057600080fd5b80356129b36129ae82612942565b6128f3565b8082825260208201915060208360051b8501019250868311156129d557600080fd5b6020840193505b828410156129f75783358252602093840193909101906129dc565b9695505050505050565b6001600160a01b03811681146120cf57600080fd5b600082601f830112612a2757600080fd5b8135612a356129ae82612942565b8082825260208201915060208360051b860101925085831115612a5757600080fd5b602085015b83811015612a7d578035612a6f81612a01565b835260209283019201612a5c565b5095945050505050565b600082601f830112612a9857600080fd5b8135612aa66129ae82612942565b8082825260208201915060208360051b860101925085831115612ac857600080fd5b602085015b83811015612a7d578035835260209283019201612acd565b600080600060608486031215612afa57600080fd5b833567ffffffffffffffff811115612b1157600080fd5b612b1d86828701612a16565b935050602084013567ffffffffffffffff811115612b3a57600080fd5b612b4686828701612a87565b925050604084013567ffffffffffffffff811115612b6357600080fd5b612b6f86828701612a87565b9150509250925092565b60008060408385031215612b8c57600080fd5b8235612b9781612a01565b946020939093013593505050565b61010081016106658284805182526001600160a01b03602082015116602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b60008060408385031215612c1957600080fd5b823567ffffffffffffffff811115612c3057600080fd5b612c3c85828601612a16565b925050602083013567ffffffffffffffff811115612c5957600080fd5b612c6585828601612a87565b9150509250929050565b600081518084526020840193506020830160005b82811015612ca1578151865260209586019590910190600101612c83565b5093949350505050565b60808082528551908201819052600090602087019060a0840190835b81811015612ce5578351835260209384019390920191600101612cc7565b50508381036020808601919091528751808352918101925087019060005b81811015612d2a5782516001600160a01b0316845260209384019390920191600101612d03565b5050508281036040840152612d3f8186612c6f565b90508281036060840152612d538185612c6f565b979650505050505050565b60008083601f840112612d7057600080fd5b50813567ffffffffffffffff811115612d8857600080fd5b6020830191508360208260051b8501011115612da357600080fd5b9250929050565b60008060008060408587031215612dc057600080fd5b843567ffffffffffffffff811115612dd757600080fd5b612de387828801612d5e565b909550935050602085013567ffffffffffffffff811115612e0357600080fd5b612e0f87828801612d5e565b95989497509550505050565b602080825282518282018190526000918401906040840190835b81811015612eb157612e9a838551805182526001600160a01b03602082015116602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b602093909301926101009290920191600101612e35565b509095945050505050565b600080600060608486031215612ed157600080fd5b8335612edc81612a01565b92506020840135612eec81612a01565b929592945050506040919091013590565b600060208284031215612f0f57600080fd5b5035919050565b60008060008060808587031215612f2c57600080fd5b84359350602085013567ffffffffffffffff811115612f4a57600080fd5b612f5687828801612a16565b935050604085013567ffffffffffffffff811115612f7357600080fd5b612f7f87828801612a87565b925050606085013567ffffffffffffffff811115612f9c57600080fd5b8501601f81018713612fad57600080fd5b8035612fbb6129ae82612942565b8082825260208201915060208360051b850101925089831115612fdd57600080fd5b6020840193505b82841015613008578335612ff781612899565b825260209384019390910190612fe4565b969995985093965050505050565b60006020828403121561302857600080fd5b81356123ac81612a01565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805161306d81612a01565b919050565b60006020828403121561308457600080fd5b81516123ac81612a01565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156106655761066561308f565b6000602082840312156130e357600080fd5b5051919050565b6001815b6001841115613125578085048111156131095761310961308f565b600184161561311757908102905b60019390931c9280026130ee565b935093915050565b60008261313c57506001610665565b8161314957506000610665565b816001811461315f576002811461316957613185565b6001915050610665565b60ff84111561317a5761317a61308f565b50506001821b610665565b5060208310610133831016604e8410600b84101617156131a8575081810a610665565b6131d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846130ea565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156132055761320561308f565b029392505050565b60006123ac838361312d565b80820281158282048414176106655761066561308f565b805162ffffff8116811461306d57600080fd5b8051600281900b811461306d57600080fd5b80516fffffffffffffffffffffffffffffffff8116811461306d57600080fd5b6000806000806000806000806000806000806101808d8f03121561329857600080fd5b8c516bffffffffffffffffffffffff811681146132b457600080fd5b9b506132c260208e01613062565b9a506132d060408e01613062565b99506132de60608e01613062565b98506132ec60808e01613230565b97506132fa60a08e01613243565b965061330860c08e01613243565b955061331660e08e01613255565b6101008e01516101208f0151919650945092506133366101408e01613255565b91506133456101608e01613255565b90509295989b509295989b509295989b565b6000608082019050825182526001600160a01b0360208401511660208301526fffffffffffffffffffffffffffffffff60408401511660408301526fffffffffffffffffffffffffffffffff606084015116606083015292915050565b600080604083850312156133c757600080fd5b505080516020909101519092909150565b6000602082840312156133ea57600080fd5b81516123ac81612899565b818103818111156106655761066561308f565b60008261343e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000825160005b818110156134935760208186018101518583015201613479565b50600092019182525091905056fea264697066735822122031cf0c1a2afa5b3781e1cb3390c342ff7e48ec7abc94107d38c453cd3df8625864736f6c634300081b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101825760003560e01c806372f702f3116100d8578063b69ef8a81161008c578063e5b4752211610066578063e5b4752214610350578063f2fde38b14610363578063f3fef3a31461037657600080fd5b8063b69ef8a8146102fa578063bcca1e0414610302578063cfa4a6a61461031557600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c95780639f118536146102da578063a033fcd4146102e757600080fd5b806372f702f31461029d57806386863ec6146102b657600080fd5b80635c975abb1161013a5780636b130999116101145780636b130999146102635780636c4470fb14610283578063715018a61461029557600080fd5b80635c975abb146101fe578063673a2a1f146102205780636982d8151461023857600080fd5b80630f3da1181161016b5780630f3da118146101af578063143ee5b9146101c25780633628a8ed146101eb57600080fd5b806302329a29146101875780630666c6811461019c575b600080fd5b61019a6101953660046128a7565b610389565b005b61019a6101aa366004612966565b61041f565b61019a6101bd366004612ae5565b6104b3565b6101d56101d0366004612b79565b61057d565b6040516101e29190612ba5565b60405180910390f35b61019a6101f9366004612c06565b61066b565b60065461021090610100900460ff1681565b60405190151581526020016101e2565b610228610c4a565b6040516101e29493929190612cab565b60075461024b906001600160a01b031681565b6040516001600160a01b0390911681526020016101e2565b610276610271366004612daa565b610e9b565b6040516101e29190612e1b565b600a545b6040519081526020016101e2565b61019a611077565b60065461024b906201000090046001600160a01b031681565b61019a6102c4366004612ebc565b6110dd565b6000546001600160a01b031661024b565b6006546102109060ff1681565b61019a6102f5366004612b79565b611331565b610287611656565b61019a610310366004612c06565b6116e7565b610328610323366004612efd565b611a3d565b604080519485526001600160a01b0390931660208501529183015260608201526080016101e2565b61019a61035e366004612f16565b611aa6565b61019a610371366004613016565b611ff0565b61019a610384366004612b79565b6120d2565b6000546001600160a01b031633146103e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60068054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6000546001600160a01b031633146104795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b60005b81518110156104af576104a782828151811061049a5761049a613033565b60200260200101516121d1565b60010161047c565b5050565b6000546001600160a01b0316331461050d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b60005b83518110156105775761056f84828151811061052e5761052e613033565b602002602001015184838151811061054857610548613033565b602002602001015184848151811061056257610562613033565b60200260200101516121da565b600101610510565b50505050565b60408051610100810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905260e0840183905284516001600160a01b03881681840152808601879052855180820387018152910190945283519301929092209091600991815260208082019290925260409081016000208151610100810183528154815260018201546001600160a01b0316938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460e082015290505b92915050565b600654610100900460ff16156106c35760405162461bcd60e51b815260206004820152600660248201527f706175736564000000000000000000000000000000000000000000000000000060448201526064016103df565b600082511180156106d5575080518251145b6107215760405162461bcd60e51b815260206004820152600b60248201527f696e707574206572726f7200000000000000000000000000000000000000000060448201526064016103df565b600061072b611656565b116107785760405162461bcd60e51b815260206004820152600a60248201527f706f6f6c20656d7074790000000000000000000000000000000000000000000060448201526064016103df565b6000805b8351811015610c2c57336001600160a01b03168482815181106107a1576107a1613033565b60200260200101516001600160a01b0316636352211e8584815181106107c9576107c9613033565b60200260200101516040518263ffffffff1660e01b81526004016107ef91815260200190565b602060405180830381865afa15801561080c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108309190613072565b6001600160a01b0316146108865760405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064016103df565b60006108fc85838151811061089d5761089d613033565b60200260200101518584815181106108b7576108b7613033565b6020026020010151604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b600081815260096020908152604091829020825161010081018452815480825260018301546001600160a01b0316938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e0830152919250906109be5760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b65640000000000000000000000000000000000000000000060448201526064016103df565b8060c001514211610a115760405162461bcd60e51b815260206004820152600f60248201527f6e6f74207265616368656420796574000000000000000000000000000000000060448201526064016103df565b606081810180516000818152600260208181526040928390208351968701845280546001600160a01b0316875260018101549187019190915201549301929092525181148015610a8f5750868481518110610a6e57610a6e613033565b60200260200101516001600160a01b031682602001516001600160a01b0316145b610adb5760405162461bcd60e51b815260206004820152600e60248201527f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000060448201526064016103df565b610ae482612205565b60e0820151610af390866130be565b94506000604051806101000160405280858152602001898781518110610b1b57610b1b613033565b60200260200101516001600160a01b03168152602001888781518110610b4357610b43613033565b602002602001015181526020018460600151815260200184608001518152602001428152602001846080015142610b7a91906130be565b815260e08581015160209283015260008781526009835260409081902084518155928401516001840180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039092169190911790558301516002830155606083015160038301556080830151600483015560a0830151600583015560c083015160068301558201516007909101559050610c1c816122b4565b50506001909201915061077c9050565b50600654610577906201000090046001600160a01b0316338361235c565b6060806060806000610c5b60015490565b905060008167ffffffffffffffff811115610c7857610c786128c4565b604051908082528060200260200182016040528015610ca1578160200160208202803683370190505b50905060008267ffffffffffffffff811115610cbf57610cbf6128c4565b604051908082528060200260200182016040528015610ce8578160200160208202803683370190505b50905060008367ffffffffffffffff811115610d0657610d066128c4565b604051908082528060200260200182016040528015610d2f578160200160208202803683370190505b50905060008467ffffffffffffffff811115610d4d57610d4d6128c4565b604051908082528060200260200182016040528015610d76578160200160208202803683370190505b50905060005b600154811015610e8b576000610d91826123b3565b9050600080600080610de385600081815260026020818152604092839020835160608101855281546001600160a01b031680825260018301549382018490529190930154929093018290529293919291565b9350935093509350838a8781518110610dfe57610dfe613033565b60200260200101818152505082898781518110610e1d57610e1d613033565b60200260200101906001600160a01b031690816001600160a01b03168152505081888781518110610e5057610e50613033565b60200260200101818152505080878781518110610e6f57610e6f613033565b6020908102919091010152505060019093019250610d7c915050565b5092989197509550909350915050565b60608367ffffffffffffffff811115610eb657610eb66128c4565b604051908082528060200260200182016040528015610f4357816020015b604080516101008101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181610ed45790505b50905060005b8481101561106e5760096000610fd5888885818110610f6a57610f6a613033565b9050602002016020810190610f7f9190613016565b878786818110610f9157610f91613033565b90506020020135604080516001600160a01b038416602082015290810182905260009060600160405160208183030381529060405280519060200120905092915050565b815260208082019290925260409081016000208151610100810183528154815260018201546001600160a01b0316938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460e0820152825183908390811061105b5761105b613033565b6020908102919091010152600101610f49565b50949350505050565b6000546001600160a01b031633146110d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b6110db60006123da565b565b6000546001600160a01b031633146111375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b60065460ff161561118a5760405162461bcd60e51b815260206004820152601160248201527f616c726561647920696e6974696174656400000000000000000000000000000060448201526064016103df565b600680547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0386811691820292909217909255600780547fffffffffffffffffffffffff000000000000000000000000000000000000000016918516919091179055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905163313ce567916004808201926020929091908290030181865afa15801561124c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127091906130d1565b61127b90600a61320d565b6008556007546112ad906001600160a01b031661129983600a613219565b6008546112a8906102ee613219565b6121da565b6007546112d7906001600160a01b03166112c883601e613219565b6008546112a890610dac613219565b600754611301906001600160a01b03166112f283605a613219565b6008546112a890614074613219565b5050600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b6000546001600160a01b0316331461138b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b6040517f99fbab8800000000000000000000000000000000000000000000000000000000815260048101829052829060009081906001600160a01b038416906399fbab889060240161018060405180830381865afa1580156113f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114159190613275565b5050604080516080810182528f81523060208201526fffffffffffffffffffffffffffffffff818301819052606082015290517ffc6f7865000000000000000000000000000000000000000000000000000000008152989c50969a509598506000975087966001600160a01b038d16965063fc6f786595506114a1945089935060040191506133579050565b60408051808303816000875af11580156114bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e391906133b4565b9092509050811561159a57846001600160a01b031663a9059cbb61150f6000546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af1158015611574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159891906133d8565b505b801561164c57836001600160a01b031663a9059cbb6115c16000546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611626573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164a91906133d8565b505b5050505050505050565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916201000090046001600160a01b0316906370a0823190602401602060405180830381865afa1580156116be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e291906130d1565b905090565b600082511180156116f9575080518251145b6117455760405162461bcd60e51b815260206004820152600b60248201527f696e707574206572726f7200000000000000000000000000000000000000000060448201526064016103df565b6000805b8351811015610c2c57336001600160a01b031684828151811061176e5761176e613033565b60200260200101516001600160a01b0316636352211e85848151811061179657611796613033565b60200260200101516040518263ffffffff1660e01b81526004016117bc91815260200190565b602060405180830381865afa1580156117d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fd9190613072565b6001600160a01b0316146118535760405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064016103df565b60006009600061188887858151811061186e5761186e613033565b60200260200101518786815181106108b7576108b7613033565b81526020808201929092526040908101600020815161010081018352815480825260018301546001600160a01b0316948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460e082015291506119495760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b65640000000000000000000000000000000000000000000060448201526064016103df565b8060c00151421161199c5760405162461bcd60e51b815260206004820152600f60248201527f6e6f74207265616368656420796574000000000000000000000000000000000060448201526064016103df565b6119a581612205565b60e08101516119b490846130be565b92506001600a60008282546119c991906133f5565b9091555050516000908152600960205260408120818155600180820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600282018390556003820183905560048201839055600582018390556006820183905560079091019190915501611749565b600080600080600080600080611a9389600081815260026020818152604092839020835160608101855281546001600160a01b031680825260018301549382018490529190930154929093018290529293919291565b929c919b50995090975095505050505050565b600654610100900460ff1615611afe5760405162461bcd60e51b815260206004820152600660248201527f706175736564000000000000000000000000000000000000000000000000000060448201526064016103df565b60008351118015611b10575081518351145b8015611b1d575080518351145b611b695760405162461bcd60e51b815260206004820152600b60248201527f696e707574206572726f7200000000000000000000000000000000000000000060448201526064016103df565b6000611b73611656565b11611bc05760405162461bcd60e51b815260206004820152600a60248201527f706f6f6c20656d7074790000000000000000000000000000000000000000000060448201526064016103df565b600080600080611c1088600081815260026020818152604092839020835160608101855281546001600160a01b031680825260018301549382018490529190930154929093018290529293919291565b935093509350935060005b875181101561164a576000611c55898381518110611c3b57611c3b613033565b60200260200101518984815181106108b7576108b7613033565b9050858a148015611c905750846001600160a01b0316898381518110611c7d57611c7d613033565b60200260200101516001600160a01b0316145b611cdc5760405162461bcd60e51b815260206004820152600e60248201527f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000060448201526064016103df565b60008181526009602052604090205415611d385760405162461bcd60e51b815260206004820152600e60248201527f616c7265616479207374616b656400000000000000000000000000000000000060448201526064016103df565b336001600160a01b0316898381518110611d5457611d54613033565b60200260200101516001600160a01b0316636352211e8a8581518110611d7c57611d7c613033565b60200260200101516040518263ffffffff1660e01b8152600401611da291815260200190565b602060405180830381865afa158015611dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de39190613072565b6001600160a01b031614611e395760405162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064016103df565b6000839050898381518110611e5057611e50613033565b60209081029190910101516007546001600160a01b039081169116148015611e8e5750878381518110611e8557611e85613033565b60200260200101515b15611eb0576000611ea082600a612442565b9050611eac81836130be565b9150505b60006040518061010001604052808481526020018c8681518110611ed657611ed6613033565b60200260200101516001600160a01b031681526020018b8681518110611efe57611efe613033565b602002602001015181526020018d81526020018781526020014281526020018742611f2991906130be565b8152602090810184905260008581526009825260409081902083518155918301516001830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039092169190911790558201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e08201516007909101559050611fc9816122b4565b6001600a6000828254611fdc91906130be565b909155505060019093019250611c1b915050565b6000546001600160a01b0316331461204a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b6001600160a01b0381166120c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103df565b6120cf816123da565b50565b6000546001600160a01b0316331461212c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103df565b816001600160a01b03166323b872dd3061214e6000546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b1580156121b557600080fd5b505af11580156121c9573d6000803e3d6000fd5b505050505050565b6120cf81612466565b6121e8600554848484612592565b6001600560008282546121fb91906130be565b9091555050505050565b805160208083015160408085015160608087015160808089015160a0808b015160c0808d015160e0808f01518b51338152429e81019e909e529a8d019d909d526001600160a01b03909a16968b0196909652928901959095529387019190915290850191909152938301939093526101008201526101208101919091527f4ad4e00f7548f7da9a1763c1d447789dbf141b8b91b13b01df350ab643423ed890610140015b60405180910390a150565b805160208083015160408085015160608087015160808089015160a0808b015160c0808d015160e0808f01518b51338152429e81019e909e529a8d019d909d526001600160a01b03909a16968b0196909652928901959095529387019190915290850191909152938301939093526101008201526101208101919091527f9eb120f0fdd9bcf5e5901cd6709f4c7d3d3d01d0752036bb5b71d4630ae00ac890610140016122a9565b600080612367611656565b9050801580612374575082155b156123835760009150506123ac565b82811061239e5761239585858561272a565b829150506123ac565b6123a985858361272a565b90505b9392505050565b6000600182815481106123c8576123c8613033565b90600052602060002001549050919050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080821161245057600080fd5b606461245c8385613219565b6123ac9190613408565b60008181526004602052604090205460ff1661247f5750565b600081815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280835281842080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018181018690559101849055600390925282205481549092919061250a9082906133f5565b8154811061251a5761251a613033565b6000918252602080832090910154808352600390915260408083208590558583528220919091556001805491925082918490811061255a5761255a613033565b600091825260209091200155600180548061257757612577613443565b60019003818190600052602060002001600090559055505050565b6040805160208082018790526001600160a01b0386168284018190526060830186905260808084018690528451808503909101815260a084018086528151918401919091206101008501865291815260c0840187905260e0909301859052600081815260049092529290205460ff161561266157600082815260026020818152604092839020845181547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178155908401516001820155918301519101556121c9565b6000828152600460209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911681179091556002808452828520865181547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390911617815586850151818401559583015195019490945583546003909252822081905580830183559190527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6015550505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916127b49190613472565b6000604051808303816000865af19150503d80600081146127f1576040519150601f19603f3d011682016040523d82523d6000602084013e6127f6565b606091505b509150915081801561282057508051158061282057508080602001905181019061282091906133d8565b6128925760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016103df565b5050505050565b80151581146120cf57600080fd5b6000602082840312156128b957600080fd5b81356123ac81612899565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561293a5761293a6128c4565b604052919050565b600067ffffffffffffffff82111561295c5761295c6128c4565b5060051b60200190565b60006020828403121561297857600080fd5b813567ffffffffffffffff81111561298f57600080fd5b8201601f810184136129a057600080fd5b80356129b36129ae82612942565b6128f3565b8082825260208201915060208360051b8501019250868311156129d557600080fd5b6020840193505b828410156129f75783358252602093840193909101906129dc565b9695505050505050565b6001600160a01b03811681146120cf57600080fd5b600082601f830112612a2757600080fd5b8135612a356129ae82612942565b8082825260208201915060208360051b860101925085831115612a5757600080fd5b602085015b83811015612a7d578035612a6f81612a01565b835260209283019201612a5c565b5095945050505050565b600082601f830112612a9857600080fd5b8135612aa66129ae82612942565b8082825260208201915060208360051b860101925085831115612ac857600080fd5b602085015b83811015612a7d578035835260209283019201612acd565b600080600060608486031215612afa57600080fd5b833567ffffffffffffffff811115612b1157600080fd5b612b1d86828701612a16565b935050602084013567ffffffffffffffff811115612b3a57600080fd5b612b4686828701612a87565b925050604084013567ffffffffffffffff811115612b6357600080fd5b612b6f86828701612a87565b9150509250925092565b60008060408385031215612b8c57600080fd5b8235612b9781612a01565b946020939093013593505050565b61010081016106658284805182526001600160a01b03602082015116602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b60008060408385031215612c1957600080fd5b823567ffffffffffffffff811115612c3057600080fd5b612c3c85828601612a16565b925050602083013567ffffffffffffffff811115612c5957600080fd5b612c6585828601612a87565b9150509250929050565b600081518084526020840193506020830160005b82811015612ca1578151865260209586019590910190600101612c83565b5093949350505050565b60808082528551908201819052600090602087019060a0840190835b81811015612ce5578351835260209384019390920191600101612cc7565b50508381036020808601919091528751808352918101925087019060005b81811015612d2a5782516001600160a01b0316845260209384019390920191600101612d03565b5050508281036040840152612d3f8186612c6f565b90508281036060840152612d538185612c6f565b979650505050505050565b60008083601f840112612d7057600080fd5b50813567ffffffffffffffff811115612d8857600080fd5b6020830191508360208260051b8501011115612da357600080fd5b9250929050565b60008060008060408587031215612dc057600080fd5b843567ffffffffffffffff811115612dd757600080fd5b612de387828801612d5e565b909550935050602085013567ffffffffffffffff811115612e0357600080fd5b612e0f87828801612d5e565b95989497509550505050565b602080825282518282018190526000918401906040840190835b81811015612eb157612e9a838551805182526001600160a01b03602082015116602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b602093909301926101009290920191600101612e35565b509095945050505050565b600080600060608486031215612ed157600080fd5b8335612edc81612a01565b92506020840135612eec81612a01565b929592945050506040919091013590565b600060208284031215612f0f57600080fd5b5035919050565b60008060008060808587031215612f2c57600080fd5b84359350602085013567ffffffffffffffff811115612f4a57600080fd5b612f5687828801612a16565b935050604085013567ffffffffffffffff811115612f7357600080fd5b612f7f87828801612a87565b925050606085013567ffffffffffffffff811115612f9c57600080fd5b8501601f81018713612fad57600080fd5b8035612fbb6129ae82612942565b8082825260208201915060208360051b850101925089831115612fdd57600080fd5b6020840193505b82841015613008578335612ff781612899565b825260209384019390910190612fe4565b969995985093965050505050565b60006020828403121561302857600080fd5b81356123ac81612a01565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805161306d81612a01565b919050565b60006020828403121561308457600080fd5b81516123ac81612a01565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156106655761066561308f565b6000602082840312156130e357600080fd5b5051919050565b6001815b6001841115613125578085048111156131095761310961308f565b600184161561311757908102905b60019390931c9280026130ee565b935093915050565b60008261313c57506001610665565b8161314957506000610665565b816001811461315f576002811461316957613185565b6001915050610665565b60ff84111561317a5761317a61308f565b50506001821b610665565b5060208310610133831016604e8410600b84101617156131a8575081810a610665565b6131d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846130ea565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156132055761320561308f565b029392505050565b60006123ac838361312d565b80820281158282048414176106655761066561308f565b805162ffffff8116811461306d57600080fd5b8051600281900b811461306d57600080fd5b80516fffffffffffffffffffffffffffffffff8116811461306d57600080fd5b6000806000806000806000806000806000806101808d8f03121561329857600080fd5b8c516bffffffffffffffffffffffff811681146132b457600080fd5b9b506132c260208e01613062565b9a506132d060408e01613062565b99506132de60608e01613062565b98506132ec60808e01613230565b97506132fa60a08e01613243565b965061330860c08e01613243565b955061331660e08e01613255565b6101008e01516101208f0151919650945092506133366101408e01613255565b91506133456101608e01613255565b90509295989b509295989b509295989b565b6000608082019050825182526001600160a01b0360208401511660208301526fffffffffffffffffffffffffffffffff60408401511660408301526fffffffffffffffffffffffffffffffff606084015116606083015292915050565b600080604083850312156133c757600080fd5b505080516020909101519092909150565b6000602082840312156133ea57600080fd5b81516123ac81612899565b818103818111156106655761066561308f565b60008261343e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000825160005b818110156134935760208186018101518583015201613479565b50600092019182525091905056fea264697066735822122031cf0c1a2afa5b3781e1cb3390c342ff7e48ec7abc94107d38c453cd3df8625864736f6c634300081b0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.