false
false
0

Contract Address Details

0x70F340045613F86D6c5CEb787B5DA28B765c2470

Contract Name
MigrationIDO
Creator
0xc7d98c–7f3521 at 0x244f55–eecc19
Balance
0 CLO
Tokens
Fetching tokens...
Transactions
19 Transactions
Transfers
130 Transfers
Gas Used
21,463,486
Last Balance Update
16285297
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
MigrationIDO




Optimization enabled
true
Compiler version
v0.8.19+commit.7dd6d404




Optimization runs
200
EVM Version
default




Verified at
2024-09-26T15:33:04.915215Z

Contract source code

// SPDX-License-Identifier: No License (None)
pragma solidity 0.8.19;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 *
 * Source https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-solidity/v2.1.3/contracts/ownership/Ownable.sol
 * This contract is copied here and renamed from the original to avoid clashes in the compiled artifacts
 * when the user imports a zos-lib contract (that transitively causes this contract to be compiled and added to the
 * build/artifacts folder) as well as the vanilla Ownable implementation from an openzeppelin version.
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(),"Not Owner");
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * @notice Renouncing to ownership will leave the contract without an owner.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0),"Zero address not allowed");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IERC223 {
    function mint(address _to, uint256 _amount) external;
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function burnFrom(address sender, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external;
    function balanceOf(address account) external view returns (uint256);
}

interface ISlothVesting {
    function allocateTokens(
        address to, // beneficiary of tokens
        uint256 amount // amount of token
    ) external;
}

contract MigrationIDO is Ownable {
    address constant public SOY = address(0x9FaE2529863bD691B4A7171bDfCf33C7ebB10a65);
    address public slothVesting = address(0xA1D58D570Afebd08Fc13a3983881Ac72a9857954);

    uint256 constant public startMigration = 1706745600;   // timestamp when migration start 1 February 2024 00:00:00 UTC
    uint256 public endMigration = 1714521599; // 30 April 2024 23:59:59 UTC
    uint256 public soyRatio = 100;
    bool public isPause;
    uint256 public totalSlothMinted;
    uint256 public totalSoyReserved;
    uint256 public totalSOYMigrated;
    mapping(address user => uint256 amount) public reserved;

    event Migrate(address user, uint256 soyAmount, uint256 slothAmount);
    event SetPeriod(uint256 endMigration, uint256 soyRatio);


    modifier migrationAllowed() {
        require(block.timestamp >= startMigration && block.timestamp <= endMigration, "Migration is closed");
        require(!isPause, "Migration is paused");
        _;
    }

    function tokenReceived(address _from, uint _value, bytes memory) external returns(bytes4) {
        require(msg.sender == SOY, "Only SOY");
        migrate(_from, _value);
        return this.tokenReceived.selector;
    }

    function migrate(address user, uint256 amount) internal migrationAllowed {
        uint256 reservedAmount = reserved[user];
        if(reservedAmount < amount) {
            uint256 rest = amount - reservedAmount;
            amount = reservedAmount;
            reserved[user] = 0;
            IERC223(SOY).transfer(user, rest);
        } else {
            reserved[user] = reservedAmount - amount;
        }
        uint256 slothAmount;
        slothAmount = amount / soyRatio;
        emit Migrate(user, amount, slothAmount);
        totalSOYMigrated += amount;
        totalSlothMinted += slothAmount;
        transferToVesting(user, slothAmount);       
    }

    function transferToVesting(address user, uint256 amount) internal {
        ISlothVesting(slothVesting).allocateTokens(user, amount);
    }


    function addReserved(address[] calldata users, uint256[] calldata amounts) external onlyOwner {
        uint256 len = users.length;
        uint256 total;
        require(amounts.length == len);
        for (uint i; i < len; i++) {
            reserved[users[i]] += amounts[i];
            total += amounts[i];
        }
        totalSoyReserved += total;
    }

    function replaceAddress(address oldAddress, address newAddress) external onlyOwner {
        uint256 value = reserved[oldAddress];
        reserved[oldAddress] = 0;
        reserved[newAddress] = value;
    }
    
    function setPause(bool pause) external onlyOwner {
        isPause = pause;
    }
    
    function setSlothVesting(address _slothVesting) external onlyOwner {
        slothVesting = _slothVesting;
    }

    function setPeriod(uint256 _endMigration, uint256 _soyRatio) external onlyOwner {
        endMigration = _endMigration;
        soyRatio = _soyRatio;
        emit SetPeriod(_endMigration, _soyRatio);
    }

    function burnSoy() external onlyOwner {
        uint256 value = IERC223(SOY).balanceOf(address(this));
        IERC223(SOY).transfer(0xdEad000000000000000000000000000000000000, value);
    }

    function rescueERC20(address token, address to) external onlyOwner {
        require(token != SOY, "wrong token");
        uint256 value = IERC223(token).balanceOf(address(this));
        IERC223(token).transfer(to, value);
    }
}
        

Contract ABI

[{"type":"event","name":"Migrate","inputs":[{"type":"address","name":"user","internalType":"address","indexed":false},{"type":"uint256","name":"soyAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"slothAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SetPeriod","inputs":[{"type":"uint256","name":"endMigration","internalType":"uint256","indexed":false},{"type":"uint256","name":"soyRatio","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"SOY","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addReserved","inputs":[{"type":"address[]","name":"users","internalType":"address[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnSoy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"endMigration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isPause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"replaceAddress","inputs":[{"type":"address","name":"oldAddress","internalType":"address"},{"type":"address","name":"newAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueERC20","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"reserved","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPause","inputs":[{"type":"bool","name":"pause","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPeriod","inputs":[{"type":"uint256","name":"_endMigration","internalType":"uint256"},{"type":"uint256","name":"_soyRatio","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSlothVesting","inputs":[{"type":"address","name":"_slothVesting","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"slothVesting","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"soyRatio","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startMigration","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"tokenReceived","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSOYMigrated","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSlothMinted","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSoyReserved","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x6080604052600180546001600160a01b03191673a1d58d570afebd08fc13a3983881ac72a985795417905563663185ff600255606460035534801561004357600080fd5b50600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3610f80806100926000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d8d8a0d71161007c578063d8d8a0d714610293578063d8f29cb51461029c578063da9425e2146102af578063e01b99de146102cf578063f2fde38b146102d8578063ff0938a7146102eb57600080fd5b80638da5cb5b146102225780638f32d59b14610233578063ad66b3c614610252578063be9e2c9a14610265578063bedb86fb1461028057600080fd5b80632e2fa3fc1161010a5780632e2fa3fc146101c05780635d799f87146101c95780636c525d04146101dc5780637028768f146101e5578063715018a6146101ee5780638943ec02146101f657600080fd5b80630273101914610147578063038ad0001461015157806303c5b1dc14610181578063156806151461019457806318264f33146101a7575b600080fd5b61014f6102f8565b005b600154610164906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f61018f366004610c2d565b610417565b61014f6101a2366004610c9b565b610488565b6101b26365badf0081565b604051908152602001610178565b6101b260035481565b61014f6101d7366004610d23565b61059d565b6101b260025481565b6101b260055481565b61014f6106f8565b610209610204366004610d6c565b61076c565b6040516001600160e01b03199091168152602001610178565b6000546001600160a01b0316610164565b6000546001600160a01b031633145b6040519015158152602001610178565b61014f610260366004610d23565b6107d6565b610164739fae2529863bd691b4a7171bdfcf33c7ebb10a6581565b61014f61028e366004610e37565b61082d565b6101b260075481565b61014f6102aa366004610e60565b61086a565b6101b26102bd366004610e60565b60086020526000908152604090205481565b6101b260065481565b61014f6102e6366004610e60565b6108b6565b6004546102429060ff1681565b6000546001600160a01b0316331461032b5760405162461bcd60e51b815260040161032290610e7b565b60405180910390fd5b6040516370a0823160e01b8152306004820152600090739fae2529863bd691b4a7171bdfcf33c7ebb10a65906370a0823190602401602060405180830381865afa15801561037d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a19190610e9e565b60405163a9059cbb60e01b815261dead60901b600482015260248101829052909150739fae2529863bd691b4a7171bdfcf33c7ebb10a659063a9059cbb90604401600060405180830381600087803b1580156103fc57600080fd5b505af1158015610410573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146104415760405162461bcd60e51b815260040161032290610e7b565b6002829055600381905560408051838152602081018390527f3d818526b1ffcc62c6fe3542ee7a92bde19c368137535380f6270af3f300bc6d910160405180910390a15050565b6000546001600160a01b031633146104b25760405162461bcd60e51b815260040161032290610e7b565b8260008282146104c157600080fd5b60005b8281101561057d578484828181106104de576104de610eb7565b90506020020135600860008989858181106104fb576104fb610eb7565b90506020020160208101906105109190610e60565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461053f9190610ee3565b90915550859050848281811061055757610557610eb7565b90506020020135826105699190610ee3565b91508061057581610efc565b9150506104c4565b5080600660008282546105909190610ee3565b9091555050505050505050565b6000546001600160a01b031633146105c75760405162461bcd60e51b815260040161032290610e7b565b739fae2529863bd691b4a7171bdfcf33c7ebb10a64196001600160a01b038316016106225760405162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b6044820152606401610322565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d9190610e9e565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb90604401600060405180830381600087803b1580156106db57600080fd5b505af11580156106ef573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146107225760405162461bcd60e51b815260040161032290610e7b565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600033739fae2529863bd691b4a7171bdfcf33c7ebb10a65146107bc5760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920534f5960c01b6044820152606401610322565b6107c684846108ec565b506344a1f60160e11b9392505050565b6000546001600160a01b031633146108005760405162461bcd60e51b815260040161032290610e7b565b6001600160a01b039182166000908152600860205260408082208054908390559290931681529190912055565b6000546001600160a01b031633146108575760405162461bcd60e51b815260040161032290610e7b565b6004805460ff1916911515919091179055565b6000546001600160a01b031633146108945760405162461bcd60e51b815260040161032290610e7b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146108e05760405162461bcd60e51b815260040161032290610e7b565b6108e981610b12565b50565b6365badf00421015801561090257506002544211155b6109445760405162461bcd60e51b8152602060048201526013602482015272135a59dc985d1a5bdb881a5cc818db1bdcd959606a1b6044820152606401610322565b60045460ff161561098d5760405162461bcd60e51b8152602060048201526013602482015272135a59dc985d1a5bdb881a5cc81c185d5cd959606a1b6044820152606401610322565b6001600160a01b03821660009081526008602052604090205481811015610a505760006109ba8284610f15565b6001600160a01b038516600081815260086020526040808220919091555163a9059cbb60e01b81526004810191909152602481018290529293508392909150739fae2529863bd691b4a7171bdfcf33c7ebb10a659063a9059cbb90604401600060405180830381600087803b158015610a3257600080fd5b505af1158015610a46573d6000803e3d6000fd5b5050505050610a74565b610a5a8282610f15565b6001600160a01b0384166000908152600860205260409020555b600060035483610a849190610f28565b604080516001600160a01b0387168152602081018690529081018290529091507fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c9060600160405180910390a18260076000828254610ae39190610ee3565b925050819055508060056000828254610afc9190610ee3565b90915550610b0c90508482610bc3565b50505050565b6001600160a01b038116610b685760405162461bcd60e51b815260206004820152601860248201527f5a65726f2061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610322565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546040516386ce028560e01b81526001600160a01b03848116600483015260248201849052909116906386ce028590604401600060405180830381600087803b158015610c1157600080fd5b505af1158015610c25573d6000803e3d6000fd5b505050505050565b60008060408385031215610c4057600080fd5b50508035926020909101359150565b60008083601f840112610c6157600080fd5b50813567ffffffffffffffff811115610c7957600080fd5b6020830191508360208260051b8501011115610c9457600080fd5b9250929050565b60008060008060408587031215610cb157600080fd5b843567ffffffffffffffff80821115610cc957600080fd5b610cd588838901610c4f565b90965094506020870135915080821115610cee57600080fd5b50610cfb87828801610c4f565b95989497509550505050565b80356001600160a01b0381168114610d1e57600080fd5b919050565b60008060408385031215610d3657600080fd5b610d3f83610d07565b9150610d4d60208401610d07565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215610d8157600080fd5b610d8a84610d07565b925060208401359150604084013567ffffffffffffffff80821115610dae57600080fd5b818601915086601f830112610dc257600080fd5b813581811115610dd457610dd4610d56565b604051601f8201601f19908116603f01168101908382118183101715610dfc57610dfc610d56565b81604052828152896020848701011115610e1557600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215610e4957600080fd5b81358015158114610e5957600080fd5b9392505050565b600060208284031215610e7257600080fd5b610e5982610d07565b6020808252600990820152682737ba1027bbb732b960b91b604082015260600190565b600060208284031215610eb057600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610ef657610ef6610ecd565b92915050565b600060018201610f0e57610f0e610ecd565b5060010190565b81810381811115610ef657610ef6610ecd565b600082610f4557634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212207266c91b4626af9a5cc2ee9298fba783f1141411b566dca73402a45fe016cdd564736f6c63430008130033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d8d8a0d71161007c578063d8d8a0d714610293578063d8f29cb51461029c578063da9425e2146102af578063e01b99de146102cf578063f2fde38b146102d8578063ff0938a7146102eb57600080fd5b80638da5cb5b146102225780638f32d59b14610233578063ad66b3c614610252578063be9e2c9a14610265578063bedb86fb1461028057600080fd5b80632e2fa3fc1161010a5780632e2fa3fc146101c05780635d799f87146101c95780636c525d04146101dc5780637028768f146101e5578063715018a6146101ee5780638943ec02146101f657600080fd5b80630273101914610147578063038ad0001461015157806303c5b1dc14610181578063156806151461019457806318264f33146101a7575b600080fd5b61014f6102f8565b005b600154610164906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f61018f366004610c2d565b610417565b61014f6101a2366004610c9b565b610488565b6101b26365badf0081565b604051908152602001610178565b6101b260035481565b61014f6101d7366004610d23565b61059d565b6101b260025481565b6101b260055481565b61014f6106f8565b610209610204366004610d6c565b61076c565b6040516001600160e01b03199091168152602001610178565b6000546001600160a01b0316610164565b6000546001600160a01b031633145b6040519015158152602001610178565b61014f610260366004610d23565b6107d6565b610164739fae2529863bd691b4a7171bdfcf33c7ebb10a6581565b61014f61028e366004610e37565b61082d565b6101b260075481565b61014f6102aa366004610e60565b61086a565b6101b26102bd366004610e60565b60086020526000908152604090205481565b6101b260065481565b61014f6102e6366004610e60565b6108b6565b6004546102429060ff1681565b6000546001600160a01b0316331461032b5760405162461bcd60e51b815260040161032290610e7b565b60405180910390fd5b6040516370a0823160e01b8152306004820152600090739fae2529863bd691b4a7171bdfcf33c7ebb10a65906370a0823190602401602060405180830381865afa15801561037d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a19190610e9e565b60405163a9059cbb60e01b815261dead60901b600482015260248101829052909150739fae2529863bd691b4a7171bdfcf33c7ebb10a659063a9059cbb90604401600060405180830381600087803b1580156103fc57600080fd5b505af1158015610410573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146104415760405162461bcd60e51b815260040161032290610e7b565b6002829055600381905560408051838152602081018390527f3d818526b1ffcc62c6fe3542ee7a92bde19c368137535380f6270af3f300bc6d910160405180910390a15050565b6000546001600160a01b031633146104b25760405162461bcd60e51b815260040161032290610e7b565b8260008282146104c157600080fd5b60005b8281101561057d578484828181106104de576104de610eb7565b90506020020135600860008989858181106104fb576104fb610eb7565b90506020020160208101906105109190610e60565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461053f9190610ee3565b90915550859050848281811061055757610557610eb7565b90506020020135826105699190610ee3565b91508061057581610efc565b9150506104c4565b5080600660008282546105909190610ee3565b9091555050505050505050565b6000546001600160a01b031633146105c75760405162461bcd60e51b815260040161032290610e7b565b739fae2529863bd691b4a7171bdfcf33c7ebb10a64196001600160a01b038316016106225760405162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b6044820152606401610322565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d9190610e9e565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb90604401600060405180830381600087803b1580156106db57600080fd5b505af11580156106ef573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146107225760405162461bcd60e51b815260040161032290610e7b565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600033739fae2529863bd691b4a7171bdfcf33c7ebb10a65146107bc5760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920534f5960c01b6044820152606401610322565b6107c684846108ec565b506344a1f60160e11b9392505050565b6000546001600160a01b031633146108005760405162461bcd60e51b815260040161032290610e7b565b6001600160a01b039182166000908152600860205260408082208054908390559290931681529190912055565b6000546001600160a01b031633146108575760405162461bcd60e51b815260040161032290610e7b565b6004805460ff1916911515919091179055565b6000546001600160a01b031633146108945760405162461bcd60e51b815260040161032290610e7b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146108e05760405162461bcd60e51b815260040161032290610e7b565b6108e981610b12565b50565b6365badf00421015801561090257506002544211155b6109445760405162461bcd60e51b8152602060048201526013602482015272135a59dc985d1a5bdb881a5cc818db1bdcd959606a1b6044820152606401610322565b60045460ff161561098d5760405162461bcd60e51b8152602060048201526013602482015272135a59dc985d1a5bdb881a5cc81c185d5cd959606a1b6044820152606401610322565b6001600160a01b03821660009081526008602052604090205481811015610a505760006109ba8284610f15565b6001600160a01b038516600081815260086020526040808220919091555163a9059cbb60e01b81526004810191909152602481018290529293508392909150739fae2529863bd691b4a7171bdfcf33c7ebb10a659063a9059cbb90604401600060405180830381600087803b158015610a3257600080fd5b505af1158015610a46573d6000803e3d6000fd5b5050505050610a74565b610a5a8282610f15565b6001600160a01b0384166000908152600860205260409020555b600060035483610a849190610f28565b604080516001600160a01b0387168152602081018690529081018290529091507fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c9060600160405180910390a18260076000828254610ae39190610ee3565b925050819055508060056000828254610afc9190610ee3565b90915550610b0c90508482610bc3565b50505050565b6001600160a01b038116610b685760405162461bcd60e51b815260206004820152601860248201527f5a65726f2061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610322565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546040516386ce028560e01b81526001600160a01b03848116600483015260248201849052909116906386ce028590604401600060405180830381600087803b158015610c1157600080fd5b505af1158015610c25573d6000803e3d6000fd5b505050505050565b60008060408385031215610c4057600080fd5b50508035926020909101359150565b60008083601f840112610c6157600080fd5b50813567ffffffffffffffff811115610c7957600080fd5b6020830191508360208260051b8501011115610c9457600080fd5b9250929050565b60008060008060408587031215610cb157600080fd5b843567ffffffffffffffff80821115610cc957600080fd5b610cd588838901610c4f565b90965094506020870135915080821115610cee57600080fd5b50610cfb87828801610c4f565b95989497509550505050565b80356001600160a01b0381168114610d1e57600080fd5b919050565b60008060408385031215610d3657600080fd5b610d3f83610d07565b9150610d4d60208401610d07565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215610d8157600080fd5b610d8a84610d07565b925060208401359150604084013567ffffffffffffffff80821115610dae57600080fd5b818601915086601f830112610dc257600080fd5b813581811115610dd457610dd4610d56565b604051601f8201601f19908116603f01168101908382118183101715610dfc57610dfc610d56565b81604052828152896020848701011115610e1557600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215610e4957600080fd5b81358015158114610e5957600080fd5b9392505050565b600060208284031215610e7257600080fd5b610e5982610d07565b6020808252600990820152682737ba1027bbb732b960b91b604082015260600190565b600060208284031215610eb057600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610ef657610ef6610ecd565b92915050565b600060018201610f0e57610f0e610ecd565b5060010190565b81810381811115610ef657610ef6610ecd565b600082610f4557634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212207266c91b4626af9a5cc2ee9298fba783f1141411b566dca73402a45fe016cdd564736f6c63430008130033