ETH Price: $2,151.65 (-1.54%)

Contract

0x64C5cc449bD253D7fd57751c9080ACcd0216126d
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Age:1H
Reset Filter

Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Age:1H
Reset Filter

Advanced mode:
Parent Transaction Hash Method Block
From
To

There are no matching entries

Update your filters to view other transactions

View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SaverExchange

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2020-04-20
*/

pragma solidity ^0.5.0;


interface ERC20 {
    function totalSupply() external view returns (uint256 supply);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function transferFrom(address _from, address _to, uint256 _value)
        external
        returns (bool success);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    function decimals() external view returns (uint256 digits);

    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

interface ExchangeInterface {
    function swapEtherToToken(uint256 _ethAmount, address _tokenAddress, uint256 _maxAmount)
        external
        payable
        returns (uint256, uint256);

    function swapTokenToEther(address _tokenAddress, uint256 _amount, uint256 _maxAmount)
        external
        returns (uint256);

    function swapTokenToToken(address _src, address _dest, uint256 _amount)
        external
        payable
        returns (uint256);

    function getExpectedRate(address src, address dest, uint256 srcQty)
        external
        view
        returns (uint256 expectedRate);
}

contract TokenInterface {
    function allowance(address, address) public returns (uint256);

    function balanceOf(address) public returns (uint256);

    function approve(address, uint256) public;

    function transfer(address, uint256) public returns (bool);

    function transferFrom(address, address, uint256) public returns (bool);

    function deposit() public payable;

    function withdraw(uint256) public;
}

contract DSMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x);
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x);
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x / y;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x <= y ? x : y;
    }

    function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x >= y ? x : y;
    }

    function imin(int256 x, int256 y) internal pure returns (int256 z) {
        return x <= y ? x : y;
    }

    function imax(int256 x, int256 y) internal pure returns (int256 z) {
        return x >= y ? x : y;
    }

    uint256 constant WAD = 10**18;
    uint256 constant RAY = 10**27;

    function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }

    function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }

    function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, WAD), y / 2) / y;
    }

    function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}

contract SaverExchangeConstantAddresses {
    address public constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address payable public constant WALLET_ID = 0x322d58b9E75a6918f7e7849AEe0fF09369977e08;
    address public constant DISCOUNT_ADDRESS = 0x1b14E8D511c9A4395425314f849bD737BAF8208F;

    address public constant KYBER_WRAPPER = 0x8F337bD3b7F2b05d9A8dC8Ac518584e833424893;
    address public constant UNISWAP_WRAPPER = 0x1e30124FDE14533231216D95F7798cD0061e5cf8;
    address public constant OASIS_WRAPPER = 0x891f5A171f865031b0f3Eb9723bb8f68C901c9FE;

    
    address public constant ERC20_PROXY_0X = 0x95E6F48254609A6ee006F7D493c8e5fB97094ceF;
}

contract Discount {
    address public owner;
    mapping(address => CustomServiceFee) public serviceFees;

    uint256 constant MAX_SERVICE_FEE = 400;

    struct CustomServiceFee {
        bool active;
        uint256 amount;
    }

    constructor() public {
        owner = msg.sender;
    }

    function isCustomFeeSet(address _user) public view returns (bool) {
        return serviceFees[_user].active;
    }

    function getCustomServiceFee(address _user) public view returns (uint256) {
        return serviceFees[_user].amount;
    }

    function setServiceFee(address _user, uint256 _fee) public {
        require(msg.sender == owner, "Only owner");
        require(_fee >= MAX_SERVICE_FEE || _fee == 0);

        serviceFees[_user] = CustomServiceFee({active: true, amount: _fee});
    }

    function disableServiceFee(address _user) public {
        require(msg.sender == owner, "Only owner");

        serviceFees[_user] = CustomServiceFee({active: false, amount: 0});
    }
}

contract SaverExchange is DSMath, SaverExchangeConstantAddresses {
    uint256 public constant SERVICE_FEE = 800; 

    event Swap(
        address src,
        address dest,
        uint256 amountSold,
        uint256 amountBought,
        address wrapper
    );

    function swapTokenToToken(
        address _src,
        address _dest,
        uint256 _amount,
        uint256 _minPrice,
        uint256 _exchangeType,
        address _exchangeAddress,
        bytes memory _callData,
        uint256 _0xPrice
    ) public payable {
        
        address[3] memory orderAddresses = [_exchangeAddress, _src, _dest];

        if (orderAddresses[1] == KYBER_ETH_ADDRESS) {
            require(msg.value >= _amount, "msg.value smaller than amount");
        } else {
            require(
                ERC20(orderAddresses[1]).transferFrom(msg.sender, address(this), _amount),
                "Not able to withdraw wanted amount"
            );
        }

        uint256 fee = takeFee(_amount, orderAddresses[1]);
        _amount = sub(_amount, fee);
        
        uint256[2] memory tokens;
        address wrapper;
        uint256 price;
        bool success;

        
        tokens[1] = _amount;

        if (_exchangeType == 4) {
            if (orderAddresses[1] != KYBER_ETH_ADDRESS) {
                ERC20(orderAddresses[1]).approve(address(ERC20_PROXY_0X), _amount);
            }

            (success, tokens[0], ) = takeOrder(
                orderAddresses,
                _callData,
                address(this).balance,
                _amount
            );
            
            require(success && tokens[0] > 0, "0x transaction failed");
            wrapper = address(_exchangeAddress);
        }

        if (tokens[0] == 0) {
            (wrapper, price) = getBestPrice(
                _amount,
                orderAddresses[1],
                orderAddresses[2],
                _exchangeType
            );

            require(price > _minPrice || _0xPrice > _minPrice, "Slippage hit");

            
            if (_0xPrice >= price) {
                if (orderAddresses[1] != KYBER_ETH_ADDRESS) {
                    ERC20(orderAddresses[1]).approve(address(ERC20_PROXY_0X), _amount);
                }
                (success, tokens[0], tokens[1]) = takeOrder(
                    orderAddresses,
                    _callData,
                    address(this).balance,
                    _amount
                );
                
                if (success && tokens[0] > 0) {
                    wrapper = address(_exchangeAddress);
                    emit Swap(orderAddresses[1], orderAddresses[2], _amount, tokens[0], wrapper);
                }
            }

            if (tokens[1] > 0) {
                
                if (tokens[1] != _amount) {
                    (wrapper, price) = getBestPrice(
                        tokens[1],
                        orderAddresses[1],
                        orderAddresses[2],
                        _exchangeType
                    );
                }

                
                require(price > _minPrice, "Slippage hit onchain price");
                if (orderAddresses[1] == KYBER_ETH_ADDRESS) {
                    (tokens[0], ) = ExchangeInterface(wrapper).swapEtherToToken.value(tokens[1])(
                        tokens[1],
                        orderAddresses[2],
                        uint256(-1)
                    );
                } else {
                    ERC20(orderAddresses[1]).transfer(wrapper, tokens[1]);

                    if (orderAddresses[2] == KYBER_ETH_ADDRESS) {
                        tokens[0] = ExchangeInterface(wrapper).swapTokenToEther(
                            orderAddresses[1],
                            tokens[1],
                            uint256(-1)
                        );
                    } else {
                        tokens[0] = ExchangeInterface(wrapper).swapTokenToToken(
                            orderAddresses[1],
                            orderAddresses[2],
                            tokens[1]
                        );
                    }
                }

                emit Swap(orderAddresses[1], orderAddresses[2], _amount, tokens[0], wrapper);
            }
        }

        
        if (address(this).balance > 0) {
            msg.sender.transfer(address(this).balance);
        }

        
        if (orderAddresses[2] != KYBER_ETH_ADDRESS) {
            if (ERC20(orderAddresses[2]).balanceOf(address(this)) > 0) {
                ERC20(orderAddresses[2]).transfer(
                    msg.sender,
                    ERC20(orderAddresses[2]).balanceOf(address(this))
                );
            }
        }

        if (orderAddresses[1] != KYBER_ETH_ADDRESS) {
            if (ERC20(orderAddresses[1]).balanceOf(address(this)) > 0) {
                ERC20(orderAddresses[1]).transfer(
                    msg.sender,
                    ERC20(orderAddresses[1]).balanceOf(address(this))
                );
            }
        }
    }

    
    
    
    
    
    function takeOrder(
        address[3] memory _addresses,
        bytes memory _data,
        uint256 _value,
        uint256 _amount
    ) private returns (bool, uint256, uint256) {
        bool success;

        
        (success, ) = _addresses[0].call.value(_value)(_data);

        uint256 tokensLeft = _amount;
        uint256 tokensReturned = 0;
        if (success) {
            
            if (_addresses[1] == KYBER_ETH_ADDRESS) {
                tokensLeft = address(this).balance;
            } else {
                tokensLeft = ERC20(_addresses[1]).balanceOf(address(this));
            }

            
            if (_addresses[2] == KYBER_ETH_ADDRESS) {
                TokenInterface(WETH_ADDRESS).withdraw(
                    TokenInterface(WETH_ADDRESS).balanceOf(address(this))
                );
                tokensReturned = address(this).balance;
            } else {
                tokensReturned = ERC20(_addresses[2]).balanceOf(address(this));
            }
        }

        return (success, tokensReturned, tokensLeft);
    }

    
    
    
    
    
    function getBestPrice(
        uint256 _amount,
        address _srcToken,
        address _destToken,
        uint256 _exchangeType
    ) public returns (address, uint256) {
        uint256 expectedRateKyber;
        uint256 expectedRateUniswap;
        uint256 expectedRateOasis;

        if (_exchangeType == 1) {
            return (OASIS_WRAPPER, getExpectedRate(OASIS_WRAPPER, _srcToken, _destToken, _amount));
        }

        if (_exchangeType == 2) {
            return (KYBER_WRAPPER, getExpectedRate(KYBER_WRAPPER, _srcToken, _destToken, _amount));
        }

        if (_exchangeType == 3) {
            expectedRateUniswap = getExpectedRate(UNISWAP_WRAPPER, _srcToken, _destToken, _amount);
            expectedRateUniswap = expectedRateUniswap * (10**(18 - getDecimals(_destToken)));
            return (UNISWAP_WRAPPER, expectedRateUniswap);
        }

        expectedRateKyber = getExpectedRate(KYBER_WRAPPER, _srcToken, _destToken, _amount);
        expectedRateUniswap = getExpectedRate(UNISWAP_WRAPPER, _srcToken, _destToken, _amount);
        expectedRateUniswap = expectedRateUniswap * (10**(18 - getDecimals(_destToken)));
        expectedRateOasis = getExpectedRate(OASIS_WRAPPER, _srcToken, _destToken, _amount);
        expectedRateOasis = expectedRateOasis * (10**(18 - getDecimals(_destToken)));

        if (
            (expectedRateKyber >= expectedRateUniswap) && (expectedRateKyber >= expectedRateOasis)
        ) {
            return (KYBER_WRAPPER, expectedRateKyber);
        }

        if (
            (expectedRateOasis >= expectedRateKyber) && (expectedRateOasis >= expectedRateUniswap)
        ) {
            return (OASIS_WRAPPER, expectedRateOasis);
        }

        if (
            (expectedRateUniswap >= expectedRateKyber) && (expectedRateUniswap >= expectedRateOasis)
        ) {
            return (UNISWAP_WRAPPER, expectedRateUniswap);
        }
    }

    function getExpectedRate(
        address _wrapper,
        address _srcToken,
        address _destToken,
        uint256 _amount
    ) public returns (uint256) {
        bool success;
        bytes memory result;

        (success, result) = _wrapper.call(
            abi.encodeWithSignature(
                "getExpectedRate(address,address,uint256)",
                _srcToken,
                _destToken,
                _amount
            )
        );

        if (success) {
            return sliceUint(result, 0);
        } else {
            return 0;
        }
    }

    
    
    
    function takeFee(uint256 _amount, address _token) internal returns (uint256 feeAmount) {
        uint256 fee = SERVICE_FEE;

        if (Discount(DISCOUNT_ADDRESS).isCustomFeeSet(msg.sender)) {
            fee = Discount(DISCOUNT_ADDRESS).getCustomServiceFee(msg.sender);
        }

        if (fee == 0) {
            feeAmount = 0;
        } else {
            feeAmount = _amount / SERVICE_FEE;
            if (_token == KYBER_ETH_ADDRESS) {
                WALLET_ID.transfer(feeAmount);
            } else {
                ERC20(_token).transfer(WALLET_ID, feeAmount);
            }
        }
    }

    function getDecimals(address _token) internal view returns (uint256) {
        
        if (_token == address(0xE0B7927c4aF23765Cb51314A0E0521A9645F0E2A)) {
            return 9;
        }
        
        if (_token == address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) {
            return 6;
        }
        
        if (_token == address(0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599)) {
            return 8;
        }

        return 18;
    }

    function sliceUint(bytes memory bs, uint256 start) internal pure returns (uint256) {
        require(bs.length >= start + 32, "slicing out of range");

        uint256 x;
        assembly {
            x := mload(add(bs, add(0x20, start)))
        }

        return x;
    }

    
    function() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"WETH_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"KYBER_ETH_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_srcToken","type":"address"},{"name":"_destToken","type":"address"},{"name":"_exchangeType","type":"uint256"}],"name":"getBestPrice","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SERVICE_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wrapper","type":"address"},{"name":"_srcToken","type":"address"},{"name":"_destToken","type":"address"},{"name":"_amount","type":"uint256"}],"name":"getExpectedRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_src","type":"address"},{"name":"_dest","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_minPrice","type":"uint256"},{"name":"_exchangeType","type":"uint256"},{"name":"_exchangeAddress","type":"address"},{"name":"_callData","type":"bytes"},{"name":"_0xPrice","type":"uint256"}],"name":"swapTokenToToken","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"DISCOUNT_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"KYBER_WRAPPER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"OASIS_WRAPPER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERC20_PROXY_0X","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WALLET_ID","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UNISWAP_WRAPPER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"src","type":"address"},{"indexed":false,"name":"dest","type":"address"},{"indexed":false,"name":"amountSold","type":"uint256"},{"indexed":false,"name":"amountBought","type":"uint256"},{"indexed":false,"name":"wrapper","type":"address"}],"name":"Swap","type":"event"}]

608060405234801561001057600080fd5b50611fa6806100206000396000f3fe6080604052600436106100c75760003560e01c8063a46a66c911610074578063d0cc72891161004e578063d0cc728914610347578063d3661fa51461035c578063ddaa293c14610371576100c7565b8063a46a66c914610308578063b175afa11461031d578063c917c2d314610332576100c7565b806350c86de5116100a557806350c86de5146101a25780637474ff5e146101c9578063874072611461021f576100c7565b8063040141e5146100c957806329f7fc9e146101075780632ec1f0091461011c575b005b3480156100d557600080fd5b506100de610386565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561011357600080fd5b506100de61039e565b34801561012857600080fd5b506101726004803603608081101561013f57600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604081013590911690606001356103b6565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091528051918290030190f35b3480156101ae57600080fd5b506101b76105de565b60408051918252519081900360200190f35b3480156101d557600080fd5b506101b7600480360360808110156101ec57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201351690606001356105e4565b6100c7600480360361010081101561023657600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013582169260408201359260608301359260808101359260a08201359092169181019060e0810160c082013564010000000081111561029157600080fd5b8201836020820111156102a357600080fd5b803590602001918460018302840111640100000000831117156102c557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925061075a915050565b34801561031457600080fd5b506100de611716565b34801561032957600080fd5b506100de61172e565b34801561033e57600080fd5b506100de611746565b34801561035357600080fd5b506100de61175e565b34801561036857600080fd5b506100de611776565b34801561037d57600080fd5b506100de61178e565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b600080600080600085600114156104085773891f5a171f865031b0f3eb9723bb8f68c901c9fe6103fc73891f5a171f865031b0f3eb9723bb8f68c901c9fe8a8a8d6105e4565b945094505050506105d5565b856002141561044657738f337bd3b7f2b05d9a8dc8ac518584e8334248936103fc738f337bd3b7f2b05d9a8dc8ac518584e8334248938a8a8d6105e4565b85600314156104a55761046f731e30124fde14533231216d95f7798cd0061e5cf889898c6105e4565b915061047a876117a6565b731e30124fde14533231216d95f7798cd0061e5cf89550601203600a0a9190910292506105d5915050565b6104c5738f337bd3b7f2b05d9a8dc8ac518584e83342489389898c6105e4565b92506104e7731e30124fde14533231216d95f7798cd0061e5cf889898c6105e4565b91506104f2876117a6565b601203600a0a8202915061051c73891f5a171f865031b0f3eb9723bb8f68c901c9fe89898c6105e4565b9050610527876117a6565b601203600a0a0281831080159061053e5750808310155b1561056557738f337bd3b7f2b05d9a8dc8ac518584e83342489383945094505050506105d5565b8281101580156105755750818110155b1561059b5773891f5a171f865031b0f3eb9723bb8f68c901c9fe945092506105d5915050565b8282101580156105ab5750808210155b156105d15750731e30124fde14533231216d95f7798cd0061e5cf8935091506105d59050565b5050505b94509492505050565b61032081565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f809a9e55000000000000000000000000000000000000000000000000000000001781529251825160009485946060948b16939092909182918083835b602083106106c457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610687565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610726576040519150601f19603f3d011682016040523d82523d6000602084013e61072b565b606091505b509092509050811561074b5761074281600061185f565b92505050610752565b6000925050505b949350505050565b610762611f1c565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff85811682528a811660208301819052908a16928201929092529073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561082b578634101561082657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d73672e76616c756520736d616c6c6572207468616e20616d6f756e74000000604482015290519081900360640190fd5b610929565b602080820151604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018b9052905173ffffffffffffffffffffffffffffffffffffffff909216926323b872dd926064808401938290030181600087803b1580156108a857600080fd5b505af11580156108bc573d6000803e3d6000fd5b505050506040513d60208110156108d257600080fd5b5051610929576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611f596022913960400191505060405180910390fd5b600061093c8883600160200201516118e3565b90506109488882611b69565b9750610952611f3a565b602081018990526000808060048a1415610af857602086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610a6a57856001602002015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37395e6f48254609a6ee006f7d493c8e5fb97094cef8e6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610a3d57600080fd5b505af1158015610a51573d6000803e3d6000fd5b505050506040513d6020811015610a6757600080fd5b50505b610a77868930318f611b79565b5085529050808015610a895750835115155b610af457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f3078207472616e73616374696f6e206661696c65640000000000000000000000604482015290519081900360640190fd5b8892505b83516112c857610b168c8760015b602002015160408901518d6103b6565b90935091508a821180610b2857508a87115b610b9357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f536c697070616765206869740000000000000000000000000000000000000000604482015290519081900360640190fd5b818710610dba57602086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c9e57856001602002015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37395e6f48254609a6ee006f7d493c8e5fb97094cef8e6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610c7157600080fd5b505af1158015610c85573d6000803e3d6000fd5b505050506040513d6020811015610c9b57600080fd5b50505b610cab868930318f611b79565b602087015285529050808015610cc15750835115155b15610dba578892507fb39c9bc43f811e1a7ce159c5f147458fdb80266bf23c17322013316e27e086d0866001602002015187600260200201518e876000602002015187604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a15b6020840151156112c85760208401518c14610de6576020840151610de090876001610b06565b90935091505b8a8211610e5457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536c69707061676520686974206f6e636861696e207072696365000000000000604482015290519081900360640190fd5b602086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610f6857602084015160408088015181517f43ac1dc60000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff91821660248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448201528251918716936343ac1dc693909260648084019382900301818588803b158015610f2d57600080fd5b505af1158015610f41573d6000803e3d6000fd5b50505050506040513d6040811015610f5857600080fd5b50518460005b60200201526111d7565b60208087015185820151604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015260248201939093529051919092169263a9059cbb92604480820193918290030181600087803b158015610fe857600080fd5b505af1158015610ffc573d6000803e3d6000fd5b505050506040513d602081101561101257600080fd5b5050604086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156111215760208087015185820151604080517f3bba21dc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff938416600482015260248101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448301525191861692633bba21dc926064808401938290030181600087803b1580156110ed57600080fd5b505af1158015611101573d6000803e3d6000fd5b505050506040513d602081101561111757600080fd5b5051846000610f5e565b6020808701516040808901518784015182517f13712c9f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9485166004820152918416602483015260448201529051918616926313712c9f926064808401938290030181600087803b1580156111a857600080fd5b505af11580156111bc573d6000803e3d6000fd5b505050506040513d60208110156111d257600080fd5b505184525b7fb39c9bc43f811e1a7ce159c5f147458fdb80266bf23c17322013316e27e086d0866001602002015187600260200201518e876000602002015187604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a15b3031156112fe576040513390303180156108fc02916000818181858888f193505050501580156112fc573d6000803e3d6000fd5b505b604086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146115055760408087015181517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152915160009273ffffffffffffffffffffffffffffffffffffffff909216916370a08231916024808301926020929190829003018186803b1580156113a757600080fd5b505afa1580156113bb573d6000803e3d6000fd5b505050506040513d60208110156113d157600080fd5b505111156115055760408087015181517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152915173ffffffffffffffffffffffffffffffffffffffff9091169163a9059cbb91339184916370a0823191602480820192602092909190829003018186803b15801561145557600080fd5b505afa158015611469573d6000803e3d6000fd5b505050506040513d602081101561147f57600080fd5b50516040805163ffffffff851660e01b815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b1580156114d857600080fd5b505af11580156114ec573d6000803e3d6000fd5b505050506040513d602081101561150257600080fd5b50505b602086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461170657602080870151604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009373ffffffffffffffffffffffffffffffffffffffff909316926370a082319260248082019391829003018186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b5051111561170657602080870151604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9092169263a9059cbb92339285926370a0823192602480840193829003018186803b15801561165657600080fd5b505afa15801561166a573d6000803e3d6000fd5b505050506040513d602081101561168057600080fd5b50516040805163ffffffff851660e01b815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b1580156116d957600080fd5b505af11580156116ed573d6000803e3d6000fd5b505050506040513d602081101561170357600080fd5b50505b5050505050505050505050505050565b731b14e8d511c9a4395425314f849bd737baf8208f81565b738f337bd3b7f2b05d9a8dc8ac518584e83342489381565b73891f5a171f865031b0f3eb9723bb8f68c901c9fe81565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b731e30124fde14533231216d95f7798cd0061e5cf881565b600073ffffffffffffffffffffffffffffffffffffffff821673e0b7927c4af23765cb51314a0e0521a9645f0e2a14156117e25750600961185a565b73ffffffffffffffffffffffffffffffffffffffff821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48141561181c5750600661185a565b73ffffffffffffffffffffffffffffffffffffffff8216732260fac5e5542a773aa44fbcfedf7c193bc2c59914156118565750600861185a565b5060125b919050565b600081602001835110156118d457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f736c6963696e67206f7574206f662072616e6765000000000000000000000000604482015290519081900360640190fd5b50818101602001515b92915050565b604080517fb371deac000000000000000000000000000000000000000000000000000000008152336004820152905160009161032091731b14e8d511c9a4395425314f849bd737baf8208f9163b371deac916024808301926020929190829003018186803b15801561195457600080fd5b505afa158015611968573d6000803e3d6000fd5b505050506040513d602081101561197e57600080fd5b505115611a1e57604080517f6eeb54310000000000000000000000000000000000000000000000000000000081523360048201529051731b14e8d511c9a4395425314f849bd737baf8208f91636eeb5431916024808301926020929190829003018186803b1580156119ef57600080fd5b505afa158015611a03573d6000803e3d6000fd5b505050506040513d6020811015611a1957600080fd5b505190505b80611a2c5760009150611b62565b6103208404915073ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611aac5760405173322d58b9e75a6918f7e7849aee0ff09369977e089083156108fc029084906000818181858888f19350505050158015611aa6573d6000803e3d6000fd5b50611b62565b604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273322d58b9e75a6918f7e7849aee0ff09369977e08600482015260248101849052905173ffffffffffffffffffffffffffffffffffffffff85169163a9059cbb9160448083019260209291908290030181600087803b158015611b3557600080fd5b505af1158015611b49573d6000803e3d6000fd5b505050506040513d6020811015611b5f57600080fd5b50505b5092915050565b808203828111156118dd57600080fd5b60008080808781602002015173ffffffffffffffffffffffffffffffffffffffff1686886040518082805190602001908083835b60208310611bea57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611bad565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611c4c576040519150601f19603f3d011682016040523d82523d6000602084013e611c51565b606091505b5090915085905060008215611f0d5760208a015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611c9f5730319150611d3c565b6020808b0151604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216926370a0823192602480840193829003018186803b158015611d0d57600080fd5b505afa158015611d21573d6000803e3d6000fd5b505050506040513d6020811015611d3757600080fd5b505191505b60408a015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611e6d57604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291632e1a7d4d9183916370a082319160248083019260209291908290030181600087803b158015611de657600080fd5b505af1158015611dfa573d6000803e3d6000fd5b505050506040513d6020811015611e1057600080fd5b50516040805163ffffffff841660e01b8152600481019290925251602480830192600092919082900301818387803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b505030319250611f0d915050565b6040808b015181517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152915173ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d6020811015611f0857600080fd5b505190505b91999198509650945050505050565b60405180606001604052806003906020820280388339509192915050565b6040518060400160405280600290602082028038833950919291505056fe4e6f742061626c6520746f2077697468647261772077616e74656420616d6f756e74a165627a7a72305820fc1890355dec31c5e20f09f797962686ea85bb6f5e9a613356b2dee5598fcff30029

Deployed Bytecode

0x6080604052600436106100c75760003560e01c8063a46a66c911610074578063d0cc72891161004e578063d0cc728914610347578063d3661fa51461035c578063ddaa293c14610371576100c7565b8063a46a66c914610308578063b175afa11461031d578063c917c2d314610332576100c7565b806350c86de5116100a557806350c86de5146101a25780637474ff5e146101c9578063874072611461021f576100c7565b8063040141e5146100c957806329f7fc9e146101075780632ec1f0091461011c575b005b3480156100d557600080fd5b506100de610386565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561011357600080fd5b506100de61039e565b34801561012857600080fd5b506101726004803603608081101561013f57600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604081013590911690606001356103b6565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091528051918290030190f35b3480156101ae57600080fd5b506101b76105de565b60408051918252519081900360200190f35b3480156101d557600080fd5b506101b7600480360360808110156101ec57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201351690606001356105e4565b6100c7600480360361010081101561023657600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013582169260408201359260608301359260808101359260a08201359092169181019060e0810160c082013564010000000081111561029157600080fd5b8201836020820111156102a357600080fd5b803590602001918460018302840111640100000000831117156102c557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925061075a915050565b34801561031457600080fd5b506100de611716565b34801561032957600080fd5b506100de61172e565b34801561033e57600080fd5b506100de611746565b34801561035357600080fd5b506100de61175e565b34801561036857600080fd5b506100de611776565b34801561037d57600080fd5b506100de61178e565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b600080600080600085600114156104085773891f5a171f865031b0f3eb9723bb8f68c901c9fe6103fc73891f5a171f865031b0f3eb9723bb8f68c901c9fe8a8a8d6105e4565b945094505050506105d5565b856002141561044657738f337bd3b7f2b05d9a8dc8ac518584e8334248936103fc738f337bd3b7f2b05d9a8dc8ac518584e8334248938a8a8d6105e4565b85600314156104a55761046f731e30124fde14533231216d95f7798cd0061e5cf889898c6105e4565b915061047a876117a6565b731e30124fde14533231216d95f7798cd0061e5cf89550601203600a0a9190910292506105d5915050565b6104c5738f337bd3b7f2b05d9a8dc8ac518584e83342489389898c6105e4565b92506104e7731e30124fde14533231216d95f7798cd0061e5cf889898c6105e4565b91506104f2876117a6565b601203600a0a8202915061051c73891f5a171f865031b0f3eb9723bb8f68c901c9fe89898c6105e4565b9050610527876117a6565b601203600a0a0281831080159061053e5750808310155b1561056557738f337bd3b7f2b05d9a8dc8ac518584e83342489383945094505050506105d5565b8281101580156105755750818110155b1561059b5773891f5a171f865031b0f3eb9723bb8f68c901c9fe945092506105d5915050565b8282101580156105ab5750808210155b156105d15750731e30124fde14533231216d95f7798cd0061e5cf8935091506105d59050565b5050505b94509492505050565b61032081565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f809a9e55000000000000000000000000000000000000000000000000000000001781529251825160009485946060948b16939092909182918083835b602083106106c457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610687565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610726576040519150601f19603f3d011682016040523d82523d6000602084013e61072b565b606091505b509092509050811561074b5761074281600061185f565b92505050610752565b6000925050505b949350505050565b610762611f1c565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff85811682528a811660208301819052908a16928201929092529073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561082b578634101561082657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d73672e76616c756520736d616c6c6572207468616e20616d6f756e74000000604482015290519081900360640190fd5b610929565b602080820151604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018b9052905173ffffffffffffffffffffffffffffffffffffffff909216926323b872dd926064808401938290030181600087803b1580156108a857600080fd5b505af11580156108bc573d6000803e3d6000fd5b505050506040513d60208110156108d257600080fd5b5051610929576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611f596022913960400191505060405180910390fd5b600061093c8883600160200201516118e3565b90506109488882611b69565b9750610952611f3a565b602081018990526000808060048a1415610af857602086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610a6a57856001602002015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37395e6f48254609a6ee006f7d493c8e5fb97094cef8e6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610a3d57600080fd5b505af1158015610a51573d6000803e3d6000fd5b505050506040513d6020811015610a6757600080fd5b50505b610a77868930318f611b79565b5085529050808015610a895750835115155b610af457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f3078207472616e73616374696f6e206661696c65640000000000000000000000604482015290519081900360640190fd5b8892505b83516112c857610b168c8760015b602002015160408901518d6103b6565b90935091508a821180610b2857508a87115b610b9357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f536c697070616765206869740000000000000000000000000000000000000000604482015290519081900360640190fd5b818710610dba57602086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c9e57856001602002015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37395e6f48254609a6ee006f7d493c8e5fb97094cef8e6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610c7157600080fd5b505af1158015610c85573d6000803e3d6000fd5b505050506040513d6020811015610c9b57600080fd5b50505b610cab868930318f611b79565b602087015285529050808015610cc15750835115155b15610dba578892507fb39c9bc43f811e1a7ce159c5f147458fdb80266bf23c17322013316e27e086d0866001602002015187600260200201518e876000602002015187604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a15b6020840151156112c85760208401518c14610de6576020840151610de090876001610b06565b90935091505b8a8211610e5457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536c69707061676520686974206f6e636861696e207072696365000000000000604482015290519081900360640190fd5b602086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610f6857602084015160408088015181517f43ac1dc60000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff91821660248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448201528251918716936343ac1dc693909260648084019382900301818588803b158015610f2d57600080fd5b505af1158015610f41573d6000803e3d6000fd5b50505050506040513d6040811015610f5857600080fd5b50518460005b60200201526111d7565b60208087015185820151604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015260248201939093529051919092169263a9059cbb92604480820193918290030181600087803b158015610fe857600080fd5b505af1158015610ffc573d6000803e3d6000fd5b505050506040513d602081101561101257600080fd5b5050604086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156111215760208087015185820151604080517f3bba21dc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff938416600482015260248101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448301525191861692633bba21dc926064808401938290030181600087803b1580156110ed57600080fd5b505af1158015611101573d6000803e3d6000fd5b505050506040513d602081101561111757600080fd5b5051846000610f5e565b6020808701516040808901518784015182517f13712c9f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9485166004820152918416602483015260448201529051918616926313712c9f926064808401938290030181600087803b1580156111a857600080fd5b505af11580156111bc573d6000803e3d6000fd5b505050506040513d60208110156111d257600080fd5b505184525b7fb39c9bc43f811e1a7ce159c5f147458fdb80266bf23c17322013316e27e086d0866001602002015187600260200201518e876000602002015187604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a15b3031156112fe576040513390303180156108fc02916000818181858888f193505050501580156112fc573d6000803e3d6000fd5b505b604086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146115055760408087015181517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152915160009273ffffffffffffffffffffffffffffffffffffffff909216916370a08231916024808301926020929190829003018186803b1580156113a757600080fd5b505afa1580156113bb573d6000803e3d6000fd5b505050506040513d60208110156113d157600080fd5b505111156115055760408087015181517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152915173ffffffffffffffffffffffffffffffffffffffff9091169163a9059cbb91339184916370a0823191602480820192602092909190829003018186803b15801561145557600080fd5b505afa158015611469573d6000803e3d6000fd5b505050506040513d602081101561147f57600080fd5b50516040805163ffffffff851660e01b815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b1580156114d857600080fd5b505af11580156114ec573d6000803e3d6000fd5b505050506040513d602081101561150257600080fd5b50505b602086015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461170657602080870151604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009373ffffffffffffffffffffffffffffffffffffffff909316926370a082319260248082019391829003018186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b5051111561170657602080870151604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9092169263a9059cbb92339285926370a0823192602480840193829003018186803b15801561165657600080fd5b505afa15801561166a573d6000803e3d6000fd5b505050506040513d602081101561168057600080fd5b50516040805163ffffffff851660e01b815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b1580156116d957600080fd5b505af11580156116ed573d6000803e3d6000fd5b505050506040513d602081101561170357600080fd5b50505b5050505050505050505050505050565b731b14e8d511c9a4395425314f849bd737baf8208f81565b738f337bd3b7f2b05d9a8dc8ac518584e83342489381565b73891f5a171f865031b0f3eb9723bb8f68c901c9fe81565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b731e30124fde14533231216d95f7798cd0061e5cf881565b600073ffffffffffffffffffffffffffffffffffffffff821673e0b7927c4af23765cb51314a0e0521a9645f0e2a14156117e25750600961185a565b73ffffffffffffffffffffffffffffffffffffffff821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48141561181c5750600661185a565b73ffffffffffffffffffffffffffffffffffffffff8216732260fac5e5542a773aa44fbcfedf7c193bc2c59914156118565750600861185a565b5060125b919050565b600081602001835110156118d457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f736c6963696e67206f7574206f662072616e6765000000000000000000000000604482015290519081900360640190fd5b50818101602001515b92915050565b604080517fb371deac000000000000000000000000000000000000000000000000000000008152336004820152905160009161032091731b14e8d511c9a4395425314f849bd737baf8208f9163b371deac916024808301926020929190829003018186803b15801561195457600080fd5b505afa158015611968573d6000803e3d6000fd5b505050506040513d602081101561197e57600080fd5b505115611a1e57604080517f6eeb54310000000000000000000000000000000000000000000000000000000081523360048201529051731b14e8d511c9a4395425314f849bd737baf8208f91636eeb5431916024808301926020929190829003018186803b1580156119ef57600080fd5b505afa158015611a03573d6000803e3d6000fd5b505050506040513d6020811015611a1957600080fd5b505190505b80611a2c5760009150611b62565b6103208404915073ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611aac5760405173322d58b9e75a6918f7e7849aee0ff09369977e089083156108fc029084906000818181858888f19350505050158015611aa6573d6000803e3d6000fd5b50611b62565b604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273322d58b9e75a6918f7e7849aee0ff09369977e08600482015260248101849052905173ffffffffffffffffffffffffffffffffffffffff85169163a9059cbb9160448083019260209291908290030181600087803b158015611b3557600080fd5b505af1158015611b49573d6000803e3d6000fd5b505050506040513d6020811015611b5f57600080fd5b50505b5092915050565b808203828111156118dd57600080fd5b60008080808781602002015173ffffffffffffffffffffffffffffffffffffffff1686886040518082805190602001908083835b60208310611bea57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611bad565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611c4c576040519150601f19603f3d011682016040523d82523d6000602084013e611c51565b606091505b5090915085905060008215611f0d5760208a015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611c9f5730319150611d3c565b6020808b0151604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216926370a0823192602480840193829003018186803b158015611d0d57600080fd5b505afa158015611d21573d6000803e3d6000fd5b505050506040513d6020811015611d3757600080fd5b505191505b60408a015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611e6d57604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291632e1a7d4d9183916370a082319160248083019260209291908290030181600087803b158015611de657600080fd5b505af1158015611dfa573d6000803e3d6000fd5b505050506040513d6020811015611e1057600080fd5b50516040805163ffffffff841660e01b8152600481019290925251602480830192600092919082900301818387803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b505030319250611f0d915050565b6040808b015181517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152915173ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d6020811015611f0857600080fd5b505190505b91999198509650945050505050565b60405180606001604052806003906020820280388339509192915050565b6040518060400160405280600290602082028038833950919291505056fe4e6f742061626c6520746f2077697468647261772077616e74656420616d6f756e74a165627a7a72305820fc1890355dec31c5e20f09f797962686ea85bb6f5e9a613356b2dee5598fcff30029

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Smart contract containing DeFi Saver Exchange logic.

Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.