ETH Price: $2,525.09 (+0.32%)

Token

Genesis Staking (sGEN)
 

Overview

Max Total Supply

322,686,622.747987089956289321 sGEN

Holders

193

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,513,235.845343534229015852 sGEN

Value
$0.00
0x67f8bf2c521af007328b74c8ae7416badc512357
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GenesisAutoCompoundStaking

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : GenesisStaking.sol
// Website: https://genesisdao.io/
// X: https://x.com/0xGenesisDAO
// Discord: https://discord.gg/genesisdao


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


//                                         &                                       
//                           (&&&&&&&&&&&&&&&&&&&&&&&&&&&*                         
//                      &&&&&&&&&&&&&&&&&&&&&@,,@@@@&&&&&&&&&&&                    
//                  &&&&&&&&&&&&&&&&&&&&&,,,,,,,,,*@@@&&&&&&&&&&&&&                
//               &&&&&&&&&&&&&&&&&&&&,,,,,,,,,,,@@@@@@@&&&&&&&&&&&&&&&             
//            &&&&&&&&&&&&&&&&&@,,,,,,,,,,,@@@@@@@@@@&&&&&&&&&&&&&&&&&&&&          
//          &&&&&&&&&&&&&&@,,,,,,,,,,,*@@@@@@@@@@&&&&&&&&&@,,,,,#@@@@&&&&&&        
//        &&&&&&&&&&&&#,,,,,,,,,,,@@@@@@@@@@@&&&&&&&&&*,,,,,,,,,,,,@@@@&&&&&&      
//       &&&&&&&&&@..,,.,,,,,@@@@@@@@@@&&&&&&&&&&@,,,,,,,,,,,,,,,,,@@@@&&&&&&&     
//     #&&&&&&&&&&@..,,,,,%@@@@@@@@&&&&&&&&&@,,,,,,,,,,,,@@,,,,,,,,@@@@&&&&&&&&    
//    &&&&&&&&&&&&@..,,,,,&@@@@&&&&&&&&&..,,,,,,,,,,@@@@@@@@,,,,,,,@@@@&&&&&&&&&&  
//   &&&&&&&&&&&&&@..,,,,,&@@@@&&&&&&&&@..,,,,,@@@@@@@@@@@@@,,,,,,,@@@@&&&&&&&&&&* 
//   &&&&&&&&&&&&&@..,,,,,&@@@@&&&&&&&&@@@@@@@@@@@@@@&&&&&&@,,,,,,,@@@@&&&&&&&&&&& 
//  &&&&&&&&&&&&&&@..,,,,@@@@@@&&&&&&&&&&&&@@@@@@&&&&&&&&&&@@,,,,,,@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&@@@@@@@@//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&&@@@/**,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*@@@@@@@@@&&&&&&&&&&&&&
// &&&&&&&&&&&&&&&@.....,.,,@@@@@@@@@@@@@@@@@@@@@@@@@@&&%@@@@@@/*,,@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&@....,,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/**,,,,@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&@....,,,,@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&@,,,,,,,@@@@&&&&&&&&&&&&
//  &&&&&&&&&&&&&&@....,,,,@@@@&&&&&&&&&@,,,,,@@@@&&&&&&&&&@,,,,,,,@@@@&&&&&&&&&&&&
//   &&&&&&&&&&&&&@....,,,,@@@@&&&&&,,,,,,,,,,,,@@@@&&&&&&&@,,,,,,,@@@@&&&&&&&&&&& 
//   &&&&&&&&&&&&&@....,,,,@@@@,,,,,,,,,,,,,,@@@@@@@&&&&&&&@,,,,,,,@@@@&&&&&&&&&&* 
//    &&&&&&&&&&&&@....,,,,,,,,,,,,,,,,,@@@@@@@@@@@&&&&&&&&,,,,,,,,@@@@&&&&&&&&&&  
//     /&&&&&&&&&&@....,,,,,,,,,,,@@@@@@@@@@@@&&&&&&&&@,,,,,,,,,,,,@@@@&&&&&&&&    
//       &&&&&&&&&@@....,,,,,@@@@@@@@@@@@&&&&&&&&&,,,,,,,,,,,,,@@@@@@@@&&&&&&&     
//        &&&&&&&&&@@@@@@@@@@@@@@@@&&&&&&&&&&@,,,,,,,,,,,,@@@@@@@@@@@&&&&&&&&      
//          &&&&&&&&&&@@@@@@@@&&&&&&&&&&@,,,,,,,,,,,,@@@@@@@@@@@&&&&&&&&&&&        
//            &&&&&&&&&&&&&&&&&&&&&&..,,,,,,,,,,(@@@@@@@@@@&&&&&&&&&&&&&&          
//               &&&&&&&&&&&&&&&&&@...,,,,,,@@@@@@@@@@&&&&&&&&&&&&&&&&             
//                  &&&&&&&&&&&&&&@@@@@@@@@@@@@@@@&&&&&&&&&&&&&&&&&                
//                      &&&&&&&&&&&&@@@@@@@@@&&&&&&&&&&&&&&&&&&                    
//                           *&&&&&&&&&&&&&&&&&&&&&&&&&&& 


import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IERC20MintableBurnable is IERC20 {
    function mint(address account, uint256 amount) external;
    function burn(uint256 amount) external;
}

contract GenesisAutoCompoundStaking is IERC20, Ownable {
    uint256 private constant MAX_UINT256 = type(uint256).max;
    uint256 private constant SCALE = 1e18;
    uint256 private constant ONE_YEAR = 365 days;

    uint256 private constant MAX_STAKE_TAX = 500; // 5%
    uint256 private constant MAX_UNSTAKE_TAX = 1500; // 15%
    uint256 private constant PERCENTAGE_BASE = 10000; // 100%

    string public name = "Genesis Staking";
    string public symbol = "sGEN";
    uint8 public decimals = 18;

    address public baseToken;
    address public liquidityPool;
    address public treasury;

    uint256 public fixedAPR = 50 ether;
    uint256 public dynamicAPRMinCap = 30 ether;
    uint256 public dynamicAPRMaxCap = 70 ether;
    uint256 public dynamicAPRConstant = 1 ether;
    uint256 public rebaseInterval = 8 hours;
    uint256 public stakeTax = 500;
    uint256 public unstakeTax = 500;

    uint256 public stakeStartTime;
    uint256 public lastRebaseTime;

    uint256 public totalGons;
    uint256 public totalSupplyTokens;
    uint256 public gonsPerFragment = 1e9;

    uint256 public initialMaxSupply;
    uint256 public maxSupply;
    uint256 public maxGons;

    uint256 public warmupPeriod;

    mapping(address => uint256) private _gonBalances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => uint256) public stakeTimes;

    event Mint(address indexed wallet, uint256 amount, uint256 gonsAdded, uint256 gonsPerFragment, uint256 newTotalSupply);
    event Burn(address indexed wallet, uint256 amount, uint256 gonsRemoved, uint256 gonsPerFragment, uint256 newTotalSupply);
    event Stake(address indexed user, uint256 amount, uint256 taxAmount, uint256 mintedTokens);
    event Unstake(address indexed user, uint256 amount, uint256 taxAmount, uint256 returnedTokens);
    event Rebase(
        uint256 fixedAPR, 
        uint256 dynamicAPR, 
        uint256 rebaseAPR, 
        uint256 lastRebaseTime, 
        uint256 rebaseCount, 
        uint256 maxSupply, 
        uint256 supplyDelta,
        uint256 gonsPerFragment,
        uint256 currentSupply
    );

    event BaseTokenSet(address indexed baseToken);
    event LiquidityPoolSet(address indexed liquidityPool);
    event APRParamsSet(uint256 fixedAPR, uint256 dynamicAPRMinCap, uint256 dynamicAPRMaxCap, uint256 dynamicAPRConstant);
    event RebaseIntervalSet(uint256 rebaseInterval);
    event StakeTaxSet(uint256 stakeTax);
    event UnstakeTaxSet(uint256 unstakeTax);
    event StakeStartTimeSet(uint256 stakeStartTime);
    event TreasurySet(address indexed treasury);

    constructor(
        address _baseToken, 
        address _liquidityPool, 
        address _treasury,
        uint256 _stakeStartTime
    ) Ownable(msg.sender) {
        baseToken = _baseToken;
        liquidityPool = _liquidityPool;
        treasury = _treasury;
        stakeStartTime = _stakeStartTime;

        maxSupply = IERC20MintableBurnable(baseToken).totalSupply() + 1 ether;
        initialMaxSupply = maxSupply;
        maxGons = MAX_UINT256 - (MAX_UINT256 % maxSupply);
        gonsPerFragment = maxGons / maxSupply;
        _mint(address(this), 1 ether);

        warmupPeriod = 60;

        emit BaseTokenSet(_baseToken);
        emit LiquidityPoolSet(_liquidityPool);
        emit TreasurySet(_treasury);
        emit StakeStartTimeSet(_stakeStartTime);
    }

    function setBaseToken(address _baseToken) external onlyOwner {
        baseToken = _baseToken;
        emit BaseTokenSet(_baseToken);
    }

    function setLiquidityPool(address _liquidityPool) external onlyOwner {
        liquidityPool = _liquidityPool;
        emit LiquidityPoolSet(_liquidityPool);
    }

    function setAprParameters(
        uint256 _fixedAPR,
        uint256 _dynamicAPRMinCap,
        uint256 _dynamicAPRMaxCap,
        uint256 _dynamicAPRConstant
    ) external onlyOwner {
        require(_dynamicAPRMinCap <= _dynamicAPRMaxCap, "Min cap higher than max cap");
        fixedAPR = _fixedAPR;
        dynamicAPRMinCap = _dynamicAPRMinCap;
        dynamicAPRMaxCap = _dynamicAPRMaxCap;
        dynamicAPRConstant = _dynamicAPRConstant;

        emit APRParamsSet(_fixedAPR, _dynamicAPRMinCap, _dynamicAPRMaxCap, _dynamicAPRConstant);
    }

    function setRebaseInterval(uint256 _rebaseInterval) external onlyOwner {
        rebaseInterval = _rebaseInterval;
        emit RebaseIntervalSet(_rebaseInterval);
    }

    function setStakeTax(uint256 _stakeTax) external onlyOwner {
        require(_stakeTax <= MAX_STAKE_TAX, "Stake tax too high");
        stakeTax = _stakeTax;
        emit StakeTaxSet(_stakeTax);
    }

    function setUnstakeTax(uint256 _unstakeTax) external onlyOwner {
        require(_unstakeTax <= MAX_UNSTAKE_TAX, "Unstake tax too high");
        unstakeTax = _unstakeTax;
        emit UnstakeTaxSet(_unstakeTax);
    }

    function setTreasury(address _treasury) external onlyOwner {
        treasury = _treasury;
        emit TreasurySet(_treasury);
    }

    function setStakeStartTime(uint256 _stakeStartTime) external onlyOwner {
        require(block.timestamp < stakeStartTime, "Staking already started");
        stakeStartTime = _stakeStartTime;
        emit StakeStartTimeSet(_stakeStartTime);
    }

    function setWarmupPeriod(uint256 _warmupPeriod) external onlyOwner {
        require(_warmupPeriod > 0, "Warmup period too low");
        require(_warmupPeriod <= 1 days, "Warmup period too high");
        warmupPeriod = _warmupPeriod;
    }

    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        uint256 gonsToAdd = amount * gonsPerFragment;
        totalGons += gonsToAdd;
        totalSupplyTokens += amount;
        _gonBalances[account] += gonsToAdd;

        emit Mint(account, amount, gonsToAdd, gonsPerFragment, totalSupplyTokens);

        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        uint256 gonsToRemove = amount * gonsPerFragment;
        totalGons -= gonsToRemove;
        totalSupplyTokens -= amount;
        _gonBalances[account] -= gonsToRemove;

        emit Burn(account, amount, gonsToRemove, gonsPerFragment, totalSupplyTokens);

        emit Transfer(account, address(0), amount);
    }

    function rebase() public {
        if (block.timestamp < stakeStartTime) return;

        uint256 timeToUse = lastRebaseTime > 0 ? lastRebaseTime : stakeStartTime;
        uint256 rebaseCount = (block.timestamp - timeToUse) / rebaseInterval;
        if (rebaseCount == 0) return;

        uint256 fixedApr = getFixedAPR();
        uint256 dynamicApr = getDynamicAPR();
        uint256 finalApr = fixedApr + dynamicApr;

        uint256 intervalsPerYear = ONE_YEAR / rebaseInterval;
        uint256 intervalAPR = finalApr / intervalsPerYear;
        uint256 supplyDelta = (maxSupply * intervalAPR) / SCALE / 100;

        if (supplyDelta == 0) {
            lastRebaseTime = timeToUse + rebaseInterval * rebaseCount;
            return;
        }

        if (supplyDelta > maxSupply) {
            supplyDelta = maxSupply;
        }

        maxSupply += supplyDelta;
        gonsPerFragment = maxGons / maxSupply;

        totalSupplyTokens = totalGons / gonsPerFragment; 
        lastRebaseTime = timeToUse + rebaseInterval * rebaseCount;

        emit Rebase(
            fixedApr, 
            dynamicApr, 
            intervalAPR, 
            timeToUse, 
            rebaseCount, 
            maxSupply,
            supplyDelta,
            gonsPerFragment,
            totalSupplyTokens 
        );
    }

    function stake(uint256 amount) external {
        rebase();

        require(IERC20(baseToken).transferFrom(msg.sender, address(this), amount), "Transfer failed");

        uint256 taxAmount = (amount * stakeTax) / PERCENTAGE_BASE;
        uint256 netAmount = amount - taxAmount;

        IERC20MintableBurnable(baseToken).burn(netAmount);
        if (taxAmount > 0) {
            IERC20(baseToken).transfer(treasury, taxAmount);
        }

        _mint(msg.sender, netAmount);

        if (warmupPeriod > 0) {
            stakeTimes[msg.sender] = block.timestamp;
        }
        
        emit Stake(msg.sender, amount, taxAmount, netAmount);
    }

    function unstake(uint256 amount) external {
        require(block.timestamp - stakeTimes[msg.sender] >= warmupPeriod, "Warmup period not over");

        rebase();

        uint256 gonsToRemove = amount * gonsPerFragment;
        require(_gonBalances[msg.sender] >= gonsToRemove, "Insufficient balance");

        _burn(msg.sender, amount);
        IERC20MintableBurnable(baseToken).mint(address(this), amount);

        uint256 taxAmount = (amount * unstakeTax) / PERCENTAGE_BASE;
        uint256 netAmount = amount - taxAmount;

        IERC20(baseToken).transfer(msg.sender, netAmount);
        if (taxAmount > 0) {
            IERC20(baseToken).transfer(treasury, taxAmount);
        }

        emit Unstake(msg.sender, amount, taxAmount, netAmount);
    }

    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(_gonBalances[sender] >= amount * gonsPerFragment, "ERC20: transfer amount exceeds balance");
        require(sender == address(0) || recipient != address(this), "ERC20: transfer to staking contract");

        rebase();

        uint256 taxAmount = ((stakeTax + unstakeTax) * amount) / PERCENTAGE_BASE;
        uint256 netAmount = amount - taxAmount;

        uint256 gonsToTransfer = netAmount * gonsPerFragment;
        uint256 gonsTaxAmount = taxAmount * gonsPerFragment;

        _gonBalances[sender] -= (gonsToTransfer + gonsTaxAmount);
        _gonBalances[recipient] += gonsToTransfer;
        if (gonsTaxAmount > 0) {
            _gonBalances[treasury] += gonsTaxAmount;
        }

        emit Transfer(sender, recipient, netAmount);
    }

    function getFixedAPR() public view returns (uint256) {
        return fixedAPR;
    }

    function getDynamicAPR() public view returns (uint256) {
        uint256 totalStaked = totalSupplyTokens;
        uint256 lpBalance = IERC20(baseToken).balanceOf(liquidityPool);

        if (lpBalance <= 0) {
            revert("LP balance zero");
        }
        if (dynamicAPRConstant <= 0) {
            revert("Dynamic APR constant zero");
        }

        uint256 ratio = (totalStaked * SCALE) / lpBalance;

        if (ratio > 10 * SCALE) {
            ratio = 10 * SCALE;
        }

        uint256 scaledRatio = (ratio * dynamicAPRConstant) / SCALE;
        uint256 logInput = SCALE + scaledRatio;

        uint256 logValue = log10(logInput);

        uint256 apyValue = dynamicAPRMaxCap -
            ((dynamicAPRMaxCap - dynamicAPRMinCap) * logValue) /
            log10(dynamicAPRConstant * 10);

        if (apyValue < dynamicAPRMinCap) {
            apyValue = dynamicAPRMinCap;
        }

        return apyValue;
    }

    function getFinalAPR() public view returns (uint256) {
        return getFixedAPR() + getDynamicAPR();
    }

    function log10(uint256 x) internal view returns (uint256) {
        if (x <= 0) {
            revert("Log zero");
        }
        uint256 result = 0;
        while (x >= 10 * SCALE) {
            x /= 10;
            result += SCALE;
        }
        for (uint8 i = 0; i < 18; ++i) {
            x = (x * x) / SCALE;
            if (x >= 10 * SCALE) {
                x /= 10;
                result += SCALE / (2 ** (i + 1));
            }
        }
        return result;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _gonBalances[account] / gonsPerFragment;
    }

    function totalSupply() public view override returns (uint256) {
        return totalSupplyTokens;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, currentAllowance - amount);

        return true;
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function timeTillNextRebase() public view returns (uint256) {
        if (block.timestamp < stakeStartTime) {
            return stakeStartTime - block.timestamp;
        }
        return rebaseInterval - ((block.timestamp - stakeStartTime) % rebaseInterval);
    }

    function totalTokensAtNextRebase() public view returns (uint256) {
        uint256 fixedApr = getFixedAPR();
        uint256 dynamicApr = getDynamicAPR();
        uint256 finalApr = fixedApr + dynamicApr;

        uint256 intervalsPerYear = ONE_YEAR / rebaseInterval;
        uint256 intervalAPR = finalApr / intervalsPerYear;
        uint256 supplyDelta = (totalSupplyTokens * intervalAPR) / SCALE / 100;

        return supplyDelta;
    }

    function tokensForAddressAtNextRebase(address account) public view returns (uint256) {
        uint256 supplyDelta = totalTokensAtNextRebase();
        uint256 userBalance = balanceOf(account);
        uint256 userShare = (userBalance * SCALE) / totalSupplyTokens;

        return (supplyDelta * userShare) / SCALE / 100;
    }

    function tokensDeductedForUnstaking(uint256 amount) public view returns (uint256) {
        uint256 taxAmount = (amount * unstakeTax) / PERCENTAGE_BASE;
        return taxAmount;
    }

    function tokensDeductedForStaking(uint256 amount) public view returns (uint256) {
        uint256 taxAmount = (amount * stakeTax) / PERCENTAGE_BASE;
        return taxAmount;
    }

    function index() public view returns (uint256) {
        return balanceOf(address(this));
    }

    function totalTokensRewarded() public view returns (uint256) {
        return maxSupply - initialMaxSupply;
    }

    function emergencyWithdraw(address token, address to, uint256 amount) external onlyOwner {
        require(token != address(this), "Cannot withdraw staking token");
        IERC20(token).transfer(to, amount);
    }
    
    function emergencyEthWithdraw(address to, uint256 amount) external onlyOwner {
        payable(to).transfer(amount);
    }
}

File 2 of 4 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 3 of 4 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 4 of 4 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"address","name":"_liquidityPool","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_stakeStartTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fixedAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dynamicAPRMinCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dynamicAPRMaxCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dynamicAPRConstant","type":"uint256"}],"name":"APRParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"baseToken","type":"address"}],"name":"BaseTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsRemoved","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsPerFragment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalSupply","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"liquidityPool","type":"address"}],"name":"LiquidityPoolSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsPerFragment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalSupply","type":"uint256"}],"name":"Mint","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":"fixedAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dynamicAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebaseAPR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRebaseTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebaseCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supplyDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gonsPerFragment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentSupply","type":"uint256"}],"name":"Rebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rebaseInterval","type":"uint256"}],"name":"RebaseIntervalSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintedTokens","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stakeStartTime","type":"uint256"}],"name":"StakeStartTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stakeTax","type":"uint256"}],"name":"StakeTaxSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"treasury","type":"address"}],"name":"TreasurySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnedTokens","type":"uint256"}],"name":"Unstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"unstakeTax","type":"uint256"}],"name":"UnstakeTaxSet","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicAPRConstant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicAPRMaxCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicAPRMinCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyEthWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fixedAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDynamicAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFinalAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFixedAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gonsPerFragment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebaseInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fixedAPR","type":"uint256"},{"internalType":"uint256","name":"_dynamicAPRMinCap","type":"uint256"},{"internalType":"uint256","name":"_dynamicAPRMaxCap","type":"uint256"},{"internalType":"uint256","name":"_dynamicAPRConstant","type":"uint256"}],"name":"setAprParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"}],"name":"setBaseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityPool","type":"address"}],"name":"setLiquidityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rebaseInterval","type":"uint256"}],"name":"setRebaseInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeStartTime","type":"uint256"}],"name":"setStakeStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeTax","type":"uint256"}],"name":"setStakeTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unstakeTax","type":"uint256"}],"name":"setUnstakeTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_warmupPeriod","type":"uint256"}],"name":"setWarmupPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeTillNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"tokensDeductedForStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"tokensDeductedForUnstaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"tokensForAddressAtNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensAtNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensRewarded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warmupPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c0604052600f60809081526e47656e65736973205374616b696e6760881b60a05260019061002e9082610534565b5060408051808201909152600481526339a3a2a760e11b60208201526002906100579082610534565b506003805460ff191660121790556802b5e3af16b18800006006556801a055690d9db800006007556803cb71f51fc5580000600855670de0b6b3a7640000600955617080600a556101f4600b819055600c55633b9aca006011553480156100bc575f80fd5b50604051612b75380380612b758339810160408190526100db91610609565b338061010157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61010a816102ef565b5060038054610100600160a81b0319166101006001600160a01b0387811682029290921792839055600480546001600160a01b031990811688851617825560058054909116878516179055600d859055604080516318160ddd60e01b8152905192909404909216926318160ddd92818101926020929091908290030181865afa158015610199573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101bd9190610651565b6101cf90670de0b6b3a764000061067c565b601381905560128190556101e4905f196106a9565b6101ef905f196106bc565b6014819055601354610200916106cf565b60115561021530670de0b6b3a764000061033e565b603c6015556040516001600160a01b038516907f9ee7d7a42466d19669fb88ad7a5b03861d6abd7d2a681c83dd982207cfaeb370905f90a26040516001600160a01b038416907fe57f71636571365571c0eaeaeb54e1d9e0065804f056a57a2a29448524f7d18a905f90a26040516001600160a01b038316907f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f905f90a26040518181527fd1c4f5d3748426e79e1bbf9eef6e637b3b173e57084ada1e37330d9a31e06f759060200160405180910390a1505050506106f9565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166103945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016100f8565b5f601154826103a391906106e2565b905080600f5f8282546103b6919061067c565b925050819055508160105f8282546103ce919061067c565b90915550506001600160a01b0383165f90815260166020526040812080548392906103fa90849061067c565b909155505060115460105460408051858152602081018590529081019290925260608201526001600160a01b038416907f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa66699060800160405180910390a26040518281526001600160a01b038416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806104c457607f821691505b6020821081036104e257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561052f57805f5260205f20601f840160051c8101602085101561050d5750805b601f840160051c820191505b8181101561052c575f8155600101610519565b50505b505050565b81516001600160401b0381111561054d5761054d61049c565b6105618161055b84546104b0565b846104e8565b6020601f821160018114610593575f831561057c5750848201515b5f19600385901b1c1916600184901b17845561052c565b5f84815260208120601f198516915b828110156105c257878501518255602094850194600190920191016105a2565b50848210156105df57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b80516001600160a01b0381168114610604575f80fd5b919050565b5f805f806080858703121561061c575f80fd5b610625856105ee565b9350610633602086016105ee565b9250610641604086016105ee565b6060959095015193969295505050565b5f60208284031215610661575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561068f5761068f610668565b92915050565b634e487b7160e01b5f52601260045260245ffd5b5f826106b7576106b7610695565b500690565b8181038181111561068f5761068f610668565b5f826106dd576106dd610695565b500490565b808202811582820484141761068f5761068f610668565b61246f806107065f395ff3fe608060405234801561000f575f80fd5b5060043610610367575f3560e01c80637419f190116101c9578063c4968c9a116100fe578063dd62ed3e1161009e578063ecdd98be11610079578063ecdd98be146106ba578063ef037fb9146106c3578063f0f44260146106d6578063f2fde38b146106e9575f80fd5b8063dd62ed3e14610666578063deac361a1461069e578063e63ea408146106a7575f80fd5b8063cca1ef6e116100d9578063cca1ef6e1461062e578063d5abeb0114610641578063d5e1fc1f1461064a578063d9565b031461065d575f80fd5b8063c4968c9a146105fa578063c55dae6314610603578063cc1b63d51461061b575f80fd5b80639d0487bc11610169578063a85667c511610144578063a85667c5146105c4578063a9059cbb146105d7578063af14052c146105ea578063be8edf5c146105f2575f80fd5b80639d0487bc1461058b578063a4168bcf1461059e578063a694fc3a146105b1575f80fd5b806389edeb74116101a457806389edeb74146105575780638bd1d033146105605780638da5cb5b1461057357806395d89b4114610583575f80fd5b80637419f1901461053c5780637ed8f6531461054557806383e373b01461054e575f80fd5b80632e187a681161029f57806351d4a5801161023f578063663dcdbc1161021a578063663dcdbc14610506578063665a11ca1461050e57806370a0823114610521578063715018a614610534575f80fd5b806351d4a580146104ca578063529bed7f146104d357806361d027b3146104db575f80fd5b80634508a6cc1161027a5780634508a6cc1461049e57806345885bfe146104b15780634a7c4d18146104b95780634befa981146104c2575f80fd5b80632e187a681461046d57806330643c4114610476578063313ce5671461047f575f80fd5b806316bb6c131161030a5780631ad25ffb116102e55780631ad25ffb1461042057806323b872dd1461043f5780632986c0e5146104525780632e17de781461045a575f80fd5b806316bb6c13146103fc57806318160ddd1461040f5780631924063e14610417575f80fd5b8063095ea7b311610345578063095ea7b3146103b157806309bc773f146103d45780630f336d48146103eb578063118ab4e1146103f3575f80fd5b8063018770201461036b57806306fdde031461038057806307ec35a21461039e575b5f80fd5b61037e61037936600461210f565b6106fc565b005b61038861074d565b6040516103959190612128565b60405180910390f35b61037e6103ac36600461215d565b6107d9565b6103c46103bf366004612174565b61086b565b6040519015158152602001610395565b6103dd600b5481565b604051908152602001610395565b6103dd610881565b6103dd60065481565b61037e61040a36600461210f565b610a90565b6010546103dd565b6103dd600e5481565b6103dd61042e36600461210f565b60186020525f908152604090205481565b6103c461044d36600461219c565b610ae9565b6103dd610b97565b61037e61046836600461215d565b610ba6565b6103dd60105481565b6103dd60125481565b60035461048c9060ff1681565b60405160ff9091168152602001610395565b6103dd6104ac36600461215d565b610e53565b6006546103dd565b6103dd60095481565b6103dd610e77565b6103dd60075481565b6103dd610e8d565b6005546104ee906001600160a01b031681565b6040516001600160a01b039091168152602001610395565b6103dd610ecd565b6004546104ee906001600160a01b031681565b6103dd61052f36600461210f565b610ede565b61037e610f04565b6103dd600d5481565b6103dd60115481565b6103dd600c5481565b6103dd600a5481565b61037e61056e3660046121d6565b610f17565b5f546001600160a01b03166104ee565b610388610fd1565b61037e61059936600461215d565b610fde565b6103dd6105ac36600461215d565b611062565b61037e6105bf36600461215d565b611075565b61037e6105d236600461215d565b6112b0565b6103c46105e5366004612174565b611350565b61037e61135c565b6103dd61152c565b6103dd60145481565b6003546104ee9061010090046001600160a01b031681565b61037e61062936600461215d565b6115a1565b6103dd61063c36600461210f565b61162f565b6103dd60135481565b61037e610658366004612174565b61169d565b6103dd60085481565b6103dd610674366004612205565b6001600160a01b039182165f90815260176020908152604080832093909416825291909152205490565b6103dd60155481565b61037e6106b536600461219c565b6116dd565b6103dd600f5481565b61037e6106d136600461215d565b6117b3565b61037e6106e436600461210f565b6117f0565b61037e6106f736600461210f565b611841565b61070461187e565b600480546001600160a01b0319166001600160a01b0383169081179091556040517fe57f71636571365571c0eaeaeb54e1d9e0065804f056a57a2a29448524f7d18a905f90a250565b6001805461075a90612236565b80601f016020809104026020016040519081016040528092919081815260200182805461078690612236565b80156107d15780601f106107a8576101008083540402835291602001916107d1565b820191905f5260205f20905b8154815290600101906020018083116107b457829003601f168201915b505050505081565b6107e161187e565b6105dc81111561082f5760405162461bcd60e51b81526020600482015260146024820152730aadce6e8c2d6ca40e8c2f040e8dede40d0d2ced60631b60448201526064015b60405180910390fd5b600c8190556040518181527f9a094848248314ee3f45b23fdb2e11de1fc9715cd5391c24a64adcc415747f9c906020015b60405180910390a150565b5f6108773384846118aa565b5060015b92915050565b601054600354600480546040516370a0823160e01b81526001600160a01b03918216928101929092525f93928492610100909104909116906370a0823190602401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610901919061226e565b90505f81116109445760405162461bcd60e51b815260206004820152600f60248201526e4c502062616c616e6365207a65726f60881b6044820152606401610826565b5f600954116109955760405162461bcd60e51b815260206004820152601960248201527f44796e616d69632041505220636f6e7374616e74207a65726f000000000000006044820152606401610826565b5f816109a9670de0b6b3a764000085612299565b6109b391906122c4565b90506109c8670de0b6b3a7640000600a612299565b8111156109e5576109e2670de0b6b3a7640000600a612299565b90505b5f670de0b6b3a7640000600954836109fd9190612299565b610a0791906122c4565b90505f610a1c82670de0b6b3a76400006122d7565b90505f610a28826119ce565b90505f610a42600954600a610a3d9190612299565b6119ce565b82600754600854610a5391906122ea565b610a5d9190612299565b610a6791906122c4565b600854610a7491906122ea565b9050600754811015610a8557506007545b979650505050505050565b610a9861187e565b60038054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517f9ee7d7a42466d19669fb88ad7a5b03861d6abd7d2a681c83dd982207cfaeb370905f90a250565b6001600160a01b0383165f90815260176020908152604080832033845290915281205482811015610b6d5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610826565b610b78858585611ae1565b610b8c8533610b8786856122ea565b6118aa565b506001949350505050565b5f610ba130610ede565b905090565b601554335f90815260186020526040902054610bc290426122ea565b1015610c095760405162461bcd60e51b81526020600482015260166024820152752bb0b936bab8103832b934b7b2103737ba1037bb32b960511b6044820152606401610826565b610c1161135c565b5f60115482610c209190612299565b335f90815260166020526040902054909150811115610c785760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610826565b610c823383611def565b6003546040516340c10f1960e01b8152306004820152602481018490526101009091046001600160a01b0316906340c10f19906044015f604051808303815f87803b158015610ccf575f80fd5b505af1158015610ce1573d5f803e3d5ffd5b505050505f612710600c5484610cf79190612299565b610d0191906122c4565b90505f610d0e82856122ea565b60035460405163a9059cbb60e01b81523360048201526024810183905291925061010090046001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015610d62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8691906122fd565b508115610e0a5760035460055460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101859052610100909204169063a9059cbb906044016020604051808303815f875af1158015610de4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0891906122fd565b505b604080518581526020810184905290810182905233907ffbd65cfd6de1493db337385c0712095397ecbd0504df64b861cdfceb80c7b4229060600160405180910390a250505050565b5f80612710600c5484610e669190612299565b610e7091906122c4565b9392505050565b5f610e80610881565b600654610ba191906122d7565b5f600d54421015610ea65742600d54610ba191906122ea565b600a54600d54610eb690426122ea565b610ec0919061231c565b600a54610ba191906122ea565b5f601254601354610ba191906122ea565b6011546001600160a01b0382165f90815260166020526040812054909161087b916122c4565b610f0c61187e565b610f155f611f4f565b565b610f1f61187e565b81831115610f6f5760405162461bcd60e51b815260206004820152601b60248201527f4d696e2063617020686967686572207468616e206d61782063617000000000006044820152606401610826565b60068490556007839055600882905560098190556040805185815260208101859052908101839052606081018290527f56868216d91d6464abc5e886219763832e60a15138e4b9b39622e814215ccc7c9060800160405180910390a150505050565b6002805461075a90612236565b610fe661187e565b6101f481111561102d5760405162461bcd60e51b81526020600482015260126024820152710a6e8c2d6ca40e8c2f040e8dede40d0d2ced60731b6044820152606401610826565b600b8190556040518181527f6c994dc858e5a5188d7777e7e8b12d2d8a21f3a28c8fccaaa98c166215da99e490602001610860565b5f80612710600b5484610e669190612299565b61107d61135c565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526101009091046001600160a01b0316906323b872dd906064016020604051808303815f875af11580156110d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f991906122fd565b6111375760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610826565b5f612710600b54836111499190612299565b61115391906122c4565b90505f61116082846122ea565b600354604051630852cd8d60e31b81526004810183905291925061010090046001600160a01b0316906342966c68906024015f604051808303815f87803b1580156111a9575f80fd5b505af11580156111bb573d5f803e3d5ffd5b505050505f8211156112445760035460055460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101859052610100909204169063a9059cbb906044016020604051808303815f875af115801561121e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124291906122fd565b505b61124e3382611f9e565b6015541561126857335f9081526018602052604090204290555b604080518481526020810184905290810182905233907ff556991011e831bcfac4f406d547e5e32cdd98267efab83935230d5f8d02c4469060600160405180910390a2505050565b6112b861187e565b5f81116112ff5760405162461bcd60e51b81526020600482015260156024820152745761726d757020706572696f6420746f6f206c6f7760581b6044820152606401610826565b6201518081111561134b5760405162461bcd60e51b81526020600482015260166024820152750aec2e4daeae040e0cae4d2dec840e8dede40d0d2ced60531b6044820152606401610826565b601555565b5f610877338484611ae1565b600d5442101561136857565b5f80600e541161137a57600d5461137e565b600e545b90505f600a54824261139091906122ea565b61139a91906122c4565b9050805f036113a7575050565b5f6113b160065490565b90505f6113bc610881565b90505f6113c982846122d7565b90505f600a546301e133806113de91906122c4565b90505f6113eb82846122c4565b90505f6064670de0b6b3a7640000836013546114079190612299565b61141191906122c4565b61141b91906122c4565b9050805f036114495786600a546114329190612299565b61143c90896122d7565b600e555050505050505050565b60135481111561145857506013545b8060135f82825461146991906122d7565b909155505060135460145461147e91906122c4565b6011819055600f5461149091906122c4565b601055600a546114a1908890612299565b6114ab90896122d7565b600e55601354601154601054604080518a8152602081018a9052808201879052606081018d9052608081018c905260a081019490945260c0840185905260e0840192909252610100830152517f82ec6dc57ebf74c563b660545554cb4bb01fc6e3e89020f8f47dd324e64eeaf4918190036101200190a15050505050505050565b5f8061153760065490565b90505f611542610881565b90505f61154f82846122d7565b90505f600a546301e1338061156491906122c4565b90505f61157182846122c4565b90505f6064670de0b6b3a76400008360105461158d9190612299565b61159791906122c4565b610a8591906122c4565b6115a961187e565b600d5442106115fa5760405162461bcd60e51b815260206004820152601760248201527f5374616b696e6720616c726561647920737461727465640000000000000000006044820152606401610826565b600d8190556040518181527fd1c4f5d3748426e79e1bbf9eef6e637b3b173e57084ada1e37330d9a31e06f7590602001610860565b5f8061163961152c565b90505f61164584610ede565b90505f601054670de0b6b3a76400008361165f9190612299565b61166991906122c4565b90506064670de0b6b3a76400006116808386612299565b61168a91906122c4565b61169491906122c4565b95945050505050565b6116a561187e565b6040516001600160a01b0383169082156108fc029083905f818181858888f193505050501580156116d8573d5f803e3d5ffd5b505050565b6116e561187e565b306001600160a01b0384160361173d5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207769746864726177207374616b696e6720746f6b656e0000006044820152606401610826565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611789573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ad91906122fd565b50505050565b6117bb61187e565b600a8190556040518181527fa0df1b641bcb350bfc38973452497c08c1314b4788866ea2c6eaab659573df2490602001610860565b6117f861187e565b600580546001600160a01b0319166001600160a01b0383169081179091556040517f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f905f90a250565b61184961187e565b6001600160a01b03811661187257604051631e4fbdf760e01b81525f6004820152602401610826565b61187b81611f4f565b50565b5f546001600160a01b03163314610f155760405163118cdaa760e01b8152336004820152602401610826565b6001600160a01b03831661190c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610826565b6001600160a01b03821661196d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610826565b6001600160a01b038381165f8181526017602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f808211611a095760405162461bcd60e51b81526020600482015260086024820152674c6f67207a65726f60c01b6044820152606401610826565b5f5b611a1e670de0b6b3a7640000600a612299565b8310611a4a57611a2f600a846122c4565b9250611a43670de0b6b3a7640000826122d7565b9050611a0b565b5f5b60128160ff161015611ada57670de0b6b3a7640000611a6b8580612299565b611a7591906122c4565b9350611a8a670de0b6b3a7640000600a612299565b8410611ad257611a9b600a856122c4565b9350611aa881600161232f565b611ab390600261242b565b611ac590670de0b6b3a76400006122c4565b611acf90836122d7565b91505b600101611a4c565b5092915050565b6001600160a01b038316611b455760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610826565b6001600160a01b038216611ba75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610826565b601154611bb49082612299565b6001600160a01b0384165f908152601660205260409020541015611c295760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610826565b6001600160a01b0383161580611c4857506001600160a01b0382163014155b611ca05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f207374616b696e6720636f6e74726044820152621858dd60ea1b6064820152608401610826565b611ca861135c565b5f61271082600c54600b54611cbd91906122d7565b611cc79190612299565b611cd191906122c4565b90505f611cde82846122ea565b90505f60115482611cef9190612299565b90505f60115484611d009190612299565b9050611d0c81836122d7565b6001600160a01b0388165f9081526016602052604081208054909190611d339084906122ea565b90915550506001600160a01b0386165f9081526016602052604081208054849290611d5f9084906122d7565b90915550508015611d99576005546001600160a01b03165f9081526016602052604081208054839290611d939084906122d7565b90915550505b856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051611dde91815260200190565b60405180910390a350505050505050565b6001600160a01b038216611e4f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610826565b5f60115482611e5e9190612299565b905080600f5f828254611e7191906122ea565b925050819055508160105f828254611e8991906122ea565b90915550506001600160a01b0383165f9081526016602052604081208054839290611eb59084906122ea565b909155505060115460105460408051858152602081018590529081019290925260608201526001600160a01b038416907f4d667732637549615f3cd28023b13380094dd975c0ac7c1b26916a8b1363b7ec9060800160405180910390a26040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016119c1565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216611ff45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610826565b5f601154826120039190612299565b905080600f5f82825461201691906122d7565b925050819055508160105f82825461202e91906122d7565b90915550506001600160a01b0383165f908152601660205260408120805483929061205a9084906122d7565b909155505060115460105460408051858152602081018590529081019290925260608201526001600160a01b038416907f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa66699060800160405180910390a26040518281526001600160a01b038416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016119c1565b80356001600160a01b038116811461210a575f80fd5b919050565b5f6020828403121561211f575f80fd5b610e70826120f4565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561216d575f80fd5b5035919050565b5f8060408385031215612185575f80fd5b61218e836120f4565b946020939093013593505050565b5f805f606084860312156121ae575f80fd5b6121b7846120f4565b92506121c5602085016120f4565b929592945050506040919091013590565b5f805f80608085870312156121e9575f80fd5b5050823594602084013594506040840135936060013592509050565b5f8060408385031215612216575f80fd5b61221f836120f4565b915061222d602084016120f4565b90509250929050565b600181811c9082168061224a57607f821691505b60208210810361226857634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561227e575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761087b5761087b612285565b634e487b7160e01b5f52601260045260245ffd5b5f826122d2576122d26122b0565b500490565b8082018082111561087b5761087b612285565b8181038181111561087b5761087b612285565b5f6020828403121561230d575f80fd5b81518015158114610e70575f80fd5b5f8261232a5761232a6122b0565b500690565b60ff818116838216019081111561087b5761087b612285565b6001815b60018411156123835780850481111561236757612367612285565b600184161561237557908102905b60019390931c92800261234c565b935093915050565b5f826123995750600161087b565b816123a557505f61087b565b81600181146123bb57600281146123c5576123e1565b600191505061087b565b60ff8411156123d6576123d6612285565b50506001821b61087b565b5060208310610133831016604e8410600b8410161715612404575081810a61087b565b6124105f198484612348565b805f190482111561242357612423612285565b029392505050565b5f610e7060ff84168361238b56fea264697066735822122003b4b213befa6deb16930713ccee489ace9097411f30b8e73c7bb3c49a43411a64736f6c634300081a003300000000000000000000000099999999999997fceb5549c58ab66df52385ca4d000000000000000000000000a93e7cd5dd6d228e67cbfdcb5523d4346c312b8700000000000000000000000031b6a4dca90fabf29879143ca5bb2c10e8a11e4c00000000000000000000000000000000000000000000000000000000667f3260

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610367575f3560e01c80637419f190116101c9578063c4968c9a116100fe578063dd62ed3e1161009e578063ecdd98be11610079578063ecdd98be146106ba578063ef037fb9146106c3578063f0f44260146106d6578063f2fde38b146106e9575f80fd5b8063dd62ed3e14610666578063deac361a1461069e578063e63ea408146106a7575f80fd5b8063cca1ef6e116100d9578063cca1ef6e1461062e578063d5abeb0114610641578063d5e1fc1f1461064a578063d9565b031461065d575f80fd5b8063c4968c9a146105fa578063c55dae6314610603578063cc1b63d51461061b575f80fd5b80639d0487bc11610169578063a85667c511610144578063a85667c5146105c4578063a9059cbb146105d7578063af14052c146105ea578063be8edf5c146105f2575f80fd5b80639d0487bc1461058b578063a4168bcf1461059e578063a694fc3a146105b1575f80fd5b806389edeb74116101a457806389edeb74146105575780638bd1d033146105605780638da5cb5b1461057357806395d89b4114610583575f80fd5b80637419f1901461053c5780637ed8f6531461054557806383e373b01461054e575f80fd5b80632e187a681161029f57806351d4a5801161023f578063663dcdbc1161021a578063663dcdbc14610506578063665a11ca1461050e57806370a0823114610521578063715018a614610534575f80fd5b806351d4a580146104ca578063529bed7f146104d357806361d027b3146104db575f80fd5b80634508a6cc1161027a5780634508a6cc1461049e57806345885bfe146104b15780634a7c4d18146104b95780634befa981146104c2575f80fd5b80632e187a681461046d57806330643c4114610476578063313ce5671461047f575f80fd5b806316bb6c131161030a5780631ad25ffb116102e55780631ad25ffb1461042057806323b872dd1461043f5780632986c0e5146104525780632e17de781461045a575f80fd5b806316bb6c13146103fc57806318160ddd1461040f5780631924063e14610417575f80fd5b8063095ea7b311610345578063095ea7b3146103b157806309bc773f146103d45780630f336d48146103eb578063118ab4e1146103f3575f80fd5b8063018770201461036b57806306fdde031461038057806307ec35a21461039e575b5f80fd5b61037e61037936600461210f565b6106fc565b005b61038861074d565b6040516103959190612128565b60405180910390f35b61037e6103ac36600461215d565b6107d9565b6103c46103bf366004612174565b61086b565b6040519015158152602001610395565b6103dd600b5481565b604051908152602001610395565b6103dd610881565b6103dd60065481565b61037e61040a36600461210f565b610a90565b6010546103dd565b6103dd600e5481565b6103dd61042e36600461210f565b60186020525f908152604090205481565b6103c461044d36600461219c565b610ae9565b6103dd610b97565b61037e61046836600461215d565b610ba6565b6103dd60105481565b6103dd60125481565b60035461048c9060ff1681565b60405160ff9091168152602001610395565b6103dd6104ac36600461215d565b610e53565b6006546103dd565b6103dd60095481565b6103dd610e77565b6103dd60075481565b6103dd610e8d565b6005546104ee906001600160a01b031681565b6040516001600160a01b039091168152602001610395565b6103dd610ecd565b6004546104ee906001600160a01b031681565b6103dd61052f36600461210f565b610ede565b61037e610f04565b6103dd600d5481565b6103dd60115481565b6103dd600c5481565b6103dd600a5481565b61037e61056e3660046121d6565b610f17565b5f546001600160a01b03166104ee565b610388610fd1565b61037e61059936600461215d565b610fde565b6103dd6105ac36600461215d565b611062565b61037e6105bf36600461215d565b611075565b61037e6105d236600461215d565b6112b0565b6103c46105e5366004612174565b611350565b61037e61135c565b6103dd61152c565b6103dd60145481565b6003546104ee9061010090046001600160a01b031681565b61037e61062936600461215d565b6115a1565b6103dd61063c36600461210f565b61162f565b6103dd60135481565b61037e610658366004612174565b61169d565b6103dd60085481565b6103dd610674366004612205565b6001600160a01b039182165f90815260176020908152604080832093909416825291909152205490565b6103dd60155481565b61037e6106b536600461219c565b6116dd565b6103dd600f5481565b61037e6106d136600461215d565b6117b3565b61037e6106e436600461210f565b6117f0565b61037e6106f736600461210f565b611841565b61070461187e565b600480546001600160a01b0319166001600160a01b0383169081179091556040517fe57f71636571365571c0eaeaeb54e1d9e0065804f056a57a2a29448524f7d18a905f90a250565b6001805461075a90612236565b80601f016020809104026020016040519081016040528092919081815260200182805461078690612236565b80156107d15780601f106107a8576101008083540402835291602001916107d1565b820191905f5260205f20905b8154815290600101906020018083116107b457829003601f168201915b505050505081565b6107e161187e565b6105dc81111561082f5760405162461bcd60e51b81526020600482015260146024820152730aadce6e8c2d6ca40e8c2f040e8dede40d0d2ced60631b60448201526064015b60405180910390fd5b600c8190556040518181527f9a094848248314ee3f45b23fdb2e11de1fc9715cd5391c24a64adcc415747f9c906020015b60405180910390a150565b5f6108773384846118aa565b5060015b92915050565b601054600354600480546040516370a0823160e01b81526001600160a01b03918216928101929092525f93928492610100909104909116906370a0823190602401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610901919061226e565b90505f81116109445760405162461bcd60e51b815260206004820152600f60248201526e4c502062616c616e6365207a65726f60881b6044820152606401610826565b5f600954116109955760405162461bcd60e51b815260206004820152601960248201527f44796e616d69632041505220636f6e7374616e74207a65726f000000000000006044820152606401610826565b5f816109a9670de0b6b3a764000085612299565b6109b391906122c4565b90506109c8670de0b6b3a7640000600a612299565b8111156109e5576109e2670de0b6b3a7640000600a612299565b90505b5f670de0b6b3a7640000600954836109fd9190612299565b610a0791906122c4565b90505f610a1c82670de0b6b3a76400006122d7565b90505f610a28826119ce565b90505f610a42600954600a610a3d9190612299565b6119ce565b82600754600854610a5391906122ea565b610a5d9190612299565b610a6791906122c4565b600854610a7491906122ea565b9050600754811015610a8557506007545b979650505050505050565b610a9861187e565b60038054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517f9ee7d7a42466d19669fb88ad7a5b03861d6abd7d2a681c83dd982207cfaeb370905f90a250565b6001600160a01b0383165f90815260176020908152604080832033845290915281205482811015610b6d5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610826565b610b78858585611ae1565b610b8c8533610b8786856122ea565b6118aa565b506001949350505050565b5f610ba130610ede565b905090565b601554335f90815260186020526040902054610bc290426122ea565b1015610c095760405162461bcd60e51b81526020600482015260166024820152752bb0b936bab8103832b934b7b2103737ba1037bb32b960511b6044820152606401610826565b610c1161135c565b5f60115482610c209190612299565b335f90815260166020526040902054909150811115610c785760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610826565b610c823383611def565b6003546040516340c10f1960e01b8152306004820152602481018490526101009091046001600160a01b0316906340c10f19906044015f604051808303815f87803b158015610ccf575f80fd5b505af1158015610ce1573d5f803e3d5ffd5b505050505f612710600c5484610cf79190612299565b610d0191906122c4565b90505f610d0e82856122ea565b60035460405163a9059cbb60e01b81523360048201526024810183905291925061010090046001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015610d62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8691906122fd565b508115610e0a5760035460055460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101859052610100909204169063a9059cbb906044016020604051808303815f875af1158015610de4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0891906122fd565b505b604080518581526020810184905290810182905233907ffbd65cfd6de1493db337385c0712095397ecbd0504df64b861cdfceb80c7b4229060600160405180910390a250505050565b5f80612710600c5484610e669190612299565b610e7091906122c4565b9392505050565b5f610e80610881565b600654610ba191906122d7565b5f600d54421015610ea65742600d54610ba191906122ea565b600a54600d54610eb690426122ea565b610ec0919061231c565b600a54610ba191906122ea565b5f601254601354610ba191906122ea565b6011546001600160a01b0382165f90815260166020526040812054909161087b916122c4565b610f0c61187e565b610f155f611f4f565b565b610f1f61187e565b81831115610f6f5760405162461bcd60e51b815260206004820152601b60248201527f4d696e2063617020686967686572207468616e206d61782063617000000000006044820152606401610826565b60068490556007839055600882905560098190556040805185815260208101859052908101839052606081018290527f56868216d91d6464abc5e886219763832e60a15138e4b9b39622e814215ccc7c9060800160405180910390a150505050565b6002805461075a90612236565b610fe661187e565b6101f481111561102d5760405162461bcd60e51b81526020600482015260126024820152710a6e8c2d6ca40e8c2f040e8dede40d0d2ced60731b6044820152606401610826565b600b8190556040518181527f6c994dc858e5a5188d7777e7e8b12d2d8a21f3a28c8fccaaa98c166215da99e490602001610860565b5f80612710600b5484610e669190612299565b61107d61135c565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526101009091046001600160a01b0316906323b872dd906064016020604051808303815f875af11580156110d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f991906122fd565b6111375760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610826565b5f612710600b54836111499190612299565b61115391906122c4565b90505f61116082846122ea565b600354604051630852cd8d60e31b81526004810183905291925061010090046001600160a01b0316906342966c68906024015f604051808303815f87803b1580156111a9575f80fd5b505af11580156111bb573d5f803e3d5ffd5b505050505f8211156112445760035460055460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101859052610100909204169063a9059cbb906044016020604051808303815f875af115801561121e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124291906122fd565b505b61124e3382611f9e565b6015541561126857335f9081526018602052604090204290555b604080518481526020810184905290810182905233907ff556991011e831bcfac4f406d547e5e32cdd98267efab83935230d5f8d02c4469060600160405180910390a2505050565b6112b861187e565b5f81116112ff5760405162461bcd60e51b81526020600482015260156024820152745761726d757020706572696f6420746f6f206c6f7760581b6044820152606401610826565b6201518081111561134b5760405162461bcd60e51b81526020600482015260166024820152750aec2e4daeae040e0cae4d2dec840e8dede40d0d2ced60531b6044820152606401610826565b601555565b5f610877338484611ae1565b600d5442101561136857565b5f80600e541161137a57600d5461137e565b600e545b90505f600a54824261139091906122ea565b61139a91906122c4565b9050805f036113a7575050565b5f6113b160065490565b90505f6113bc610881565b90505f6113c982846122d7565b90505f600a546301e133806113de91906122c4565b90505f6113eb82846122c4565b90505f6064670de0b6b3a7640000836013546114079190612299565b61141191906122c4565b61141b91906122c4565b9050805f036114495786600a546114329190612299565b61143c90896122d7565b600e555050505050505050565b60135481111561145857506013545b8060135f82825461146991906122d7565b909155505060135460145461147e91906122c4565b6011819055600f5461149091906122c4565b601055600a546114a1908890612299565b6114ab90896122d7565b600e55601354601154601054604080518a8152602081018a9052808201879052606081018d9052608081018c905260a081019490945260c0840185905260e0840192909252610100830152517f82ec6dc57ebf74c563b660545554cb4bb01fc6e3e89020f8f47dd324e64eeaf4918190036101200190a15050505050505050565b5f8061153760065490565b90505f611542610881565b90505f61154f82846122d7565b90505f600a546301e1338061156491906122c4565b90505f61157182846122c4565b90505f6064670de0b6b3a76400008360105461158d9190612299565b61159791906122c4565b610a8591906122c4565b6115a961187e565b600d5442106115fa5760405162461bcd60e51b815260206004820152601760248201527f5374616b696e6720616c726561647920737461727465640000000000000000006044820152606401610826565b600d8190556040518181527fd1c4f5d3748426e79e1bbf9eef6e637b3b173e57084ada1e37330d9a31e06f7590602001610860565b5f8061163961152c565b90505f61164584610ede565b90505f601054670de0b6b3a76400008361165f9190612299565b61166991906122c4565b90506064670de0b6b3a76400006116808386612299565b61168a91906122c4565b61169491906122c4565b95945050505050565b6116a561187e565b6040516001600160a01b0383169082156108fc029083905f818181858888f193505050501580156116d8573d5f803e3d5ffd5b505050565b6116e561187e565b306001600160a01b0384160361173d5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207769746864726177207374616b696e6720746f6b656e0000006044820152606401610826565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611789573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ad91906122fd565b50505050565b6117bb61187e565b600a8190556040518181527fa0df1b641bcb350bfc38973452497c08c1314b4788866ea2c6eaab659573df2490602001610860565b6117f861187e565b600580546001600160a01b0319166001600160a01b0383169081179091556040517f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f905f90a250565b61184961187e565b6001600160a01b03811661187257604051631e4fbdf760e01b81525f6004820152602401610826565b61187b81611f4f565b50565b5f546001600160a01b03163314610f155760405163118cdaa760e01b8152336004820152602401610826565b6001600160a01b03831661190c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610826565b6001600160a01b03821661196d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610826565b6001600160a01b038381165f8181526017602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f808211611a095760405162461bcd60e51b81526020600482015260086024820152674c6f67207a65726f60c01b6044820152606401610826565b5f5b611a1e670de0b6b3a7640000600a612299565b8310611a4a57611a2f600a846122c4565b9250611a43670de0b6b3a7640000826122d7565b9050611a0b565b5f5b60128160ff161015611ada57670de0b6b3a7640000611a6b8580612299565b611a7591906122c4565b9350611a8a670de0b6b3a7640000600a612299565b8410611ad257611a9b600a856122c4565b9350611aa881600161232f565b611ab390600261242b565b611ac590670de0b6b3a76400006122c4565b611acf90836122d7565b91505b600101611a4c565b5092915050565b6001600160a01b038316611b455760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610826565b6001600160a01b038216611ba75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610826565b601154611bb49082612299565b6001600160a01b0384165f908152601660205260409020541015611c295760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610826565b6001600160a01b0383161580611c4857506001600160a01b0382163014155b611ca05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f207374616b696e6720636f6e74726044820152621858dd60ea1b6064820152608401610826565b611ca861135c565b5f61271082600c54600b54611cbd91906122d7565b611cc79190612299565b611cd191906122c4565b90505f611cde82846122ea565b90505f60115482611cef9190612299565b90505f60115484611d009190612299565b9050611d0c81836122d7565b6001600160a01b0388165f9081526016602052604081208054909190611d339084906122ea565b90915550506001600160a01b0386165f9081526016602052604081208054849290611d5f9084906122d7565b90915550508015611d99576005546001600160a01b03165f9081526016602052604081208054839290611d939084906122d7565b90915550505b856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051611dde91815260200190565b60405180910390a350505050505050565b6001600160a01b038216611e4f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610826565b5f60115482611e5e9190612299565b905080600f5f828254611e7191906122ea565b925050819055508160105f828254611e8991906122ea565b90915550506001600160a01b0383165f9081526016602052604081208054839290611eb59084906122ea565b909155505060115460105460408051858152602081018590529081019290925260608201526001600160a01b038416907f4d667732637549615f3cd28023b13380094dd975c0ac7c1b26916a8b1363b7ec9060800160405180910390a26040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016119c1565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216611ff45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610826565b5f601154826120039190612299565b905080600f5f82825461201691906122d7565b925050819055508160105f82825461202e91906122d7565b90915550506001600160a01b0383165f908152601660205260408120805483929061205a9084906122d7565b909155505060115460105460408051858152602081018590529081019290925260608201526001600160a01b038416907f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa66699060800160405180910390a26040518281526001600160a01b038416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016119c1565b80356001600160a01b038116811461210a575f80fd5b919050565b5f6020828403121561211f575f80fd5b610e70826120f4565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561216d575f80fd5b5035919050565b5f8060408385031215612185575f80fd5b61218e836120f4565b946020939093013593505050565b5f805f606084860312156121ae575f80fd5b6121b7846120f4565b92506121c5602085016120f4565b929592945050506040919091013590565b5f805f80608085870312156121e9575f80fd5b5050823594602084013594506040840135936060013592509050565b5f8060408385031215612216575f80fd5b61221f836120f4565b915061222d602084016120f4565b90509250929050565b600181811c9082168061224a57607f821691505b60208210810361226857634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561227e575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761087b5761087b612285565b634e487b7160e01b5f52601260045260245ffd5b5f826122d2576122d26122b0565b500490565b8082018082111561087b5761087b612285565b8181038181111561087b5761087b612285565b5f6020828403121561230d575f80fd5b81518015158114610e70575f80fd5b5f8261232a5761232a6122b0565b500690565b60ff818116838216019081111561087b5761087b612285565b6001815b60018411156123835780850481111561236757612367612285565b600184161561237557908102905b60019390931c92800261234c565b935093915050565b5f826123995750600161087b565b816123a557505f61087b565b81600181146123bb57600281146123c5576123e1565b600191505061087b565b60ff8411156123d6576123d6612285565b50506001821b61087b565b5060208310610133831016604e8410600b8410161715612404575081810a61087b565b6124105f198484612348565b805f190482111561242357612423612285565b029392505050565b5f610e7060ff84168361238b56fea264697066735822122003b4b213befa6deb16930713ccee489ace9097411f30b8e73c7bb3c49a43411a64736f6c634300081a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000099999999999997fceb5549c58ab66df52385ca4d000000000000000000000000a93e7cd5dd6d228e67cbfdcb5523d4346c312b8700000000000000000000000031b6a4dca90fabf29879143ca5bb2c10e8a11e4c00000000000000000000000000000000000000000000000000000000667f3260

-----Decoded View---------------
Arg [0] : _baseToken (address): 0x99999999999997fceB5549c58aB66dF52385ca4d
Arg [1] : _liquidityPool (address): 0xa93E7cd5Dd6d228e67cbFdcb5523D4346c312B87
Arg [2] : _treasury (address): 0x31B6A4DCA90FABf29879143CA5bB2c10E8A11e4c
Arg [3] : _stakeStartTime (uint256): 1719612000

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000099999999999997fceb5549c58ab66df52385ca4d
Arg [1] : 000000000000000000000000a93e7cd5dd6d228e67cbfdcb5523d4346c312b87
Arg [2] : 00000000000000000000000031b6a4dca90fabf29879143ca5bb2c10e8a11e4c
Arg [3] : 00000000000000000000000000000000000000000000000000000000667f3260


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.