false
true
0

Contract Address Details

0x956F90d84d9DD5aC0eFa39679e6fA75D4ca8c934

Token
MeFi (MEFI)
Creator
0x756639–797eec at 0x0dfcdc–65ba72
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
131 Transactions
Transfers
125 Transfers
Gas Used
11,471,436
Last Balance Update
26180248
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
MeFi




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




Optimization runs
200
EVM Version
paris




Verified at
2026-02-26T04:58:34.918341Z

contracts/AER/MeFi.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

/**
 * @title MeFi - Optimized for Small LP & Frequent Small Deposits
 * @notice Backs by eDAI, skips arbitrage on tiny amounts to save gas
 * @dev Start with arbitrage disabled (0%), enable when LP grows
 */

interface IERC20 {
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function transfer(address to, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
}

interface IPulseXRouter {
    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint[] memory amounts);
    
    function getAmountsOut(uint amountIn, address[] memory path) 
        external view returns (uint[] memory amounts);
}

contract MeFi {
    
    string public constant name = "MeFi";
    string public constant symbol = "MEFI";
    uint8 public constant decimals = 18;
    
    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    
    address public owner;
    address public pendingOwner;
    address public oracle;
    
    address public constant EDAI = 0xefD766cCb38EaF1dfd701853BFCe31359239F305;
    address public constant ROUTER = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
    
    uint256 public baseBackingEDAI;
    uint256 public arbitrageProfitEDAI;
    
    mapping(address => uint256) public totalEarned;
    mapping(address => uint256) public totalRedeemed;
    mapping(address => bool) public authorizedMinters;
    
    bool private _paused;
    bool private _locked;
    
    // OPTIMIZED: Settings for small LP scenario
    uint256 public arbitragePercent = 0;              // START AT 0% - disable initially
    uint256 public minSpreadBps = 200;                // 2% minimum
    uint256 public maxSpreadBps = 1000;               // 10% maximum (flash loan protection)
    uint256 public maxArbitragePerTx = 100 * 1e18;    // Start conservative: 100 eDAI
    uint256 public minArbitrageAmount = 5 * 1e18;     // NEW: Only arbitrage if >= 5 eDAI
    uint256 public constant MIN_DEPOSIT = 1e12;       // LOWERED: 0.000001 eDAI (for tiny deposits)
    uint256 public constant MAX_SUPPLY = 100_000_000 * 1e18;
    
    uint256 public totalArbitrageProfits;
    uint256 public totalArbitrageExecuted;
    uint256 public totalArbitrageSkipped; // NEW: Track skipped arbitrages
    
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event TaxDeposited(address indexed creator, uint256 edaiAmount, uint256 mefiMinted);
    event ArbitrageExecuted(bool isSell, uint256 edaiAmount, uint256 mefiAmount, uint256 profit, uint256 newBacking);
    event ArbitrageSkipped(string reason, uint256 edaiAmount); // NEW: Track why skipped
    event Redeemed(address indexed user, uint256 mefiAmount, uint256 edaiReceived);
    event BackingUpdated(uint256 totalBacking, uint256 backingPerMeFi);
    event Paused(address account);
    event Unpaused(address account);
    event OwnershipTransferInitiated(address indexed previousOwner, address indexed newOwner);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event ArbitrageSettingsUpdated(uint256 percent, uint256 minSpread, uint256 maxSpread, uint256 maxSize, uint256 minAmount);
    
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }
    
    modifier onlyOracle() {
        require(msg.sender == oracle || authorizedMinters[msg.sender], "Not oracle");
        _;
    }
    
    modifier whenNotPaused() {
        require(!_paused, "Paused");
        _;
    }
    
    modifier nonReentrant() {
        require(!_locked, "Reentrant");
        _locked = true;
        _;
        _locked = false;
    }
    
    constructor() {
        owner = msg.sender;
    }
    
    // ==========================================
    // ERC20
    // ==========================================
    
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    
    function transfer(address to, uint256 amount) public whenNotPaused returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }
    
    function allowance(address tokenOwner, address spender) public view returns (uint256) {
        return _allowances[tokenOwner][spender];
    }
    
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    
    function transferFrom(address from, address to, uint256 amount) public whenNotPaused returns (bool) {
        _spendAllowance(from, msg.sender, amount);
        _transfer(from, to, amount);
        return true;
    }
    
    // ==========================================
    // CORE
    // ==========================================
    
    function depositTax(address creator, uint256 edaiAmount) 
        external 
        onlyOracle 
        whenNotPaused 
        nonReentrant 
        returns (uint256 mefiMinted, uint256 profitCaptured)
    {
        require(creator != address(0), "Invalid creator");
        require(edaiAmount >= MIN_DEPOSIT, "Below minimum");
        
        bool success = IERC20(EDAI).transferFrom(msg.sender, address(this), edaiAmount);
        require(success, "eDAI transfer failed");
        
        uint256 arbitrageEDAI = (edaiAmount * arbitragePercent) / 100;
        uint256 creatorEDAI = edaiAmount - arbitrageEDAI;
        
        if (arbitrageEDAI > maxArbitragePerTx) {
            uint256 excess = arbitrageEDAI - maxArbitragePerTx;
            arbitrageEDAI = maxArbitragePerTx;
            creatorEDAI += excess;
        }
        
        // OPTIMIZED: Check if arbitrage amount is worth it
        if (arbitrageEDAI > 0 && arbitrageEDAI >= minArbitrageAmount) {
            profitCaptured = _executeArbitrage(arbitrageEDAI);
        } else if (arbitrageEDAI > 0) {
            // Too small, skip arbitrage to save gas
            baseBackingEDAI += arbitrageEDAI;
            totalArbitrageSkipped++;
            emit ArbitrageSkipped("Amount too small", arbitrageEDAI);
        }
        
        mefiMinted = creatorEDAI;
        baseBackingEDAI += creatorEDAI;
        totalEarned[creator] += mefiMinted;
        
        _mint(creator, mefiMinted);
        
        emit TaxDeposited(creator, edaiAmount, mefiMinted);
        emit BackingUpdated(getTotalBacking(), getBackingPerMeFi());
        
        return (mefiMinted, profitCaptured);
    }
    
    function _executeArbitrage(uint256 edaiAmount) internal returns (uint256 profit) {
        // If arbitrage disabled (0%), skip
        if (arbitragePercent == 0) {
            baseBackingEDAI += edaiAmount;
            totalArbitrageSkipped++;
            emit ArbitrageSkipped("Arbitrage disabled", edaiAmount);
            return 0;
        }
        
        uint256 backingPerMeFi = getBackingPerMeFi();
        uint256 dexPrice = _getDexPrice();
        
        uint256 spreadBps;
        
        if (dexPrice > backingPerMeFi) {
            spreadBps = ((dexPrice - backingPerMeFi) * 10000) / backingPerMeFi;
            
            if (spreadBps > maxSpreadBps) {
                baseBackingEDAI += edaiAmount;
                totalArbitrageSkipped++;
                emit ArbitrageSkipped("Spread too large (manipulation?)", edaiAmount);
                return 0;
            }
            
            if (spreadBps >= minSpreadBps) {
                profit = _sellArbitrage(edaiAmount, backingPerMeFi, dexPrice);
            } else {
                baseBackingEDAI += edaiAmount;
                totalArbitrageSkipped++;
                emit ArbitrageSkipped("Spread too small", edaiAmount);
            }
            
        } else if (dexPrice < backingPerMeFi) {
            spreadBps = ((backingPerMeFi - dexPrice) * 10000) / backingPerMeFi;
            
            if (spreadBps > maxSpreadBps) {
                baseBackingEDAI += edaiAmount;
                totalArbitrageSkipped++;
                emit ArbitrageSkipped("Spread too large (manipulation?)", edaiAmount);
                return 0;
            }
            
            if (spreadBps >= minSpreadBps) {
                profit = _buyArbitrage(edaiAmount, backingPerMeFi, dexPrice);
            } else {
                baseBackingEDAI += edaiAmount;
                totalArbitrageSkipped++;
                emit ArbitrageSkipped("Spread too small", edaiAmount);
            }
            
        } else {
            baseBackingEDAI += edaiAmount;
            totalArbitrageSkipped++;
            emit ArbitrageSkipped("Prices equal", edaiAmount);
        }
        
        return profit;
    }
    
    function _sellArbitrage(uint256 edaiAmount, uint256 backingPerMeFi, uint256 dexPrice) internal returns (uint256 profit) {
        uint256 mefiToMint = (edaiAmount * 1e18) / backingPerMeFi;
        _mint(address(this), mefiToMint);
        _approve(address(this), ROUTER, mefiToMint);
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = EDAI;
        
        uint256 minOut = (mefiToMint * dexPrice * 98) / (1e18 * 100);
        
        uint256[] memory amounts = IPulseXRouter(ROUTER).swapExactTokensForTokens(
            mefiToMint,
            minOut,
            path,
            address(this),
            block.timestamp + 300
        );
        
        uint256 edaiReceived = amounts[1];
        
        if (edaiReceived > edaiAmount) {
            profit = edaiReceived - edaiAmount;
            arbitrageProfitEDAI += profit;
            totalArbitrageProfits += profit;
            totalArbitrageExecuted++;
        }
        
        emit ArbitrageExecuted(true, edaiAmount, mefiToMint, profit, getBackingPerMeFi());
        return profit;
    }
    
    function _buyArbitrage(uint256 edaiAmount, uint256 /* backingPerMeFi */, uint256 dexPrice) internal returns (uint256 profit) {
        IERC20(EDAI).approve(ROUTER, edaiAmount);
        
        address[] memory path = new address[](2);
        path[0] = EDAI;
        path[1] = address(this);
        
        uint256 minMefi = (edaiAmount * 1e18 * 98) / (dexPrice * 100);
        
        uint256[] memory amounts = IPulseXRouter(ROUTER).swapExactTokensForTokens(
            edaiAmount,
            minMefi,
            path,
            address(this),
            block.timestamp + 300
        );
        
        uint256 mefiBought = amounts[1];
        _burn(address(this), mefiBought);
        
        totalArbitrageExecuted++;
        emit ArbitrageExecuted(false, edaiAmount, mefiBought, 0, getBackingPerMeFi());
        
        return 0;
    }
    
    function redeemForEDAI(uint256 mefiAmount) external whenNotPaused nonReentrant returns (uint256 edaiAmount) {
        require(mefiAmount > 0, "Invalid amount");
        require(_balances[msg.sender] >= mefiAmount, "Insufficient balance");
        require(_totalSupply > 0, "No supply");
        
        uint256 backingPerMeFi = getBackingPerMeFi();
        edaiAmount = (mefiAmount * backingPerMeFi) / 1e18;
        require(edaiAmount > 0, "Amount too small");
        
        uint256 treasuryBalance = IERC20(EDAI).balanceOf(address(this));
        require(treasuryBalance >= edaiAmount, "Insufficient treasury");
        
        uint256 burnRatio = (mefiAmount * 1e18) / _totalSupply;
        uint256 baseUsed = (baseBackingEDAI * burnRatio) / 1e18;
        uint256 profitUsed = (arbitrageProfitEDAI * burnRatio) / 1e18;
        
        baseBackingEDAI -= baseUsed;
        arbitrageProfitEDAI -= profitUsed;
        totalRedeemed[msg.sender] += mefiAmount;
        
        _burn(msg.sender, mefiAmount);
        
        bool success = IERC20(EDAI).transfer(msg.sender, edaiAmount);
        require(success, "eDAI transfer failed");
        
        emit Redeemed(msg.sender, mefiAmount, edaiAmount);
        emit BackingUpdated(getTotalBacking(), getBackingPerMeFi());
        
        return edaiAmount;
    }
    
    // ==========================================
    // VIEW
    // ==========================================
    
    function getTotalBacking() public view returns (uint256) {
        return baseBackingEDAI + arbitrageProfitEDAI;
    }
    
    function getBackingPerMeFi() public view returns (uint256) {
        if (_totalSupply == 0) return 1e18;
        return (getTotalBacking() * 1e18) / _totalSupply;
    }
    
    function getTreasuryBalance() external view returns (uint256) {
        return IERC20(EDAI).balanceOf(address(this));
    }
    
    function estimateRedemption(uint256 mefiAmount) external view returns (uint256) {
        if (_totalSupply == 0) return 0;
        return (mefiAmount * getBackingPerMeFi()) / 1e18;
    }
    
    function _getDexPrice() internal view returns (uint256) {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = EDAI;
        
        try IPulseXRouter(ROUTER).getAmountsOut(1e18, path) returns (uint[] memory amounts) {
            return amounts[1];
        } catch {
            return getBackingPerMeFi();
        }
    }
    
    function getArbitrageStats() external view returns (
        uint256 totalProfits,
        uint256 totalExecuted,
        uint256 totalSkipped,
        uint256 currentBacking,
        uint256 backingGrowth
    ) {
        totalProfits = totalArbitrageProfits;
        totalExecuted = totalArbitrageExecuted;
        totalSkipped = totalArbitrageSkipped;
        currentBacking = getBackingPerMeFi();
        backingGrowth = currentBacking > 1e18 ? ((currentBacking - 1e18) * 10000) / 1e18 : 0;
    }
    
    function paused() public view returns (bool) {
        return _paused;
    }
    
    // ==========================================
    // ADMIN
    // ==========================================
    
    function setOracle(address _oracle) external onlyOwner {
        require(_oracle != address(0), "Invalid");
        oracle = _oracle;
    }
    
    function setMinter(address minter, bool authorized) external onlyOwner {
        authorizedMinters[minter] = authorized;
    }
    
    function setArbitrageSettings(
        uint256 _arbitragePercent,
        uint256 _minSpreadBps,
        uint256 _maxSpreadBps,
        uint256 _maxArbitragePerTx,
        uint256 _minArbitrageAmount  // NEW: Set minimum arbitrage amount
    ) external onlyOwner {
        require(_arbitragePercent <= 50, "Max 50%");
        require(_minSpreadBps >= 50, "Min 0.5%");
        require(_maxSpreadBps <= 2000, "Max 20%");
        require(_maxSpreadBps >= _minSpreadBps, "Max < min");
        
        arbitragePercent = _arbitragePercent;
        minSpreadBps = _minSpreadBps;
        maxSpreadBps = _maxSpreadBps;
        maxArbitragePerTx = _maxArbitragePerTx;
        minArbitrageAmount = _minArbitrageAmount;
        
        emit ArbitrageSettingsUpdated(_arbitragePercent, _minSpreadBps, _maxSpreadBps, _maxArbitragePerTx, _minArbitrageAmount);
    }
    
    function pause() external onlyOwner {
        _paused = true;
        emit Paused(msg.sender);
    }
    
    function unpause() external onlyOwner {
        _paused = false;
        emit Unpaused(msg.sender);
    }
    
    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Invalid");
        pendingOwner = newOwner;
        emit OwnershipTransferInitiated(owner, newOwner);
    }
    
    function acceptOwnership() external {
        require(msg.sender == pendingOwner, "Not pending owner");
        address oldOwner = owner;
        owner = pendingOwner;
        pendingOwner = address(0);
        emit OwnershipTransferred(oldOwner, owner);
    }
    
    function emergencyWithdrawEDAI(uint256 amount) external onlyOwner {
        require(_paused, "Must pause");
        bool success = IERC20(EDAI).transfer(owner, amount);
        require(success, "Failed");
    }
    
    // ==========================================
    // INTERNAL
    // ==========================================
    
    function _transfer(address from, address to, uint256 amount) internal {
        require(from != address(0) && to != address(0), "Zero address");
        require(_balances[from] >= amount, "Insufficient");
        
        _balances[from] -= amount;
        _balances[to] += amount;
        
        emit Transfer(from, to, amount);
    }
    
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "Zero address");
        require(_totalSupply + amount <= MAX_SUPPLY, "Max supply");
        
        _totalSupply += amount;
        _balances[account] += amount;
        
        emit Transfer(address(0), account, amount);
    }
    
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "Zero address");
        require(_balances[account] >= amount, "Insufficient");
        
        _balances[account] -= amount;
        _totalSupply -= amount;
        
        emit Transfer(account, address(0), amount);
    }
    
    function _approve(address tokenOwner, address spender, uint256 amount) internal {
        require(tokenOwner != address(0) && spender != address(0), "Zero address");
        
        _allowances[tokenOwner][spender] = amount;
        emit Approval(tokenOwner, spender, amount);
    }
    
    function _spendAllowance(address tokenOwner, address spender, uint256 amount) internal {
        uint256 currentAllowance = _allowances[tokenOwner][spender];
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "Insufficient allowance");
            unchecked {
                _allowances[tokenOwner][spender] = currentAllowance - amount;
            }
        }
    }
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"paris","compilationTarget":{"contracts/AER/MeFi.sol":"MeFi"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ArbitrageExecuted","inputs":[{"type":"bool","name":"isSell","internalType":"bool","indexed":false},{"type":"uint256","name":"edaiAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"mefiAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"profit","internalType":"uint256","indexed":false},{"type":"uint256","name":"newBacking","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ArbitrageSettingsUpdated","inputs":[{"type":"uint256","name":"percent","internalType":"uint256","indexed":false},{"type":"uint256","name":"minSpread","internalType":"uint256","indexed":false},{"type":"uint256","name":"maxSpread","internalType":"uint256","indexed":false},{"type":"uint256","name":"maxSize","internalType":"uint256","indexed":false},{"type":"uint256","name":"minAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ArbitrageSkipped","inputs":[{"type":"string","name":"reason","internalType":"string","indexed":false},{"type":"uint256","name":"edaiAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BackingUpdated","inputs":[{"type":"uint256","name":"totalBacking","internalType":"uint256","indexed":false},{"type":"uint256","name":"backingPerMeFi","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferInitiated","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"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":"Paused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Redeemed","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"mefiAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"edaiReceived","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TaxDeposited","inputs":[{"type":"address","name":"creator","internalType":"address","indexed":true},{"type":"uint256","name":"edaiAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"mefiMinted","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"EDAI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_SUPPLY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_DEPOSIT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ROUTER","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"tokenOwner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"arbitragePercent","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"arbitrageProfitEDAI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"authorizedMinters","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"baseBackingEDAI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"mefiMinted","internalType":"uint256"},{"type":"uint256","name":"profitCaptured","internalType":"uint256"}],"name":"depositTax","inputs":[{"type":"address","name":"creator","internalType":"address"},{"type":"uint256","name":"edaiAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdrawEDAI","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"estimateRedemption","inputs":[{"type":"uint256","name":"mefiAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalProfits","internalType":"uint256"},{"type":"uint256","name":"totalExecuted","internalType":"uint256"},{"type":"uint256","name":"totalSkipped","internalType":"uint256"},{"type":"uint256","name":"currentBacking","internalType":"uint256"},{"type":"uint256","name":"backingGrowth","internalType":"uint256"}],"name":"getArbitrageStats","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBackingPerMeFi","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalBacking","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTreasuryBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxArbitragePerTx","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxSpreadBps","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minArbitrageAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minSpreadBps","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"oracle","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingOwner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"edaiAmount","internalType":"uint256"}],"name":"redeemForEDAI","inputs":[{"type":"uint256","name":"mefiAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setArbitrageSettings","inputs":[{"type":"uint256","name":"_arbitragePercent","internalType":"uint256"},{"type":"uint256","name":"_minSpreadBps","internalType":"uint256"},{"type":"uint256","name":"_maxSpreadBps","internalType":"uint256"},{"type":"uint256","name":"_maxArbitragePerTx","internalType":"uint256"},{"type":"uint256","name":"_minArbitrageAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinter","inputs":[{"type":"address","name":"minter","internalType":"address"},{"type":"bool","name":"authorized","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOracle","inputs":[{"type":"address","name":"_oracle","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalArbitrageExecuted","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalArbitrageProfits","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalArbitrageSkipped","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalEarned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalRedeemed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]}]
              

Contract Creation Code

0x60806040526000600c5560c8600d556103e8600e5568056bc75e2d63100000600f55674563918244f4000060105534801561003957600080fd5b50600380546001600160a01b0319163317905561296c8061005b6000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c80637adbf9731161015c578063ab2cd9ba116100ce578063e1e158a511610087578063e1e158a5146105dc578063e2896cac146105e8578063e30c3978146105fb578063e4d89f061461060e578063ee3a408f14610617578063f2fde38b1461062057600080fd5b8063ab2cd9ba14610562578063b19aedf71461056b578063c0afe83b14610574578063c6189b551461057d578063cf456ae714610590578063dd62ed3e146105a357600080fd5b80638da5cb5b116101205780638da5cb5b146104db57806395d89b41146104ee5780639b5655dc14610511578063a595829b14610519578063a9059cbb1461052c578063aa2fe91b1461053f57600080fd5b80637adbf973146104915780637dc0d1d0146104a45780638456cb59146104b757806384e816bb146104bf5780638bba1f08146104c857600080fd5b806332cb6b0c116101f557806366660731116101b957806366660731146103ed57806370a082311461041d578063731cd8b71461044657806376327a911461044e57806379ba50971461046e5780637aabea951461047657600080fd5b806332cb6b0c1461037357806332fe7b26146103855780633f4ba83a146103b85780635c975abb146103c2578063649aca4a146103cd57600080fd5b806319f041741161024757806319f04174146103045780631f0242dd1461030c5780631f47b5281461033457806323b872dd1461033d5780632405d0a014610350578063313ce5671461035957600080fd5b8063056ee4701461028457806306fdde03146102a0578063095ea7b3146102d057806309d91a52146102f357806318160ddd146102fc575b600080fd5b61028d60125481565b6040519081526020015b60405180910390f35b6102c3604051806040016040528060048152602001634d65466960e01b81525081565b604051610297919061242f565b6102e36102de366004612499565b610633565b6040519015158152602001610297565b61028d600f5481565b60005461028d565b61028d61064a565b61031f61031a366004612499565b610661565b60408051928352602083019190915201610297565b61028d60135481565b6102e361034b3660046124c3565b610a6a565b61028d600c5481565b610361601281565b60405160ff9091168152602001610297565b61028d6a52b7d2dcc80cd2e400000081565b6103a073165c3410fc91ef562c50559f7d2289febed552d981565b6040516001600160a01b039091168152602001610297565b6103c0610ab0565b005b600b5460ff166102e3565b61028d6103db3660046124ff565b60086020526000908152604090205481565b6103f5610b1a565b604080519586526020860194909452928401919091526060830152608082015260a001610297565b61028d61042b3660046124ff565b6001600160a01b031660009081526001602052604090205490565b61028d610b78565b61028d61045c3660046124ff565b60096020526000908152604090205481565b6103c0610bb7565b6103a073efd766ccb38eaf1dfd701853bfce31359239f30581565b6103c061049f3660046124ff565b610c62565b6005546103a0906001600160a01b031681565b6103c0610cee565b61028d60105481565b61028d6104d6366004612521565b610d55565b6003546103a0906001600160a01b031681565b6102c3604051806040016040528060048152602001634d45464960e01b81525081565b61028d610d8d565b61028d610527366004612521565b610e03565b6102e361053a366004612499565b611282565b6102e361054d3660046124ff565b600a6020526000908152604090205460ff1681565b61028d60075481565b61028d600d5481565b61028d600e5481565b6103c061058b366004612521565b6112b3565b6103c061059e36600461254b565b6113e4565b61028d6105b1366004612582565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61028d64e8d4a5100081565b6103c06105f63660046125b5565b611439565b6004546103a0906001600160a01b031681565b61028d60115481565b61028d60065481565b6103c061062e3660046124ff565b6115c1565b600061064033848461167d565b5060015b92915050565b600060075460065461065c9190612606565b905090565b60055460009081906001600160a01b031633148061068e5750336000908152600a602052604090205460ff165b6106cc5760405162461bcd60e51b815260206004820152600a6024820152694e6f74206f7261636c6560b01b60448201526064015b60405180910390fd5b600b5460ff16156106ef5760405162461bcd60e51b81526004016106c390612619565b600b54610100900460ff16156107335760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064016106c3565b600b805461ff0019166101001790556001600160a01b03841661078a5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21031b932b0ba37b960891b60448201526064016106c3565b64e8d4a510008310156107cf5760405162461bcd60e51b815260206004820152600d60248201526c42656c6f77206d696e696d756d60981b60448201526064016106c3565b6040516323b872dd60e01b81523360048201523060248201526044810184905260009073efd766ccb38eaf1dfd701853bfce31359239f305906323b872dd906064016020604051808303816000875af1158015610830573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108549190612639565b90508061089a5760405162461bcd60e51b815260206004820152601460248201527319511052481d1c985b9cd9995c8819985a5b195960621b60448201526064016106c3565b60006064600c54866108ac9190612656565b6108b6919061266d565b905060006108c4828761268f565b9050600f548211156108f5576000600f54836108e0919061268f565b600f54935090506108f18183612606565b9150505b60008211801561090757506010548210155b1561091c576109158261171b565b9350610974565b81156109745781600660008282546109349190612606565b909155505060138054906000610949836126a2565b91905055506000805160206129178339815191528260405161096b91906126bb565b60405180910390a15b80945080600660008282546109899190612606565b90915550506001600160a01b038716600090815260086020526040812080548792906109b6908490612606565b909155506109c6905087866119e4565b60408051878152602081018790526001600160a01b038916917fed4842fbe4d213991be858c677c34ed27f119a1cb2a288de215304757eee2025910160405180910390a27faabc7a8108435a4fc30d1e2cecd59cbdec96ee6fa583c6eebf9a20bc9d14d3ed610a3361064a565b610a3b610b78565b6040805192835260208301919091520160405180910390a1505050600b805461ff001916905590939092509050565b600b5460009060ff1615610a905760405162461bcd60e51b81526004016106c390612619565b610a9b843384611ae8565b610aa6848484611b91565b5060019392505050565b6003546001600160a01b03163314610ada5760405162461bcd60e51b81526004016106c3906126f9565b600b805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b601154601254601354600080610b2e610b78565b9150670de0b6b3a76400008211610b46576000610b6f565b670de0b6b3a7640000610b59818461268f565b610b6590612710612656565b610b6f919061266d565b90509091929394565b60008054600003610b905750670de0b6b3a764000090565b600054610b9b61064a565b610bad90670de0b6b3a7640000612656565b61065c919061266d565b6004546001600160a01b03163314610c055760405162461bcd60e51b81526020600482015260116024820152702737ba103832b73234b7339037bbb732b960791b60448201526064016106c3565b60038054600480546001600160a01b03198084166001600160a01b038381169182179096559116909155604051929091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6003546001600160a01b03163314610c8c5760405162461bcd60e51b81526004016106c3906126f9565b6001600160a01b038116610ccc5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016106c3565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b03163314610d185760405162461bcd60e51b81526004016106c3906126f9565b600b805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610b10565b60008054600003610d6857506000919050565b670de0b6b3a7640000610d79610b78565b610d839084612656565b610644919061266d565b6040516370a0823160e01b815230600482015260009073efd766ccb38eaf1dfd701853bfce31359239f305906370a0823190602401602060405180830381865afa158015610ddf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065c919061271c565b600b5460009060ff1615610e295760405162461bcd60e51b81526004016106c390612619565b600b54610100900460ff1615610e6d5760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064016106c3565b600b805461ff00191661010017905581610eba5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016106c3565b33600090815260016020526040902054821115610f105760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016106c3565b6000805411610f4d5760405162461bcd60e51b81526020600482015260096024820152684e6f20737570706c7960b81b60448201526064016106c3565b6000610f57610b78565b9050670de0b6b3a7640000610f6c8285612656565b610f76919061266d565b915060008211610f985760405162461bcd60e51b81526004016106c390612735565b6040516370a0823160e01b815230600482015260009073efd766ccb38eaf1dfd701853bfce31359239f305906370a0823190602401602060405180830381865afa158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e919061271c565b9050828110156110585760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420747265617375727960581b60448201526064016106c3565b6000805461106e86670de0b6b3a7640000612656565b611078919061266d565b90506000670de0b6b3a7640000826006546110939190612656565b61109d919061266d565b90506000670de0b6b3a7640000836007546110b89190612656565b6110c2919061266d565b905081600660008282546110d6919061268f565b9250508190555080600760008282546110ef919061268f565b90915550503360009081526009602052604081208054899290611113908490612606565b9091555061112390503388611cc5565b60405163a9059cbb60e01b81523360048201526024810187905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063a9059cbb906044016020604051808303816000875af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a29190612639565b9050806111e85760405162461bcd60e51b815260206004820152601460248201527319511052481d1c985b9cd9995c8819985a5b195960621b60448201526064016106c3565b604080518981526020810189905233917ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec262910160405180910390a27faabc7a8108435a4fc30d1e2cecd59cbdec96ee6fa583c6eebf9a20bc9d14d3ed61124c61064a565b611254610b78565b6040805192835260208301919091520160405180910390a1505050505050600b805461ff0019169055919050565b600b5460009060ff16156112a85760405162461bcd60e51b81526004016106c390612619565b610640338484611b91565b6003546001600160a01b031633146112dd5760405162461bcd60e51b81526004016106c3906126f9565b600b5460ff1661131c5760405162461bcd60e51b815260206004820152600a6024820152694d75737420706175736560b01b60448201526064016106c3565b60035460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063a9059cbb906044016020604051808303816000875af1158015611384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a89190612639565b9050806113e05760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b60448201526064016106c3565b5050565b6003546001600160a01b0316331461140e5760405162461bcd60e51b81526004016106c3906126f9565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6003546001600160a01b031633146114635760405162461bcd60e51b81526004016106c3906126f9565b603285111561149e5760405162461bcd60e51b81526020600482015260076024820152664d61782035302560c81b60448201526064016106c3565b60328410156114da5760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b60448201526064016106c3565b6107d08311156115165760405162461bcd60e51b81526020600482015260076024820152664d61782032302560c81b60448201526064016106c3565b838310156115525760405162461bcd60e51b815260206004820152600960248201526826b0bc101e1036b4b760b91b60448201526064016106c3565b600c859055600d849055600e839055600f8290556010819055604080518681526020810186905290810184905260608101839052608081018290527fd7eb6830d58fec1f7218ede3317273bc3ddc1292d5444175e5ed3e0f98716be89060a00160405180910390a15050505050565b6003546001600160a01b031633146115eb5760405162461bcd60e51b81526004016106c3906126f9565b6001600160a01b03811661162b5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016106c3565b600480546001600160a01b0319166001600160a01b03838116918217909255600354604051919216907fb150023a879fd806e3599b6ca8ee3b60f0e360ab3846d128d67ebce1a391639a90600090a350565b6001600160a01b0383161580159061169d57506001600160a01b03821615155b6116b95760405162461bcd60e51b81526004016106c390612765565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000600c546000036117a45781600660008282546117399190612606565b90915550506013805490600061174e836126a2565b90915550506040805181815260128183015271105c989a5d1c9859d948191a5cd8589b195960721b60608201526020810184905290516000805160206129178339815191529181900360800190a1506000919050565b60006117ae610b78565b905060006117ba611dc5565b905060008282111561191157826117d1818461268f565b6117dd90612710612656565b6117e7919061266d565b9050600e5481111561187e5784600660008282546118059190612606565b90915550506013805490600061181a836126a2565b90915550506040805181815260208183018190527f53707265616420746f6f206c6172676520286d616e6970756c6174696f6e3f296060830152810187905290516000805160206129178339815191529181900360800190a1506000949350505050565b600d54811061189957611892858484611f11565b93506119dc565b84600660008282546118ab9190612606565b9091555050601380549060006118c0836126a2565b9091555050604080518181526010818301526f14dc1c995859081d1bdbc81cdb585b1b60821b60608201526020810187905290516000805160206129178339815191529181900360800190a16119dc565b8282101561196c5782611924838261268f565b61193090612710612656565b61193a919061266d565b9050600e548111156119585784600660008282546118059190612606565b600d54811061189957611892858484612193565b846006600082825461197e9190612606565b909155505060138054906000611993836126a2565b909155505060408051818152600c818301526b141c9a58d95cc8195c5d585b60a21b60608201526020810187905290516000805160206129178339815191529181900360800190a15b505050919050565b6001600160a01b038216611a0a5760405162461bcd60e51b81526004016106c390612765565b6a52b7d2dcc80cd2e400000081600054611a249190612606565b1115611a5f5760405162461bcd60e51b815260206004820152600a6024820152694d617820737570706c7960b01b60448201526064016106c3565b80600080828254611a709190612606565b90915550506001600160a01b03821660009081526001602052604081208054839290611a9d908490612606565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6001600160a01b038084166000908152600260209081526040808320938616835292905220546000198114611b8b5781811015611b605760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016106c3565b6001600160a01b03808516600090815260026020908152604080832093871683529290522082820390555b50505050565b6001600160a01b03831615801590611bb157506001600160a01b03821615155b611bcd5760405162461bcd60e51b81526004016106c390612765565b6001600160a01b038316600090815260016020526040902054811115611c245760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016106c3565b6001600160a01b03831660009081526001602052604081208054839290611c4c90849061268f565b90915550506001600160a01b03821660009081526001602052604081208054839290611c79908490612606565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161170e91815260200190565b6001600160a01b038216611ceb5760405162461bcd60e51b81526004016106c390612765565b6001600160a01b038216600090815260016020526040902054811115611d425760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016106c3565b6001600160a01b03821660009081526001602052604081208054839290611d6a90849061268f565b9250508190555080600080828254611d82919061268f565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611adc565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110611dfe57611dfe6127a1565b60200260200101906001600160a01b031690816001600160a01b03168152505073efd766ccb38eaf1dfd701853bfce31359239f30581600181518110611e4657611e466127a1565b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815273165c3410fc91ef562c50559f7d2289febed552d99063d06ca61f90611e9f90670de0b6b3a76400009085906004016127fb565b600060405180830381865afa925050508015611edd57506040513d6000823e601f3d908101601f19168201604052611eda919081019061281c565b60015b611eef57611ee9610b78565b91505090565b80600181518110611f0257611f026127a1565b60200260200101519250505090565b60008083611f2786670de0b6b3a7640000612656565b611f31919061266d565b9050611f3d30826119e4565b611f5c3073165c3410fc91ef562c50559f7d2289febed552d98361167d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611f9157611f916127a1565b60200260200101906001600160a01b031690816001600160a01b03168152505073efd766ccb38eaf1dfd701853bfce31359239f30581600181518110611fd957611fd96127a1565b6001600160a01b0390921660209283029190910190910152600068056bc75e2d631000006120078685612656565b612012906062612656565b61201c919061266d565b9050600073165c3410fc91ef562c50559f7d2289febed552d96338ed17398584863061204a4261012c612606565b6040518663ffffffff1660e01b815260040161206a9594939291906128da565b6000604051808303816000875af1158015612089573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120b1919081019061281c565b90506000816001815181106120c8576120c86127a1565b602002602001015190508881111561212c576120e4898261268f565b955085600760008282546120f89190612606565b9250508190555085601160008282546121119190612606565b909155505060128054906000612126836126a2565b91905055505b7f560f22ff4d63f97bb10bc39ad6ea0b90caebf129c92f9d8608f8feb058e43c5060018a878961215a610b78565b6040805195151586526020860194909452928401919091526060830152608082015260a00160405180910390a150505050509392505050565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d960048201526024810184905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063095ea7b3906044016020604051808303816000875af1158015612202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122269190612639565b5060408051600280825260608201835260009260208301908036833701905050905073efd766ccb38eaf1dfd701853bfce31359239f30581600081518110612270576122706127a1565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106122a4576122a46127a1565b6001600160a01b039092166020928302919091019091015260006122c9846064612656565b6122db87670de0b6b3a7640000612656565b6122e6906062612656565b6122f0919061266d565b9050600073165c3410fc91ef562c50559f7d2289febed552d96338ed17398884863061231e4261012c612606565b6040518663ffffffff1660e01b815260040161233e9594939291906128da565b6000604051808303816000875af115801561235d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612385919081019061281c565b905060008160018151811061239c5761239c6127a1565b602002602001015190506123b03082611cc5565b601280549060006123c0836126a2565b91905055507f560f22ff4d63f97bb10bc39ad6ea0b90caebf129c92f9d8608f8feb058e43c506000898360006123f4610b78565b6040805195151586526020860194909452928401919091526060830152608082015260a00160405180910390a1506000979650505050505050565b600060208083528351808285015260005b8181101561245c57858101830151858201604001528201612440565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461249457600080fd5b919050565b600080604083850312156124ac57600080fd5b6124b58361247d565b946020939093013593505050565b6000806000606084860312156124d857600080fd5b6124e18461247d565b92506124ef6020850161247d565b9150604084013590509250925092565b60006020828403121561251157600080fd5b61251a8261247d565b9392505050565b60006020828403121561253357600080fd5b5035919050565b801515811461254857600080fd5b50565b6000806040838503121561255e57600080fd5b6125678361247d565b915060208301356125778161253a565b809150509250929050565b6000806040838503121561259557600080fd5b61259e8361247d565b91506125ac6020840161247d565b90509250929050565b600080600080600060a086880312156125cd57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610644576106446125f0565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60006020828403121561264b57600080fd5b815161251a8161253a565b8082028115828204841417610644576106446125f0565b60008261268a57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610644576106446125f0565b6000600182016126b4576126b46125f0565b5060010190565b6040815260006126eb60408301601081526f105b5bdd5b9d081d1bdbc81cdb585b1b60821b602082015260400190565b905082602083015292915050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b60006020828403121561272e57600080fd5b5051919050565b60208152600061064460208301601081526f105b5bdd5b9d081d1bdbc81cdb585b1b60821b602082015260400190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156127f05781516001600160a01b0316875295820195908201906001016127cb565b509495945050505050565b82815260406020820152600061281460408301846127b7565b949350505050565b6000602080838503121561282f57600080fd5b825167ffffffffffffffff8082111561284757600080fd5b818501915085601f83011261285b57600080fd5b81518181111561286d5761286d61278b565b8060051b604051601f19603f830116810181811085821117156128925761289261278b565b6040529182528482019250838101850191888311156128b057600080fd5b938501935b828510156128ce578451845293850193928501926128b5565b98975050505050505050565b85815284602082015260a0604082015260006128f960a08301866127b7565b6001600160a01b039490941660608301525060800152939250505056fea87d5e72382e1279629de8ddc63dfdc32098c7e8812a592ab3053cd443194ff2a2646970667358221220565ae801880b2e14b22b9bda57c4e15c5c24c046d10ca93c6150c71d59eaa67764736f6c63430008130033

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061027f5760003560e01c80637adbf9731161015c578063ab2cd9ba116100ce578063e1e158a511610087578063e1e158a5146105dc578063e2896cac146105e8578063e30c3978146105fb578063e4d89f061461060e578063ee3a408f14610617578063f2fde38b1461062057600080fd5b8063ab2cd9ba14610562578063b19aedf71461056b578063c0afe83b14610574578063c6189b551461057d578063cf456ae714610590578063dd62ed3e146105a357600080fd5b80638da5cb5b116101205780638da5cb5b146104db57806395d89b41146104ee5780639b5655dc14610511578063a595829b14610519578063a9059cbb1461052c578063aa2fe91b1461053f57600080fd5b80637adbf973146104915780637dc0d1d0146104a45780638456cb59146104b757806384e816bb146104bf5780638bba1f08146104c857600080fd5b806332cb6b0c116101f557806366660731116101b957806366660731146103ed57806370a082311461041d578063731cd8b71461044657806376327a911461044e57806379ba50971461046e5780637aabea951461047657600080fd5b806332cb6b0c1461037357806332fe7b26146103855780633f4ba83a146103b85780635c975abb146103c2578063649aca4a146103cd57600080fd5b806319f041741161024757806319f04174146103045780631f0242dd1461030c5780631f47b5281461033457806323b872dd1461033d5780632405d0a014610350578063313ce5671461035957600080fd5b8063056ee4701461028457806306fdde03146102a0578063095ea7b3146102d057806309d91a52146102f357806318160ddd146102fc575b600080fd5b61028d60125481565b6040519081526020015b60405180910390f35b6102c3604051806040016040528060048152602001634d65466960e01b81525081565b604051610297919061242f565b6102e36102de366004612499565b610633565b6040519015158152602001610297565b61028d600f5481565b60005461028d565b61028d61064a565b61031f61031a366004612499565b610661565b60408051928352602083019190915201610297565b61028d60135481565b6102e361034b3660046124c3565b610a6a565b61028d600c5481565b610361601281565b60405160ff9091168152602001610297565b61028d6a52b7d2dcc80cd2e400000081565b6103a073165c3410fc91ef562c50559f7d2289febed552d981565b6040516001600160a01b039091168152602001610297565b6103c0610ab0565b005b600b5460ff166102e3565b61028d6103db3660046124ff565b60086020526000908152604090205481565b6103f5610b1a565b604080519586526020860194909452928401919091526060830152608082015260a001610297565b61028d61042b3660046124ff565b6001600160a01b031660009081526001602052604090205490565b61028d610b78565b61028d61045c3660046124ff565b60096020526000908152604090205481565b6103c0610bb7565b6103a073efd766ccb38eaf1dfd701853bfce31359239f30581565b6103c061049f3660046124ff565b610c62565b6005546103a0906001600160a01b031681565b6103c0610cee565b61028d60105481565b61028d6104d6366004612521565b610d55565b6003546103a0906001600160a01b031681565b6102c3604051806040016040528060048152602001634d45464960e01b81525081565b61028d610d8d565b61028d610527366004612521565b610e03565b6102e361053a366004612499565b611282565b6102e361054d3660046124ff565b600a6020526000908152604090205460ff1681565b61028d60075481565b61028d600d5481565b61028d600e5481565b6103c061058b366004612521565b6112b3565b6103c061059e36600461254b565b6113e4565b61028d6105b1366004612582565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61028d64e8d4a5100081565b6103c06105f63660046125b5565b611439565b6004546103a0906001600160a01b031681565b61028d60115481565b61028d60065481565b6103c061062e3660046124ff565b6115c1565b600061064033848461167d565b5060015b92915050565b600060075460065461065c9190612606565b905090565b60055460009081906001600160a01b031633148061068e5750336000908152600a602052604090205460ff165b6106cc5760405162461bcd60e51b815260206004820152600a6024820152694e6f74206f7261636c6560b01b60448201526064015b60405180910390fd5b600b5460ff16156106ef5760405162461bcd60e51b81526004016106c390612619565b600b54610100900460ff16156107335760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064016106c3565b600b805461ff0019166101001790556001600160a01b03841661078a5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21031b932b0ba37b960891b60448201526064016106c3565b64e8d4a510008310156107cf5760405162461bcd60e51b815260206004820152600d60248201526c42656c6f77206d696e696d756d60981b60448201526064016106c3565b6040516323b872dd60e01b81523360048201523060248201526044810184905260009073efd766ccb38eaf1dfd701853bfce31359239f305906323b872dd906064016020604051808303816000875af1158015610830573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108549190612639565b90508061089a5760405162461bcd60e51b815260206004820152601460248201527319511052481d1c985b9cd9995c8819985a5b195960621b60448201526064016106c3565b60006064600c54866108ac9190612656565b6108b6919061266d565b905060006108c4828761268f565b9050600f548211156108f5576000600f54836108e0919061268f565b600f54935090506108f18183612606565b9150505b60008211801561090757506010548210155b1561091c576109158261171b565b9350610974565b81156109745781600660008282546109349190612606565b909155505060138054906000610949836126a2565b91905055506000805160206129178339815191528260405161096b91906126bb565b60405180910390a15b80945080600660008282546109899190612606565b90915550506001600160a01b038716600090815260086020526040812080548792906109b6908490612606565b909155506109c6905087866119e4565b60408051878152602081018790526001600160a01b038916917fed4842fbe4d213991be858c677c34ed27f119a1cb2a288de215304757eee2025910160405180910390a27faabc7a8108435a4fc30d1e2cecd59cbdec96ee6fa583c6eebf9a20bc9d14d3ed610a3361064a565b610a3b610b78565b6040805192835260208301919091520160405180910390a1505050600b805461ff001916905590939092509050565b600b5460009060ff1615610a905760405162461bcd60e51b81526004016106c390612619565b610a9b843384611ae8565b610aa6848484611b91565b5060019392505050565b6003546001600160a01b03163314610ada5760405162461bcd60e51b81526004016106c3906126f9565b600b805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b601154601254601354600080610b2e610b78565b9150670de0b6b3a76400008211610b46576000610b6f565b670de0b6b3a7640000610b59818461268f565b610b6590612710612656565b610b6f919061266d565b90509091929394565b60008054600003610b905750670de0b6b3a764000090565b600054610b9b61064a565b610bad90670de0b6b3a7640000612656565b61065c919061266d565b6004546001600160a01b03163314610c055760405162461bcd60e51b81526020600482015260116024820152702737ba103832b73234b7339037bbb732b960791b60448201526064016106c3565b60038054600480546001600160a01b03198084166001600160a01b038381169182179096559116909155604051929091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6003546001600160a01b03163314610c8c5760405162461bcd60e51b81526004016106c3906126f9565b6001600160a01b038116610ccc5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016106c3565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b03163314610d185760405162461bcd60e51b81526004016106c3906126f9565b600b805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610b10565b60008054600003610d6857506000919050565b670de0b6b3a7640000610d79610b78565b610d839084612656565b610644919061266d565b6040516370a0823160e01b815230600482015260009073efd766ccb38eaf1dfd701853bfce31359239f305906370a0823190602401602060405180830381865afa158015610ddf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065c919061271c565b600b5460009060ff1615610e295760405162461bcd60e51b81526004016106c390612619565b600b54610100900460ff1615610e6d5760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064016106c3565b600b805461ff00191661010017905581610eba5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016106c3565b33600090815260016020526040902054821115610f105760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016106c3565b6000805411610f4d5760405162461bcd60e51b81526020600482015260096024820152684e6f20737570706c7960b81b60448201526064016106c3565b6000610f57610b78565b9050670de0b6b3a7640000610f6c8285612656565b610f76919061266d565b915060008211610f985760405162461bcd60e51b81526004016106c390612735565b6040516370a0823160e01b815230600482015260009073efd766ccb38eaf1dfd701853bfce31359239f305906370a0823190602401602060405180830381865afa158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e919061271c565b9050828110156110585760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420747265617375727960581b60448201526064016106c3565b6000805461106e86670de0b6b3a7640000612656565b611078919061266d565b90506000670de0b6b3a7640000826006546110939190612656565b61109d919061266d565b90506000670de0b6b3a7640000836007546110b89190612656565b6110c2919061266d565b905081600660008282546110d6919061268f565b9250508190555080600760008282546110ef919061268f565b90915550503360009081526009602052604081208054899290611113908490612606565b9091555061112390503388611cc5565b60405163a9059cbb60e01b81523360048201526024810187905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063a9059cbb906044016020604051808303816000875af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a29190612639565b9050806111e85760405162461bcd60e51b815260206004820152601460248201527319511052481d1c985b9cd9995c8819985a5b195960621b60448201526064016106c3565b604080518981526020810189905233917ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec262910160405180910390a27faabc7a8108435a4fc30d1e2cecd59cbdec96ee6fa583c6eebf9a20bc9d14d3ed61124c61064a565b611254610b78565b6040805192835260208301919091520160405180910390a1505050505050600b805461ff0019169055919050565b600b5460009060ff16156112a85760405162461bcd60e51b81526004016106c390612619565b610640338484611b91565b6003546001600160a01b031633146112dd5760405162461bcd60e51b81526004016106c3906126f9565b600b5460ff1661131c5760405162461bcd60e51b815260206004820152600a6024820152694d75737420706175736560b01b60448201526064016106c3565b60035460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063a9059cbb906044016020604051808303816000875af1158015611384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a89190612639565b9050806113e05760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b60448201526064016106c3565b5050565b6003546001600160a01b0316331461140e5760405162461bcd60e51b81526004016106c3906126f9565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6003546001600160a01b031633146114635760405162461bcd60e51b81526004016106c3906126f9565b603285111561149e5760405162461bcd60e51b81526020600482015260076024820152664d61782035302560c81b60448201526064016106c3565b60328410156114da5760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b60448201526064016106c3565b6107d08311156115165760405162461bcd60e51b81526020600482015260076024820152664d61782032302560c81b60448201526064016106c3565b838310156115525760405162461bcd60e51b815260206004820152600960248201526826b0bc101e1036b4b760b91b60448201526064016106c3565b600c859055600d849055600e839055600f8290556010819055604080518681526020810186905290810184905260608101839052608081018290527fd7eb6830d58fec1f7218ede3317273bc3ddc1292d5444175e5ed3e0f98716be89060a00160405180910390a15050505050565b6003546001600160a01b031633146115eb5760405162461bcd60e51b81526004016106c3906126f9565b6001600160a01b03811661162b5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016106c3565b600480546001600160a01b0319166001600160a01b03838116918217909255600354604051919216907fb150023a879fd806e3599b6ca8ee3b60f0e360ab3846d128d67ebce1a391639a90600090a350565b6001600160a01b0383161580159061169d57506001600160a01b03821615155b6116b95760405162461bcd60e51b81526004016106c390612765565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000600c546000036117a45781600660008282546117399190612606565b90915550506013805490600061174e836126a2565b90915550506040805181815260128183015271105c989a5d1c9859d948191a5cd8589b195960721b60608201526020810184905290516000805160206129178339815191529181900360800190a1506000919050565b60006117ae610b78565b905060006117ba611dc5565b905060008282111561191157826117d1818461268f565b6117dd90612710612656565b6117e7919061266d565b9050600e5481111561187e5784600660008282546118059190612606565b90915550506013805490600061181a836126a2565b90915550506040805181815260208183018190527f53707265616420746f6f206c6172676520286d616e6970756c6174696f6e3f296060830152810187905290516000805160206129178339815191529181900360800190a1506000949350505050565b600d54811061189957611892858484611f11565b93506119dc565b84600660008282546118ab9190612606565b9091555050601380549060006118c0836126a2565b9091555050604080518181526010818301526f14dc1c995859081d1bdbc81cdb585b1b60821b60608201526020810187905290516000805160206129178339815191529181900360800190a16119dc565b8282101561196c5782611924838261268f565b61193090612710612656565b61193a919061266d565b9050600e548111156119585784600660008282546118059190612606565b600d54811061189957611892858484612193565b846006600082825461197e9190612606565b909155505060138054906000611993836126a2565b909155505060408051818152600c818301526b141c9a58d95cc8195c5d585b60a21b60608201526020810187905290516000805160206129178339815191529181900360800190a15b505050919050565b6001600160a01b038216611a0a5760405162461bcd60e51b81526004016106c390612765565b6a52b7d2dcc80cd2e400000081600054611a249190612606565b1115611a5f5760405162461bcd60e51b815260206004820152600a6024820152694d617820737570706c7960b01b60448201526064016106c3565b80600080828254611a709190612606565b90915550506001600160a01b03821660009081526001602052604081208054839290611a9d908490612606565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6001600160a01b038084166000908152600260209081526040808320938616835292905220546000198114611b8b5781811015611b605760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016106c3565b6001600160a01b03808516600090815260026020908152604080832093871683529290522082820390555b50505050565b6001600160a01b03831615801590611bb157506001600160a01b03821615155b611bcd5760405162461bcd60e51b81526004016106c390612765565b6001600160a01b038316600090815260016020526040902054811115611c245760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016106c3565b6001600160a01b03831660009081526001602052604081208054839290611c4c90849061268f565b90915550506001600160a01b03821660009081526001602052604081208054839290611c79908490612606565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161170e91815260200190565b6001600160a01b038216611ceb5760405162461bcd60e51b81526004016106c390612765565b6001600160a01b038216600090815260016020526040902054811115611d425760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016106c3565b6001600160a01b03821660009081526001602052604081208054839290611d6a90849061268f565b9250508190555080600080828254611d82919061268f565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611adc565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110611dfe57611dfe6127a1565b60200260200101906001600160a01b031690816001600160a01b03168152505073efd766ccb38eaf1dfd701853bfce31359239f30581600181518110611e4657611e466127a1565b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815273165c3410fc91ef562c50559f7d2289febed552d99063d06ca61f90611e9f90670de0b6b3a76400009085906004016127fb565b600060405180830381865afa925050508015611edd57506040513d6000823e601f3d908101601f19168201604052611eda919081019061281c565b60015b611eef57611ee9610b78565b91505090565b80600181518110611f0257611f026127a1565b60200260200101519250505090565b60008083611f2786670de0b6b3a7640000612656565b611f31919061266d565b9050611f3d30826119e4565b611f5c3073165c3410fc91ef562c50559f7d2289febed552d98361167d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611f9157611f916127a1565b60200260200101906001600160a01b031690816001600160a01b03168152505073efd766ccb38eaf1dfd701853bfce31359239f30581600181518110611fd957611fd96127a1565b6001600160a01b0390921660209283029190910190910152600068056bc75e2d631000006120078685612656565b612012906062612656565b61201c919061266d565b9050600073165c3410fc91ef562c50559f7d2289febed552d96338ed17398584863061204a4261012c612606565b6040518663ffffffff1660e01b815260040161206a9594939291906128da565b6000604051808303816000875af1158015612089573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120b1919081019061281c565b90506000816001815181106120c8576120c86127a1565b602002602001015190508881111561212c576120e4898261268f565b955085600760008282546120f89190612606565b9250508190555085601160008282546121119190612606565b909155505060128054906000612126836126a2565b91905055505b7f560f22ff4d63f97bb10bc39ad6ea0b90caebf129c92f9d8608f8feb058e43c5060018a878961215a610b78565b6040805195151586526020860194909452928401919091526060830152608082015260a00160405180910390a150505050509392505050565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d960048201526024810184905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063095ea7b3906044016020604051808303816000875af1158015612202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122269190612639565b5060408051600280825260608201835260009260208301908036833701905050905073efd766ccb38eaf1dfd701853bfce31359239f30581600081518110612270576122706127a1565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106122a4576122a46127a1565b6001600160a01b039092166020928302919091019091015260006122c9846064612656565b6122db87670de0b6b3a7640000612656565b6122e6906062612656565b6122f0919061266d565b9050600073165c3410fc91ef562c50559f7d2289febed552d96338ed17398884863061231e4261012c612606565b6040518663ffffffff1660e01b815260040161233e9594939291906128da565b6000604051808303816000875af115801561235d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612385919081019061281c565b905060008160018151811061239c5761239c6127a1565b602002602001015190506123b03082611cc5565b601280549060006123c0836126a2565b91905055507f560f22ff4d63f97bb10bc39ad6ea0b90caebf129c92f9d8608f8feb058e43c506000898360006123f4610b78565b6040805195151586526020860194909452928401919091526060830152608082015260a00160405180910390a1506000979650505050505050565b600060208083528351808285015260005b8181101561245c57858101830151858201604001528201612440565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461249457600080fd5b919050565b600080604083850312156124ac57600080fd5b6124b58361247d565b946020939093013593505050565b6000806000606084860312156124d857600080fd5b6124e18461247d565b92506124ef6020850161247d565b9150604084013590509250925092565b60006020828403121561251157600080fd5b61251a8261247d565b9392505050565b60006020828403121561253357600080fd5b5035919050565b801515811461254857600080fd5b50565b6000806040838503121561255e57600080fd5b6125678361247d565b915060208301356125778161253a565b809150509250929050565b6000806040838503121561259557600080fd5b61259e8361247d565b91506125ac6020840161247d565b90509250929050565b600080600080600060a086880312156125cd57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610644576106446125f0565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60006020828403121561264b57600080fd5b815161251a8161253a565b8082028115828204841417610644576106446125f0565b60008261268a57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610644576106446125f0565b6000600182016126b4576126b46125f0565b5060010190565b6040815260006126eb60408301601081526f105b5bdd5b9d081d1bdbc81cdb585b1b60821b602082015260400190565b905082602083015292915050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b60006020828403121561272e57600080fd5b5051919050565b60208152600061064460208301601081526f105b5bdd5b9d081d1bdbc81cdb585b1b60821b602082015260400190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156127f05781516001600160a01b0316875295820195908201906001016127cb565b509495945050505050565b82815260406020820152600061281460408301846127b7565b949350505050565b6000602080838503121561282f57600080fd5b825167ffffffffffffffff8082111561284757600080fd5b818501915085601f83011261285b57600080fd5b81518181111561286d5761286d61278b565b8060051b604051601f19603f830116810181811085821117156128925761289261278b565b6040529182528482019250838101850191888311156128b057600080fd5b938501935b828510156128ce578451845293850193928501926128b5565b98975050505050505050565b85815284602082015260a0604082015260006128f960a08301866127b7565b6001600160a01b039490941660608301525060800152939250505056fea87d5e72382e1279629de8ddc63dfdc32098c7e8812a592ab3053cd443194ff2a2646970667358221220565ae801880b2e14b22b9bda57c4e15c5c24c046d10ca93c6150c71d59eaa67764736f6c63430008130033