ETH Price: $2,291.29 (-5.38%)

Token

Sealed Dyson Sphere (sDYSN)

Overview

Max Total Supply

5,389,315.129876081863834562 sDYSN

Holders

676

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.853514915716783925 sDYSN

Value
$0.00
0x38c2f4836ba06bc94db27298f3e831059e58b7c3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

sDYSON is an ERC20 contract for Staked $DYSON, supporting cross-chain transfers.

Contract Source Code Verified (Exact Match)

Contract Name:
sDYSON

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : sDYSON.sol
pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-3.0-only

import "./lib/ABDKMath64x64.sol";
import "./lib/TransferHelper.sol";
import "./interface/IsDYSONUpgradeReceiver.sol";

contract StakingRateModel {
    using ABDKMath64x64 for *;

    uint public immutable initialTime;
    uint public immutable initialRate;

    /// @dev `_initialRate` is the expected initial rate divided by 16
    /// For example, if expected initial rate is 1, i.e., STAKING_RATE_BASE_UNIT
    /// then `_initialRate` passed in would be STAKING_RATE_BASE_UNIT / 16
    constructor(uint _initialRate) {
        initialTime = block.timestamp;
        initialRate = _initialRate;
    }

    /// @notice Base on `lockDuration` plus time since inital time, calculate the expected staking rate.
    /// Note that `lockDuration` must be greater than 30 minutes and less and 4 years (1 year = 365.25 days)
    /// Formula to calculate staking rate:
    /// `initialRate` * 2^((`lockDuration` + time_since_initial_time) / 1 year)
    /// @param lockDuration Duration to lock DYSON
    /// @return rate Staking rate
    function stakingRate(uint lockDuration) external view returns (uint rate) {
        if(lockDuration < 30 minutes) return 0;
        if(lockDuration > 1461 days) return 0;
        lockDuration = lockDuration + block.timestamp - initialTime;

        int128 lockPeriod = lockDuration.divu(365.25 days);
        int128 r = lockPeriod.exp_2();
        rate = r.mulu(initialRate);
    }
}

contract sDYSON {
    using TransferHelper for address;

    struct Vault {
        uint dysonAmount;
        uint sDysonAmount;
        uint unlockTime;
    }

    /// @dev For EIP-2612 permit
    bytes32 public immutable DOMAIN_SEPARATOR;
    /// @dev keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    /// @dev Max staking rate
    uint private constant STAKING_RATE_BASE_UNIT = 1e18;
    uint private constant MAX_MINT_AMOUNT_LIMIT = 2**255;
    string public constant symbol = "sDYSN";
    string public constant name = "Sealed Dyson Sphere";
    uint8 public constant decimals = 18;
    address public immutable Dyson;
    /// @dev bytes4(keccak256("onMigrationReceived(address,uint256,uint256,uint256)"))
    bytes4 private constant _MIGRATE_RECEIVED = 0xd4fb1792;

    address public owner;
    /// @dev Migration contract for user to migrate to new staking contract
    address public migration;
    uint public totalSupply;
    int256 public unbackedSupply;
    int256 public unbackedSupplyCap;

    StakingRateModel public currentModel;

    mapping(address => bool) public isMinter;
    /// @notice User's sDyson amount
    mapping(address => uint) public balanceOf;
    /// @notice User's sDYSON allowance for spender
    mapping(address => mapping(address => uint)) public allowance;
    /// @notice User's vault, indexed by number
    mapping(address => mapping(uint => Vault)) public vaults;
    /// @notice Number of vaults owned by user
    mapping(address => uint) public vaultCount;
    /// @notice Sum of dyson amount in all of user's current vaults
    mapping(address => uint) public dysonAmountStaked;
    /// @notice Sum of sDYSON amount in all of user's current vaults
    mapping(address => uint) public votingPower;

    /// @notice User's permit nonce
    mapping(address => uint256) public nonces;

    event TransferOwnership(address newOwner);
    event Transfer(address indexed from, address indexed to, uint amount);
    event Approval(address indexed owner, address indexed spender, uint amount);
    event Stake(address indexed vaultOwner, address indexed depositor, uint amount, uint sDysonAmount, uint time);
    event Restake(address indexed vaultOwner, uint index, uint dysonAmountAdded, uint sDysonAmountAdded, uint time);
    event Unstake(address indexed vaultOwner, address indexed receiver, uint amount, uint sDysonAmount);
    event Migrate(address indexed vaultOwner, uint index);

    constructor(address _owner, address dyson) {
        require(_owner != address(0), "owner cannot be zero");
        require(dyson != address(0), "dyson cannot be zero");
        owner = _owner;
        Dyson = dyson;

        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                chainId,
                address(this)
            )
        );
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "forbidden");
        _;
    }

    function transferOwnership(address _owner) external onlyOwner {
        require(_owner != address(0), "owner cannot be zero");
        owner = _owner;

        emit TransferOwnership(_owner);
    }

    function addMinter(address _minter) external onlyOwner {
        isMinter[_minter] = true;
    }

    function removeMinter(address _minter) external onlyOwner {
        isMinter[_minter] = false;
    }

    function setUnbackedSupplyCap(int256 _unbackedSupplyCap) external onlyOwner {
        unbackedSupplyCap = _unbackedSupplyCap;
    }

    function approve(address spender, uint amount) external returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function _approve(
        address _owner,
        address _spender,
        uint256 _amount
    ) internal virtual {
        require(_owner != address(0), "ERC20: approve from the zero address");
        require(_spender != address(0), "ERC20: approve to the zero address");

        allowance[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
    }

    /// @dev Mint sDYSON
    function _mint(address to, uint amount) internal returns (bool) {
        balanceOf[to] += amount;
        totalSupply += amount;
        emit Transfer(address(0), to, amount);
        return true;
    }

    /// @dev Burn sDYSON
    function _burn(address from, uint amount) internal returns (bool) {
        balanceOf[from] -= amount;
        totalSupply -= amount;
        emit Transfer(from, address(0), amount);
        return true;
    }

    function _transfer(address from, address to, uint amount) internal returns (bool) {
        balanceOf[from] -= amount;
        balanceOf[to] += amount;
        emit Transfer(from, to, amount);
        return true;
    }

    function transfer(address to, uint amount) external returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    function transferFrom(address from, address to, uint amount) external returns (bool) {
        if (allowance[from][msg.sender] != type(uint).max) {
            allowance[from][msg.sender] -= amount;
        }
        return _transfer(from, to, amount);
    }

    /// @notice Get staking rate
    /// @param lockDuration Duration to lock Dyson
    /// @return rate Staking rate
    function getStakingRate(uint lockDuration) public view returns (uint rate) {
        return currentModel.stakingRate(lockDuration);
    }

    /// @param newModel New StakingRateModel
    function setStakingRateModel(address newModel) external onlyOwner {
        currentModel = StakingRateModel(newModel);
    }

    /// @param _migration New Migration contract
    function setMigration(address _migration) external onlyOwner {
        migration = _migration;
    }

    // mint unbacked sDYSN
    function mint(address to, uint amount) external returns (bool) {
        require(isMinter[msg.sender] || (owner == msg.sender), "forbidden");
        require(amount < MAX_MINT_AMOUNT_LIMIT, "invalid amount");
        require(unbackedSupply + int256(amount) <= unbackedSupplyCap, "exceed cap");
        unbackedSupply += int256(amount);
        return _mint(to, amount);
    }

    // burn sDYSN, decrease unbacked sDYSN amount
    function burn(uint amount) external returns (bool) {
        require(amount < MAX_MINT_AMOUNT_LIMIT, "invalid amount");
        unbackedSupply -= int256(amount);
        return _burn(msg.sender, amount);
    }

    /// @notice Stake on behalf of `to`
    /// @param to Address that owns the new vault
    /// @param amount Amount of Dyson to stake
    /// @param lockDuration Duration to lock Dyson
    /// @return sDysonAmount Amount of sDYSON minted to `to`'s new vault
    function stake(address to, uint amount, uint lockDuration) external returns (uint sDysonAmount) {
        Vault storage vault = vaults[to][vaultCount[to]];
        sDysonAmount = getStakingRate(lockDuration) * amount / STAKING_RATE_BASE_UNIT;
        require(sDysonAmount > 0, "invalid lockup");

        vault.dysonAmount = amount;
        vault.sDysonAmount = sDysonAmount;
        vault.unlockTime = block.timestamp + lockDuration;
        
        dysonAmountStaked[to] += amount;
        votingPower[to] += sDysonAmount;
        vaultCount[to]++;

        _mint(to, sDysonAmount);
        Dyson.safeTransferFrom(msg.sender, address(this), amount);

        emit Stake(to, msg.sender, amount, sDysonAmount, lockDuration);
    }

    /// @notice Restake more Dyson to user's given vault. New unlock time must be greater than old unlock time.
    /// Note that user can restake even when the vault is unlocked
    /// @param index Index of user's vault to restake
    /// @param amount Amount of Dyson to restake
    /// @param lockDuration Duration to lock Dyson
    /// @return sDysonAmountAdded Amount of new sDYSON minted to user's vault
    function restake(uint index, uint amount, uint lockDuration) external returns (uint sDysonAmountAdded) {
        require(index < vaultCount[msg.sender], "invalid index");
        Vault storage vault = vaults[msg.sender][index];
        require(vault.unlockTime < block.timestamp + lockDuration, "locked");
        uint sDysonAmountOld = vault.sDysonAmount;
        uint sDysonAmountNew = (vault.dysonAmount + amount) * getStakingRate(lockDuration) / STAKING_RATE_BASE_UNIT;
        require(sDysonAmountNew > 0, "invalid lockup");

        sDysonAmountAdded = sDysonAmountNew - sDysonAmountOld;
        vault.dysonAmount += amount;
        vault.sDysonAmount = sDysonAmountNew;
        vault.unlockTime = block.timestamp + lockDuration;

        dysonAmountStaked[msg.sender] += amount;
        votingPower[msg.sender] += sDysonAmountAdded;

        _mint(msg.sender, sDysonAmountAdded);
        if(amount > 0) Dyson.safeTransferFrom(msg.sender, address(this), amount);

        emit Restake(msg.sender, index, amount, sDysonAmountAdded, lockDuration);
    }

    /// @notice Unstake a given user's vault after the vault is unlocked and transfer Dyson to `to`
    /// @param to Address that will receive Dyson
    /// @param index Index of user's vault to unstake
    /// @param sDysonAmount Amount of sDYSON to unstake
    /// @return amount Amount of Dyson transferred
    function unstake(address to, uint index, uint sDysonAmount) external returns (uint amount) {
        require(sDysonAmount > 0, "invalid input amount");
        Vault storage vault = vaults[msg.sender][index];
        require(block.timestamp >= vault.unlockTime, "locked");
        require(sDysonAmount <= vault.sDysonAmount, "exceed locked amount");
        amount = sDysonAmount * vault.dysonAmount / vault.sDysonAmount;

        vault.dysonAmount -= amount;
        vault.sDysonAmount -= sDysonAmount;

        dysonAmountStaked[msg.sender] -= amount;
        votingPower[msg.sender] -= sDysonAmount;

        _burn(msg.sender, sDysonAmount);
        Dyson.safeTransfer(to, amount);
        
        emit Unstake(msg.sender, to, amount, sDysonAmount);
    }

    /// @notice Migrate given user's vault to new staking contract
    /// @dev Owner must set `migration` before migrate.
    /// `migration` must implement `onMigrationReceived`
    /// @param index Index of user's vault to migrate
    function migrate(uint index) external {
        require(migration != address(0), "cannot migrate");
        Vault storage vault = vaults[msg.sender][index];
        uint dysonAmount = vault.dysonAmount;
        uint sDysonAmount = vault.sDysonAmount;
        uint unlockTime = vault.unlockTime;
        require(unlockTime > 0, "invalid vault");
        delete vaults[msg.sender][index];
        
        dysonAmountStaked[msg.sender] -= dysonAmount;
        votingPower[msg.sender] -= sDysonAmount;

        _approve(msg.sender, migration, sDysonAmount);
        Dyson.safeTransfer(migration, dysonAmount);
        require(IsDYSONUpgradeReceiver(migration).onMigrationReceived(msg.sender, dysonAmount, sDysonAmount, unlockTime) == _MIGRATE_RECEIVED, "migration failed");
        emit Migrate(msg.sender, index);
    }

    /// @notice rescue token stucked in this contract
    /// @param tokenAddress Address of token to be rescued
    /// @param to Address that will receive token
    /// @param amount Amount of token to be rescued
    function rescueERC20(address tokenAddress, address to, uint256 amount) onlyOwner external {
        require(tokenAddress != Dyson);
        tokenAddress.safeTransfer(to, amount);
    }

    /// @notice EIP-2612 permit
    function permit(
        address _owner,
        address _spender,
        uint256 _amount,
        uint256 _deadline,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) external {
        require(_owner != address(0), "zero address");
        require(block.timestamp <= _deadline || _deadline == 0, "permit is expired");
        bytes32 digest = keccak256(
            abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, _owner, _spender, _amount, nonces[_owner]++, _deadline)))
        );
        require(_owner == ecrecover(digest, _v, _r, _s), "invalid signature");
        _approve(_owner, _spender, _amount);
    }
}

File 2 of 4 : ABDKMath64x64.sol
pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-2.0

library ABDKMath64x64 {
    /*
     * Minimum value signed 64.64-bit fixed point number may have.
     * -2^127
     */
    int128 private constant MIN_64x64 = -0x80000000000000000000000000000000;

    /*
     * Maximum value signed 64.64-bit fixed point number may have.
     * 2^127-1
     */
    int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

    /**
     * Calculate x * y rounding down, where x is signed 64.64 fixed point number
     * and y is unsigned 256-bit integer number.  Revert on overflow.
     *
     * @param x signed 64.64 fixed point number
     * @param y unsigned 256-bit integer number
     * @return unsigned 256-bit integer number
     */
    function mulu (int128 x, uint256 y) internal pure returns (uint256) {
        unchecked {
            if (y == 0) return 0;

            require (x >= 0);

            uint256 lo = (uint256 (int256 (x)) * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64;
            uint256 hi = uint256 (int256 (x)) * (y >> 128);

            require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
            hi <<= 64;

            require (hi <=
                0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - lo);
            return hi + lo;
        }
    }

    /**
     * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
     * integer numbers.  Revert on overflow or when y is zero.
     *
     * @param x unsigned 256-bit integer number
     * @param y unsigned 256-bit integer number
     * @return signed 64.64-bit fixed point number
     */
    function divu (uint256 x, uint256 y) internal pure returns (int128) {
        unchecked {
            require (y != 0);
            uint128 result = divuu (x, y);
            require (result <= uint128 (MAX_64x64));
            return int128 (result);
        }
    }

    /**
     * Calculate binary exponent of x.  Revert on overflow.
     *
     * @param x signed 64.64-bit fixed point number
     * @return signed 64.64-bit fixed point number
     */
    function exp_2 (int128 x) internal pure returns (int128) {
        unchecked {
            require (x < 0x400000000000000000); // Overflow

            if (x < -0x400000000000000000) return 0; // Underflow

            uint256 result = 0x80000000000000000000000000000000;

            if (x & 0x8000000000000000 > 0)
                result = result * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128;
            if (x & 0x4000000000000000 > 0)
                result = result * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128;
            if (x & 0x2000000000000000 > 0)
                result = result * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128;
            if (x & 0x1000000000000000 > 0)
                result = result * 0x10B5586CF9890F6298B92B71842A98363 >> 128;
            if (x & 0x800000000000000 > 0)
                result = result * 0x1059B0D31585743AE7C548EB68CA417FD >> 128;
            if (x & 0x400000000000000 > 0)
                result = result * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128;
            if (x & 0x200000000000000 > 0)
                result = result * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128;
            if (x & 0x100000000000000 > 0)
                result = result * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128;
            if (x & 0x80000000000000 > 0)
                result = result * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128;
            if (x & 0x40000000000000 > 0)
                result = result * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128;
            if (x & 0x20000000000000 > 0)
                result = result * 0x100162F3904051FA128BCA9C55C31E5DF >> 128;
            if (x & 0x10000000000000 > 0)
                result = result * 0x1000B175EFFDC76BA38E31671CA939725 >> 128;
            if (x & 0x8000000000000 > 0)
                result = result * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128;
            if (x & 0x4000000000000 > 0)
                result = result * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128;
            if (x & 0x2000000000000 > 0)
                result = result * 0x1000162E525EE054754457D5995292026 >> 128;
            if (x & 0x1000000000000 > 0)
                result = result * 0x10000B17255775C040618BF4A4ADE83FC >> 128;
            if (x & 0x800000000000 > 0)
                result = result * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128;
            if (x & 0x400000000000 > 0)
                result = result * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128;
            if (x & 0x200000000000 > 0)
                result = result * 0x10000162E43F4F831060E02D839A9D16D >> 128;
            if (x & 0x100000000000 > 0)
                result = result * 0x100000B1721BCFC99D9F890EA06911763 >> 128;
            if (x & 0x80000000000 > 0)
                result = result * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128;
            if (x & 0x40000000000 > 0)
                result = result * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128;
            if (x & 0x20000000000 > 0)
                result = result * 0x100000162E430E5A18F6119E3C02282A5 >> 128;
            if (x & 0x10000000000 > 0)
                result = result * 0x1000000B1721835514B86E6D96EFD1BFE >> 128;
            if (x & 0x8000000000 > 0)
                result = result * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128;
            if (x & 0x4000000000 > 0)
                result = result * 0x10000002C5C8601CC6B9E94213C72737A >> 128;
            if (x & 0x2000000000 > 0)
                result = result * 0x1000000162E42FFF037DF38AA2B219F06 >> 128;
            if (x & 0x1000000000 > 0)
                result = result * 0x10000000B17217FBA9C739AA5819F44F9 >> 128;
            if (x & 0x800000000 > 0)
                result = result * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128;
            if (x & 0x400000000 > 0)
                result = result * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128;
            if (x & 0x200000000 > 0)
                result = result * 0x10000000162E42FF0999CE3541B9FFFCF >> 128;
            if (x & 0x100000000 > 0)
                result = result * 0x100000000B17217F80F4EF5AADDA45554 >> 128;
            if (x & 0x80000000 > 0)
                result = result * 0x10000000058B90BFBF8479BD5A81B51AD >> 128;
            if (x & 0x40000000 > 0)
                result = result * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128;
            if (x & 0x20000000 > 0)
                result = result * 0x100000000162E42FEFB2FED257559BDAA >> 128;
            if (x & 0x10000000 > 0)
                result = result * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128;
            if (x & 0x8000000 > 0)
                result = result * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128;
            if (x & 0x4000000 > 0)
                result = result * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128;
            if (x & 0x2000000 > 0)
                result = result * 0x1000000000162E42FEFA494F1478FDE05 >> 128;
            if (x & 0x1000000 > 0)
                result = result * 0x10000000000B17217F7D20CF927C8E94C >> 128;
            if (x & 0x800000 > 0)
                result = result * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128;
            if (x & 0x400000 > 0)
                result = result * 0x100000000002C5C85FDF477B662B26945 >> 128;
            if (x & 0x200000 > 0)
                result = result * 0x10000000000162E42FEFA3AE53369388C >> 128;
            if (x & 0x100000 > 0)
                result = result * 0x100000000000B17217F7D1D351A389D40 >> 128;
            if (x & 0x80000 > 0)
                result = result * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128;
            if (x & 0x40000 > 0)
                result = result * 0x1000000000002C5C85FDF4741BEA6E77E >> 128;
            if (x & 0x20000 > 0)
                result = result * 0x100000000000162E42FEFA39FE95583C2 >> 128;
            if (x & 0x10000 > 0)
                result = result * 0x1000000000000B17217F7D1CFB72B45E1 >> 128;
            if (x & 0x8000 > 0)
                result = result * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128;
            if (x & 0x4000 > 0)
                result = result * 0x10000000000002C5C85FDF473E242EA38 >> 128;
            if (x & 0x2000 > 0)
                result = result * 0x1000000000000162E42FEFA39F02B772C >> 128;
            if (x & 0x1000 > 0)
                result = result * 0x10000000000000B17217F7D1CF7D83C1A >> 128;
            if (x & 0x800 > 0)
                result = result * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128;
            if (x & 0x400 > 0)
                result = result * 0x100000000000002C5C85FDF473DEA871F >> 128;
            if (x & 0x200 > 0)
                result = result * 0x10000000000000162E42FEFA39EF44D91 >> 128;
            if (x & 0x100 > 0)
                result = result * 0x100000000000000B17217F7D1CF79E949 >> 128;
            if (x & 0x80 > 0)
                result = result * 0x10000000000000058B90BFBE8E7BCE544 >> 128;
            if (x & 0x40 > 0)
                result = result * 0x1000000000000002C5C85FDF473DE6ECA >> 128;
            if (x & 0x20 > 0)
                result = result * 0x100000000000000162E42FEFA39EF366F >> 128;
            if (x & 0x10 > 0)
                result = result * 0x1000000000000000B17217F7D1CF79AFA >> 128;
            if (x & 0x8 > 0)
                result = result * 0x100000000000000058B90BFBE8E7BCD6D >> 128;
            if (x & 0x4 > 0)
                result = result * 0x10000000000000002C5C85FDF473DE6B2 >> 128;
            if (x & 0x2 > 0)
                result = result * 0x1000000000000000162E42FEFA39EF358 >> 128;
            if (x & 0x1 > 0)
                result = result * 0x10000000000000000B17217F7D1CF79AB >> 128;

            result >>= uint256 (int256 (63 - (x >> 64)));
            require (result <= uint256 (int256 (MAX_64x64)));

            return int128 (int256 (result));
        }
    }

    /**
     * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
     * integer numbers.  Revert on overflow or when y is zero.
     *
     * @param x unsigned 256-bit integer number
     * @param y unsigned 256-bit integer number
     * @return unsigned 64.64-bit fixed point number
     */
    function divuu (uint256 x, uint256 y) private pure returns (uint128) {
        unchecked {
            require (y != 0);

            uint256 result;

            if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
                result = (x << 64) / y;
            else {
                uint256 msb = 192;
                uint256 xc = x >> 192;
                if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
                if (xc >= 0x10000) { xc >>= 16; msb += 16; }
                if (xc >= 0x100) { xc >>= 8; msb += 8; }
                if (xc >= 0x10) { xc >>= 4; msb += 4; }
                if (xc >= 0x4) { xc >>= 2; msb += 2; }
                if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

                result = (x << 255 - msb) / ((y - 1 >> msb - 191) + 1);
                require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

                uint256 hi = result * (y >> 128);
                uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

                uint256 xh = x >> 192;
                uint256 xl = x << 64;

                if (xl < lo) xh -= 1;
                xl -= lo; // We rely on overflow behavior here
                lo = hi << 128;
                if (xl < lo) xh -= 1;
                xl -= lo; // We rely on overflow behavior here

                assert (xh == hi >> 128);

                result += xl / y;
            }

            require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
            return uint128 (result);
        }
    }
}

File 3 of 4 : TransferHelper.sol
pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-2.0

library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: approve failed');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: transfer failed');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: transferFrom failed');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'transferHelper: ETH transfer failed');
    }
}

File 4 of 4 : IsDYSONUpgradeReceiver.sol
pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IsDYSONUpgradeReceiver {
    function onMigrationReceived(address, uint, uint, uint) external returns (bytes4);
}

Settings
{
  "remappings": [
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "interface/=src/interface/",
    "util/=src/util/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"dyson","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vaultOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vaultOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dysonAmountAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sDysonAmountAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Restake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vaultOwner","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sDysonAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Stake","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vaultOwner","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sDysonAmount","type":"uint256"}],"name":"Unstake","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Dyson","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","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":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentModel","outputs":[{"internalType":"contract StakingRateModel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dysonAmountStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockDuration","type":"uint256"}],"name":"getStakingRate","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migration","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDuration","type":"uint256"}],"name":"restake","outputs":[{"internalType":"uint256","name":"sDysonAmountAdded","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_migration","type":"address"}],"name":"setMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newModel","type":"address"}],"name":"setStakingRateModel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"_unbackedSupplyCap","type":"int256"}],"name":"setUnbackedSupplyCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockDuration","type":"uint256"}],"name":"stake","outputs":[{"internalType":"uint256","name":"sDysonAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unbackedSupply","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unbackedSupplyCap","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"sDysonAmount","type":"uint256"}],"name":"unstake","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaults","outputs":[{"internalType":"uint256","name":"dysonAmount","type":"uint256"},{"internalType":"uint256","name":"sDysonAmount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"votingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b506040516200220438038062002204833981016040819052620000349162000212565b6001600160a01b038216620000905760405162461bcd60e51b815260206004820152601460248201527f6f776e65722063616e6e6f74206265207a65726f00000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b038116620000e85760405162461bcd60e51b815260206004820152601460248201527f6479736f6e2063616e6e6f74206265207a65726f000000000000000000000000604482015260640162000087565b600080546001600160a01b0319166001600160a01b039384161790551660a0908152604080518082018252601381527f5365616c6564204479736f6e20537068657265000000000000000000000000006020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fcabe06b4a655adb0e7cc058ca86732e01882c50fe55237ea18e7384246737cf4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808083019190915230828601528351808303909501855260c0909101909252825192019190912090526200024a565b80516001600160a01b03811681146200020d57600080fd5b919050565b600080604083850312156200022657600080fd5b6200023183620001f5565b91506200024160208401620001f5565b90509250929050565b60805160a051611f6a6200029a600039600081816105b90152818161082901528181610caa01528181610fc601528181611069015261128a0152600081816103ac01526113e70152611f6a6000f3fe608060405234801561001057600080fd5b50600436106102315760003560e01c80637ecebe0011610130578063a9059cbb116100b8578063ce733e6d1161007c578063ce733e6d146105db578063d0b1ad85146105ee578063d505accf14610601578063dd62ed3e14610614578063f2fde38b1461063f57600080fd5b8063a9059cbb1461054b578063aa271e1a1461055e578063b2118a8d14610581578063c07473f614610594578063c3cf2956146105b457600080fd5b806395d89b41116100ff57806395d89b41146104ef578063983b2d5614610513578063a2bc66be14610526578063a692db6e14610539578063a7635a4e1461054257600080fd5b80637ecebe001461047c57806385f408941461049c5780638da5cb5b146104bc5780639038ff80146104cf57600080fd5b80633092afd5116101be57806340c10f191161018257806340c10f19146103ce57806342966c68146103e1578063454b0608146103f457806370a08231146104075780637bbfc69e1461042757600080fd5b80633092afd51461034057806330adf81f14610353578063313ce5671461037a578063351a5f7b146103945780633644e515146103a757600080fd5b80630f2ad452116102055780630f2ad452146102d15780631705a3bd146102e657806318160ddd1461031157806323ac136d1461031a57806323b872dd1461032d57600080fd5b80629a97561461023657806306fdde031461025c578063095ea7b31461029b5780630c51b88f146102be575b600080fd5b610249610244366004611ba1565b610652565b6040519081526020015b60405180910390f35b61028e604051806040016040528060138152602001725365616c6564204479736f6e2053706865726560681b81525081565b6040516102539190611bde565b6102ae6102a9366004611c2d565b6106c6565b6040519015158152602001610253565b6102496102cc366004611c57565b6106dc565b6102e46102df366004611c8a565b6108a8565b005b6001546102f9906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b61024960025481565b6102e4610328366004611c8a565b6108f4565b6102ae61033b366004611ca5565b610940565b6102e461034e366004611c8a565b6109b8565b6102497f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610382601281565b60405160ff9091168152602001610253565b6005546102f9906001600160a01b031681565b6102497f000000000000000000000000000000000000000000000000000000000000000081565b6102ae6103dc366004611c2d565b610a03565b6102ae6103ef366004611ba1565b610b00565b6102e4610402366004611ba1565b610b68565b610249610415366004611c8a565b60076020526000908152604090205481565b610461610435366004611c2d565b600960209081526000928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610253565b61024961048a366004611c8a565b600d6020526000908152604090205481565b6102496104aa366004611c8a565b600b6020526000908152604090205481565b6000546102f9906001600160a01b031681565b6102496104dd366004611c8a565b600a6020526000908152604090205481565b61028e6040518060400160405280600581526020016439a22ca9a760d91b81525081565b6102e4610521366004611c8a565b610ddc565b610249610534366004611c57565b610e2a565b61024960045481565b61024960035481565b6102ae610559366004611c2d565b611030565b6102ae61056c366004611c8a565b60066020526000908152604090205460ff1681565b6102e461058f366004611ca5565b61103d565b6102496105a2366004611c8a565b600c6020526000908152604090205481565b6102f97f000000000000000000000000000000000000000000000000000000000000000081565b6102496105e9366004611ce1565b6110be565b6102e46105fc366004611ba1565b611306565b6102e461060f366004611d0d565b611335565b610249610622366004611d80565b600860209081526000928352604080842090915290825290205481565b6102e461064d366004611c8a565b611599565b6005546040516380a537d960e01b8152600481018390526000916001600160a01b0316906380a537d990602401602060405180830381865afa15801561069c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c09190611db3565b92915050565b60006106d3338484611664565b50600192915050565b6001600160a01b0383166000908152600960209081526040808320600a83528184205484529091528120670de0b6b3a76400008461071985610652565b6107239190611de2565b61072d9190611df9565b9150600082116107755760405162461bcd60e51b815260206004820152600e60248201526d0696e76616c6964206c6f636b75760941b60448201526064015b60405180910390fd5b838155600181018290556107898342611e1b565b60028201556001600160a01b0385166000908152600b6020526040812080548692906107b6908490611e1b565b90915550506001600160a01b0385166000908152600c6020526040812080548492906107e3908490611e1b565b90915550506001600160a01b0385166000908152600a6020526040812080549161080c83611e2e565b919050555061081b8583611788565b506108516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308761181b565b604080518581526020810184905290810184905233906001600160a01b038716907f4b22ccaaeb4846ec98072623a51a9070bf1f01c75ac1f8119035f373df852a0c906060015b60405180910390a3509392505050565b6000546001600160a01b031633146108d25760405162461bcd60e51b815260040161076c90611e47565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461091e5760405162461bcd60e51b815260040161076c90611e47565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166000908152600860209081526040808320338452909152812054600019146109a5576001600160a01b03841660009081526008602090815260408083203384529091528120805484929061099f908490611e6a565b90915550505b6109b084848461194b565b949350505050565b6000546001600160a01b031633146109e25760405162461bcd60e51b815260040161076c90611e47565b6001600160a01b03166000908152600660205260409020805460ff19169055565b3360009081526006602052604081205460ff1680610a2b57506000546001600160a01b031633145b610a475760405162461bcd60e51b815260040161076c90611e47565b600160ff1b8210610a8b5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015260640161076c565b60045482600354610a9c9190611e7d565b1315610ad75760405162461bcd60e51b815260206004820152600a6024820152690657863656564206361760b41b604482015260640161076c565b8160036000828254610ae99190611e7d565b90915550610af990508383611788565b9392505050565b6000600160ff1b8210610b465760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015260640161076c565b8160036000828254610b589190611ea5565b909155506106c090503383611a00565b6001546001600160a01b0316610bb15760405162461bcd60e51b815260206004820152600e60248201526d63616e6e6f74206d69677261746560901b604482015260640161076c565b336000908152600960209081526040808320848452909152902080546001820154600283015480610c145760405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081d985d5b1d609a1b604482015260640161076c565b336000818152600960209081526040808320898452825280832083815560018101849055600201839055928252600b90529081208054859290610c58908490611e6a565b9091555050336000908152600c602052604081208054849290610c7c908490611e6a565b9091555050600154610c999033906001600160a01b031684611664565b600154610cd3906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911685611a86565b600154604051636a7d8bc960e11b808252336004830152602482018690526044820185905260648201849052916001600160a01b03169063d4fb1792906084016020604051808303816000875af1158015610d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d569190611ecc565b6001600160e01b03191614610da05760405162461bcd60e51b815260206004820152601060248201526f1b5a59dc985d1a5bdb8819985a5b195960821b604482015260640161076c565b60405185815233907fa59785389b00cbd19745afbe8d59b28e3161395c6b1e3525861a2b0dede0b90d9060200160405180910390a25050505050565b6000546001600160a01b03163314610e065760405162461bcd60e51b815260040161076c90611e47565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000808211610e725760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a59081a5b9c1d5d08185b5bdd5b9d60621b604482015260640161076c565b33600090815260096020908152604080832086845290915290206002810154421015610ec95760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015260640161076c565b8060010154831115610f145760405162461bcd60e51b8152602060048201526014602482015273195e18d95959081b1bd8dad95908185b5bdd5b9d60621b604482015260640161076c565b60018101548154610f259085611de2565b610f2f9190611df9565b915081816000016000828254610f459190611e6a565b9250508190555082816001016000828254610f609190611e6a565b9091555050336000908152600b602052604081208054849290610f84908490611e6a565b9091555050336000908152600c602052604081208054859290610fa8908490611e6a565b90915550610fb890503384611a00565b50610fed6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168684611a86565b60408051838152602081018590526001600160a01b0387169133917f18edd09e80386cd99df397e2e0d87d2bb259423eae08645e776321a36fe680ef9101610898565b6000610af933848461194b565b6000546001600160a01b031633146110675760405162461bcd60e51b815260040161076c90611e47565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036110a557600080fd5b6110b96001600160a01b0384168383611a86565b505050565b336000908152600a6020526040812054841061110c5760405162461bcd60e51b815260206004820152600d60248201526c0d2dcecc2d8d2c840d2dcc8caf609b1b604482015260640161076c565b33600090815260096020908152604080832087845290915290206111308342611e1b565b81600201541061116b5760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015260640161076c565b60018101546000670de0b6b3a764000061118486610652565b8454611191908990611e1b565b61119b9190611de2565b6111a59190611df9565b9050600081116111e85760405162461bcd60e51b815260206004820152600e60248201526d0696e76616c6964206c6f636b75760941b604482015260640161076c565b6111f28282611e6a565b9350858360000160008282546112089190611e1b565b90915550506001830181905561121e8542611e1b565b6002840155336000908152600b602052604081208054889290611242908490611e1b565b9091555050336000908152600c602052604081208054869290611266908490611e1b565b9091555061127690503385611788565b5085156112b2576112b26001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308961181b565b60408051888152602081018890529081018590526060810186905233907fbc25936f61d661553dca1fb2bd2c968321f2a2f3061dc7511941bad73f2aa0639060800160405180910390a25050509392505050565b6000546001600160a01b031633146113305760405162461bcd60e51b815260040161076c90611e47565b600455565b6001600160a01b03871661137a5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015260640161076c565b8342111580611387575083155b6113c75760405162461bcd60e51b81526020600482015260116024820152701c195c9b5a5d081a5cc8195e1c1a5c9959607a1b604482015260640161076c565b6001600160a01b0387166000908152600d602052604081208054611901917f0000000000000000000000000000000000000000000000000000000000000000917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918c918c918c91908861143a83611e2e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e001604051602081830303815290604052805190602001206040516020016114be9392919060f09390931b6001600160f01b03191683526002830191909152602282015260420190565b60408051601f1981840301815282825280516020918201206000845290830180835281905260ff8716918301919091526060820185905260808201849052915060019060a0016020604051602081039080840390855afa158015611526573d6000803e3d6000fd5b505050602060405103516001600160a01b0316886001600160a01b0316146115845760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b604482015260640161076c565b61158f888888611664565b5050505050505050565b6000546001600160a01b031633146115c35760405162461bcd60e51b815260040161076c90611e47565b6001600160a01b0381166116105760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b604482015260640161076c565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b6001600160a01b0383166116c65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161076c565b6001600160a01b0382166117275760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161076c565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382166000908152600760205260408120805483919083906117b2908490611e1b565b9250508190555081600260008282546117cb9190611e1b565b90915550506040518281526001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350600192915050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161187f9190611ef6565b6000604051808303816000865af19150503d80600081146118bc576040519150601f19603f3d011682016040523d82523d6000602084013e6118c1565b606091505b50915091508180156118eb5750805115806118eb5750808060200190518101906118eb9190611f12565b6119435760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a207472616e7366657246726f6d206661696044820152621b195960ea1b606482015260840161076c565b505050505050565b6001600160a01b038316600090815260076020526040812080548391908390611975908490611e6a565b90915550506001600160a01b038316600090815260076020526040812080548492906119a2908490611e1b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119ee91815260200190565b60405180910390a35060019392505050565b6001600160a01b038216600090815260076020526040812080548391908390611a2a908490611e6a565b925050819055508160026000828254611a439190611e6a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161180a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691611ae29190611ef6565b6000604051808303816000865af19150503d8060008114611b1f576040519150601f19603f3d011682016040523d82523d6000602084013e611b24565b606091505b5091509150818015611b4e575080511580611b4e575080806020019051810190611b4e9190611f12565b611b9a5760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c656400604482015260640161076c565b5050505050565b600060208284031215611bb357600080fd5b5035919050565b60005b83811015611bd5578181015183820152602001611bbd565b50506000910152565b6020815260008251806020840152611bfd816040850160208701611bba565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611c2857600080fd5b919050565b60008060408385031215611c4057600080fd5b611c4983611c11565b946020939093013593505050565b600080600060608486031215611c6c57600080fd5b611c7584611c11565b95602085013595506040909401359392505050565b600060208284031215611c9c57600080fd5b610af982611c11565b600080600060608486031215611cba57600080fd5b611cc384611c11565b9250611cd160208501611c11565b9150604084013590509250925092565b600080600060608486031215611cf657600080fd5b505081359360208301359350604090920135919050565b600080600080600080600060e0888a031215611d2857600080fd5b611d3188611c11565b9650611d3f60208901611c11565b95506040880135945060608801359350608088013560ff81168114611d6357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9357600080fd5b611d9c83611c11565b9150611daa60208401611c11565b90509250929050565b600060208284031215611dc557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c0576106c0611dcc565b600082611e1657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156106c0576106c0611dcc565b600060018201611e4057611e40611dcc565b5060010190565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b818103818111156106c0576106c0611dcc565b8082018281126000831280158216821582161715611e9d57611e9d611dcc565b505092915050565b8181036000831280158383131683831282161715611ec557611ec5611dcc565b5092915050565b600060208284031215611ede57600080fd5b81516001600160e01b031981168114610af957600080fd5b60008251611f08818460208701611bba565b9190910192915050565b600060208284031215611f2457600080fd5b81518015158114610af957600080fdfea264697066735822122069b16c2dffe6e81a438b657e29cb2897194f907138f0c2dcfb7aef09e6834c7c64736f6c63430008110033000000000000000000000000922fef8f101678de12a97277d835e17d026af8850000000000000000000000009cbd81b43ba263ca894178366cfb89a246d1159c

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102315760003560e01c80637ecebe0011610130578063a9059cbb116100b8578063ce733e6d1161007c578063ce733e6d146105db578063d0b1ad85146105ee578063d505accf14610601578063dd62ed3e14610614578063f2fde38b1461063f57600080fd5b8063a9059cbb1461054b578063aa271e1a1461055e578063b2118a8d14610581578063c07473f614610594578063c3cf2956146105b457600080fd5b806395d89b41116100ff57806395d89b41146104ef578063983b2d5614610513578063a2bc66be14610526578063a692db6e14610539578063a7635a4e1461054257600080fd5b80637ecebe001461047c57806385f408941461049c5780638da5cb5b146104bc5780639038ff80146104cf57600080fd5b80633092afd5116101be57806340c10f191161018257806340c10f19146103ce57806342966c68146103e1578063454b0608146103f457806370a08231146104075780637bbfc69e1461042757600080fd5b80633092afd51461034057806330adf81f14610353578063313ce5671461037a578063351a5f7b146103945780633644e515146103a757600080fd5b80630f2ad452116102055780630f2ad452146102d15780631705a3bd146102e657806318160ddd1461031157806323ac136d1461031a57806323b872dd1461032d57600080fd5b80629a97561461023657806306fdde031461025c578063095ea7b31461029b5780630c51b88f146102be575b600080fd5b610249610244366004611ba1565b610652565b6040519081526020015b60405180910390f35b61028e604051806040016040528060138152602001725365616c6564204479736f6e2053706865726560681b81525081565b6040516102539190611bde565b6102ae6102a9366004611c2d565b6106c6565b6040519015158152602001610253565b6102496102cc366004611c57565b6106dc565b6102e46102df366004611c8a565b6108a8565b005b6001546102f9906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b61024960025481565b6102e4610328366004611c8a565b6108f4565b6102ae61033b366004611ca5565b610940565b6102e461034e366004611c8a565b6109b8565b6102497f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610382601281565b60405160ff9091168152602001610253565b6005546102f9906001600160a01b031681565b6102497f7bc0190f3d731cafd9950ecabc4ea4148dbcbd1685a6ba795d31a495c6ba017781565b6102ae6103dc366004611c2d565b610a03565b6102ae6103ef366004611ba1565b610b00565b6102e4610402366004611ba1565b610b68565b610249610415366004611c8a565b60076020526000908152604090205481565b610461610435366004611c2d565b600960209081526000928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610253565b61024961048a366004611c8a565b600d6020526000908152604090205481565b6102496104aa366004611c8a565b600b6020526000908152604090205481565b6000546102f9906001600160a01b031681565b6102496104dd366004611c8a565b600a6020526000908152604090205481565b61028e6040518060400160405280600581526020016439a22ca9a760d91b81525081565b6102e4610521366004611c8a565b610ddc565b610249610534366004611c57565b610e2a565b61024960045481565b61024960035481565b6102ae610559366004611c2d565b611030565b6102ae61056c366004611c8a565b60066020526000908152604090205460ff1681565b6102e461058f366004611ca5565b61103d565b6102496105a2366004611c8a565b600c6020526000908152604090205481565b6102f97f0000000000000000000000009cbd81b43ba263ca894178366cfb89a246d1159c81565b6102496105e9366004611ce1565b6110be565b6102e46105fc366004611ba1565b611306565b6102e461060f366004611d0d565b611335565b610249610622366004611d80565b600860209081526000928352604080842090915290825290205481565b6102e461064d366004611c8a565b611599565b6005546040516380a537d960e01b8152600481018390526000916001600160a01b0316906380a537d990602401602060405180830381865afa15801561069c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c09190611db3565b92915050565b60006106d3338484611664565b50600192915050565b6001600160a01b0383166000908152600960209081526040808320600a83528184205484529091528120670de0b6b3a76400008461071985610652565b6107239190611de2565b61072d9190611df9565b9150600082116107755760405162461bcd60e51b815260206004820152600e60248201526d0696e76616c6964206c6f636b75760941b60448201526064015b60405180910390fd5b838155600181018290556107898342611e1b565b60028201556001600160a01b0385166000908152600b6020526040812080548692906107b6908490611e1b565b90915550506001600160a01b0385166000908152600c6020526040812080548492906107e3908490611e1b565b90915550506001600160a01b0385166000908152600a6020526040812080549161080c83611e2e565b919050555061081b8583611788565b506108516001600160a01b037f0000000000000000000000009cbd81b43ba263ca894178366cfb89a246d1159c1633308761181b565b604080518581526020810184905290810184905233906001600160a01b038716907f4b22ccaaeb4846ec98072623a51a9070bf1f01c75ac1f8119035f373df852a0c906060015b60405180910390a3509392505050565b6000546001600160a01b031633146108d25760405162461bcd60e51b815260040161076c90611e47565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461091e5760405162461bcd60e51b815260040161076c90611e47565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166000908152600860209081526040808320338452909152812054600019146109a5576001600160a01b03841660009081526008602090815260408083203384529091528120805484929061099f908490611e6a565b90915550505b6109b084848461194b565b949350505050565b6000546001600160a01b031633146109e25760405162461bcd60e51b815260040161076c90611e47565b6001600160a01b03166000908152600660205260409020805460ff19169055565b3360009081526006602052604081205460ff1680610a2b57506000546001600160a01b031633145b610a475760405162461bcd60e51b815260040161076c90611e47565b600160ff1b8210610a8b5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015260640161076c565b60045482600354610a9c9190611e7d565b1315610ad75760405162461bcd60e51b815260206004820152600a6024820152690657863656564206361760b41b604482015260640161076c565b8160036000828254610ae99190611e7d565b90915550610af990508383611788565b9392505050565b6000600160ff1b8210610b465760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015260640161076c565b8160036000828254610b589190611ea5565b909155506106c090503383611a00565b6001546001600160a01b0316610bb15760405162461bcd60e51b815260206004820152600e60248201526d63616e6e6f74206d69677261746560901b604482015260640161076c565b336000908152600960209081526040808320848452909152902080546001820154600283015480610c145760405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081d985d5b1d609a1b604482015260640161076c565b336000818152600960209081526040808320898452825280832083815560018101849055600201839055928252600b90529081208054859290610c58908490611e6a565b9091555050336000908152600c602052604081208054849290610c7c908490611e6a565b9091555050600154610c999033906001600160a01b031684611664565b600154610cd3906001600160a01b037f0000000000000000000000009cbd81b43ba263ca894178366cfb89a246d1159c8116911685611a86565b600154604051636a7d8bc960e11b808252336004830152602482018690526044820185905260648201849052916001600160a01b03169063d4fb1792906084016020604051808303816000875af1158015610d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d569190611ecc565b6001600160e01b03191614610da05760405162461bcd60e51b815260206004820152601060248201526f1b5a59dc985d1a5bdb8819985a5b195960821b604482015260640161076c565b60405185815233907fa59785389b00cbd19745afbe8d59b28e3161395c6b1e3525861a2b0dede0b90d9060200160405180910390a25050505050565b6000546001600160a01b03163314610e065760405162461bcd60e51b815260040161076c90611e47565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000808211610e725760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a59081a5b9c1d5d08185b5bdd5b9d60621b604482015260640161076c565b33600090815260096020908152604080832086845290915290206002810154421015610ec95760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015260640161076c565b8060010154831115610f145760405162461bcd60e51b8152602060048201526014602482015273195e18d95959081b1bd8dad95908185b5bdd5b9d60621b604482015260640161076c565b60018101548154610f259085611de2565b610f2f9190611df9565b915081816000016000828254610f459190611e6a565b9250508190555082816001016000828254610f609190611e6a565b9091555050336000908152600b602052604081208054849290610f84908490611e6a565b9091555050336000908152600c602052604081208054859290610fa8908490611e6a565b90915550610fb890503384611a00565b50610fed6001600160a01b037f0000000000000000000000009cbd81b43ba263ca894178366cfb89a246d1159c168684611a86565b60408051838152602081018590526001600160a01b0387169133917f18edd09e80386cd99df397e2e0d87d2bb259423eae08645e776321a36fe680ef9101610898565b6000610af933848461194b565b6000546001600160a01b031633146110675760405162461bcd60e51b815260040161076c90611e47565b7f0000000000000000000000009cbd81b43ba263ca894178366cfb89a246d1159c6001600160a01b0316836001600160a01b0316036110a557600080fd5b6110b96001600160a01b0384168383611a86565b505050565b336000908152600a6020526040812054841061110c5760405162461bcd60e51b815260206004820152600d60248201526c0d2dcecc2d8d2c840d2dcc8caf609b1b604482015260640161076c565b33600090815260096020908152604080832087845290915290206111308342611e1b565b81600201541061116b5760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015260640161076c565b60018101546000670de0b6b3a764000061118486610652565b8454611191908990611e1b565b61119b9190611de2565b6111a59190611df9565b9050600081116111e85760405162461bcd60e51b815260206004820152600e60248201526d0696e76616c6964206c6f636b75760941b604482015260640161076c565b6111f28282611e6a565b9350858360000160008282546112089190611e1b565b90915550506001830181905561121e8542611e1b565b6002840155336000908152600b602052604081208054889290611242908490611e1b565b9091555050336000908152600c602052604081208054869290611266908490611e1b565b9091555061127690503385611788565b5085156112b2576112b26001600160a01b037f0000000000000000000000009cbd81b43ba263ca894178366cfb89a246d1159c1633308961181b565b60408051888152602081018890529081018590526060810186905233907fbc25936f61d661553dca1fb2bd2c968321f2a2f3061dc7511941bad73f2aa0639060800160405180910390a25050509392505050565b6000546001600160a01b031633146113305760405162461bcd60e51b815260040161076c90611e47565b600455565b6001600160a01b03871661137a5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015260640161076c565b8342111580611387575083155b6113c75760405162461bcd60e51b81526020600482015260116024820152701c195c9b5a5d081a5cc8195e1c1a5c9959607a1b604482015260640161076c565b6001600160a01b0387166000908152600d602052604081208054611901917f7bc0190f3d731cafd9950ecabc4ea4148dbcbd1685a6ba795d31a495c6ba0177917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918c918c918c91908861143a83611e2e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e001604051602081830303815290604052805190602001206040516020016114be9392919060f09390931b6001600160f01b03191683526002830191909152602282015260420190565b60408051601f1981840301815282825280516020918201206000845290830180835281905260ff8716918301919091526060820185905260808201849052915060019060a0016020604051602081039080840390855afa158015611526573d6000803e3d6000fd5b505050602060405103516001600160a01b0316886001600160a01b0316146115845760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b604482015260640161076c565b61158f888888611664565b5050505050505050565b6000546001600160a01b031633146115c35760405162461bcd60e51b815260040161076c90611e47565b6001600160a01b0381166116105760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b604482015260640161076c565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b6001600160a01b0383166116c65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161076c565b6001600160a01b0382166117275760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161076c565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382166000908152600760205260408120805483919083906117b2908490611e1b565b9250508190555081600260008282546117cb9190611e1b565b90915550506040518281526001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350600192915050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161187f9190611ef6565b6000604051808303816000865af19150503d80600081146118bc576040519150601f19603f3d011682016040523d82523d6000602084013e6118c1565b606091505b50915091508180156118eb5750805115806118eb5750808060200190518101906118eb9190611f12565b6119435760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a207472616e7366657246726f6d206661696044820152621b195960ea1b606482015260840161076c565b505050505050565b6001600160a01b038316600090815260076020526040812080548391908390611975908490611e6a565b90915550506001600160a01b038316600090815260076020526040812080548492906119a2908490611e1b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119ee91815260200190565b60405180910390a35060019392505050565b6001600160a01b038216600090815260076020526040812080548391908390611a2a908490611e6a565b925050819055508160026000828254611a439190611e6a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161180a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691611ae29190611ef6565b6000604051808303816000865af19150503d8060008114611b1f576040519150601f19603f3d011682016040523d82523d6000602084013e611b24565b606091505b5091509150818015611b4e575080511580611b4e575080806020019051810190611b4e9190611f12565b611b9a5760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c656400604482015260640161076c565b5050505050565b600060208284031215611bb357600080fd5b5035919050565b60005b83811015611bd5578181015183820152602001611bbd565b50506000910152565b6020815260008251806020840152611bfd816040850160208701611bba565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611c2857600080fd5b919050565b60008060408385031215611c4057600080fd5b611c4983611c11565b946020939093013593505050565b600080600060608486031215611c6c57600080fd5b611c7584611c11565b95602085013595506040909401359392505050565b600060208284031215611c9c57600080fd5b610af982611c11565b600080600060608486031215611cba57600080fd5b611cc384611c11565b9250611cd160208501611c11565b9150604084013590509250925092565b600080600060608486031215611cf657600080fd5b505081359360208301359350604090920135919050565b600080600080600080600060e0888a031215611d2857600080fd5b611d3188611c11565b9650611d3f60208901611c11565b95506040880135945060608801359350608088013560ff81168114611d6357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d9357600080fd5b611d9c83611c11565b9150611daa60208401611c11565b90509250929050565b600060208284031215611dc557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106c0576106c0611dcc565b600082611e1657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156106c0576106c0611dcc565b600060018201611e4057611e40611dcc565b5060010190565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b818103818111156106c0576106c0611dcc565b8082018281126000831280158216821582161715611e9d57611e9d611dcc565b505092915050565b8181036000831280158383131683831282161715611ec557611ec5611dcc565b5092915050565b600060208284031215611ede57600080fd5b81516001600160e01b031981168114610af957600080fd5b60008251611f08818460208701611bba565b9190910192915050565b600060208284031215611f2457600080fd5b81518015158114610af957600080fdfea264697066735822122069b16c2dffe6e81a438b657e29cb2897194f907138f0c2dcfb7aef09e6834c7c64736f6c63430008110033

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

000000000000000000000000922fef8f101678de12a97277d835e17d026af8850000000000000000000000009cbd81b43ba263ca894178366cfb89a246d1159c

-----Decoded View---------------
Arg [0] : _owner (address): 0x922fef8f101678dE12a97277d835E17d026AF885
Arg [1] : dyson (address): 0x9CBD81b43ba263ca894178366Cfb89A246D1159C

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000922fef8f101678de12a97277d835e17d026af885
Arg [1] : 0000000000000000000000009cbd81b43ba263ca894178366cfb89a246d1159c


[ 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.