Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,051 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Reward | 22318230 | 3 hrs ago | IN | 0 ETH | 0.00051866 | ||||
Unstake | 22303491 | 2 days ago | IN | 0 ETH | 0.00005687 | ||||
Unstake | 22296238 | 3 days ago | IN | 0 ETH | 0.00014402 | ||||
Stake | 22283929 | 4 days ago | IN | 0 ETH | 0.00018068 | ||||
Stake | 22274072 | 6 days ago | IN | 0 ETH | 0.00010518 | ||||
Stake | 22258185 | 8 days ago | IN | 0 ETH | 0.00019017 | ||||
Unstake | 22245963 | 10 days ago | IN | 0 ETH | 0.00023089 | ||||
Stake | 22238675 | 11 days ago | IN | 0 ETH | 0.00069726 | ||||
Claim Reward | 22225070 | 13 days ago | IN | 0 ETH | 0.00016942 | ||||
Stake | 22189432 | 18 days ago | IN | 0 ETH | 0.00036467 | ||||
Unstake | 22187189 | 18 days ago | IN | 0 ETH | 0.00017769 | ||||
Unstake | 22131489 | 26 days ago | IN | 0 ETH | 0.00025981 | ||||
Claim Reward | 22124322 | 27 days ago | IN | 0 ETH | 0.00011176 | ||||
Unstake | 22121814 | 27 days ago | IN | 0 ETH | 0.0001356 | ||||
Stake | 22116671 | 28 days ago | IN | 0 ETH | 0.00025441 | ||||
Unstake | 22108800 | 29 days ago | IN | 0 ETH | 0.00012165 | ||||
Stake | 22105154 | 29 days ago | IN | 0 ETH | 0.0002894 | ||||
Claim Reward | 22087371 | 32 days ago | IN | 0 ETH | 0.00024013 | ||||
Stake | 22075727 | 33 days ago | IN | 0 ETH | 0.00017362 | ||||
Claim Reward | 22067278 | 35 days ago | IN | 0 ETH | 0.00004067 | ||||
Unstake | 22053281 | 37 days ago | IN | 0 ETH | 0.0002088 | ||||
Unstake | 22045755 | 38 days ago | IN | 0 ETH | 0.00018021 | ||||
Stake | 22043809 | 38 days ago | IN | 0 ETH | 0.00021168 | ||||
Stake | 22018865 | 41 days ago | IN | 0 ETH | 0.00081298 | ||||
Claim Reward | 22018860 | 41 days ago | IN | 0 ETH | 0.00151071 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Swap Exact ETH F... | 22318230 | 3 hrs ago | 0.00000369 ETH | ||||
Transfer | 22225070 | 13 days ago | 0 ETH | ||||
Transfer | 22124322 | 27 days ago | 0 ETH | ||||
Swap Exact ETH F... | 22087371 | 32 days ago | 0.0000001 ETH | ||||
Transfer | 22067278 | 35 days ago | 0.00000002 ETH | ||||
Swap Exact ETH F... | 22018860 | 41 days ago | 0 ETH | ||||
Transfer | 21971066 | 48 days ago | 0.00096432 ETH | ||||
Transfer | 21940672 | 52 days ago | 0 ETH | ||||
Swap Exact ETH F... | 21863285 | 63 days ago | 0.00000004 ETH | ||||
Swap Exact ETH F... | 21845689 | 66 days ago | 0.02935319 ETH | ||||
Swap Exact ETH F... | 21830348 | 68 days ago | 0.00000139 ETH | ||||
Transfer | 21770034 | 76 days ago | 0.00249537 ETH | ||||
Transfer | 21755550 | 78 days ago | 0.02600871 ETH | ||||
Transfer | 21722559 | 83 days ago | 0.00003975 ETH | ||||
Transfer | 21612351 | 98 days ago | 0.00082824 ETH | ||||
Transfer | 21609345 | 99 days ago | 0.00000006 ETH | ||||
Swap Exact ETH F... | 21594212 | 101 days ago | 0.0007329 ETH | ||||
Transfer | 21571960 | 104 days ago | 0.0003478 ETH | ||||
Transfer | 21548592 | 107 days ago | 0.00000842 ETH | ||||
Swap Exact ETH F... | 21540906 | 108 days ago | 0.01344167 ETH | ||||
Transfer | 21537879 | 109 days ago | 0.00033857 ETH | ||||
Transfer | 21488168 | 116 days ago | 0.00010831 ETH | ||||
Transfer | 21475873 | 117 days ago | 0.03464397 ETH | ||||
Transfer | 21465327 | 119 days ago | 0.00392877 ETH | ||||
Transfer | 21458421 | 120 days ago | 0.00040476 ETH |
Loading...
Loading
Contract Name:
StakingPool
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import '@openzeppelin/contracts/utils/Context.sol'; import '@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol'; import './interfaces/IPoolExtension.sol'; contract StakingPool is Context, Ownable, ReentrancyGuard { using SafeERC20 for IERC20; IUniswapV2Router02 immutable _router; uint256 constant MULTIPLIER = 10 ** 36; address public token; uint256 public lockupPeriod; uint256 public totalStakedUsers; uint256 public totalSharesDeposited; IPoolExtension public extension; struct Share { uint256 amount; uint256 stakedTime; } struct Reward { uint256 excluded; uint256 realised; } mapping(address => Share) public shares; mapping(address => Reward) public rewards; uint256 public rewardsPerShare; uint256 public totalDistributed; uint256 public totalRewards; event Stake(address indexed user, uint256 amount); event Unstake(address indexed user, uint256 amount); event ClaimReward(address user); event DepositRewards(address indexed user, uint256 amountTokens); event DistributeReward( address indexed user, uint256 amount, bool _wasCompounded ); constructor(address _token, uint256 _lockupPeriod, address __router) { token = _token; lockupPeriod = _lockupPeriod; _router = IUniswapV2Router02(__router); } function stake(uint256 _amount) external nonReentrant { IERC20(token).safeTransferFrom(_msgSender(), address(this), _amount); _setShare(_msgSender(), _amount, false); } function stakeForWallets( address[] memory _wallets, uint256[] memory _amounts ) external nonReentrant { require(_wallets.length == _amounts.length, 'INSYNC'); uint256 _totalAmount; for (uint256 _i; _i < _wallets.length; _i++) { _totalAmount += _amounts[_i]; _setShare(_wallets[_i], _amounts[_i], false); } IERC20(token).safeTransferFrom(_msgSender(), address(this), _totalAmount); } function unstake(uint256 _amount) external nonReentrant { IERC20(token).safeTransfer(_msgSender(), _amount); _setShare(_msgSender(), _amount, true); } function _setShare( address wallet, uint256 balanceUpdate, bool isRemoving ) internal { if (address(extension) != address(0)) { try extension.setShare(wallet, balanceUpdate, isRemoving) {} catch {} } if (isRemoving) { _removeShares(wallet, balanceUpdate); emit Unstake(wallet, balanceUpdate); } else { _addShares(wallet, balanceUpdate); emit Stake(wallet, balanceUpdate); } } function _addShares(address wallet, uint256 amount) private { if (shares[wallet].amount > 0) { _distributeReward(wallet, false, 0); } uint256 sharesBefore = shares[wallet].amount; totalSharesDeposited += amount; shares[wallet].amount += amount; shares[wallet].stakedTime = block.timestamp; if (sharesBefore == 0 && shares[wallet].amount > 0) { totalStakedUsers++; } rewards[wallet].excluded = _cumulativeRewards(shares[wallet].amount); } function _removeShares(address wallet, uint256 amount) private { require( shares[wallet].amount > 0 && amount <= shares[wallet].amount, 'REM: amount' ); require( block.timestamp > shares[wallet].stakedTime + lockupPeriod, 'REM: timelock' ); uint256 _unclaimed = getUnpaid(wallet); bool _otherStakersPresent = totalSharesDeposited - amount > 0; if (!_otherStakersPresent) { _distributeReward(wallet, false, 0); } totalSharesDeposited -= amount; shares[wallet].amount -= amount; if (shares[wallet].amount == 0) { totalStakedUsers--; } rewards[wallet].excluded = _cumulativeRewards(shares[wallet].amount); // if there are other stakers and unclaimed rewards, // deposit them back into the pool for other stakers to claim if (_otherStakersPresent && _unclaimed > 0) { _depositRewards(wallet, _unclaimed); } } function depositRewards() external payable { _depositRewards(_msgSender(), msg.value); } function _depositRewards(address _wallet, uint256 _amountETH) internal { require(_amountETH > 0, 'ETH'); require(totalSharesDeposited > 0, 'SHARES'); totalRewards += _amountETH; rewardsPerShare += (MULTIPLIER * _amountETH) / totalSharesDeposited; emit DepositRewards(_wallet, _amountETH); } function _distributeReward( address _wallet, bool _compound, uint256 _compoundMinTokensToReceive ) internal { if (shares[_wallet].amount == 0) { return; } shares[_wallet].stakedTime = block.timestamp; // reset every claim uint256 _amountWei = getUnpaid(_wallet); rewards[_wallet].realised += _amountWei; rewards[_wallet].excluded = _cumulativeRewards(shares[_wallet].amount); if (_amountWei > 0) { totalDistributed += _amountWei; if (_compound) { _compoundRewards(_wallet, _amountWei, _compoundMinTokensToReceive); } else { uint256 _balBefore = address(this).balance; (bool success, ) = payable(_wallet).call{ value: _amountWei }(''); require(success, 'DIST0'); require(address(this).balance >= _balBefore - _amountWei, 'DIST1'); } emit DistributeReward(_wallet, _amountWei, _compound); } } function _compoundRewards( address _wallet, uint256 _wei, uint256 _minTokensToReceive ) internal { address[] memory path = new address[](2); path[0] = _router.WETH(); path[1] = token; IERC20 _token = IERC20(token); uint256 _tokenBalBefore = _token.balanceOf(address(this)); _router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: _wei }( _minTokensToReceive, path, address(this), block.timestamp ); uint256 _compoundAmount = _token.balanceOf(address(this)) - _tokenBalBefore; _setShare(_wallet, _compoundAmount, false); } function claimReward( bool _compound, uint256 _compMinTokensToReceive ) external nonReentrant { _distributeReward(_msgSender(), _compound, _compMinTokensToReceive); emit ClaimReward(_msgSender()); } function claimRewardAdmin( address _wallet, bool _compound, uint256 _compMinTokensToReceive ) external nonReentrant onlyOwner { _distributeReward(_wallet, _compound, _compMinTokensToReceive); emit ClaimReward(_wallet); } function getUnpaid(address wallet) public view returns (uint256) { if (shares[wallet].amount == 0) { return 0; } uint256 earnedRewards = _cumulativeRewards(shares[wallet].amount); uint256 rewardsExcluded = rewards[wallet].excluded; if (earnedRewards <= rewardsExcluded) { return 0; } return earnedRewards - rewardsExcluded; } function _cumulativeRewards(uint256 share) internal view returns (uint256) { return (share * rewardsPerShare) / MULTIPLIER; } function setPoolExtension(IPoolExtension _extension) external onlyOwner { extension = _extension; } function setLockupPeriod(uint256 _seconds) external onlyOwner { require(_seconds < 365 days, 'lte 1 year'); lockupPeriod = _seconds; } function withdrawTokens(uint256 _amount) external onlyOwner { IERC20 _token = IERC20(token); _token.safeTransfer( _msgSender(), _amount == 0 ? _token.balanceOf(address(this)) : _amount ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.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; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ 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)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// 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; } }
pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
pragma solidity >=0.6.2; import './IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; interface IPoolExtension { function setShare( address wallet, uint256 balanceChange, bool isRemoving ) external; }
{ "metadata": { "bytecodeHash": "none" }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_lockupPeriod","type":"uint256"},{"internalType":"address","name":"__router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"ClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"DepositRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_wasCompounded","type":"bool"}],"name":"DistributeReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstake","type":"event"},{"inputs":[{"internalType":"bool","name":"_compound","type":"bool"},{"internalType":"uint256","name":"_compMinTokensToReceive","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_compound","type":"bool"},{"internalType":"uint256","name":"_compMinTokensToReceive","type":"uint256"}],"name":"claimRewardAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositRewards","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"contract IPoolExtension","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getUnpaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockupPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"excluded","type":"uint256"},{"internalType":"uint256","name":"realised","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"setLockupPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPoolExtension","name":"_extension","type":"address"}],"name":"setPoolExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stakedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"stakeForWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSharesDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedUsers","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":"_amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801562000010575f80fd5b5060405162001aca38038062001aca8339810160408190526200003391620000d9565b6200003e336200006e565b60018055600280546001600160a01b0319166001600160a01b039485161790556003919091551660805262000117565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000d4575f80fd5b919050565b5f805f60608486031215620000ec575f80fd5b620000f784620000bd565b9250602084015191506200010e60408501620000bd565b90509250925092565b608051611993620001375f395f81816111fd015261133d01526119935ff3fe60806040526004361061013c575f3560e01c806389d96917116100b3578063c7e1d0b11161006d578063c7e1d0b114610361578063ce7c2ac214610376578063ee947a7c146103a8578063efca2eed146103bd578063f2fde38b146103d2578063fc0c546a146103f1575f80fd5b806389d96917146102aa5780638da5cb5b146102c957806395319435146102e5578063a694fc3a14610304578063b2a7e22414610323578063c771c39014610342575f80fd5b8063315a095d11610104578063315a095d1461020f5780633c6e67891461022e57806341aef16214610243578063472f13f314610262578063715018a61461028157806380bb405514610295575f80fd5b80630700037d146101405780630e15561a1461018c578063152111f7146101af5780632d5537b0146101b95780632e17de78146101f0575b5f80fd5b34801561014b575f80fd5b5061017261015a366004611577565b60086020525f90815260409020805460019091015482565b604080519283526020830191909152015b60405180910390f35b348015610197575f80fd5b506101a1600b5481565b604051908152602001610183565b6101b7610410565b005b3480156101c4575f80fd5b506006546101d8906001600160a01b031681565b6040516001600160a01b039091168152602001610183565b3480156101fb575f80fd5b506101b761020a366004611599565b61041c565b34801561021a575f80fd5b506101b7610229366004611599565b610453565b348015610239575f80fd5b506101a160055481565b34801561024e575f80fd5b506101b761025d3660046115bd565b6104f2565b34801561026d575f80fd5b506101b761027c3660046115fb565b610557565b34801561028c575f80fd5b506101b76105a6565b3480156102a0575f80fd5b506101a160045481565b3480156102b5575f80fd5b506101a16102c4366004611577565b6105b7565b3480156102d4575f80fd5b505f546001600160a01b03166101d8565b3480156102f0575f80fd5b506101b76102ff3660046116f5565b61063a565b34801561030f575f80fd5b506101b761031e366004611599565b610727565b34801561032e575f80fd5b506101b761033d366004611577565b610743565b34801561034d575f80fd5b506101b761035c366004611599565b61076d565b34801561036c575f80fd5b506101a160095481565b348015610381575f80fd5b50610172610390366004611577565b60076020525f90815260409020805460019091015482565b3480156103b3575f80fd5b506101a160035481565b3480156103c8575f80fd5b506101a1600a5481565b3480156103dd575f80fd5b506101b76103ec366004611577565b6107ba565b3480156103fc575f80fd5b506002546101d8906001600160a01b031681565b61041a3334610830565b565b610424610932565b61043b336002546001600160a01b0316908361098b565b610447338260016109ee565b61045060018055565b50565b61045b610b02565b6002546001600160a01b03166104ee33831561047757836104dd565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156104b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104dd91906117b1565b6001600160a01b038416919061098b565b5050565b6104fa610932565b610502610b02565b61050d838383610b5b565b6040516001600160a01b03841681527f63e32091e4445d16e29c33a6b264577c2d86694021aa4e6f4dd590048f5792e89060200160405180910390a161055260018055565b505050565b61055f610932565b61056a338383610b5b565b6040805133815290517f63e32091e4445d16e29c33a6b264577c2d86694021aa4e6f4dd590048f5792e89181900360200190a16104ee60018055565b6105ae610b02565b61041a5f610d5c565b6001600160a01b0381165f9081526007602052604081205481036105dc57505f919050565b6001600160a01b0382165f908152600760205260408120546105fd90610dab565b6001600160a01b0384165f9081526008602052604090205490915080821161062857505f9392505050565b61063281836117dc565b949350505050565b610642610932565b80518251146106815760405162461bcd60e51b8152602060048201526006602482015265494e53594e4360d01b60448201526064015b60405180910390fd5b5f805b83518110156107035782818151811061069f5761069f6117ef565b6020026020010151826106b29190611803565b91506106f18482815181106106c9576106c96117ef565b60200260200101518483815181106106e3576106e36117ef565b60200260200101515f6109ee565b806106fb81611816565b915050610684565b5061071d335b6002546001600160a01b0316903084610dda565b506104ee60018055565b61072f610932565b61073833610709565b61044733825f6109ee565b61074b610b02565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b610775610b02565b6301e1338081106107b55760405162461bcd60e51b815260206004820152600a602482015269363a329018903cb2b0b960b11b6044820152606401610678565b600355565b6107c2610b02565b6001600160a01b0381166108275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610678565b61045081610d5c565b5f81116108655760405162461bcd60e51b815260206004820152600360248201526208aa8960eb1b6044820152606401610678565b5f6005541161089f5760405162461bcd60e51b815260206004820152600660248201526553484152455360d01b6044820152606401610678565b80600b5f8282546108b09190611803565b90915550506005546108d1826ec097ce7bc90715b34b9f100000000061182e565b6108db9190611845565b60095f8282546108eb9190611803565b90915550506040518181526001600160a01b038316907fb9ad861b752f80117b35bea6dec99933d8a5ae360f2839ee8784b750d56134099060200160405180910390a25050565b6002600154036109845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610678565b6002600155565b6040516001600160a01b03831660248201526044810182905261055290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610e12565b6006546001600160a01b031615610a65576006546040516329cc05cf60e01b81526001600160a01b038581166004830152602482018590528315156044830152909116906329cc05cf906064015f604051808303815f87803b158015610a52575f80fd5b505af1925050508015610a63575060015b505b8015610abd57610a758383610ee5565b826001600160a01b03167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd83604051610ab091815260200190565b60405180910390a2505050565b610ac783836110ba565b826001600160a01b03167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a83604051610ab091815260200190565b5f546001600160a01b0316331461041a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610678565b6001600160a01b0383165f908152600760205260408120549003610b7e57505050565b6001600160a01b0383165f90815260076020526040812042600190910155610ba5846105b7565b6001600160a01b0385165f90815260086020526040812060010180549293508392909190610bd4908490611803565b90915550506001600160a01b0384165f90815260076020526040902054610bfa90610dab565b6001600160a01b0385165f908152600860205260409020558015610d565780600a5f828254610c299190611803565b90915550508215610c4457610c3f8482846111db565b610d10565b60405147905f906001600160a01b0387169084908381818185875af1925050503d805f8114610c8e576040519150601f19603f3d011682016040523d82523d5f602084013e610c93565b606091505b5050905080610ccc5760405162461bcd60e51b8152602060048201526005602482015264044495354360dc1b6044820152606401610678565b610cd683836117dc565b471015610d0d5760405162461bcd60e51b8152602060048201526005602482015264444953543160d81b6044820152606401610678565b50505b6040805182815284151560208201526001600160a01b038616917ff34664cb7e3473d9bcd089297cc2ec340fede133eaf733d0ca506f1e05e2fee0910160405180910390a25b50505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6ec097ce7bc90715b34b9f100000000060095483610dca919061182e565b610dd49190611845565b92915050565b6040516001600160a01b0380851660248301528316604482015260648101829052610d569085906323b872dd60e01b906084016109b7565b5f610e66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114469092919063ffffffff16565b905080515f1480610e86575080806020019051810190610e869190611864565b6105525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610678565b6001600160a01b0382165f9081526007602052604090205415801590610f2257506001600160a01b0382165f908152600760205260409020548111155b610f5c5760405162461bcd60e51b815260206004820152600b60248201526a1491534e88185b5bdd5b9d60aa1b6044820152606401610678565b6003546001600160a01b0383165f90815260076020526040902060010154610f849190611803565b4211610fc25760405162461bcd60e51b815260206004820152600d60248201526c52454d3a2074696d656c6f636b60981b6044820152606401610678565b5f610fcc836105b7565b90505f8083600554610fde91906117dc565b11905080610ff157610ff1845f80610b5b565b8260055f82825461100291906117dc565b90915550506001600160a01b0384165f908152600760205260408120805485929061102e9084906117dc565b90915550506001600160a01b0384165f9081526007602052604081205490036110665760048054905f6110608361187f565b91905055505b6001600160a01b0384165f9081526007602052604090205461108790610dab565b6001600160a01b0385165f908152600860205260409020558080156110ab57505f82115b15610d5657610d568483610830565b6001600160a01b0382165f90815260076020526040902054156110e2576110e2825f80610b5b565b6001600160a01b0382165f90815260076020526040812054600580549192849261110d908490611803565b90915550506001600160a01b0383165f9081526007602052604081208054849290611139908490611803565b90915550506001600160a01b0383165f908152600760205260409020426001909101558015801561118057506001600160a01b0383165f9081526007602052604090205415155b1561119a5760048054905f61119483611816565b91905055505b6001600160a01b0383165f908152600760205260409020546111bb90610dab565b6001600160a01b039093165f908152600860205260409020929092555050565b6040805160028082526060820183525f926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611257573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127b9190611894565b815f8151811061128d5761128d6117ef565b6001600160a01b0392831660209182029290920101526002548251911690829060019081106112be576112be6117ef565b6001600160a01b0392831660209182029290920101526002546040516370a0823160e01b81523060048201529116905f9082906370a0823190602401602060405180830381865afa158015611315573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061133991906117b1565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b6f9de9586868630426040518663ffffffff1660e01b815260040161138e94939291906118af565b5f604051808303818588803b1580156113a5575f80fd5b505af11580156113b7573d5f803e3d5ffd5b50506040516370a0823160e01b81523060048201525f93508492506001600160a01b03861691506370a0823190602401602060405180830381865afa158015611402573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142691906117b1565b61143091906117dc565b905061143d87825f6109ee565b50505050505050565b606061063284845f85855f80866001600160a01b0316858760405161146b9190611939565b5f6040518083038185875af1925050503d805f81146114a5576040519150601f19603f3d011682016040523d82523d5f602084013e6114aa565b606091505b50915091506114bb878383876114c6565b979650505050505050565b606083156115345782515f0361152d576001600160a01b0385163b61152d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610678565b5081610632565b61063283838151156115495781518083602001fd5b8060405162461bcd60e51b81526004016106789190611954565b6001600160a01b0381168114610450575f80fd5b5f60208284031215611587575f80fd5b813561159281611563565b9392505050565b5f602082840312156115a9575f80fd5b5035919050565b8015158114610450575f80fd5b5f805f606084860312156115cf575f80fd5b83356115da81611563565b925060208401356115ea816115b0565b929592945050506040919091013590565b5f806040838503121561160c575f80fd5b8235611617816115b0565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561166257611662611625565b604052919050565b5f67ffffffffffffffff82111561168357611683611625565b5060051b60200190565b5f82601f83011261169c575f80fd5b813560206116b16116ac8361166a565b611639565b82815260059290921b840181019181810190868411156116cf575f80fd5b8286015b848110156116ea57803583529183019183016116d3565b509695505050505050565b5f8060408385031215611706575f80fd5b823567ffffffffffffffff8082111561171d575f80fd5b818501915085601f830112611730575f80fd5b813560206117406116ac8361166a565b82815260059290921b8401810191818101908984111561175e575f80fd5b948201945b8386101561178557853561177681611563565b82529482019490820190611763565b9650508601359250508082111561179a575f80fd5b506117a78582860161168d565b9150509250929050565b5f602082840312156117c1575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610dd457610dd46117c8565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610dd457610dd46117c8565b5f60018201611827576118276117c8565b5060010190565b8082028115828204841417610dd457610dd46117c8565b5f8261185f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611874575f80fd5b8151611592816115b0565b5f8161188d5761188d6117c8565b505f190190565b5f602082840312156118a4575f80fd5b815161159281611563565b5f60808201868352602060808185015281875180845260a08601915082890193505f5b818110156118f75784516001600160a01b0316835293830193918301916001016118d2565b50506001600160a01b039690961660408501525050506060015292915050565b5f5b83811015611931578181015183820152602001611919565b50505f910152565b5f825161194a818460208701611917565b9190910192915050565b602081525f8251806020840152611972816040850160208701611917565b601f01601f1916919091016040019291505056fea164736f6c6343000814000a00000000000000000000000014fee680690900ba0cccfc76ad70fd1b95d10e1600000000000000000000000000000000000000000000000000000000001275000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode
0x60806040526004361061013c575f3560e01c806389d96917116100b3578063c7e1d0b11161006d578063c7e1d0b114610361578063ce7c2ac214610376578063ee947a7c146103a8578063efca2eed146103bd578063f2fde38b146103d2578063fc0c546a146103f1575f80fd5b806389d96917146102aa5780638da5cb5b146102c957806395319435146102e5578063a694fc3a14610304578063b2a7e22414610323578063c771c39014610342575f80fd5b8063315a095d11610104578063315a095d1461020f5780633c6e67891461022e57806341aef16214610243578063472f13f314610262578063715018a61461028157806380bb405514610295575f80fd5b80630700037d146101405780630e15561a1461018c578063152111f7146101af5780632d5537b0146101b95780632e17de78146101f0575b5f80fd5b34801561014b575f80fd5b5061017261015a366004611577565b60086020525f90815260409020805460019091015482565b604080519283526020830191909152015b60405180910390f35b348015610197575f80fd5b506101a1600b5481565b604051908152602001610183565b6101b7610410565b005b3480156101c4575f80fd5b506006546101d8906001600160a01b031681565b6040516001600160a01b039091168152602001610183565b3480156101fb575f80fd5b506101b761020a366004611599565b61041c565b34801561021a575f80fd5b506101b7610229366004611599565b610453565b348015610239575f80fd5b506101a160055481565b34801561024e575f80fd5b506101b761025d3660046115bd565b6104f2565b34801561026d575f80fd5b506101b761027c3660046115fb565b610557565b34801561028c575f80fd5b506101b76105a6565b3480156102a0575f80fd5b506101a160045481565b3480156102b5575f80fd5b506101a16102c4366004611577565b6105b7565b3480156102d4575f80fd5b505f546001600160a01b03166101d8565b3480156102f0575f80fd5b506101b76102ff3660046116f5565b61063a565b34801561030f575f80fd5b506101b761031e366004611599565b610727565b34801561032e575f80fd5b506101b761033d366004611577565b610743565b34801561034d575f80fd5b506101b761035c366004611599565b61076d565b34801561036c575f80fd5b506101a160095481565b348015610381575f80fd5b50610172610390366004611577565b60076020525f90815260409020805460019091015482565b3480156103b3575f80fd5b506101a160035481565b3480156103c8575f80fd5b506101a1600a5481565b3480156103dd575f80fd5b506101b76103ec366004611577565b6107ba565b3480156103fc575f80fd5b506002546101d8906001600160a01b031681565b61041a3334610830565b565b610424610932565b61043b336002546001600160a01b0316908361098b565b610447338260016109ee565b61045060018055565b50565b61045b610b02565b6002546001600160a01b03166104ee33831561047757836104dd565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156104b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104dd91906117b1565b6001600160a01b038416919061098b565b5050565b6104fa610932565b610502610b02565b61050d838383610b5b565b6040516001600160a01b03841681527f63e32091e4445d16e29c33a6b264577c2d86694021aa4e6f4dd590048f5792e89060200160405180910390a161055260018055565b505050565b61055f610932565b61056a338383610b5b565b6040805133815290517f63e32091e4445d16e29c33a6b264577c2d86694021aa4e6f4dd590048f5792e89181900360200190a16104ee60018055565b6105ae610b02565b61041a5f610d5c565b6001600160a01b0381165f9081526007602052604081205481036105dc57505f919050565b6001600160a01b0382165f908152600760205260408120546105fd90610dab565b6001600160a01b0384165f9081526008602052604090205490915080821161062857505f9392505050565b61063281836117dc565b949350505050565b610642610932565b80518251146106815760405162461bcd60e51b8152602060048201526006602482015265494e53594e4360d01b60448201526064015b60405180910390fd5b5f805b83518110156107035782818151811061069f5761069f6117ef565b6020026020010151826106b29190611803565b91506106f18482815181106106c9576106c96117ef565b60200260200101518483815181106106e3576106e36117ef565b60200260200101515f6109ee565b806106fb81611816565b915050610684565b5061071d335b6002546001600160a01b0316903084610dda565b506104ee60018055565b61072f610932565b61073833610709565b61044733825f6109ee565b61074b610b02565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b610775610b02565b6301e1338081106107b55760405162461bcd60e51b815260206004820152600a602482015269363a329018903cb2b0b960b11b6044820152606401610678565b600355565b6107c2610b02565b6001600160a01b0381166108275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610678565b61045081610d5c565b5f81116108655760405162461bcd60e51b815260206004820152600360248201526208aa8960eb1b6044820152606401610678565b5f6005541161089f5760405162461bcd60e51b815260206004820152600660248201526553484152455360d01b6044820152606401610678565b80600b5f8282546108b09190611803565b90915550506005546108d1826ec097ce7bc90715b34b9f100000000061182e565b6108db9190611845565b60095f8282546108eb9190611803565b90915550506040518181526001600160a01b038316907fb9ad861b752f80117b35bea6dec99933d8a5ae360f2839ee8784b750d56134099060200160405180910390a25050565b6002600154036109845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610678565b6002600155565b6040516001600160a01b03831660248201526044810182905261055290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610e12565b6006546001600160a01b031615610a65576006546040516329cc05cf60e01b81526001600160a01b038581166004830152602482018590528315156044830152909116906329cc05cf906064015f604051808303815f87803b158015610a52575f80fd5b505af1925050508015610a63575060015b505b8015610abd57610a758383610ee5565b826001600160a01b03167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd83604051610ab091815260200190565b60405180910390a2505050565b610ac783836110ba565b826001600160a01b03167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a83604051610ab091815260200190565b5f546001600160a01b0316331461041a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610678565b6001600160a01b0383165f908152600760205260408120549003610b7e57505050565b6001600160a01b0383165f90815260076020526040812042600190910155610ba5846105b7565b6001600160a01b0385165f90815260086020526040812060010180549293508392909190610bd4908490611803565b90915550506001600160a01b0384165f90815260076020526040902054610bfa90610dab565b6001600160a01b0385165f908152600860205260409020558015610d565780600a5f828254610c299190611803565b90915550508215610c4457610c3f8482846111db565b610d10565b60405147905f906001600160a01b0387169084908381818185875af1925050503d805f8114610c8e576040519150601f19603f3d011682016040523d82523d5f602084013e610c93565b606091505b5050905080610ccc5760405162461bcd60e51b8152602060048201526005602482015264044495354360dc1b6044820152606401610678565b610cd683836117dc565b471015610d0d5760405162461bcd60e51b8152602060048201526005602482015264444953543160d81b6044820152606401610678565b50505b6040805182815284151560208201526001600160a01b038616917ff34664cb7e3473d9bcd089297cc2ec340fede133eaf733d0ca506f1e05e2fee0910160405180910390a25b50505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6ec097ce7bc90715b34b9f100000000060095483610dca919061182e565b610dd49190611845565b92915050565b6040516001600160a01b0380851660248301528316604482015260648101829052610d569085906323b872dd60e01b906084016109b7565b5f610e66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114469092919063ffffffff16565b905080515f1480610e86575080806020019051810190610e869190611864565b6105525760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610678565b6001600160a01b0382165f9081526007602052604090205415801590610f2257506001600160a01b0382165f908152600760205260409020548111155b610f5c5760405162461bcd60e51b815260206004820152600b60248201526a1491534e88185b5bdd5b9d60aa1b6044820152606401610678565b6003546001600160a01b0383165f90815260076020526040902060010154610f849190611803565b4211610fc25760405162461bcd60e51b815260206004820152600d60248201526c52454d3a2074696d656c6f636b60981b6044820152606401610678565b5f610fcc836105b7565b90505f8083600554610fde91906117dc565b11905080610ff157610ff1845f80610b5b565b8260055f82825461100291906117dc565b90915550506001600160a01b0384165f908152600760205260408120805485929061102e9084906117dc565b90915550506001600160a01b0384165f9081526007602052604081205490036110665760048054905f6110608361187f565b91905055505b6001600160a01b0384165f9081526007602052604090205461108790610dab565b6001600160a01b0385165f908152600860205260409020558080156110ab57505f82115b15610d5657610d568483610830565b6001600160a01b0382165f90815260076020526040902054156110e2576110e2825f80610b5b565b6001600160a01b0382165f90815260076020526040812054600580549192849261110d908490611803565b90915550506001600160a01b0383165f9081526007602052604081208054849290611139908490611803565b90915550506001600160a01b0383165f908152600760205260409020426001909101558015801561118057506001600160a01b0383165f9081526007602052604090205415155b1561119a5760048054905f61119483611816565b91905055505b6001600160a01b0383165f908152600760205260409020546111bb90610dab565b6001600160a01b039093165f908152600860205260409020929092555050565b6040805160028082526060820183525f926020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611257573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127b9190611894565b815f8151811061128d5761128d6117ef565b6001600160a01b0392831660209182029290920101526002548251911690829060019081106112be576112be6117ef565b6001600160a01b0392831660209182029290920101526002546040516370a0823160e01b81523060048201529116905f9082906370a0823190602401602060405180830381865afa158015611315573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061133991906117b1565b90507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663b6f9de9586868630426040518663ffffffff1660e01b815260040161138e94939291906118af565b5f604051808303818588803b1580156113a5575f80fd5b505af11580156113b7573d5f803e3d5ffd5b50506040516370a0823160e01b81523060048201525f93508492506001600160a01b03861691506370a0823190602401602060405180830381865afa158015611402573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142691906117b1565b61143091906117dc565b905061143d87825f6109ee565b50505050505050565b606061063284845f85855f80866001600160a01b0316858760405161146b9190611939565b5f6040518083038185875af1925050503d805f81146114a5576040519150601f19603f3d011682016040523d82523d5f602084013e6114aa565b606091505b50915091506114bb878383876114c6565b979650505050505050565b606083156115345782515f0361152d576001600160a01b0385163b61152d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610678565b5081610632565b61063283838151156115495781518083602001fd5b8060405162461bcd60e51b81526004016106789190611954565b6001600160a01b0381168114610450575f80fd5b5f60208284031215611587575f80fd5b813561159281611563565b9392505050565b5f602082840312156115a9575f80fd5b5035919050565b8015158114610450575f80fd5b5f805f606084860312156115cf575f80fd5b83356115da81611563565b925060208401356115ea816115b0565b929592945050506040919091013590565b5f806040838503121561160c575f80fd5b8235611617816115b0565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561166257611662611625565b604052919050565b5f67ffffffffffffffff82111561168357611683611625565b5060051b60200190565b5f82601f83011261169c575f80fd5b813560206116b16116ac8361166a565b611639565b82815260059290921b840181019181810190868411156116cf575f80fd5b8286015b848110156116ea57803583529183019183016116d3565b509695505050505050565b5f8060408385031215611706575f80fd5b823567ffffffffffffffff8082111561171d575f80fd5b818501915085601f830112611730575f80fd5b813560206117406116ac8361166a565b82815260059290921b8401810191818101908984111561175e575f80fd5b948201945b8386101561178557853561177681611563565b82529482019490820190611763565b9650508601359250508082111561179a575f80fd5b506117a78582860161168d565b9150509250929050565b5f602082840312156117c1575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610dd457610dd46117c8565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610dd457610dd46117c8565b5f60018201611827576118276117c8565b5060010190565b8082028115828204841417610dd457610dd46117c8565b5f8261185f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611874575f80fd5b8151611592816115b0565b5f8161188d5761188d6117c8565b505f190190565b5f602082840312156118a4575f80fd5b815161159281611563565b5f60808201868352602060808185015281875180845260a08601915082890193505f5b818110156118f75784516001600160a01b0316835293830193918301916001016118d2565b50506001600160a01b039690961660408501525050506060015292915050565b5f5b83811015611931578181015183820152602001611919565b50505f910152565b5f825161194a818460208701611917565b9190910192915050565b602081525f8251806020840152611972816040850160208701611917565b601f01601f1916919091016040019291505056fea164736f6c6343000814000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000014fee680690900ba0cccfc76ad70fd1b95d10e1600000000000000000000000000000000000000000000000000000000001275000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
-----Decoded View---------------
Arg [0] : _token (address): 0x14feE680690900BA0ccCfC76AD70Fd1b95D10e16
Arg [1] : _lockupPeriod (uint256): 1209600
Arg [2] : __router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000014fee680690900ba0cccfc76ad70fd1b95d10e16
Arg [1] : 0000000000000000000000000000000000000000000000000000000000127500
Arg [2] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.