Contract Overview
Balance:
0 CLV
CLV Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xdf2b24c2a18b20ce27be026ed8d0b71c4f1f42b79ad8081940be01f13d35021b | Withdraw | 1541618 | 180 days 4 hrs ago | 0xada286f2d2cb001b53deee492b61d288cfb90a35 | IN | 0x64c201c3274d04d435900514cea61b2a3ee9b4f2 | 0 CLV | 0.0151267 | |
0x878a94d7443e13a3ee055e9a7a4b89ac426091d281d1e24a9a39d6754d8494ac | Deposit | 1539744 | 180 days 11 hrs ago | 0xada286f2d2cb001b53deee492b61d288cfb90a35 | IN | 0x64c201c3274d04d435900514cea61b2a3ee9b4f2 | 0 CLV | 0.0197162 | |
0xcba0327a99997126aeeb69982c3e311bfc13ce6d788c75d4c77d7792f116d56c | Add | 1538299 | 180 days 16 hrs ago | 0xe395605bd95b3a641b9d1266cdb256176419161a | IN | 0x64c201c3274d04d435900514cea61b2a3ee9b4f2 | 0 CLV | 0.0106214325 | |
0x635162c9e498b8cb777d0333592ab35179c48c30677f4e8890a883612b8213da | 0x60c06040 | 1529621 | 182 days 12 mins ago | 0xe395605bd95b3a641b9d1266cdb256176419161a | IN | Create: PronteraV2 | 0 CLV | 0.1887714675 |
[ Download CSV Export ]
Contract Name:
PronteraV2
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "../libraries/Math.sol"; import "./interfaces/IPronteraReserve.sol"; import "./interfaces/IIzludeV2.sol"; import "./interfaces/IWETH.sol"; contract PronteraV2 is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; using SafeERC20 for IWETH; using Address for address; using Address for address payable; IWETH public constant WETH = IWETH(0x1376C97C5c512d2d6F9173A9A3A016B6140b4536); // Info of each user. struct UserInfo { uint256 jellopy; uint256 rewardDebt; uint256 storedJellopy; } // Info of each pool. struct PoolInfo { IERC20 want; address izlude; uint256 accKSWPerJellopy; uint64 allocPoint; uint64 lastRewardTime; } // Reserve IPronteraReserve public immutable reserve; // KSW address address public immutable ksw; // KSW tokens rewards per second. uint256 public kswPerSecond; // Info of each pool. address[] public traversalPools; mapping(address => bool) public isInTraversalPools; // remember is izlude in traversal mapping(address => PoolInfo) public poolInfo; uint256 public totalPool; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; // Info of each user that stakes to izlude. mapping(address => mapping(address => UserInfo)) public userInfo; // [user] [izlude] [store] => amount mapping(address => mapping(address => mapping(address => uint256))) private _storeAllowances; mapping(address => mapping(address => mapping(address => uint256))) public jellopyStorage; event Deposit(address indexed user, address indexed izlude, uint256 amount); event DepositFor(address indexed user, address indexed izlude, uint256 amount); event Withdraw(address indexed user, address indexed izlude, uint256 amount); event EmergencyWithdraw(address indexed user, address indexed izlude, uint256 amount); event StoreApproval(address indexed owner, address indexed izlude, address indexed spender, uint256 value); event StoreKeepJellopy(address indexed owner, address indexed izlude, address indexed store, uint256 value); event StoreReturnJellopy(address indexed user, address indexed izlude, address indexed store, uint256 amount); event StoreWithdraw(address indexed user, address indexed izlude, address indexed store, uint256 amount); event AddPool(address indexed izlude, uint256 allocPoint, bool withUpdate); event SetPool(address indexed izlude, uint256 allocPoint, bool withUpdate); event SetKSWPerSecond(uint256 kswPerSecond); modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "Prontera: EXPIRED"); _; } constructor( IPronteraReserve _reserve, address _ksw, uint256 _kswPerSecond ) { reserve = _reserve; kswPerSecond = _kswPerSecond; ksw = _ksw; } function traversalPoolsLength() external view returns (uint256) { return traversalPools.length; } function _addTraversal(address izlude) private { if (isInTraversalPools[izlude]) { return; } isInTraversalPools[izlude] = true; traversalPools.push(izlude); } function removeTraversal(uint256 index) external { address izlude = traversalPools[index]; require(poolInfo[izlude].allocPoint == 0, "allocated"); isInTraversalPools[izlude] = false; traversalPools[index] = traversalPools[traversalPools.length - 1]; traversalPools.pop(); } // Add a new izlude to the pool. function add( address izlude, uint64 allocPoint, bool withUpdate ) external onlyOwner { require(IIzludeV2(izlude).prontera() == address(this), "?"); require(IIzludeV2(izlude).totalSupply() >= 0, "??"); require(poolInfo[izlude].izlude == address(0), "duplicated"); if (withUpdate) { massUpdatePools(); } poolInfo[izlude] = PoolInfo({ want: IIzludeV2(izlude).want(), izlude: izlude, allocPoint: allocPoint, lastRewardTime: uint64(block.timestamp), accKSWPerJellopy: 0 }); totalPool += 1; totalAllocPoint += allocPoint; if (allocPoint > 0) { _addTraversal(izlude); } emit AddPool(izlude, allocPoint, withUpdate); } // Update the given pool's KSW allocation point. function set( address izlude, uint64 allocPoint, bool withUpdate ) external onlyOwner { require(izlude != address(0), "invalid izlude"); PoolInfo storage pool = poolInfo[izlude]; require(pool.izlude == izlude, "!found"); if (withUpdate) { massUpdatePools(); } totalAllocPoint = (totalAllocPoint - pool.allocPoint) + allocPoint; pool.allocPoint = allocPoint; if (allocPoint > 0) { _addTraversal(izlude); } emit SetPool(izlude, allocPoint, withUpdate); } /** * @dev View function to see pending KSWs on frontend. * */ function pendingKSW(address izlude, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[izlude]; UserInfo storage user = userInfo[izlude][_user]; uint256 accKSWPerJellopy = pool.accKSWPerJellopy; uint256 izludeSupply = IIzludeV2(izlude).totalSupply(); if (block.timestamp > pool.lastRewardTime && izludeSupply != 0) { uint256 time = block.timestamp - pool.lastRewardTime; uint256 kswReward = (time * kswPerSecond * pool.allocPoint) / totalAllocPoint; uint256 stakingBal = reserve.balances(); accKSWPerJellopy += (Math.min(kswReward, stakingBal) * 1e12) / izludeSupply; } uint256 tJellopy = user.jellopy + user.storedJellopy; uint256 r = ((tJellopy * accKSWPerJellopy) / 1e12) - user.rewardDebt; return r; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { for (uint256 i = 0; i < traversalPools.length; i++) { updatePool(traversalPools[i]); } } // Update reward variables of the given pool to be up-to-date. function updatePool(address izlude) public { PoolInfo storage pool = poolInfo[izlude]; require(pool.izlude == izlude, "!pool"); if (block.timestamp > pool.lastRewardTime) { uint256 izludeSupply = IIzludeV2(izlude).totalSupply(); if (izludeSupply > 0) { uint256 time = block.timestamp - pool.lastRewardTime; uint256 kswReward = (time * kswPerSecond * pool.allocPoint) / totalAllocPoint; uint256 r = reserve.withdraw(address(this), kswReward); pool.accKSWPerJellopy += (r * 1e12) / izludeSupply; } pool.lastRewardTime = uint64(block.timestamp); } } /** * @dev low level deposit 'want' to izlude or staking here * * 'warning' deposit amount must be guarantee by caller */ function _deposit( address _user, address izlude, IERC20 want, uint256 amount ) private { PoolInfo storage pool = poolInfo[izlude]; UserInfo storage user = userInfo[izlude][_user]; updatePool(izlude); uint256 tJellopy = user.jellopy + user.storedJellopy; if (tJellopy > 0) { uint256 pending = ((tJellopy * pool.accKSWPerJellopy) / 1e12) - user.rewardDebt; if (pending > 0) { IERC20(ksw).transfer(_user, pending); } } // amount must guaranteed by caller if (amount > 0) { want.safeIncreaseAllowance(izlude, amount); uint256 addAmount = IIzludeV2(izlude).deposit(_user, amount); tJellopy += addAmount; user.jellopy += addAmount; } user.rewardDebt = (tJellopy * pool.accKSWPerJellopy) / 1e12; } function harvest(address[] calldata izludes) external nonReentrant { for (uint256 i = 0; i < izludes.length; i++) { _deposit(msg.sender, izludes[i], IERC20(address(0)), 0); } } function deposit(address izlude, uint256 amount) external nonReentrant { PoolInfo storage pool = poolInfo[izlude]; if (amount > 0) { require(_safeERC20TransferIn(pool.want, amount) == amount, "!amount"); } _deposit(msg.sender, izlude, pool.want, amount); emit Deposit(msg.sender, izlude, amount); } function depositFor( address user, address izlude, uint256 amount ) external nonReentrant { PoolInfo storage pool = poolInfo[izlude]; if (amount > 0) { require(_safeERC20TransferIn(pool.want, amount) == amount, "!amount"); } _deposit(user, izlude, pool.want, amount); emit DepositFor(user, izlude, amount); } function _withdraw( address _user, address izlude, IERC20 want, uint256 jellopyAmount ) private returns (uint256 amount) { PoolInfo storage pool = poolInfo[izlude]; UserInfo storage user = userInfo[izlude][_user]; jellopyAmount = Math.min(user.jellopy, jellopyAmount); updatePool(izlude); uint256 tJellopy = user.jellopy + user.storedJellopy; uint256 pending = ((tJellopy * pool.accKSWPerJellopy) / 1e12) - user.rewardDebt; if (pending > 0) { IERC20(ksw).transfer(_user, pending); } tJellopy -= jellopyAmount; user.jellopy -= jellopyAmount; user.rewardDebt = (tJellopy * pool.accKSWPerJellopy) / 1e12; if (jellopyAmount > 0) { uint256 wantBefore = want.balanceOf(address(this)); IIzludeV2(izlude).withdraw(_user, jellopyAmount); uint256 wantAfter = want.balanceOf(address(this)); amount = wantAfter - wantBefore; } } function withdraw(address izlude, uint256 jellopyAmount) external nonReentrant { PoolInfo storage pool = poolInfo[izlude]; uint256 amount = _withdraw(msg.sender, izlude, pool.want, jellopyAmount); if (amount > 0) { pool.want.safeTransfer(msg.sender, amount); } emit Withdraw(msg.sender, izlude, jellopyAmount); } // withdraw from allowed store. send pending reward to owner but transfer want to store and let store handle the rest function storeWithdraw( address _user, address izlude, uint256 jellopyAmount ) external nonReentrant { require(jellopyAmount > 0, "invalid amount"); PoolInfo storage pool = poolInfo[izlude]; UserInfo storage user = userInfo[izlude][_user]; jellopyStorage[_user][izlude][msg.sender] -= jellopyAmount; user.storedJellopy -= jellopyAmount; user.jellopy += jellopyAmount; uint256 amount = _withdraw(_user, izlude, pool.want, jellopyAmount); if (amount > 0) { pool.want.safeTransfer(msg.sender, amount); } emit StoreWithdraw(_user, izlude, msg.sender, amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(address izlude) external { PoolInfo storage pool = poolInfo[izlude]; UserInfo storage user = userInfo[izlude][msg.sender]; uint256 jellopy = user.jellopy; user.jellopy = 0; user.rewardDebt = (user.storedJellopy * pool.accKSWPerJellopy) / 1e12; if (jellopy > 0) { IERC20 want = pool.want; uint256 wantBefore = want.balanceOf(address(this)); IIzludeV2(izlude).withdraw(msg.sender, jellopy); uint256 wantAfter = want.balanceOf(address(this)); want.safeTransfer(msg.sender, wantAfter - wantBefore); } emit EmergencyWithdraw(msg.sender, izlude, jellopy); } /** * @dev Returns the remaining number of jellopy that `store` will be * allowed to keep on behalf of `user` through {storeKeepJellopy}. This is * zero by default. * * This value changes when {approveStore} or {storeKeepJellopy} are called. */ function storeAllowance( address user, address izlude, address store ) external view returns (uint256) { return _storeAllowances[user][izlude][store]; } function _approveStore( address user, address izlude, address store, uint256 amount ) private { require(user != address(0), "approve from the zero address"); require(izlude != address(0), "approve izlude zero address"); require(store != address(0), "approve to the zero address"); _storeAllowances[user][izlude][store] = amount; emit StoreApproval(user, izlude, store, amount); } /** * @dev grant store to keep jellopy */ function approveStore( address izlude, address store, uint256 amount ) external { _approveStore(msg.sender, izlude, store, amount); } /** * @dev Atomically increases the allowance granted to `store` by the caller. */ function increaseStoreAllowance( address izlude, address store, uint256 addedAmount ) external { _approveStore(msg.sender, izlude, store, _storeAllowances[msg.sender][izlude][store] + addedAmount); } /** * @dev Atomically decreases the allowance granted to `store` by the caller. */ function decreaseStoreAllowance( address izlude, address store, uint256 subtractedAmount ) external { uint256 currentAllowance = _storeAllowances[msg.sender][izlude][store]; require(currentAllowance >= subtractedAmount, "decreased allowance below zero"); unchecked { _approveStore(msg.sender, izlude, store, currentAllowance - subtractedAmount); } } /** * @dev store pull user jellopy to keep */ function storeKeepJellopy( address _user, address izlude, uint256 amount ) external { require(amount > 0, "invalid amount"); UserInfo storage user = userInfo[izlude][_user]; user.jellopy -= amount; user.storedJellopy += amount; jellopyStorage[_user][izlude][msg.sender] += amount; uint256 currentAllowance = _storeAllowances[_user][izlude][msg.sender]; require(currentAllowance >= amount, "keep amount exceeds allowance"); unchecked { _approveStore(_user, izlude, msg.sender, currentAllowance - amount); } emit StoreKeepJellopy(_user, izlude, msg.sender, amount); } /** * @dev store return jellopy to user */ function storeReturnJellopy( address _user, address izlude, uint256 amount ) external { require(amount > 0, "invalid amount"); UserInfo storage user = userInfo[izlude][_user]; jellopyStorage[_user][izlude][msg.sender] -= amount; user.storedJellopy -= amount; user.jellopy += amount; emit StoreReturnJellopy(_user, izlude, msg.sender, amount); } function setKSWPerSecond(uint256 _kswPerSecond) external onlyOwner { massUpdatePools(); kswPerSecond = _kswPerSecond; emit SetKSWPerSecond(_kswPerSecond); } function _safeERC20TransferIn(IERC20 token, uint256 amount) private returns (uint256) { require(amount > 0, "zero amount"); uint256 balanceBefore = token.balanceOf(address(this)); token.safeTransferFrom(msg.sender, address(this), amount); uint256 balanceAfter = token.balanceOf(address(this)); return balanceAfter - balanceBefore; } receive() external payable { require(msg.sender == address(WETH), "reject"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2); } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } }
//SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IPronteraReserve { function balances() external view returns (uint256); function withdraw(address to, uint256 amount) external returns (uint256); }
//SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./IByalan.sol"; interface IIzludeV2 { function totalSupply() external view returns (uint256); function prontera() external view returns (address); function want() external view returns (IERC20); function deposit(address user, uint256 amount) external returns (uint256 jellopy); function withdraw(address user, uint256 jellopy) external returns (uint256); function balance() external view returns (uint256); function byalan() external view returns (IByalan); function feeKafra() external view returns (address); function allocKafra() external view returns (address); function calculateWithdrawFee(uint256 amount, address user) external view returns (uint256); }
//SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 wad) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
//SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./IByalanIsland.sol"; import "./ISailor.sol"; interface IByalan is IByalanIsland, ISailor { function want() external view returns (address); function beforeDeposit() external; function deposit() external; function withdraw(uint256) external; function balanceOf() external view returns (uint256); function balanceOfWant() external view returns (uint256); function balanceOfPool() external view returns (uint256); function balanceOfMasterChef() external view returns (uint256); function pendingRewardTokens() external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts); function harvest() external; function retireStrategy() external; function panic() external; function pause() external; function unpause() external; function paused() external view returns (bool); }
//SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IByalanIsland { function izlude() external view returns (address); }
//SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface ISailor { function MAX_FEE() external view returns (uint256); function totalFee() external view returns (uint256); function callFee() external view returns (uint256); function kswFee() external view returns (uint256); }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
[{"inputs":[{"internalType":"contract IPronteraReserve","name":"_reserve","type":"address"},{"internalType":"address","name":"_ksw","type":"address"},{"internalType":"uint256","name":"_kswPerSecond","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withUpdate","type":"bool"}],"name":"AddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositFor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":"uint256","name":"kswPerSecond","type":"uint256"}],"name":"SetKSWPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withUpdate","type":"bool"}],"name":"SetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"StoreApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":true,"internalType":"address","name":"store","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"StoreKeepJellopy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":true,"internalType":"address","name":"store","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StoreReturnJellopy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":true,"internalType":"address","name":"store","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StoreWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint64","name":"allocPoint","type":"uint64"},{"internalType":"bool","name":"withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"address","name":"store","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"address","name":"store","type":"address"},{"internalType":"uint256","name":"subtractedAmount","type":"uint256"}],"name":"decreaseStoreAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"izludes","type":"address[]"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"address","name":"store","type":"address"},{"internalType":"uint256","name":"addedAmount","type":"uint256"}],"name":"increaseStoreAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isInTraversalPools","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"jellopyStorage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ksw","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kswPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingKSW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"want","type":"address"},{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"accKSWPerJellopy","type":"uint256"},{"internalType":"uint64","name":"allocPoint","type":"uint64"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeTraversal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","outputs":[{"internalType":"contract IPronteraReserve","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint64","name":"allocPoint","type":"uint64"},{"internalType":"bool","name":"withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_kswPerSecond","type":"uint256"}],"name":"setKSWPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"izlude","type":"address"},{"internalType":"address","name":"store","type":"address"}],"name":"storeAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"storeKeepJellopy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"storeReturnJellopy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"jellopyAmount","type":"uint256"}],"name":"storeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"traversalPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"traversalPoolsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"jellopy","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"storedJellopy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"jellopyAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620040fe380380620040fe8339810160408190526200003491620000c7565b6200003f336200005e565b600180556001600160a01b039283166080526002551660a0526200010f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000c457600080fd5b50565b600080600060608486031215620000dd57600080fd5b8351620000ea81620000ae565b6020850151909350620000fd81620000ae565b80925050604084015190509250925092565b60805160a051613fad620001516000396000818161041e01528181612ef701526133cc0152600081816107150152818161165501526118ea0152613fad6000f3fe60806040526004361061021d5760003560e01c80638b3d04921161011d578063d82505d2116100b0578063f0f386c61161007f578063f2fde38b11610064578063f2fde38b146107ed578063f3fef3a31461080d578063f6bd31d91461082d57600080fd5b8063f0f386c6146107ad578063f2a8062a146107cd57600080fd5b8063d82505d214610737578063d84f094214610757578063dc82847b14610777578063ecfb49a31461079757600080fd5b8063ad5c4648116100ec578063ad5c46481461069b578063b3db428b146106c3578063c89d3460146106e3578063cd3293de1461070357600080fd5b80638b3d04921461056d5780638da5cb5b1461058d5780639a7b5f11146105b8578063a437ecd51461067b57600080fd5b80634cb92bff116101b05780636ff1c9bc1161017f578063740cbf2a11610164578063740cbf2a146104ef5780637b46c54f1461052d5780637f8eeae91461054d57600080fd5b80636ff1c9bc146104ba578063715018a6146104da57600080fd5b80634cb92bff146103ec578063615e59781461040c578063630b5ba11461046557806366d054fd1461047a57600080fd5b80632dc9852f116101ec5780632dc9852f146103765780633a01f4eb1461039657806343425e3d146103b657806347e7ef24146103cc57600080fd5b80630d29317b146102ab5780630f208beb146102cb57806317caf6f1146103325780632590dc041461035657600080fd5b366102a65733731376c97c5c512d2d6f9173a9a3a016b6140b4536146102a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f72656a656374000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b3480156102b757600080fd5b506102a46102c6366004613b05565b610842565b3480156102d757600080fd5b506103126102e6366004613b40565b600860209081526000928352604080842090915290825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b34801561033e57600080fd5b5061034860075481565b604051908152602001610329565b34801561036257600080fd5b506102a4610371366004613b79565b610906565b34801561038257600080fd5b506102a4610391366004613b79565b610b61565b3480156103a257600080fd5b506102a46103b1366004613b79565b610c1c565b3480156103c257600080fd5b5061034860025481565b3480156103d857600080fd5b506102a46103e7366004613bba565b610c77565b3480156103f857600080fd5b506102a4610407366004613bf4565b610e1b565b34801561041857600080fd5b506104407f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610329565b34801561047157600080fd5b506102a4611093565b34801561048657600080fd5b506104aa610495366004613c4c565b60046020526000908152604090205460ff1681565b6040519015158152602001610329565b3480156104c657600080fd5b506102a46104d5366004613c4c565b6110f2565b3480156104e657600080fd5b506102a46113d5565b3480156104fb57600080fd5b5061034861050a366004613c69565b600a60209081526000938452604080852082529284528284209052825290205481565b34801561053957600080fd5b506102a4610548366004613c4c565b611462565b34801561055957600080fd5b50610440610568366004613b05565b611750565b34801561057957600080fd5b50610348610588366004613b40565b611787565b34801561059957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610440565b3480156105c457600080fd5b5061062e6105d3366004613c4c565b600560205260009081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff92831693919092169167ffffffffffffffff808216916801000000000000000090041685565b6040805173ffffffffffffffffffffffffffffffffffffffff96871681529590941660208601529284019190915267ffffffffffffffff908116606084015216608082015260a001610329565b34801561068757600080fd5b506102a4610696366004613b79565b611a0b565b3480156106a757600080fd5b50610440731376c97c5c512d2d6f9173a9a3a016b6140b453681565b3480156106cf57600080fd5b506102a46106de366004613b79565b611c5e565b3480156106ef57600080fd5b506102a46106fe366004613ca9565b611e1d565b34801561070f57600080fd5b506104407f000000000000000000000000000000000000000000000000000000000000000081565b34801561074357600080fd5b506102a4610752366004613b79565b611ee8565b34801561076357600080fd5b506102a4610772366004613bf4565b612041565b34801561078357600080fd5b506102a4610792366004613b79565b61258f565b3480156107a357600080fd5b5061034860065481565b3480156107b957600080fd5b506103486107c8366004613c69565b61259b565b3480156107d957600080fd5b506102a46107e8366004613b05565b6125e0565b3480156107f957600080fd5b506102a4610808366004613c4c565b6127f7565b34801561081957600080fd5b506102a4610828366004613bba565b612924565b34801561083957600080fd5b50600354610348565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029b565b6108cb611093565b60028190556040518181527f2d26e84aa9424250adedd22d6aa9ebcc526d6444f5c40a1388f09466dfb006b79060200160405180910390a150565b60008111610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260086020908152604080832093871683529290529081208054909183918391906109b8908490613d4d565b92505081905550818160020160008282546109d39190613d64565b909155505073ffffffffffffffffffffffffffffffffffffffff8085166000908152600a60209081526040808320938716835292815282822033835290529081208054849290610a24908490613d64565b909155505073ffffffffffffffffffffffffffffffffffffffff808516600090815260096020908152604080832093871683529281528282203383529052205482811015610ace576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6b65657020616d6f756e74206578636565647320616c6c6f77616e6365000000604482015260640161029b565b610adc858533868503612a44565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fda4875f3744489c34925a09aafabdba3e1950e6f925c8435c36f5887facddf6686604051610b5291815260200190565b60405180910390a45050505050565b33600090815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff8781168552908352818420908616845290915290205481811015610c08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000604482015260640161029b565b610c16338585858503612a44565b50505050565b33600081815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff80891685529083528184209087168452909152902054610c72919085908590610c6d908690613d64565b612a44565b505050565b60026001541415610ce4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161029b565b600260015573ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604090208115610d9f5780548290610d389073ffffffffffffffffffffffffffffffffffffffff1682612c2f565b14610d9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f21616d6f756e7400000000000000000000000000000000000000000000000000604482015260640161029b565b8054610dc5903390859073ffffffffffffffffffffffffffffffffffffffff1685612e13565b60405182815273ffffffffffffffffffffffffffffffffffffffff84169033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350506001805550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff8316610f19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c696420697a6c756465000000000000000000000000000000000000604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600560205260409020600181015490921614610fae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f21666f756e640000000000000000000000000000000000000000000000000000604482015260640161029b565b8115610fbc57610fbc611093565b600381015460075467ffffffffffffffff80861692610fdd92911690613d4d565b610fe79190613d64565b6007556003810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091551561103157611031846130a4565b6040805167ffffffffffffffff85168152831515602082015273ffffffffffffffffffffffffffffffffffffffff8616917f2da23d71725b2996ab9c22a7b9538d102f672281f7fa3cfbd63648b21faf5ecf910160405180910390a250505050565b60005b6003548110156110ef576110dd600382815481106110b6576110b6613d7c565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16611462565b806110e781613dab565b915050611096565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602090815260408083206008835281842033855290925282208054928155600280830154908201549293919264e8d4a510009161114c91613de4565b6111569190613e21565b600183015580156113825782546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169060009082906370a082319060240160206040518083038186803b1580156111ce57600080fd5b505afa1580156111e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112069190613e5c565b6040517ff3fef3a30000000000000000000000000000000000000000000000000000000081523360048201526024810185905290915073ffffffffffffffffffffffffffffffffffffffff87169063f3fef3a390604401602060405180830381600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112af9190613e5c565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b15801561131857600080fd5b505afa15801561132c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113509190613e5c565b905061137e336113608484613d4d565b73ffffffffffffffffffffffffffffffffffffffff8616919061317e565b5050505b60405181815273ffffffffffffffffffffffffffffffffffffffff85169033907ff24ef89f38eadc1bde50701ad6e4d6d11a2dc24f7cf834a486991f38833285049060200160405180910390a350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029b565b6114606000613252565b565b73ffffffffffffffffffffffffffffffffffffffff80821660008181526005602052604090206001810154909216146114f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015260640161029b565b600381015468010000000000000000900467ffffffffffffffff1642111561174c5760008273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561156157600080fd5b505afa158015611575573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115999190613e5c565b905080156117095760038201546000906115c99068010000000000000000900467ffffffffffffffff1642613d4d565b600754600385015460025492935060009267ffffffffffffffff909116906115f19085613de4565b6115fb9190613de4565b6116059190613e21565b6040517ff3fef3a30000000000000000000000000000000000000000000000000000000081523060048201526024810182905290915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401602060405180830381600087803b15801561169957600080fd5b505af11580156116ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d19190613e5c565b9050836116e38264e8d4a51000613de4565b6116ed9190613e21565b8560020160008282546117009190613d64565b90915550505050505b506003810180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff16021790555b5050565b6003818154811061176057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b73ffffffffffffffffffffffffffffffffffffffff8083166000818152600560209081526040808320600883528184209587168452948252808320600286015482517f18160ddd00000000000000000000000000000000000000000000000000000000815292519496959194909387936318160ddd9260048083019392829003018186803b15801561181857600080fd5b505afa15801561182c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118509190613e5c565b600385015490915068010000000000000000900467ffffffffffffffff164211801561187b57508015155b156119bc5760038401546000906118a89068010000000000000000900467ffffffffffffffff1642613d4d565b600754600387015460025492935060009267ffffffffffffffff909116906118d09085613de4565b6118da9190613de4565b6118e49190613e21565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637bb98a686040518163ffffffff1660e01b815260040160206040518083038186803b15801561194e57600080fd5b505afa158015611962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119869190613e5c565b90508361199383836132c7565b6119a29064e8d4a51000613de4565b6119ac9190613e21565b6119b69086613d64565b94505050505b600283015483546000916119cf91613d64565b90506000846001015464e8d4a5100085846119ea9190613de4565b6119f49190613e21565b6119fe9190613d4d565b9998505050505050505050565b60026001541415611a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161029b565b600260015580611ae4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff8083166000818152600560209081526040808320600883528184209589168452948252808320600a835281842094845293825280832033845290915281208054859290611b47908490613d4d565b9250508190555082816002016000828254611b629190613d4d565b9091555050805483908290600090611b7b908490613d64565b90915550508154600090611ba9908790879073ffffffffffffffffffffffffffffffffffffffff16876132dd565b90508015611bd4578254611bd49073ffffffffffffffffffffffffffffffffffffffff16338361317e565b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7383e4661f108f7cab2df2742893cd78cb1eda1ca7f691b00fab994c4387c22a84604051611c4a91815260200190565b60405180910390a450506001805550505050565b60026001541415611ccb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161029b565b600260015573ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604090208115611d865780548290611d1f9073ffffffffffffffffffffffffffffffffffffffff1682612c2f565b14611d86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f21616d6f756e7400000000000000000000000000000000000000000000000000604482015260640161029b565b8054611dac908590859073ffffffffffffffffffffffffffffffffffffffff1685612e13565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f6b64443f4cc3aac2df66fff76675a29dc321ce9efebffb006f528db1690179a084604051611e0b91815260200190565b60405180910390a35050600180555050565b60026001541415611e8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161029b565b600260015560005b81811015611edf57611ecd33848484818110611eb057611eb0613d7c565b9050602002016020810190611ec59190613c4c565b600080612e13565b80611ed781613dab565b915050611e92565b50506001805550565b60008111611f52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff80831660008181526008602090815260408083209488168352938152838220600a82528483209383529281528382203383529052918220805491928492611faf908490613d4d565b9250508190555081816002016000828254611fca9190613d4d565b9091555050805482908290600090611fe3908490613d64565b9091555050604051828152339073ffffffffffffffffffffffffffffffffffffffff85811691908716907f0ddc297cc4f799785fa716d1672ce1a384e27eb367a633618f88510164866888906020015b60405180910390a450505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029b565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16638fbe554d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561211f57600080fd5b505afa158015612133573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121579190613e75565b73ffffffffffffffffffffffffffffffffffffffff16146121d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600160248201527f3f00000000000000000000000000000000000000000000000000000000000000604482015260640161029b565b60008373ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561221c57600080fd5b505afa158015612230573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122549190613e5c565b10156122bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f3f3f000000000000000000000000000000000000000000000000000000000000604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260056020526040902060010154161561234e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6475706c69636174656400000000000000000000000000000000000000000000604482015260640161029b565b801561235c5761235c611093565b6040518060a001604052808473ffffffffffffffffffffffffffffffffffffffff16631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b1580156123ad57600080fd5b505afa1580156123c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e59190613e75565b73ffffffffffffffffffffffffffffffffffffffff908116825285811660208084018290526000604080860182905267ffffffffffffffff808a1660608089019190915242821660809889015294835260058452818320885181549088167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216178255948901516001808301805492909916919096161790965590870151600286015592860151600390940180549690950151831668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090961693909216929092179390931790915560068054919290916124ed908490613d64565b925050819055508167ffffffffffffffff16600760008282546125109190613d64565b909155505067ffffffffffffffff82161561252e5761252e836130a4565b6040805167ffffffffffffffff84168152821515602082015273ffffffffffffffffffffffffffffffffffffffff8516917f8751832cde8683b4204d3dc2d6f8d920627750abb2cd9e13592cf75f389abd1e910160405180910390a2505050565b610c7233848484612a44565b73ffffffffffffffffffffffffffffffffffffffff808416600090815260096020908152604080832086851684528252808320938516835292905220545b9392505050565b6000600382815481106125f5576125f5613d7c565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600590915260409091206003015490915067ffffffffffffffff161561269e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f616c6c6f63617465640000000000000000000000000000000000000000000000604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600380546126f990600190613d4d565b8154811061270957612709613d7c565b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918490811061274257612742613d7c565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600380548061279b5761279b613e92565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff811661291b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161029b565b6110ef81613252565b60026001541415612991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161029b565b600260015573ffffffffffffffffffffffffffffffffffffffff8083166000908152600560205260408120805490926129cf913391879116866132dd565b905080156129fa5781546129fa9073ffffffffffffffffffffffffffffffffffffffff16338361317e565b60405183815273ffffffffffffffffffffffffffffffffffffffff85169033907f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb90602001611e0b565b73ffffffffffffffffffffffffffffffffffffffff8416612ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f617070726f76652066726f6d20746865207a65726f2061646472657373000000604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff8316612b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f617070726f766520697a6c756465207a65726f20616464726573730000000000604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff8216612bbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f617070726f766520746f20746865207a65726f20616464726573730000000000604482015260640161029b565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260096020908152604080832088861680855290835281842095881680855295835292819020869055518581529192917f46058f119776d3adccdcefd4764fdb0736c1fdd75cbd4528da85221f8723e8179101612033565b6000808211612c9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7a65726f20616d6f756e74000000000000000000000000000000000000000000604482015260640161029b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b158015612d0257600080fd5b505afa158015612d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3a9190613e5c565b9050612d5e73ffffffffffffffffffffffffffffffffffffffff85163330866136a4565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b158015612dc657600080fd5b505afa158015612dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dfe9190613e5c565b9050612e0a8282613d4d565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600560209081526040808320600883528184209489168452939091529020612e5785611462565b60028101548154600091612e6a91613d64565b90508015612f77576000826001015464e8d4a51000856002015484612e8f9190613de4565b612e999190613e21565b612ea39190613d4d565b90508015612f75576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b158015612f3b57600080fd5b505af1158015612f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f739190613ec1565b505b505b831561307357612f9e73ffffffffffffffffffffffffffffffffffffffff86168786613702565b6040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015260248201869052600091908816906347e7ef2490604401602060405180830381600087803b15801561301257600080fd5b505af1158015613026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061304a9190613e5c565b90506130568183613d64565b91508083600001600082825461306c9190613d64565b9091555050505b64e8d4a510008360020154826130899190613de4565b6130939190613e21565b826001018190555050505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff16156130d55750565b73ffffffffffffffffffffffffffffffffffffffff16600081815260046020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556003805491820181559091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c729084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261380f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008183106132d657816125d9565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600560209081526040808320600883528184209489168452939091528120805491929161332790856132c7565b935061333286611462565b6002810154815460009161334591613d64565b90506000826001015464e8d4a510008560020154846133649190613de4565b61336e9190613e21565b6133789190613d4d565b9050801561344a576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561341057600080fd5b505af1158015613424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134489190613ec1565b505b6134548683613d4d565b91508583600001600082825461346a9190613d4d565b9091555050600284015464e8d4a51000906134859084613de4565b61348f9190613e21565b60018401558515613698576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8916906370a082319060240160206040518083038186803b15801561350257600080fd5b505afa158015613516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353a9190613e5c565b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018a9052919250908a169063f3fef3a390604401602060405180830381600087803b1580156135ae57600080fd5b505af11580156135c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e69190613e5c565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8a16906370a082319060240160206040518083038186803b15801561364f57600080fd5b505afa158015613663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136879190613e5c565b90506136938282613d4d565b965050505b50505050949350505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610c169085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131d0565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b15801561377457600080fd5b505afa158015613788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ac9190613e5c565b6137b69190613d64565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260448101829052909150610c169085907f095ea7b300000000000000000000000000000000000000000000000000000000906064016131d0565b6000613871826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661391b9092919063ffffffff16565b805190915015610c72578080602001905181019061388f9190613ec1565b610c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161029b565b606061392a8484600085613932565b949350505050565b6060824710156139c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161029b565b843b613a2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161029b565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613a559190613f0a565b60006040518083038185875af1925050503d8060008114613a92576040519150601f19603f3d011682016040523d82523d6000602084013e613a97565b606091505b5091509150613aa7828286613ab2565b979650505050505050565b60608315613ac15750816125d9565b825115613ad15782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029b9190613f26565b600060208284031215613b1757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146110ef57600080fd5b60008060408385031215613b5357600080fd5b8235613b5e81613b1e565b91506020830135613b6e81613b1e565b809150509250929050565b600080600060608486031215613b8e57600080fd5b8335613b9981613b1e565b92506020840135613ba981613b1e565b929592945050506040919091013590565b60008060408385031215613bcd57600080fd5b8235613bd881613b1e565b946020939093013593505050565b80151581146110ef57600080fd5b600080600060608486031215613c0957600080fd5b8335613c1481613b1e565b9250602084013567ffffffffffffffff81168114613c3157600080fd5b91506040840135613c4181613be6565b809150509250925092565b600060208284031215613c5e57600080fd5b81356125d981613b1e565b600080600060608486031215613c7e57600080fd5b8335613c8981613b1e565b92506020840135613c9981613b1e565b91506040840135613c4181613b1e565b60008060208385031215613cbc57600080fd5b823567ffffffffffffffff80821115613cd457600080fd5b818501915085601f830112613ce857600080fd5b813581811115613cf757600080fd5b8660208260051b8501011115613d0c57600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613d5f57613d5f613d1e565b500390565b60008219821115613d7757613d77613d1e565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ddd57613ddd613d1e565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e1c57613e1c613d1e565b500290565b600082613e57577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215613e6e57600080fd5b5051919050565b600060208284031215613e8757600080fd5b81516125d981613b1e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060208284031215613ed357600080fd5b81516125d981613be6565b60005b83811015613ef9578181015183820152602001613ee1565b83811115610c165750506000910152565b60008251613f1c818460208701613ede565b9190910192915050565b6020815260008251806020840152613f45816040850160208701613ede565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea264697066735822122085fd42bd233bc5e0f76ba102c55da55daa571a320ded8e1178920a9345f2653664736f6c63430008090033000000000000000000000000c6725c4e8b9b97aa8fed83347e3af7c24450803a00000000000000000000000034fa09534e411dee1967df183ddbd4f65c65fb460000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c6725c4e8b9b97aa8fed83347e3af7c24450803a00000000000000000000000034fa09534e411dee1967df183ddbd4f65c65fb460000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _reserve (address): 0xc6725c4e8b9b97aa8fed83347e3af7c24450803a
Arg [1] : _ksw (address): 0x34fa09534e411dee1967df183ddbd4f65c65fb46
Arg [2] : _kswPerSecond (uint256): 0
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c6725c4e8b9b97aa8fed83347e3af7c24450803a
Arg [1] : 00000000000000000000000034fa09534e411dee1967df183ddbd4f65c65fb46
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.