Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
9991752 | 1708 days ago | 0.0015 ETH | ||||
9991429 | 1708 days ago | 6.0179599 ETH | ||||
9991429 | 1708 days ago | 6.0179599 ETH | ||||
9990305 | 1708 days ago | 4.5989359 ETH | ||||
9990305 | 1708 days ago | 4.5989359 ETH | ||||
9990154 | 1708 days ago | 9.23140993 ETH | ||||
9990154 | 1708 days ago | 9.23140993 ETH | ||||
9990144 | 1708 days ago | 55.30783928 ETH | ||||
9990144 | 1708 days ago | 55.30783928 ETH | ||||
9990141 | 1708 days ago | 5.12201045 ETH | ||||
9990141 | 1708 days ago | 5.12201045 ETH | ||||
9990092 | 1708 days ago | 9.23296738 ETH | ||||
9990092 | 1708 days ago | 9.23296738 ETH | ||||
9989179 | 1708 days ago | 28.19216838 ETH | ||||
9989179 | 1708 days ago | 28.19216838 ETH | ||||
9989065 | 1709 days ago | 77.38717131 ETH | ||||
9989065 | 1709 days ago | 77.38717131 ETH | ||||
9985949 | 1709 days ago | 0.0015 ETH | ||||
9985949 | 1709 days ago | 0.21855901 ETH | ||||
9985949 | 1709 days ago | 0.21855901 ETH | ||||
9985949 | 1709 days ago | 0.36079427 ETH | ||||
9985949 | 1709 days ago | 0.14243178 ETH | ||||
9985949 | 1709 days ago | 0.21836248 ETH | ||||
9985949 | 1709 days ago | 0.0015 ETH | ||||
9981606 | 1710 days ago | 48.14730096 ETH |
Loading...
Loading
Contract Name:
MCDSaverFlashLoan
Compiler Version
v0.5.7+commit.6da8b019
Optimization Enabled:
Yes with 20000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-03-23 */ 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 SaverLogger { event Repay( uint256 indexed cdpId, address indexed owner, uint256 collateralAmount, uint256 daiAmount ); event Boost( uint256 indexed cdpId, address indexed owner, uint256 daiAmount, uint256 collateralAmount ); function LogRepay(uint256 _cdpId, address _owner, uint256 _collateralAmount, uint256 _daiAmount) public { emit Repay(_cdpId, _owner, _collateralAmount, _daiAmount); } function LogBoost(uint256 _cdpId, address _owner, uint256 _daiAmount, uint256 _collateralAmount) public { emit Boost(_cdpId, _owner, _daiAmount, _collateralAmount); } } 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 PipInterface { function read() public returns (bytes32); } contract Spotter { struct Ilk { PipInterface pip; uint256 mat; } mapping (bytes32 => Ilk) public ilks; uint256 public par; } contract Jug { struct Ilk { uint256 duty; uint256 rho; } mapping (bytes32 => Ilk) public ilks; function drip(bytes32) public returns (uint); } contract Vat { struct Urn { uint256 ink; uint256 art; } struct Ilk { uint256 Art; uint256 rate; uint256 spot; uint256 line; uint256 dust; } mapping (bytes32 => mapping (address => Urn )) public urns; mapping (bytes32 => Ilk) public ilks; mapping (bytes32 => mapping (address => uint)) public gem; function can(address, address) public view returns (uint); function dai(address) public view returns (uint); function frob(bytes32, address, address, address, int, int) public; function hope(address) public; function move(address, address, uint) public; } contract Gem { function dec() public returns (uint); function gem() public returns (Gem); function join(address, uint) public payable; function exit(address, uint) public; function approve(address, uint) public; function transfer(address, uint) public returns (bool); function transferFrom(address, address, uint) public returns (bool); function deposit() public payable; function withdraw(uint) public; function allowance(address, address) public returns (uint); } contract DaiJoin { function vat() public returns (Vat); function dai() public returns (Gem); function join(address, uint) public payable; function exit(address, uint) public; } 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 SaverExchangeInterface { function getBestPrice( uint256 _amount, address _srcToken, address _destToken, uint256 _exchangeType ) public view returns (address, uint256); } contract ConstantAddressesExchangeMainnet { address public constant MAKER_DAI_ADDRESS = 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359; address public constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address payable public constant WALLET_ID = 0x322d58b9E75a6918f7e7849AEe0fF09369977e08; address public constant LOGGER_ADDRESS = 0xeCf88e1ceC2D2894A0295DB3D86Fe7CE4991E6dF; address public constant DISCOUNT_ADDRESS = 0x1b14E8D511c9A4395425314f849bD737BAF8208F; address public constant GAS_TOKEN_INTERFACE_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04; address public constant SAVER_EXCHANGE_ADDRESS = 0x862F3dcF1104b8a9468fBb8B843C37C31B41eF09; address public constant MANAGER_ADDRESS = 0x5ef30b9986345249bc32d8928B7ee64DE9435E39; address public constant VAT_ADDRESS = 0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B; address public constant SPOTTER_ADDRESS = 0x65C79fcB50Ca1594B025960e539eD7A9a6D434A3; address public constant PROXY_ACTIONS = 0x82ecD135Dce65Fbc6DbdD0e4237E0AF93FFD5038; address public constant JUG_ADDRESS = 0x19c0976f590D67707E62397C87829d896Dc0f1F1; address public constant DAI_JOIN_ADDRESS = 0x9759A6Ac90977b93B58547b4A71c78317f391A28; address public constant ETH_JOIN_ADDRESS = 0x2F0b23f53734252Bda2277357e97e1517d6B042A; address public constant MIGRATION_ACTIONS_PROXY = 0xe4B22D484958E582098A98229A24e8A43801b674; address public constant SAI_ADDRESS = 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359; address public constant DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address payable public constant SCD_MCD_MIGRATION = 0xc73e0383F3Aff3215E6f04B0331D58CeCf0Ab849; address public constant ERC20_PROXY_0X = 0x95E6F48254609A6ee006F7D493c8e5fB97094ceF; address public constant NEW_IDAI_ADDRESS = 0x6c1E2B0f67e00c06c8e2BE7Dc681Ab785163fF4D; } contract ConstantAddressesExchangeKovan { address public constant MAKER_DAI_ADDRESS = 0xC4375B7De8af5a38a93548eb8453a498222C4fF2; address public constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public constant MKR_ADDRESS = 0xAaF64BFCC32d0F15873a02163e7E500671a4ffcD; address public constant WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C; address payable public constant WALLET_ID = 0x54b44C6B18fc0b4A1010B21d524c338D1f8065F6; address public constant LOGGER_ADDRESS = 0x32d0e18f988F952Eb3524aCE762042381a2c39E5; address public constant DISCOUNT_ADDRESS = 0x1297c1105FEDf45E0CF6C102934f32C4EB780929; address public constant GAS_TOKEN_INTERFACE_ADDRESS = 0x0000000000170CcC93903185bE5A2094C870Df62; address public constant SAVER_EXCHANGE_ADDRESS = 0xACA7d11e3f482418C324aAC8e90AaD0431f692A6; address public constant MANAGER_ADDRESS = 0x1476483dD8C35F25e568113C5f70249D3976ba21; address public constant VAT_ADDRESS = 0xbA987bDB501d131f766fEe8180Da5d81b34b69d9; address public constant SPOTTER_ADDRESS = 0x3a042de6413eDB15F2784f2f97cC68C7E9750b2D; address public constant PROXY_ACTIONS = 0xd1D24637b9109B7f61459176EdcfF9Be56283a7B; address public constant JUG_ADDRESS = 0xcbB7718c9F39d05aEEDE1c472ca8Bf804b2f1EaD; address public constant DAI_JOIN_ADDRESS = 0x5AA71a3ae1C0bd6ac27A1f28e1415fFFB6F15B8c; address public constant ETH_JOIN_ADDRESS = 0x775787933e92b709f2a3C70aa87999696e74A9F8; address public constant MIGRATION_ACTIONS_PROXY = 0x433870076aBd08865f0e038dcC4Ac6450e313Bd8; address public constant SAI_ADDRESS = 0xC4375B7De8af5a38a93548eb8453a498222C4fF2; address public constant DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa; address payable public constant SCD_MCD_MIGRATION = 0x411B2Faa662C8e3E5cF8f01dFdae0aeE482ca7b0; address public constant ERC20_PROXY_0X = 0x95E6F48254609A6ee006F7D493c8e5fB97094ceF; address public constant NEW_IDAI_ADDRESS = 0x6c1E2B0f67e00c06c8e2BE7Dc681Ab785163fF4D; } contract ConstantAddressesExchange is ConstantAddressesExchangeMainnet {} contract ExchangeHelper is ConstantAddressesExchange { function swap(uint[4] memory _data, address _src, address _dest, address _exchangeAddress, bytes memory _callData) internal returns (uint) { address wrapper; uint price; uint[2] memory tokens; bool success; tokens[1] = _data[0]; _src = wethToKyberEth(_src); _dest = wethToKyberEth(_dest); address[3] memory orderAddresses = [_exchangeAddress, _src, _dest]; if (_data[2] == 4) { if (orderAddresses[1] != KYBER_ETH_ADDRESS) { ERC20(orderAddresses[1]).approve(address(ERC20_PROXY_0X), _data[0]); } (success, tokens[0], ) = takeOrder(orderAddresses, _callData, address(this).balance, _data[0]); require(success && tokens[0] > 0, "0x transaction failed"); } if (tokens[0] == 0) { (wrapper, price) = SaverExchangeInterface(SAVER_EXCHANGE_ADDRESS).getBestPrice(_data[0], orderAddresses[1], orderAddresses[2], _data[2]); require(price > _data[1] || _data[3] > _data[1], "Slippage hit"); if (_data[3] >= price) { if (orderAddresses[1] != KYBER_ETH_ADDRESS) { ERC20(orderAddresses[1]).approve(address(ERC20_PROXY_0X), _data[0]); } (success, tokens[0], tokens[1]) = takeOrder(orderAddresses, _callData, address(this).balance, _data[0]); } if (tokens[1] > 0) { if (tokens[1] != _data[0]) { (wrapper, price) = SaverExchangeInterface(SAVER_EXCHANGE_ADDRESS).getBestPrice(tokens[1], orderAddresses[1], orderAddresses[2], _data[2]); } require(price > _data[1], "Slippage hit onchain price"); if (orderAddresses[1] == KYBER_ETH_ADDRESS) { uint tRet; (tRet,) = ExchangeInterface(wrapper).swapEtherToToken.value(tokens[1])(tokens[1], orderAddresses[2], uint(-1)); tokens[0] += tRet; } else { ERC20(orderAddresses[1]).transfer(wrapper, tokens[1]); if (orderAddresses[2] == KYBER_ETH_ADDRESS) { tokens[0] += ExchangeInterface(wrapper).swapTokenToEther(orderAddresses[1], tokens[1], uint(-1)); } else { tokens[0] += ExchangeInterface(wrapper).swapTokenToToken(orderAddresses[1], orderAddresses[2], tokens[1]); } } } } return tokens[0]; } function takeOrder(address[3] memory _addresses, bytes memory _data, uint _value, uint _amount) private returns(bool, uint, uint) { bool success; (success, ) = _addresses[0].call.value(_value)(_data); uint tokensLeft = _amount; uint 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 wethToKyberEth(address _src) internal pure returns (address) { return _src == WETH_ADDRESS ? KYBER_ETH_ADDRESS : _src; } } 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 DSAuthority { function canCall(address src, address dst, bytes4 sig) public view returns (bool); } contract DSAuthEvents { event LogSetAuthority(address indexed authority); event LogSetOwner(address indexed owner); } contract DSAuth is DSAuthEvents { DSAuthority public authority; address public owner; constructor() public { owner = msg.sender; emit LogSetOwner(msg.sender); } function setOwner(address owner_) public auth { owner = owner_; emit LogSetOwner(owner); } function setAuthority(DSAuthority authority_) public auth { authority = authority_; emit LogSetAuthority(address(authority)); } modifier auth { require(isAuthorized(msg.sender, msg.sig)); _; } function isAuthorized(address src, bytes4 sig) internal view returns (bool) { if (src == address(this)) { return true; } else if (src == owner) { return true; } else if (authority == DSAuthority(0)) { return false; } else { return authority.canCall(src, address(this), sig); } } } contract DSNote { event LogNote( bytes4 indexed sig, address indexed guy, bytes32 indexed foo, bytes32 indexed bar, uint256 wad, bytes fax ) anonymous; modifier note { bytes32 foo; bytes32 bar; assembly { foo := calldataload(4) bar := calldataload(36) } emit LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data); _; } } contract DSProxy is DSAuth, DSNote { DSProxyCache public cache; constructor(address _cacheAddr) public { require(setCache(_cacheAddr)); } function() external payable {} function execute(bytes memory _code, bytes memory _data) public payable returns (address target, bytes32 response) { target = cache.read(_code); if (target == address(0)) { target = cache.write(_code); } response = execute(target, _data); } function execute(address _target, bytes memory _data) public payable auth note returns (bytes32 response) { require(_target != address(0)); assembly { let succeeded := delegatecall( sub(gas, 5000), _target, add(_data, 0x20), mload(_data), 0, 32 ) response := mload(0) switch iszero(succeeded) case 1 { revert(0, 0) } } } function setCache(address _cacheAddr) public payable auth note returns (bool) { require(_cacheAddr != address(0)); cache = DSProxyCache(_cacheAddr); return true; } } contract DSProxyCache { mapping(bytes32 => address) cache; function read(bytes memory _code) public view returns (address) { bytes32 hash = keccak256(_code); return cache[hash]; } function write(bytes memory _code) public returns (address target) { assembly { target := create(0, add(_code, 0x20), mload(_code)) switch iszero(extcodesize(target)) case 1 { revert(0, 0) } } bytes32 hash = keccak256(_code); cache[hash] = target; } } contract Manager { function last(address) public returns (uint); function cdpCan(address, uint, address) public view returns (uint); function ilks(uint) public view returns (bytes32); function owns(uint) public view returns (address); function urns(uint) public view returns (address); function vat() public view returns (address); function open(bytes32, address) public returns (uint); function give(uint, address) public; function cdpAllow(uint, address, uint) public; function urnAllow(address, uint) public; function frob(uint, int, int) public; function flux(uint, address, uint) public; function move(uint, address, uint) public; function exit(address, uint, address, uint) public; function quit(uint, address) public; function enter(address, uint) public; function shift(uint, uint) public; } contract Join { bytes32 public ilk; function dec() public returns (uint); function gem() public returns (Gem); function join(address, uint) public payable; function exit(address, uint) public; } contract SaverProxyHelper is DSMath { function normalizeDrawAmount(uint _amount, uint _rate, uint _daiVatBalance) internal pure returns (int dart) { if (_daiVatBalance < mul(_amount, RAY)) { dart = toPositiveInt(sub(mul(_amount, RAY), _daiVatBalance) / _rate); dart = mul(uint(dart), _rate) < mul(_amount, RAY) ? dart + 1 : dart; } } function toRad(uint _wad) internal pure returns (uint) { return mul(_wad, 10 ** 27); } function convertTo18(address _joinAddr, uint256 _amount) internal returns (uint256) { return mul(_amount, 10 ** (18 - Join(_joinAddr).dec())); } function toPositiveInt(uint _x) internal pure returns (int y) { y = int(_x); require(y >= 0, "int-overflow"); } function normalizePaybackAmount(address _vat, address _urn, bytes32 _ilk) internal view returns (int amount) { uint dai = Vat(_vat).dai(_urn); (, uint rate,,,) = Vat(_vat).ilks(_ilk); (, uint art) = Vat(_vat).urns(_ilk, _urn); amount = toPositiveInt(dai / rate); amount = uint(amount) <= art ? - amount : - toPositiveInt(art); } function getAllDebt(address _vat, address _usr, address _urn, bytes32 _ilk) internal view returns (uint daiAmount) { (, uint rate,,,) = Vat(_vat).ilks(_ilk); (, uint art) = Vat(_vat).urns(_ilk, _urn); uint dai = Vat(_vat).dai(_usr); uint rad = sub(mul(art, rate), dai); daiAmount = rad / RAY; daiAmount = mul(daiAmount, RAY) < rad ? daiAmount + 1 : daiAmount; } function getCollateralAddr(address _joinAddr) internal returns (address) { return address(Join(_joinAddr).gem()); } function getCdpInfo(Manager _manager, uint _cdpId, bytes32 _ilk) public view returns (uint, uint) { address vat = _manager.vat(); address urn = _manager.urns(_cdpId); (uint collateral, uint debt) = Vat(vat).urns(_ilk, urn); (,uint rate,,,) = Vat(vat).ilks(_ilk); return (collateral, rmul(debt, rate)); } function getOwner(Manager _manager, uint _cdpId) public view returns (address) { DSProxy proxy = DSProxy(uint160(_manager.owns(_cdpId))); return proxy.owner(); } } contract MCDSaverProxy is SaverProxyHelper, ExchangeHelper { uint public constant SERVICE_FEE = 400; bytes32 public constant ETH_ILK = 0x4554482d41000000000000000000000000000000000000000000000000000000; bytes32 public constant USDC_ILK = 0x555344432d410000000000000000000000000000000000000000000000000000; Manager public constant manager = Manager(MANAGER_ADDRESS); Vat public constant vat = Vat(VAT_ADDRESS); DaiJoin public constant daiJoin = DaiJoin(DAI_JOIN_ADDRESS); Spotter public constant spotter = Spotter(SPOTTER_ADDRESS); modifier boostCheck(uint _cdpId) { bytes32 ilk = manager.ilks(_cdpId); address urn = manager.urns(_cdpId); (uint collateralBefore, ) = vat.urns(ilk, urn); _; (uint collateralAfter, ) = vat.urns(ilk, urn); require(collateralAfter > collateralBefore); } modifier repayCheck(uint _cdpId) { bytes32 ilk = manager.ilks(_cdpId); uint beforeRatio = getRatio(_cdpId, ilk); _; uint afterRatio = getRatio(_cdpId, ilk); require(afterRatio > beforeRatio || afterRatio == 0); } function repay( uint[6] memory _data, address _joinAddr, address _exchangeAddress, bytes memory _callData ) public payable repayCheck(_data[0]) { address owner = getOwner(manager, _data[0]); bytes32 ilk = manager.ilks(_data[0]); uint[3] memory temp; temp[0] = drawCollateral(_data[0], ilk, _joinAddr, _data[1]); uint[4] memory swapData = [temp[0], _data[2], _data[3], _data[5]]; temp[1] = swap(swapData, getCollateralAddr(_joinAddr), DAI_ADDRESS, _exchangeAddress, _callData); temp[2] = sub(temp[1], getFee(temp[1], _data[4], owner)); paybackDebt(_data[0], ilk, temp[2], owner); if (address(this).balance > 0) { tx.origin.transfer(address(this).balance); } SaverLogger(LOGGER_ADDRESS).LogRepay(_data[0], owner, temp[0], temp[1]); } function boost( uint[6] memory _data, address _joinAddr, address _exchangeAddress, bytes memory _callData ) public payable boostCheck(_data[0]) { address owner = getOwner(manager, _data[0]); bytes32 ilk = manager.ilks(_data[0]); uint[3] memory temp; temp[0] = drawDai(_data[0], ilk, _data[1]); temp[1] = sub(temp[0], getFee(temp[0], _data[4], owner)); uint[4] memory swapData = [temp[1], _data[2], _data[3], _data[5]]; temp[2] = swap(swapData, DAI_ADDRESS, getCollateralAddr(_joinAddr), _exchangeAddress, _callData); addCollateral(_data[0], _joinAddr, temp[2]); if (address(this).balance > 0) { tx.origin.transfer(address(this).balance); } SaverLogger(LOGGER_ADDRESS).LogBoost(_data[0], owner, temp[0], temp[2]); } function drawDai(uint _cdpId, bytes32 _ilk, uint _daiAmount) internal returns (uint) { uint rate = Jug(JUG_ADDRESS).drip(_ilk); uint daiVatBalance = vat.dai(manager.urns(_cdpId)); uint maxAmount = getMaxDebt(_cdpId, _ilk); if (_daiAmount >= maxAmount) { _daiAmount = sub(maxAmount, 1); } manager.frob(_cdpId, int(0), normalizeDrawAmount(_daiAmount, rate, daiVatBalance)); manager.move(_cdpId, address(this), toRad(_daiAmount)); if (vat.can(address(this), address(DAI_JOIN_ADDRESS)) == 0) { vat.hope(DAI_JOIN_ADDRESS); } DaiJoin(DAI_JOIN_ADDRESS).exit(address(this), _daiAmount); return _daiAmount; } function addCollateral(uint _cdpId, address _joinAddr, uint _amount) internal { int convertAmount = 0; if (_joinAddr == ETH_JOIN_ADDRESS) { Join(_joinAddr).gem().deposit.value(_amount)(); convertAmount = toPositiveInt(_amount); } else { convertAmount = toPositiveInt(convertTo18(_joinAddr, _amount)); } Join(_joinAddr).gem().approve(_joinAddr, _amount); Join(_joinAddr).join(address(this), _amount); vat.frob( manager.ilks(_cdpId), manager.urns(_cdpId), address(this), address(this), convertAmount, 0 ); } function drawCollateral(uint _cdpId, bytes32 _ilk, address _joinAddr, uint _amount) internal returns (uint) { uint maxCollateral = getMaxCollateral(_cdpId, _ilk); if (_amount >= maxCollateral) { _amount = sub(maxCollateral, 1); } uint frobAmount = _ilk == USDC_ILK ? _amount * (10 ** 12) : _amount; manager.frob(_cdpId, -toPositiveInt(frobAmount), 0); manager.flux(_cdpId, address(this), frobAmount); Join(_joinAddr).exit(address(this), _amount); if (_joinAddr == ETH_JOIN_ADDRESS) { Join(_joinAddr).gem().withdraw(_amount); } return _amount; } function paybackDebt(uint _cdpId, bytes32 _ilk, uint _daiAmount, address _owner) internal { address urn = manager.urns(_cdpId); uint wholeDebt = getAllDebt(VAT_ADDRESS, urn, urn, _ilk); if (_daiAmount > wholeDebt) { ERC20(DAI_ADDRESS).transfer(_owner, sub(_daiAmount, wholeDebt)); _daiAmount = wholeDebt; } daiJoin.dai().approve(DAI_JOIN_ADDRESS, _daiAmount); daiJoin.join(urn, _daiAmount); manager.frob(_cdpId, 0, normalizePaybackAmount(VAT_ADDRESS, urn, _ilk)); } function getFee(uint _amount, uint _gasCost, address _owner) internal returns (uint feeAmount) { uint fee = SERVICE_FEE; if (Discount(DISCOUNT_ADDRESS).isCustomFeeSet(_owner)) { fee = Discount(DISCOUNT_ADDRESS).getCustomServiceFee(_owner); } feeAmount = (fee == 0) ? 0 : (_amount / fee); if (_gasCost != 0) { uint ethDaiPrice = getPrice(ETH_ILK); _gasCost = rmul(_gasCost, ethDaiPrice); feeAmount = add(feeAmount, _gasCost); } if (feeAmount > (_amount / 5)) { feeAmount = _amount / 5; } ERC20(DAI_ADDRESS).transfer(WALLET_ID, feeAmount); } function getMaxCollateral(uint _cdpId, bytes32 _ilk) public view returns (uint) { uint price = getPrice(_ilk); (uint collateral, uint debt) = getCdpInfo(manager, _cdpId, _ilk); (, uint mat) = Spotter(SPOTTER_ADDRESS).ilks(_ilk); uint maxCollateral = sub(sub(collateral, (div(mul(mat, debt), price))), 10); uint normalizeMaxCollateral = _ilk == USDC_ILK ? maxCollateral / (10 ** 12) : maxCollateral; return normalizeMaxCollateral; } function getMaxDebt(uint _cdpId, bytes32 _ilk) public view returns (uint) { uint price = getPrice(_ilk); (, uint mat) = spotter.ilks(_ilk); (uint collateral, uint debt) = getCdpInfo(manager, _cdpId, _ilk); return sub(sub(div(mul(collateral, price), mat), debt), 10); } function getPrice(bytes32 _ilk) public view returns (uint) { (, uint mat) = spotter.ilks(_ilk); (,,uint spot,,) = vat.ilks(_ilk); return rmul(rmul(spot, spotter.par()), mat); } function getRatio(uint _cdpId, bytes32 _ilk) public view returns (uint) { uint price = getPrice( _ilk); (uint collateral, uint debt) = getCdpInfo(manager, _cdpId, _ilk); if (debt == 0) return 0; return rdiv(wmul(collateral, price), debt); } function getCdpDetailedInfo(uint _cdpId) public view returns (uint collateral, uint debt, uint price, bytes32 ilk) { address urn = manager.urns(_cdpId); ilk = manager.ilks(_cdpId); (collateral, debt) = vat.urns(ilk, urn); (,uint rate,,,) = vat.ilks(ilk); debt = rmul(debt, rate); price = getPrice(ilk); } } library Address { function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function callOptionalReturn(IERC20 token, bytes memory data) private { require(address(token).isContract(), "SafeERC20: call to non-contract"); (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IFlashLoanReceiver { function executeOperation(address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external; } contract ILendingPoolAddressesProvider { function getLendingPool() public view returns (address); function setLendingPoolImpl(address _pool) public; function getLendingPoolCore() public view returns (address payable); function setLendingPoolCoreImpl(address _lendingPoolCore) public; function getLendingPoolConfigurator() public view returns (address); function setLendingPoolConfiguratorImpl(address _configurator) public; function getLendingPoolDataProvider() public view returns (address); function setLendingPoolDataProviderImpl(address _provider) public; function getLendingPoolParametersProvider() public view returns (address); function setLendingPoolParametersProviderImpl(address _parametersProvider) public; function getTokenDistributor() public view returns (address); function setTokenDistributor(address _tokenDistributor) public; function getFeeProvider() public view returns (address); function setFeeProviderImpl(address _feeProvider) public; function getLendingPoolLiquidationManager() public view returns (address); function setLendingPoolLiquidationManager(address _manager) public; function getLendingPoolManager() public view returns (address); function setLendingPoolManager(address _lendingPoolManager) public; function getPriceOracle() public view returns (address); function setPriceOracle(address _priceOracle) public; function getLendingRateOracle() public view returns (address); function setLendingRateOracle(address _lendingRateOracle) public; } library EthAddressLib { function ethAddress() internal pure returns(address) { return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; } } contract FlashLoanReceiverBase is IFlashLoanReceiver { using SafeERC20 for IERC20; using SafeMath for uint256; ILendingPoolAddressesProvider public addressesProvider; constructor(ILendingPoolAddressesProvider _provider) public { addressesProvider = _provider; } function () external payable { } function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal { address payable core = addressesProvider.getLendingPoolCore(); transferInternal(core,_reserve, _amount); } function transferInternal(address payable _destination, address _reserve, uint256 _amount) internal { if(_reserve == EthAddressLib.ethAddress()) { _destination.call.value(_amount)(""); return; } IERC20(_reserve).safeTransfer(_destination, _amount); } function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) { if(_reserve == EthAddressLib.ethAddress()) { return _target.balance; } return IERC20(_reserve).balanceOf(_target); } } contract MCDSaverFlashLoan is MCDSaverProxy, FlashLoanReceiverBase { Manager public constant MANAGER = Manager(MANAGER_ADDRESS); ILendingPoolAddressesProvider public LENDING_POOL_ADDRESS_PROVIDER = ILendingPoolAddressesProvider(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8); address payable public owner; constructor() FlashLoanReceiverBase(LENDING_POOL_ADDRESS_PROVIDER) public { owner = msg.sender; } function executeOperation( address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external { require(_amount <= getBalanceInternal(address(this), _reserve), "Invalid balance for the contract"); ( uint[6] memory data, address joinAddr, address exchangeAddress, bytes memory callData, bool isRepay ) = abi.decode(_params, (uint256[6],address,address,bytes,bool)); if (isRepay) { repayWithLoan(data, _amount, joinAddr, exchangeAddress, callData, _fee); } else { boostWithLoan(data, _amount, joinAddr, exchangeAddress, callData, _fee); } transferFundsBackToPoolInternal(_reserve, _amount.add(_fee)); if (address(this).balance > 0) { tx.origin.transfer(address(this).balance); } } function boostWithLoan( uint256[6] memory _data, uint256 _loanAmount, address _joinAddr, address _exchangeAddress, bytes memory _callData, uint _fee ) internal boostCheck(_data[0]) { uint[] memory amounts = new uint[](5); address owner = getOwner(MANAGER, _data[0]); amounts[0] = getMaxDebt(_data[0], manager.ilks(_data[0])); amounts[1] = drawDai(_data[0], MANAGER.ilks(_data[0]), amounts[0]); amounts[2] = getFee((amounts[1] + _loanAmount), 0, owner); amounts[3] = (amounts[1] + _loanAmount) - amounts[2]; amounts[4] = swap( [amounts[3], _data[2], _data[3], _data[5]], DAI_ADDRESS, getCollateralAddr(_joinAddr), _exchangeAddress, _callData ); addCollateral(_data[0], _joinAddr, amounts[4]); drawDai(_data[0], manager.ilks(_data[0]), (_loanAmount + _fee)); SaverLogger(LOGGER_ADDRESS).LogBoost(_data[0], owner, (amounts[1] + _loanAmount), amounts[4]); } function repayWithLoan( uint256[6] memory _data, uint256 _loanAmount, address _joinAddr, address _exchangeAddress, bytes memory _callData, uint _fee ) internal repayCheck(_data[0]) { uint[] memory amounts = new uint[](4); address owner = getOwner(MANAGER, _data[0]); amounts[0] = getMaxCollateral(_data[0], manager.ilks(_data[0])); amounts[1] = drawCollateral(_data[0], manager.ilks(_data[0]), _joinAddr, amounts[0]); amounts[2] = swap( [(amounts[1] + _loanAmount), _data[2], _data[3], _data[5]], getCollateralAddr(_joinAddr), DAI_ADDRESS, _exchangeAddress, _callData ); amounts[3] = getFee(amounts[2], 0, owner); uint paybackAmount = (amounts[2] - amounts[3]); paybackAmount = limitLoanAmount(_data[0], manager.ilks(_data[0]), paybackAmount, owner); paybackDebt(_data[0], MANAGER.ilks(_data[0]), paybackAmount, owner); drawCollateral(_data[0], manager.ilks(_data[0]), _joinAddr, (_loanAmount + _fee)); SaverLogger(LOGGER_ADDRESS).LogRepay(_data[0], owner, (amounts[1] + _loanAmount), amounts[2]); } function() external payable {} function limitLoanAmount(uint _cdpId, bytes32 _ilk, uint _paybackAmount, address _owner) internal returns (uint256) { uint debt = getAllDebt(address(vat), manager.urns(_cdpId), manager.urns(_cdpId), _ilk); if (_paybackAmount > debt) { ERC20(DAI_ADDRESS).transfer(_owner, (_paybackAmount - debt)); return debt; } uint debtLeft = debt - _paybackAmount; if (debtLeft < 20 ether) { uint amountOverDust = ((20 ether) - debtLeft); ERC20(DAI_ADDRESS).transfer(_owner, amountOverDust); return (_paybackAmount - amountOverDust); } return _paybackAmount; } function withdrawStuckFunds(address _tokenAddr, uint _amount) public { require(msg.sender == owner, "Only owner"); if (_tokenAddr == KYBER_ETH_ADDRESS) { owner.transfer(_amount); } else { ERC20(_tokenAddr).transfer(owner, _amount); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"WETH_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SAI_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_ILK","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_data","type":"uint256[6]"},{"name":"_joinAddr","type":"address"},{"name":"_exchangeAddress","type":"address"},{"name":"_callData","type":"bytes"}],"name":"boost","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"MANAGER","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":true,"inputs":[],"name":"DAI_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_cdpId","type":"uint256"},{"name":"_ilk","type":"bytes32"}],"name":"getMaxCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"spotter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_manager","type":"address"},{"name":"_cdpId","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ilk","type":"bytes32"}],"name":"getPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GAS_TOKEN_INTERFACE_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vat","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MANAGER_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddr","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_manager","type":"address"},{"name":"_cdpId","type":"uint256"},{"name":"_ilk","type":"bytes32"}],"name":"getCdpInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"manager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SERVICE_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_cdpId","type":"uint256"},{"name":"_ilk","type":"bytes32"}],"name":"getRatio","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIGRATION_ACTIONS_PROXY","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SPOTTER_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"USDC_ILK","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PROXY_ACTIONS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MKR_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LOGGER_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SAVER_EXCHANGE_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LENDING_POOL_ADDRESS_PROVIDER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAKER_DAI_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DISCOUNT_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"JUG_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NEW_IDAI_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"daiJoin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"addressesProvider","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VAT_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DAI_JOIN_ADDRESS","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":false,"inputs":[{"name":"_data","type":"uint256[6]"},{"name":"_joinAddr","type":"address"},{"name":"_exchangeAddress","type":"address"},{"name":"_callData","type":"bytes"}],"name":"repay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_cdpId","type":"uint256"}],"name":"getCdpDetailedInfo","outputs":[{"name":"collateral","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"price","type":"uint256"},{"name":"ilk","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_cdpId","type":"uint256"},{"name":"_ilk","type":"bytes32"}],"name":"getMaxDebt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_reserve","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_params","type":"bytes"}],"name":"executeOperation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ETH_JOIN_ADDRESS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SCD_MCD_MIGRATION","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"}]
Contract Creation Code
6080604052600180546001600160a01b0319167324a42fd28c976a61df5d00d0599c34c4f90748c817905534801561003657600080fd5b50600154600080546001600160a01b03199081166001600160a01b039093169290921790556002805490911633179055615dc680620000766000396000f3fe6080604052600436106102e75760003560e01c8063819854e711610184578063c72c4d10116100d6578063dcfc17051161008a578063ee87255811610064578063ee872558146108de578063f1d2539614610977578063f83524721461098c576102e7565b8063dcfc17051461076b578063e304c6081461085e578063ed202109146108ae576102e7565b8063cfac57c7116100bb578063cfac57c714610717578063d0cc728914610741578063d3661fa514610756576102e7565b8063c72c4d101461072c578063cf786f8f14610545576102e7565b806398ab3d4911610138578063acbeba6111610112578063acbeba61146106ed578063bf42d94714610702578063c11645bc14610717576102e7565b806398ab3d49146106c35780639da779e91461031a578063a46a66c9146106d8576102e7565b80638da5cb5b116101695780638da5cb5b1461068457806394bfbe741461069957806394f0eb3d146106ae576102e7565b8063819854e71461065a578063825ffd921461066f576102e7565b806332ac5cd21161023d578063481c6a75116101f157806362da5d90116101cb57806362da5d90146106305780636738929f146104b85780637e8a776f14610645576102e7565b8063481c6a751461044957806350c86de5146105eb57806351a885c014610600576102e7565b8063380d424411610222578063380d4244146104495780633a1283221461055a5780634115fe6b14610593576102e7565b806332ac5cd21461053057806336569e7714610545576102e7565b806329f7fc9e1161029f5780632e77468d116102795780632e77468d146104b85780632f634a90146104cd57806331d98b3f14610506576102e7565b806329f7fc9e1461045e5780632a4c0a1a146104735780632e67720c14610488576102e7565b8063186cab76116102d0578063186cab761461032f578063197e0ffe146103565780631b2df85014610449576102e7565b8063040141e5146102e95780630bd4a73e1461031a575b005b3480156102f557600080fd5b506102fe6109a1565b604080516001600160a01b039092168252519081900360200190f35b34801561032657600080fd5b506102fe6109b9565b34801561033b57600080fd5b506103446109d1565b60408051918252519081900360200190f35b6102e7600480360361012081101561036d57600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156103d457600080fd5b8201836020820111156103e657600080fd5b8035906020019184600183028401116401000000008311171561040857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109f5945050505050565b34801561045557600080fd5b506102fe610ee3565b34801561046a57600080fd5b506102fe610efb565b34801561047f57600080fd5b506102fe610f13565b34801561049457600080fd5b50610344600480360360408110156104ab57600080fd5b5080359060200135610f2b565b3480156104c457600080fd5b506102fe611055565b3480156104d957600080fd5b506102fe600480360360408110156104f057600080fd5b506001600160a01b03813516906020013561106d565b34801561051257600080fd5b506103446004803603602081101561052957600080fd5b5035611171565b34801561053c57600080fd5b506102fe61134d565b34801561055157600080fd5b506102fe611360565b34801561056657600080fd5b506102e76004803603604081101561057d57600080fd5b506001600160a01b038135169060200135611378565b34801561059f57600080fd5b506105d2600480360360608110156105b657600080fd5b506001600160a01b0381351690602081013590604001356114f6565b6040805192835260208301919091528051918290030190f35b3480156105f757600080fd5b50610344611749565b34801561060c57600080fd5b506103446004803603604081101561062357600080fd5b508035906020013561174f565b34801561063c57600080fd5b506102fe6117b5565b34801561065157600080fd5b506103446117cd565b34801561066657600080fd5b506102fe6117f1565b34801561067b57600080fd5b506102fe611809565b34801561069057600080fd5b506102fe611821565b3480156106a557600080fd5b506102fe611830565b3480156106ba57600080fd5b506102fe611848565b3480156106cf57600080fd5b506102fe611860565b3480156106e457600080fd5b506102fe61186f565b3480156106f957600080fd5b506102fe611887565b34801561070e57600080fd5b506102fe61189f565b34801561072357600080fd5b506102fe6118b7565b34801561073857600080fd5b506102fe6118cf565b34801561074d57600080fd5b506102fe6118de565b34801561076257600080fd5b506102fe6118f6565b6102e7600480360361012081101561078257600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156107e957600080fd5b8201836020820111156107fb57600080fd5b8035906020019184600183028401116401000000008311171561081d57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061190e945050505050565b34801561086a57600080fd5b506108886004803603602081101561088157600080fd5b5035611c26565b604080519485526020850193909352838301919091526060830152519081900360800190f35b3480156108ba57600080fd5b50610344600480360360408110156108d157600080fd5b5080359060200135611ec0565b3480156108ea57600080fd5b506102e76004803603608081101561090157600080fd5b6001600160a01b03823516916020810135916040820135919081019060808101606082013564010000000081111561093857600080fd5b82018360208201111561094a57600080fd5b8035906020019184600183028401116401000000008311171561096c57600080fd5b509092509050611fba565b34801561098357600080fd5b506102fe6121b8565b34801561099857600080fd5b506102fe6121d0565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7389d24a6b4ccb1b6faa2625fe562bdd9a2326035981565b7f4554482d4100000000000000000000000000000000000000000000000000000081565b8351604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d6020811015610a9057600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018590529051919250600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b158015610b0357600080fd5b505afa158015610b17573d6000803e3d6000fd5b505050506040513d6020811015610b2d57600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b038316602482015281519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c9260448082019391829003018186803b158015610bab57600080fd5b505afa158015610bbf573d6000803e3d6000fd5b505050506040513d6040811015610bd557600080fd5b505190506000610c00735ef30b9986345249bc32d8928b7ee64de9435e398a835b602002015161106d565b90506000735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8b8360200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610c5957600080fd5b505afa158015610c6d573d6000803e3d6000fd5b505050506040513d6020811015610c8357600080fd5b50519050610c8f615cf8565b8a5160208c0151610ca2919084906121e8565b80825260808c0151610cc09190610cbb908290876126bf565b612941565b6020820152610ccd615d16565b506040805160808101825260208381015182528d830151908201526060808e01519282019290925260a08d015191810191909152610d2a81736b175474e89094c44da98b954eedeac495271d0f610d238e612951565b8d8d6129c0565b604083018190528c51610d3e918d90613283565b303115610d74576040513290303180156108fc02916000818181858888f19350505050158015610d72573d6000803e3d6000fd5b505b8b51825160408085015181517f6877100500000000000000000000000000000000000000000000000000000000815260048101949094526001600160a01b0388166024850152604484019290925260648301919091525173ecf88e1cec2d2894a0295db3d86fe7ce4991e6df91636877100591608480830192600092919082900301818387803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b5050604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018b90526001600160a01b038a1660248201528151600098507335d1b3f3d7966a1dfe207aa4514c12a259a0492b9750632424be5c9650604480830196509294509250829003018186803b158015610e9e57600080fd5b505afa158015610eb2573d6000803e3d6000fd5b505050506040513d6040811015610ec857600080fd5b50519050818111610ed857600080fd5b505050505050505050565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b736b175474e89094c44da98b954eedeac495271d0f81565b600080610f3783611171565b9050600080610f5b735ef30b9986345249bc32d8928b7ee64de9435e3987876114f6565b9150915060007365c79fcb50ca1594b025960e539ed7a9a6d434a36001600160a01b031663d9638d36876040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b158015610fb857600080fd5b505afa158015610fcc573d6000803e3d6000fd5b505050506040513d6040811015610fe257600080fd5b50602001519050600061100c61100585610cbb610fff86886136c9565b896136ed565b600a612941565b905060007f555344432d410000000000000000000000000000000000000000000000000000881461103d5781611046565b64e8d4a5100082045b96505050505050505b92915050565b7365c79fcb50ca1594b025960e539ed7a9a6d434a381565b600080836001600160a01b0316638161b120846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156110b457600080fd5b505afa1580156110c8573d6000803e3d6000fd5b505050506040513d60208110156110de57600080fd5b5051604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290519192506001600160a01b03831691638da5cb5b91600480820192602092909190829003018186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d602081101561116757600080fd5b5051949350505050565b6000807365c79fcb50ca1594b025960e539ed7a9a6d434a36001600160a01b031663d9638d36846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d60408110156111f557600080fd5b5060200151604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b15801561126b57600080fd5b505afa15801561127f573d6000803e3d6000fd5b505050506040513d60a081101561129557600080fd5b5060409081015181517f495d32cb00000000000000000000000000000000000000000000000000000000815291519092506113439161133d9184917365c79fcb50ca1594b025960e539ed7a9a6d434a39163495d32cb91600480820192602092909190829003018186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b5051613700565b83613700565b925050505b919050565b6eb3f879cb30fe243b4dfee438691c0481565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b6002546001600160a01b031633146113f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c79206f776e657200000000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611456576002546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611450573d6000803e3d6000fd5b506114f2565b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810184905290519184169163a9059cbb916044808201926020929091908290030181600087803b1580156114c557600080fd5b505af11580156114d9573d6000803e3d6000fd5b505050506040513d60208110156114ef57600080fd5b50505b5050565b6000806000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561153457600080fd5b505afa158015611548573d6000803e3d6000fd5b505050506040513d602081101561155e57600080fd5b5051604080517f2726b0730000000000000000000000000000000000000000000000000000000081526004810188905290519192506000916001600160a01b03891691632726b073916024808301926020929190829003018186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0380841660248301528251939450600093849391871692632424be5c926044808301939192829003018186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d604081101561168a57600080fd5b508051602090910151604080517fd9638d36000000000000000000000000000000000000000000000000000000008152600481018b905290519294509092506000916001600160a01b0387169163d9638d369160248083019260a0929190829003018186803b1580156116fc57600080fd5b505afa158015611710573d6000803e3d6000fd5b505050506040513d60a081101561172657600080fd5b50602001519050826117388383613700565b965096505050505050935093915050565b61019081565b60008061175b83611171565b905060008061177f735ef30b9986345249bc32d8928b7ee64de9435e3987876114f6565b915091508060001415611798576000935050505061104f565b6117ab6117a58385613739565b82613761565b9695505050505050565b73e4b22d484958e582098a98229a24e8a43801b67481565b7f555344432d41000000000000000000000000000000000000000000000000000081565b7382ecd135dce65fbc6dbdd0e4237e0af93ffd503881565b739f8f72aa9304c8b593d555f12ef6589cc3a579a281565b6002546001600160a01b031681565b73ecf88e1cec2d2894a0295db3d86fe7ce4991e6df81565b73862f3dcf1104b8a9468fbb8b843c37c31b41ef0981565b6001546001600160a01b031681565b731b14e8d511c9a4395425314f849bd737baf8208f81565b7319c0976f590d67707e62397c87829d896dc0f1f181565b736c1e2b0f67e00c06c8e2be7dc681ab785163ff4d81565b739759a6ac90977b93b58547b4a71c78317f391a2881565b6000546001600160a01b031681565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b8351604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b15801561197f57600080fd5b505afa158015611993573d6000803e3d6000fd5b505050506040513d60208110156119a957600080fd5b5051905060006119b9838361174f565b905060006119dc735ef30b9986345249bc32d8928b7ee64de9435e398983610bf6565b90506000735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8a8360200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b50519050611a6b615cf8565b895160208b0151611a80919084908c90613785565b8152611a8a615d16565b5060408051608081018252825181528b82015160208201526060808d01519282019290925260a08c015191810191909152611ae481611ac88c612951565b736b175474e89094c44da98b954eedeac495271d0f8c8c6129c0565b6020830181905260808c0151611b019190610cbb908290886126bf565b604083018190528b51611b1691859087613a8e565b303115611b4c576040513290303180156108fc02916000818181858888f19350505050158015611b4a573d6000803e3d6000fd5b505b8a5182516020840151604080517f406bb32a00000000000000000000000000000000000000000000000000000000815260048101949094526001600160a01b0388166024850152604484019290925260648301525173ecf88e1cec2d2894a0295db3d86fe7ce4991e6df9163406bb32a91608480830192600092919082900301818387803b158015611bdd57600080fd5b505af1158015611bf1573d6000803e3d6000fd5b50505050505050506000611c05848461174f565b905081811180611c13575080155b611c1c57600080fd5b5050505050505050565b6000806000806000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c8657600080fd5b505afa158015611c9a573d6000803e3d6000fd5b505050506040513d6020811015611cb057600080fd5b5051604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018990529051919250735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015611d2157600080fd5b505afa158015611d35573d6000803e3d6000fd5b505050506040513d6020811015611d4b57600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b038416602482015281519294507335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c92604480840193919291829003018186803b158015611dc857600080fd5b505afa158015611ddc573d6000803e3d6000fd5b505050506040513d6040811015611df257600080fd5b508051602090910151604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519297509095506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b158015611e6f57600080fd5b505afa158015611e83573d6000803e3d6000fd5b505050506040513d60a0811015611e9957600080fd5b50602001519050611eaa8582613700565b9450611eb583611171565b935050509193509193565b600080611ecc83611171565b604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905281519293506000927365c79fcb50ca1594b025960e539ed7a9a6d434a39263d9638d369260248082019391829003018186803b158015611f3957600080fd5b505afa158015611f4d573d6000803e3d6000fd5b505050506040513d6040811015611f6357600080fd5b50602001519050600080611f8c735ef30b9986345249bc32d8928b7ee64de9435e3988886114f6565b91509150611faf611005611fa9611fa385886136c9565b866136ed565b83612941565b979650505050505050565b611fc43086613e28565b84111561203257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f496e76616c69642062616c616e636520666f722074686520636f6e7472616374604482015290519081900360640190fd5b61203a615d34565b60008060606000868661014081101561205257600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156120b957600080fd5b8201836020820111156120cb57600080fd5b803590602001918460018302840111640100000000831117156120ed57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250989d50969b509499509750351580159650945061214f93505050505761214a858a8686868d613ee5565b61215d565b61215d858a8686868d614551565b6121768a6121718b8b63ffffffff614c7816565b614cec565b3031156121ac576040513290303180156108fc02916000818181858888f193505050501580156121aa573d6000803e3d6000fd5b505b50505050505050505050565b732f0b23f53734252bda2277357e97e1517d6b042a81565b73c73e0383f3aff3215e6f04b0331d58cecf0ab84981565b6000807319c0976f590d67707e62397c87829d896dc0f1f16001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b505050506040513d602081101561226f57600080fd5b5051604080517f2726b0730000000000000000000000000000000000000000000000000000000081526004810188905290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b34691735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b1580156122fe57600080fd5b505afa158015612312573d6000803e3d6000fd5b505050506040513d602081101561232857600080fd5b50516040805163ffffffff841660e01b81526001600160a01b039092166004830152516024808301926020929190829003018186803b15801561236a57600080fd5b505afa15801561237e573d6000803e3d6000fd5b505050506040513d602081101561239457600080fd5b5051905060006123a48787611ec0565b90508085106123bb576123b8816001612941565b94505b735ef30b9986345249bc32d8928b7ee64de9435e396345e6bdcd8860006123e3898888614d79565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561242757600080fd5b505af115801561243b573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b031663f9f30db6883061246d89614dff565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156124c357600080fd5b505af11580156124d7573d6000803e3d6000fd5b5050604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152306004820152739759a6ac90977b93b58547b4a71c78317f391a28602482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9350634538c4eb92506044808301926020929190829003018186803b15801561255f57600080fd5b505afa158015612573573d6000803e3d6000fd5b505050506040513d602081101561258957600080fd5b505161262757604080517fa3b22fc4000000000000000000000000000000000000000000000000000000008152739759a6ac90977b93b58547b4a71c78317f391a28600482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163a3b22fc491602480830192600092919082900301818387803b15801561260e57600080fd5b505af1158015612622573d6000803e3d6000fd5b505050505b604080517fef693bed000000000000000000000000000000000000000000000000000000008152306004820152602481018790529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b15801561269957600080fd5b505af11580156126ad573d6000803e3d6000fd5b505050508493505050505b9392505050565b604080517fb371deac0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152905160009161019091731b14e8d511c9a4395425314f849bd737baf8208f9163b371deac916024808301926020929190829003018186803b15801561273957600080fd5b505afa15801561274d573d6000803e3d6000fd5b505050506040513d602081101561276357600080fd5b50511561280c57604080517f6eeb54310000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201529051731b14e8d511c9a4395425314f849bd737baf8208f91636eeb5431916024808301926020929190829003018186803b1580156127dd57600080fd5b505afa1580156127f1573d6000803e3d6000fd5b505050506040513d602081101561280757600080fd5b505190505b80156128215780858161281b57fe5b04612824565b60005b915083156128735760006128577f4554482d41000000000000000000000000000000000000000000000000000000611171565b90506128638582613700565b945061286f8386614e17565b9250505b60058504821115612885576005850491505b604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273322d58b9e75a6918f7e7849aee0ff09369977e086004820152602481018490529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561290c57600080fd5b505af1158015612920573d6000803e3d6000fd5b505050506040513d602081101561293657600080fd5b509195945050505050565b8082038281111561104f57600080fd5b6000816001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561298e57600080fd5b505af11580156129a2573d6000803e3d6000fd5b505050506040513d60208110156129b857600080fd5b505192915050565b60008060006129cd615d52565b8851602082015260006129df89614e27565b98506129ea88614e27565b97506129f4615cf8565b50604080516060810182526001600160a01b0389811682528b811660208301528a1681830152908b015160041415612b8d5760208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14612afb576020808201518c51604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527395e6f48254609a6ee006f7d493c8e5fb97094cef60048201526024810192909252516001600160a01b039092169263095ea7b3926044808401938290030181600087803b158015612ace57600080fd5b505af1158015612ae2573d6000803e3d6000fd5b505050506040513d6020811015612af857600080fd5b50505b612b10818830318e60005b6020020151614e6e565b5084529150818015612b225750825115155b612b8d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f3078207472616e73616374696f6e206661696c65640000000000000000000000604482015290519081900360640190fd5b8251613274578a516020820151604080840151818f015182517f2ec1f00900000000000000000000000000000000000000000000000000000000815260048101959095526001600160a01b039384166024860152921660448401526064830191909152805173862f3dcf1104b8a9468fbb8b843c37c31b41ef0992632ec1f009926084808301939192829003018186803b158015612c2a57600080fd5b505afa158015612c3e573d6000803e3d6000fd5b505050506040513d6040811015612c5457600080fd5b508051602091820151918d0151909650909450841180612c7b575060208b015160608c0151115b612ce657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f536c697070616765206869740000000000000000000000000000000000000000604482015290519081900360640190fd5b60608b01518411612ddf5760208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14612dc6576020808201518c51604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527395e6f48254609a6ee006f7d493c8e5fb97094cef60048201526024810192909252516001600160a01b039092169263095ea7b3926044808401938290030181600087803b158015612d9957600080fd5b505af1158015612dad573d6000803e3d6000fd5b505050506040513d6020811015612dc357600080fd5b50505b612dd5818830318e6000612b06565b6020860152845291505b602083015115613274578a51602084015114612ec857602080840151908201516040808401518e82015182517f2ec1f00900000000000000000000000000000000000000000000000000000000815260048101959095526001600160a01b039384166024860152921660448401526064830191909152805173862f3dcf1104b8a9468fbb8b843c37c31b41ef0992632ec1f009926084808301939192829003018186803b158015612e8f57600080fd5b505afa158015612ea3573d6000803e3d6000fd5b505050506040513d6040811015612eb957600080fd5b50805160209091015190955093505b60208b01518411612f3a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536c69707061676520686974206f6e636861696e207072696365000000000000604482015290519081900360640190fd5b60208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561303457602083015160408083015181517f43ac1dc6000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0391821660248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448201528251600094928a16936343ac1dc693926064808201939182900301818588803b158015612ffc57600080fd5b505af1158015613010573d6000803e3d6000fd5b50505050506040513d604081101561302757600080fd5b5051845101845250613274565b60208082015184820151604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015260248201939093529051919092169263a9059cbb92604480820193918290030181600087803b1580156130a757600080fd5b505af11580156130bb573d6000803e3d6000fd5b505050506040513d60208110156130d157600080fd5b505060408101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131c85760208082015184820151604080517f3bba21dc0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015260248101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448301525191881692633bba21dc926064808401938290030181600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b505050506040513d60208110156131bc57600080fd5b50518351018352613274565b6020808201516040808401518684015182517f13712c9f0000000000000000000000000000000000000000000000000000000081526001600160a01b039485166004820152918416602483015260448201529051918816926313712c9f926064808401938290030181600087803b15801561324257600080fd5b505af1158015613256573d6000803e3d6000fd5b505050506040513d602081101561326c57600080fd5b505183510183525b50505198975050505050505050565b60006001600160a01b038316732f0b23f53734252bda2277357e97e1517d6b042a141561339757826001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156132e557600080fd5b505af11580156132f9573d6000803e3d6000fd5b505050506040513d602081101561330f57600080fd5b5051604080517fd0e30db000000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163d0e30db0918591600480830192600092919082900301818588803b15801561336e57600080fd5b505af1158015613382573d6000803e3d6000fd5b5050505050613390826151d0565b90506133ac565b6133a96133a48484615241565b6151d0565b90505b826001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156133e757600080fd5b505af11580156133fb573d6000803e3d6000fd5b505050506040513d602081101561341157600080fd5b5051604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690529151919092169163095ea7b391604480830192600092919082900301818387803b15801561347e57600080fd5b505af1158015613492573d6000803e3d6000fd5b5050604080517f3b4da69f0000000000000000000000000000000000000000000000000000000081523060048201526024810186905290516001600160a01b0387169350633b4da69f9250604480830192600092919082900301818387803b1580156134fd57600080fd5b505af1158015613511573d6000803e3d6000fd5b505050507335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b03166376088703735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632c2cb9fd876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561359057600080fd5b505afa1580156135a4573d6000803e3d6000fd5b505050506040513d60208110156135ba57600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018990529051735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b15801561362757600080fd5b505afa15801561363b573d6000803e3d6000fd5b505050506040513d602081101561365157600080fd5b50516040805163ffffffff851660e01b815260048101939093526001600160a01b0390911660248301523060448301819052606483015260848201859052600060a48301819052905160c48084019382900301818387803b1580156136b557600080fd5b505af1158015611c1c573d6000803e3d6000fd5b60008115806136e4575050808202828282816136e157fe5b04145b61104f57600080fd5b60008183816136f857fe5b049392505050565b60006b033b2e3c9fd0803ce800000061373261371c85856136c9565b60026b033b2e3c9fd0803ce80000005b04614e17565b816136f857fe5b6000670de0b6b3a764000061373261375185856136c9565b6002670de0b6b3a764000061372c565b60008161373261377d856b033b2e3c9fd0803ce80000006136c9565b60028561372c565b6000806137928686610f2b565b90508083106137a9576137a6816001612941565b92505b60007f555344432d41000000000000000000000000000000000000000000000000000086146137d857836137e1565b8364e8d4a51000025b9050735ef30b9986345249bc32d8928b7ee64de9435e396345e6bdcd88613807846151d0565b60000360006040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561385057600080fd5b505af1158015613864573d6000803e3d6000fd5b5050604080517f9bb8f838000000000000000000000000000000000000000000000000000000008152600481018b9052306024820152604481018590529051735ef30b9986345249bc32d8928b7ee64de9435e399350639bb8f8389250606480830192600092919082900301818387803b1580156138e157600080fd5b505af11580156138f5573d6000803e3d6000fd5b5050604080517fef693bed0000000000000000000000000000000000000000000000000000000081523060048201526024810188905290516001600160a01b038916935063ef693bed9250604480830192600092919082900301818387803b15801561396057600080fd5b505af1158015613974573d6000803e3d6000fd5b505050506001600160a01b038516732f0b23f53734252bda2277357e97e1517d6b042a1415613a8057846001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156139d857600080fd5b505af11580156139ec573d6000803e3d6000fd5b505050506040513d6020811015613a0257600080fd5b5051604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810187905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015613a6757600080fd5b505af1158015613a7b573d6000803e3d6000fd5b505050505b83925050505b949350505050565b6000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae857600080fd5b505afa158015613afc573d6000803e3d6000fd5b505050506040513d6020811015613b1257600080fd5b505190506000613b387335d1b3f3d7966a1dfe207aa4514c12a259a0492b8380886152b9565b905080841115613be857736b175474e89094c44da98b954eedeac495271d0f63a9059cbb84613b678785612941565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613bb657600080fd5b505af1158015613bca573d6000803e3d6000fd5b505050506040513d6020811015613be057600080fd5b509093508390505b739759a6ac90977b93b58547b4a71c78317f391a286001600160a01b031663f4b9fa756040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613c3757600080fd5b505af1158015613c4b573d6000803e3d6000fd5b505050506040513d6020811015613c6157600080fd5b5051604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152739759a6ac90977b93b58547b4a71c78317f391a2860048201526024810187905290516001600160a01b039092169163095ea7b39160448082019260009290919082900301818387803b158015613ce057600080fd5b505af1158015613cf4573d6000803e3d6000fd5b5050604080517f3b4da69f0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602481018890529051739759a6ac90977b93b58547b4a71c78317f391a289350633b4da69f9250604480830192600092919082900301818387803b158015613d7357600080fd5b505af1158015613d87573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd876000613dd07335d1b3f3d7966a1dfe207aa4514c12a259a0492b878b6154b5565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015613e1457600080fd5b505af11580156121ac573d6000803e3d6000fd5b6000613e3261569f565b6001600160a01b0316826001600160a01b03161415613e5c57506001600160a01b0382163161104f565b816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613eb257600080fd5b505afa158015613ec6573d6000803e3d6000fd5b505050506040513d6020811015613edc57600080fd5b50519392505050565b8551604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015613f5657600080fd5b505afa158015613f6a573d6000803e3d6000fd5b505050506040513d6020811015613f8057600080fd5b505190506000613f90838361174f565b60408051600480825260a0820190925291925060609190602082016080803883390190505090506000613fd8735ef30b9986345249bc32d8928b7ee64de9435e398c83610bf6565b8b51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905192935061407d92735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561404c57600080fd5b505afa158015614060573d6000803e3d6000fd5b505050506040513d602081101561407657600080fd5b5051610f2b565b8260008151811061408a57fe5b6020908102919091018101919091528b51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905161414e93735ef30b9986345249bc32d8928b7ee64de9435e3992632c2cb9fd9260248083019392829003018186803b15801561410657600080fd5b505afa15801561411a573d6000803e3d6000fd5b505050506040513d602081101561413057600080fd5b505184518c90869060009061414157fe5b6020026020010151613785565b8260018151811061415b57fe5b6020026020010181815250506141f860405180608001604052808c8560018151811061418357fe5b60200260200101510181526020018d60026006811061419e57fe5b602002015181526020018d6003600681106141b557fe5b602002015181526020018d6005600681106141cc57fe5b602002015190526141dc8b612951565b736b175474e89094c44da98b954eedeac495271d0f8b8b6129c0565b8260028151811061420557fe5b6020026020010181815250506142318260028151811061422157fe5b60200260200101516000836126bf565b8260038151811061423e57fe5b60200260200101818152505060008260038151811061425957fe5b60200260200101518360028151811061426e57fe5b60200260200101510390506143178c60006006811061428957fe5b6020020151735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8f600060200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156142e457600080fd5b505afa1580156142f8573d6000803e3d6000fd5b505050506040513d602081101561430e57600080fd5b505183856156b7565b8c51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290519293506143be92735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561438b57600080fd5b505afa15801561439f573d6000803e3d6000fd5b505050506040513d60208110156143b557600080fd5b50518385613a8e565b8b51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290516144669291735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b15801561443157600080fd5b505afa158015614445573d6000803e3d6000fd5b505050506040513d602081101561445b57600080fd5b50518c8e8b01613785565b5073ecf88e1cec2d2894a0295db3d86fe7ce4991e6df63406bb32a8d60006020020151848e8760018151811061449857fe5b602002602001015101876002815181106144ae57fe5b60200260200101516040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050600060405180830381600087803b15801561451357600080fd5b505af1158015614527573d6000803e3d6000fd5b50505050505050600061453a848461174f565b905081811180614548575080155b6121ac57600080fd5b8551604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b1580156145c257600080fd5b505afa1580156145d6573d6000803e3d6000fd5b505050506040513d60208110156145ec57600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018590529051919250600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b15801561465f57600080fd5b505afa158015614673573d6000803e3d6000fd5b505050506040513d602081101561468957600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b038316602482015281519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c9260448082019391829003018186803b15801561470757600080fd5b505afa15801561471b573d6000803e3d6000fd5b505050506040513d604081101561473157600080fd5b505160408051600580825260c08201909252919250606091906020820160a080388339019050509050600061477b735ef30b9986345249bc32d8928b7ee64de9435e398d83610bf6565b8c51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905192935061482092735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b1580156147ef57600080fd5b505afa158015614803573d6000803e3d6000fd5b505050506040513d602081101561481957600080fd5b5051611ec0565b8260008151811061482d57fe5b6020908102919091018101919091528c51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290516148ef93735ef30b9986345249bc32d8928b7ee64de9435e3992632c2cb9fd9260248083019392829003018186803b1580156148a957600080fd5b505afa1580156148bd573d6000803e3d6000fd5b505050506040513d60208110156148d357600080fd5b5051845185906000906148e257fe5b60200260200101516121e8565b826001815181106148fc57fe5b60200260200101818152505061492a8b8360018151811061491957fe5b6020026020010151016000836126bf565b8260028151811061493757fe5b6020026020010181815250508160028151811061495057fe5b60200260200101518b8360018151811061496657fe5b602002602001015101038260038151811061497d57fe5b602002602001018181525050614a186040518060800160405280846003815181106149a457fe5b602002602001015181526020018e6002600681106149be57fe5b602002015181526020018e6003600681106149d557fe5b602002015181526020018e6005600681106149ec57fe5b60200201519052736b175474e89094c44da98b954eedeac495271d0f614a118d612951565b8c8c6129c0565b82600481518110614a2557fe5b6020908102919091010152614a568c600060200201518b84600481518110614a4957fe5b6020026020010151613283565b8b51604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051614afd9291735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015614ac957600080fd5b505afa158015614add573d6000803e3d6000fd5b505050506040513d6020811015614af357600080fd5b50518d8a016121e8565b5073ecf88e1cec2d2894a0295db3d86fe7ce4991e6df63687710058d60006020020151838e86600181518110614b2f57fe5b60200260200101510186600481518110614b4557fe5b60200260200101516040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050600060405180830381600087803b158015614baa57600080fd5b505af1158015614bbe573d6000803e3d6000fd5b5050604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018990526001600160a01b03881660248201528151600096507335d1b3f3d7966a1dfe207aa4514c12a259a0492b9550632424be5c9450604480830194509091829003018186803b158015614c3e57600080fd5b505afa158015614c52573d6000803e3d6000fd5b505050506040513d6040811015614c6857600080fd5b505190508181116121aa57600080fd5b6000828201838110156126b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060009054906101000a90046001600160a01b03166001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015614d3b57600080fd5b505afa158015614d4f573d6000803e3d6000fd5b505050506040513d6020811015614d6557600080fd5b50519050614d7481848461598f565b505050565b6000614d91846b033b2e3c9fd0803ce80000006136c9565b8210156126b857614dc883614dbb614db5876b033b2e3c9fd0803ce80000006136c9565b85612941565b81614dc257fe5b046151d0565b9050614de0846b033b2e3c9fd0803ce80000006136c9565b614dea82856136c9565b10614df55780613a86565b6001019392505050565b600061104f826b033b2e3c9fd0803ce80000006136c9565b8082018281101561104f57600080fd5b60006001600160a01b03821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214614e53578161104f565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee919050565b6000808080878160200201516001600160a01b031686886040518082805190602001908083835b60208310614ed257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614e95565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614f34576040519150601f19603f3d011682016040523d82523d6000602084013e614f39565b606091505b50909150859050600082156151c15760208a01516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415614f7a573031915061500a565b6020808b0151604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015614fdb57600080fd5b505afa158015614fef573d6000803e3d6000fd5b505050506040513d602081101561500557600080fd5b505191505b60408a01516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561512e57604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291632e1a7d4d9183916370a082319160248083019260209291908290030181600087803b1580156150a757600080fd5b505af11580156150bb573d6000803e3d6000fd5b505050506040513d60208110156150d157600080fd5b50516040805163ffffffff841660e01b8152600481019290925251602480830192600092919082900301818387803b15801561510c57600080fd5b505af1158015615120573d6000803e3d6000fd5b5050303192506151c1915050565b6040808b015181517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291516001600160a01b03909116916370a08231916024808301926020929190829003018186803b15801561519257600080fd5b505afa1580156151a6573d6000803e3d6000fd5b505050506040513d60208110156151bc57600080fd5b505190505b91999198509650945050505050565b80600081121561134857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f696e742d6f766572666c6f770000000000000000000000000000000000000000604482015290519081900360640190fd5b60006126b882846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561528257600080fd5b505af1158015615296573d6000803e3d6000fd5b505050506040513d60208110156152ac57600080fd5b5051601203600a0a6136c9565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561530057600080fd5b505afa158015615314573d6000803e3d6000fd5b505050506040513d60a081101561532a57600080fd5b5060200151604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b15801561539a57600080fd5b505afa1580156153ae573d6000803e3d6000fd5b505050506040513d60408110156153c457600080fd5b50602090810151604080517f6c25b3460000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529151929450600093918b1692636c25b34692602480840193919291829003018186803b15801561543157600080fd5b505afa158015615445573d6000803e3d6000fd5b505050506040513d602081101561545b57600080fd5b50519050600061546e611fa984866136c9565b90506b033b2e3c9fd0803ce80000008104945080615498866b033b2e3c9fd0803ce80000006136c9565b106154a357846154a8565b846001015b9998505050505050505050565b600080846001600160a01b0316636c25b346856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561550e57600080fd5b505afa158015615522573d6000803e3d6000fd5b505050506040513d602081101561553857600080fd5b5051604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519192506000916001600160a01b0388169163d9638d369160248083019260a0929190829003018186803b1580156155a057600080fd5b505afa1580156155b4573d6000803e3d6000fd5b505050506040513d60a08110156155ca57600080fd5b5060200151604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0388811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b15801561563a57600080fd5b505afa15801561564e573d6000803e3d6000fd5b505050506040513d604081101561566457600080fd5b50602001519050615677828481614dc257fe5b9350808411156156925761568a816151d0565b600003611faf565b5050506000039392505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b6000806157f37335d1b3f3d7966a1dfe207aa4514c12a259a0492b735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561572a57600080fd5b505afa15801561573e573d6000803e3d6000fd5b505050506040513d602081101561575457600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018b90529051735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b1580156157c157600080fd5b505afa1580156157d5573d6000803e3d6000fd5b505050506040513d60208110156157eb57600080fd5b5051886152b9565b9050808411156158af57604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015282860360248201529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561587a57600080fd5b505af115801561588e573d6000803e3d6000fd5b505050506040513d60208110156158a457600080fd5b50909150613a869050565b8381036801158e460913d0000081101561598457604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526801158e460913d00000839003602482018190529151736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561594c57600080fd5b505af1158015615960573d6000803e3d6000fd5b505050506040513d602081101561597657600080fd5b505085039250613a86915050565b509295945050505050565b61599761569f565b6001600160a01b0316826001600160a01b03161415615a06576040516001600160a01b038416908290600081818185875af1925050503d80600081146159f9576040519150601f19603f3d011682016040523d82523d6000602084013e6159fe565b606091505b505050614d74565b614d746001600160a01b038316848363ffffffff615a2016565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052614d74908490615aad826001600160a01b0316615cbf565b615b1857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615b7457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101615b37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615bd6576040519150601f19603f3d011682016040523d82523d6000602084013e615bdb565b606091505b509150915081615c4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156114ef57808060200190516020811015615c6857600080fd5b50516114ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d71602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611343575050151592915050565b60405180606001604052806003906020820280388339509192915050565b60405180608001604052806004906020820280388339509192915050565b6040518060c001604052806006906020820280388339509192915050565b6040518060400160405280600290602082028038833950919291505056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a165627a7a72305820d32ab7212aed2f18088ed58bc89562a0438ff554653e4730ce7217e0ef1e46a80029
Deployed Bytecode
0x6080604052600436106102e75760003560e01c8063819854e711610184578063c72c4d10116100d6578063dcfc17051161008a578063ee87255811610064578063ee872558146108de578063f1d2539614610977578063f83524721461098c576102e7565b8063dcfc17051461076b578063e304c6081461085e578063ed202109146108ae576102e7565b8063cfac57c7116100bb578063cfac57c714610717578063d0cc728914610741578063d3661fa514610756576102e7565b8063c72c4d101461072c578063cf786f8f14610545576102e7565b806398ab3d4911610138578063acbeba6111610112578063acbeba61146106ed578063bf42d94714610702578063c11645bc14610717576102e7565b806398ab3d49146106c35780639da779e91461031a578063a46a66c9146106d8576102e7565b80638da5cb5b116101695780638da5cb5b1461068457806394bfbe741461069957806394f0eb3d146106ae576102e7565b8063819854e71461065a578063825ffd921461066f576102e7565b806332ac5cd21161023d578063481c6a75116101f157806362da5d90116101cb57806362da5d90146106305780636738929f146104b85780637e8a776f14610645576102e7565b8063481c6a751461044957806350c86de5146105eb57806351a885c014610600576102e7565b8063380d424411610222578063380d4244146104495780633a1283221461055a5780634115fe6b14610593576102e7565b806332ac5cd21461053057806336569e7714610545576102e7565b806329f7fc9e1161029f5780632e77468d116102795780632e77468d146104b85780632f634a90146104cd57806331d98b3f14610506576102e7565b806329f7fc9e1461045e5780632a4c0a1a146104735780632e67720c14610488576102e7565b8063186cab76116102d0578063186cab761461032f578063197e0ffe146103565780631b2df85014610449576102e7565b8063040141e5146102e95780630bd4a73e1461031a575b005b3480156102f557600080fd5b506102fe6109a1565b604080516001600160a01b039092168252519081900360200190f35b34801561032657600080fd5b506102fe6109b9565b34801561033b57600080fd5b506103446109d1565b60408051918252519081900360200190f35b6102e7600480360361012081101561036d57600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156103d457600080fd5b8201836020820111156103e657600080fd5b8035906020019184600183028401116401000000008311171561040857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109f5945050505050565b34801561045557600080fd5b506102fe610ee3565b34801561046a57600080fd5b506102fe610efb565b34801561047f57600080fd5b506102fe610f13565b34801561049457600080fd5b50610344600480360360408110156104ab57600080fd5b5080359060200135610f2b565b3480156104c457600080fd5b506102fe611055565b3480156104d957600080fd5b506102fe600480360360408110156104f057600080fd5b506001600160a01b03813516906020013561106d565b34801561051257600080fd5b506103446004803603602081101561052957600080fd5b5035611171565b34801561053c57600080fd5b506102fe61134d565b34801561055157600080fd5b506102fe611360565b34801561056657600080fd5b506102e76004803603604081101561057d57600080fd5b506001600160a01b038135169060200135611378565b34801561059f57600080fd5b506105d2600480360360608110156105b657600080fd5b506001600160a01b0381351690602081013590604001356114f6565b6040805192835260208301919091528051918290030190f35b3480156105f757600080fd5b50610344611749565b34801561060c57600080fd5b506103446004803603604081101561062357600080fd5b508035906020013561174f565b34801561063c57600080fd5b506102fe6117b5565b34801561065157600080fd5b506103446117cd565b34801561066657600080fd5b506102fe6117f1565b34801561067b57600080fd5b506102fe611809565b34801561069057600080fd5b506102fe611821565b3480156106a557600080fd5b506102fe611830565b3480156106ba57600080fd5b506102fe611848565b3480156106cf57600080fd5b506102fe611860565b3480156106e457600080fd5b506102fe61186f565b3480156106f957600080fd5b506102fe611887565b34801561070e57600080fd5b506102fe61189f565b34801561072357600080fd5b506102fe6118b7565b34801561073857600080fd5b506102fe6118cf565b34801561074d57600080fd5b506102fe6118de565b34801561076257600080fd5b506102fe6118f6565b6102e7600480360361012081101561078257600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156107e957600080fd5b8201836020820111156107fb57600080fd5b8035906020019184600183028401116401000000008311171561081d57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061190e945050505050565b34801561086a57600080fd5b506108886004803603602081101561088157600080fd5b5035611c26565b604080519485526020850193909352838301919091526060830152519081900360800190f35b3480156108ba57600080fd5b50610344600480360360408110156108d157600080fd5b5080359060200135611ec0565b3480156108ea57600080fd5b506102e76004803603608081101561090157600080fd5b6001600160a01b03823516916020810135916040820135919081019060808101606082013564010000000081111561093857600080fd5b82018360208201111561094a57600080fd5b8035906020019184600183028401116401000000008311171561096c57600080fd5b509092509050611fba565b34801561098357600080fd5b506102fe6121b8565b34801561099857600080fd5b506102fe6121d0565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7389d24a6b4ccb1b6faa2625fe562bdd9a2326035981565b7f4554482d4100000000000000000000000000000000000000000000000000000081565b8351604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d6020811015610a9057600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018590529051919250600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b158015610b0357600080fd5b505afa158015610b17573d6000803e3d6000fd5b505050506040513d6020811015610b2d57600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b038316602482015281519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c9260448082019391829003018186803b158015610bab57600080fd5b505afa158015610bbf573d6000803e3d6000fd5b505050506040513d6040811015610bd557600080fd5b505190506000610c00735ef30b9986345249bc32d8928b7ee64de9435e398a835b602002015161106d565b90506000735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8b8360200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610c5957600080fd5b505afa158015610c6d573d6000803e3d6000fd5b505050506040513d6020811015610c8357600080fd5b50519050610c8f615cf8565b8a5160208c0151610ca2919084906121e8565b80825260808c0151610cc09190610cbb908290876126bf565b612941565b6020820152610ccd615d16565b506040805160808101825260208381015182528d830151908201526060808e01519282019290925260a08d015191810191909152610d2a81736b175474e89094c44da98b954eedeac495271d0f610d238e612951565b8d8d6129c0565b604083018190528c51610d3e918d90613283565b303115610d74576040513290303180156108fc02916000818181858888f19350505050158015610d72573d6000803e3d6000fd5b505b8b51825160408085015181517f6877100500000000000000000000000000000000000000000000000000000000815260048101949094526001600160a01b0388166024850152604484019290925260648301919091525173ecf88e1cec2d2894a0295db3d86fe7ce4991e6df91636877100591608480830192600092919082900301818387803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b5050604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018b90526001600160a01b038a1660248201528151600098507335d1b3f3d7966a1dfe207aa4514c12a259a0492b9750632424be5c9650604480830196509294509250829003018186803b158015610e9e57600080fd5b505afa158015610eb2573d6000803e3d6000fd5b505050506040513d6040811015610ec857600080fd5b50519050818111610ed857600080fd5b505050505050505050565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b736b175474e89094c44da98b954eedeac495271d0f81565b600080610f3783611171565b9050600080610f5b735ef30b9986345249bc32d8928b7ee64de9435e3987876114f6565b9150915060007365c79fcb50ca1594b025960e539ed7a9a6d434a36001600160a01b031663d9638d36876040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b158015610fb857600080fd5b505afa158015610fcc573d6000803e3d6000fd5b505050506040513d6040811015610fe257600080fd5b50602001519050600061100c61100585610cbb610fff86886136c9565b896136ed565b600a612941565b905060007f555344432d410000000000000000000000000000000000000000000000000000881461103d5781611046565b64e8d4a5100082045b96505050505050505b92915050565b7365c79fcb50ca1594b025960e539ed7a9a6d434a381565b600080836001600160a01b0316638161b120846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156110b457600080fd5b505afa1580156110c8573d6000803e3d6000fd5b505050506040513d60208110156110de57600080fd5b5051604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290519192506001600160a01b03831691638da5cb5b91600480820192602092909190829003018186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d602081101561116757600080fd5b5051949350505050565b6000807365c79fcb50ca1594b025960e539ed7a9a6d434a36001600160a01b031663d9638d36846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d60408110156111f557600080fd5b5060200151604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b15801561126b57600080fd5b505afa15801561127f573d6000803e3d6000fd5b505050506040513d60a081101561129557600080fd5b5060409081015181517f495d32cb00000000000000000000000000000000000000000000000000000000815291519092506113439161133d9184917365c79fcb50ca1594b025960e539ed7a9a6d434a39163495d32cb91600480820192602092909190829003018186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b5051613700565b83613700565b925050505b919050565b6eb3f879cb30fe243b4dfee438691c0481565b7335d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b6002546001600160a01b031633146113f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4f6e6c79206f776e657200000000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611456576002546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611450573d6000803e3d6000fd5b506114f2565b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526024810184905290519184169163a9059cbb916044808201926020929091908290030181600087803b1580156114c557600080fd5b505af11580156114d9573d6000803e3d6000fd5b505050506040513d60208110156114ef57600080fd5b50505b5050565b6000806000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561153457600080fd5b505afa158015611548573d6000803e3d6000fd5b505050506040513d602081101561155e57600080fd5b5051604080517f2726b0730000000000000000000000000000000000000000000000000000000081526004810188905290519192506000916001600160a01b03891691632726b073916024808301926020929190829003018186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0380841660248301528251939450600093849391871692632424be5c926044808301939192829003018186803b15801561166057600080fd5b505afa158015611674573d6000803e3d6000fd5b505050506040513d604081101561168a57600080fd5b508051602090910151604080517fd9638d36000000000000000000000000000000000000000000000000000000008152600481018b905290519294509092506000916001600160a01b0387169163d9638d369160248083019260a0929190829003018186803b1580156116fc57600080fd5b505afa158015611710573d6000803e3d6000fd5b505050506040513d60a081101561172657600080fd5b50602001519050826117388383613700565b965096505050505050935093915050565b61019081565b60008061175b83611171565b905060008061177f735ef30b9986345249bc32d8928b7ee64de9435e3987876114f6565b915091508060001415611798576000935050505061104f565b6117ab6117a58385613739565b82613761565b9695505050505050565b73e4b22d484958e582098a98229a24e8a43801b67481565b7f555344432d41000000000000000000000000000000000000000000000000000081565b7382ecd135dce65fbc6dbdd0e4237e0af93ffd503881565b739f8f72aa9304c8b593d555f12ef6589cc3a579a281565b6002546001600160a01b031681565b73ecf88e1cec2d2894a0295db3d86fe7ce4991e6df81565b73862f3dcf1104b8a9468fbb8b843c37c31b41ef0981565b6001546001600160a01b031681565b731b14e8d511c9a4395425314f849bd737baf8208f81565b7319c0976f590d67707e62397c87829d896dc0f1f181565b736c1e2b0f67e00c06c8e2be7dc681ab785163ff4d81565b739759a6ac90977b93b58547b4a71c78317f391a2881565b6000546001600160a01b031681565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b8351604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b15801561197f57600080fd5b505afa158015611993573d6000803e3d6000fd5b505050506040513d60208110156119a957600080fd5b5051905060006119b9838361174f565b905060006119dc735ef30b9986345249bc32d8928b7ee64de9435e398983610bf6565b90506000735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8a8360200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b50519050611a6b615cf8565b895160208b0151611a80919084908c90613785565b8152611a8a615d16565b5060408051608081018252825181528b82015160208201526060808d01519282019290925260a08c015191810191909152611ae481611ac88c612951565b736b175474e89094c44da98b954eedeac495271d0f8c8c6129c0565b6020830181905260808c0151611b019190610cbb908290886126bf565b604083018190528b51611b1691859087613a8e565b303115611b4c576040513290303180156108fc02916000818181858888f19350505050158015611b4a573d6000803e3d6000fd5b505b8a5182516020840151604080517f406bb32a00000000000000000000000000000000000000000000000000000000815260048101949094526001600160a01b0388166024850152604484019290925260648301525173ecf88e1cec2d2894a0295db3d86fe7ce4991e6df9163406bb32a91608480830192600092919082900301818387803b158015611bdd57600080fd5b505af1158015611bf1573d6000803e3d6000fd5b50505050505050506000611c05848461174f565b905081811180611c13575080155b611c1c57600080fd5b5050505050505050565b6000806000806000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c8657600080fd5b505afa158015611c9a573d6000803e3d6000fd5b505050506040513d6020811015611cb057600080fd5b5051604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018990529051919250735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015611d2157600080fd5b505afa158015611d35573d6000803e3d6000fd5b505050506040513d6020811015611d4b57600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b038416602482015281519294507335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c92604480840193919291829003018186803b158015611dc857600080fd5b505afa158015611ddc573d6000803e3d6000fd5b505050506040513d6040811015611df257600080fd5b508051602090910151604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519297509095506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163d9638d369160248083019260a0929190829003018186803b158015611e6f57600080fd5b505afa158015611e83573d6000803e3d6000fd5b505050506040513d60a0811015611e9957600080fd5b50602001519050611eaa8582613700565b9450611eb583611171565b935050509193509193565b600080611ecc83611171565b604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905281519293506000927365c79fcb50ca1594b025960e539ed7a9a6d434a39263d9638d369260248082019391829003018186803b158015611f3957600080fd5b505afa158015611f4d573d6000803e3d6000fd5b505050506040513d6040811015611f6357600080fd5b50602001519050600080611f8c735ef30b9986345249bc32d8928b7ee64de9435e3988886114f6565b91509150611faf611005611fa9611fa385886136c9565b866136ed565b83612941565b979650505050505050565b611fc43086613e28565b84111561203257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f496e76616c69642062616c616e636520666f722074686520636f6e7472616374604482015290519081900360640190fd5b61203a615d34565b60008060606000868661014081101561205257600080fd5b810190808060c00190600680602002604051908101604052809291908260066020028082843760009201919091525091946001600160a01b03843581169560208601359091169491935091506060810190604001356401000000008111156120b957600080fd5b8201836020820111156120cb57600080fd5b803590602001918460018302840111640100000000831117156120ed57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250989d50969b509499509750351580159650945061214f93505050505761214a858a8686868d613ee5565b61215d565b61215d858a8686868d614551565b6121768a6121718b8b63ffffffff614c7816565b614cec565b3031156121ac576040513290303180156108fc02916000818181858888f193505050501580156121aa573d6000803e3d6000fd5b505b50505050505050505050565b732f0b23f53734252bda2277357e97e1517d6b042a81565b73c73e0383f3aff3215e6f04b0331d58cecf0ab84981565b6000807319c0976f590d67707e62397c87829d896dc0f1f16001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b505050506040513d602081101561226f57600080fd5b5051604080517f2726b0730000000000000000000000000000000000000000000000000000000081526004810188905290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b34691735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b1580156122fe57600080fd5b505afa158015612312573d6000803e3d6000fd5b505050506040513d602081101561232857600080fd5b50516040805163ffffffff841660e01b81526001600160a01b039092166004830152516024808301926020929190829003018186803b15801561236a57600080fd5b505afa15801561237e573d6000803e3d6000fd5b505050506040513d602081101561239457600080fd5b5051905060006123a48787611ec0565b90508085106123bb576123b8816001612941565b94505b735ef30b9986345249bc32d8928b7ee64de9435e396345e6bdcd8860006123e3898888614d79565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561242757600080fd5b505af115801561243b573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b031663f9f30db6883061246d89614dff565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156124c357600080fd5b505af11580156124d7573d6000803e3d6000fd5b5050604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152306004820152739759a6ac90977b93b58547b4a71c78317f391a28602482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9350634538c4eb92506044808301926020929190829003018186803b15801561255f57600080fd5b505afa158015612573573d6000803e3d6000fd5b505050506040513d602081101561258957600080fd5b505161262757604080517fa3b22fc4000000000000000000000000000000000000000000000000000000008152739759a6ac90977b93b58547b4a71c78317f391a28600482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163a3b22fc491602480830192600092919082900301818387803b15801561260e57600080fd5b505af1158015612622573d6000803e3d6000fd5b505050505b604080517fef693bed000000000000000000000000000000000000000000000000000000008152306004820152602481018790529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b15801561269957600080fd5b505af11580156126ad573d6000803e3d6000fd5b505050508493505050505b9392505050565b604080517fb371deac0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152905160009161019091731b14e8d511c9a4395425314f849bd737baf8208f9163b371deac916024808301926020929190829003018186803b15801561273957600080fd5b505afa15801561274d573d6000803e3d6000fd5b505050506040513d602081101561276357600080fd5b50511561280c57604080517f6eeb54310000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201529051731b14e8d511c9a4395425314f849bd737baf8208f91636eeb5431916024808301926020929190829003018186803b1580156127dd57600080fd5b505afa1580156127f1573d6000803e3d6000fd5b505050506040513d602081101561280757600080fd5b505190505b80156128215780858161281b57fe5b04612824565b60005b915083156128735760006128577f4554482d41000000000000000000000000000000000000000000000000000000611171565b90506128638582613700565b945061286f8386614e17565b9250505b60058504821115612885576005850491505b604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273322d58b9e75a6918f7e7849aee0ff09369977e086004820152602481018490529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561290c57600080fd5b505af1158015612920573d6000803e3d6000fd5b505050506040513d602081101561293657600080fd5b509195945050505050565b8082038281111561104f57600080fd5b6000816001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561298e57600080fd5b505af11580156129a2573d6000803e3d6000fd5b505050506040513d60208110156129b857600080fd5b505192915050565b60008060006129cd615d52565b8851602082015260006129df89614e27565b98506129ea88614e27565b97506129f4615cf8565b50604080516060810182526001600160a01b0389811682528b811660208301528a1681830152908b015160041415612b8d5760208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14612afb576020808201518c51604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527395e6f48254609a6ee006f7d493c8e5fb97094cef60048201526024810192909252516001600160a01b039092169263095ea7b3926044808401938290030181600087803b158015612ace57600080fd5b505af1158015612ae2573d6000803e3d6000fd5b505050506040513d6020811015612af857600080fd5b50505b612b10818830318e60005b6020020151614e6e565b5084529150818015612b225750825115155b612b8d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f3078207472616e73616374696f6e206661696c65640000000000000000000000604482015290519081900360640190fd5b8251613274578a516020820151604080840151818f015182517f2ec1f00900000000000000000000000000000000000000000000000000000000815260048101959095526001600160a01b039384166024860152921660448401526064830191909152805173862f3dcf1104b8a9468fbb8b843c37c31b41ef0992632ec1f009926084808301939192829003018186803b158015612c2a57600080fd5b505afa158015612c3e573d6000803e3d6000fd5b505050506040513d6040811015612c5457600080fd5b508051602091820151918d0151909650909450841180612c7b575060208b015160608c0151115b612ce657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f536c697070616765206869740000000000000000000000000000000000000000604482015290519081900360640190fd5b60608b01518411612ddf5760208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14612dc6576020808201518c51604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527395e6f48254609a6ee006f7d493c8e5fb97094cef60048201526024810192909252516001600160a01b039092169263095ea7b3926044808401938290030181600087803b158015612d9957600080fd5b505af1158015612dad573d6000803e3d6000fd5b505050506040513d6020811015612dc357600080fd5b50505b612dd5818830318e6000612b06565b6020860152845291505b602083015115613274578a51602084015114612ec857602080840151908201516040808401518e82015182517f2ec1f00900000000000000000000000000000000000000000000000000000000815260048101959095526001600160a01b039384166024860152921660448401526064830191909152805173862f3dcf1104b8a9468fbb8b843c37c31b41ef0992632ec1f009926084808301939192829003018186803b158015612e8f57600080fd5b505afa158015612ea3573d6000803e3d6000fd5b505050506040513d6040811015612eb957600080fd5b50805160209091015190955093505b60208b01518411612f3a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536c69707061676520686974206f6e636861696e207072696365000000000000604482015290519081900360640190fd5b60208101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561303457602083015160408083015181517f43ac1dc6000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0391821660248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448201528251600094928a16936343ac1dc693926064808201939182900301818588803b158015612ffc57600080fd5b505af1158015613010573d6000803e3d6000fd5b50505050506040513d604081101561302757600080fd5b5051845101845250613274565b60208082015184820151604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015260248201939093529051919092169263a9059cbb92604480820193918290030181600087803b1580156130a757600080fd5b505af11580156130bb573d6000803e3d6000fd5b505050506040513d60208110156130d157600080fd5b505060408101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131c85760208082015184820151604080517f3bba21dc0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015260248101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60448301525191881692633bba21dc926064808401938290030181600087803b15801561319257600080fd5b505af11580156131a6573d6000803e3d6000fd5b505050506040513d60208110156131bc57600080fd5b50518351018352613274565b6020808201516040808401518684015182517f13712c9f0000000000000000000000000000000000000000000000000000000081526001600160a01b039485166004820152918416602483015260448201529051918816926313712c9f926064808401938290030181600087803b15801561324257600080fd5b505af1158015613256573d6000803e3d6000fd5b505050506040513d602081101561326c57600080fd5b505183510183525b50505198975050505050505050565b60006001600160a01b038316732f0b23f53734252bda2277357e97e1517d6b042a141561339757826001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156132e557600080fd5b505af11580156132f9573d6000803e3d6000fd5b505050506040513d602081101561330f57600080fd5b5051604080517fd0e30db000000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163d0e30db0918591600480830192600092919082900301818588803b15801561336e57600080fd5b505af1158015613382573d6000803e3d6000fd5b5050505050613390826151d0565b90506133ac565b6133a96133a48484615241565b6151d0565b90505b826001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156133e757600080fd5b505af11580156133fb573d6000803e3d6000fd5b505050506040513d602081101561341157600080fd5b5051604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018690529151919092169163095ea7b391604480830192600092919082900301818387803b15801561347e57600080fd5b505af1158015613492573d6000803e3d6000fd5b5050604080517f3b4da69f0000000000000000000000000000000000000000000000000000000081523060048201526024810186905290516001600160a01b0387169350633b4da69f9250604480830192600092919082900301818387803b1580156134fd57600080fd5b505af1158015613511573d6000803e3d6000fd5b505050507335d1b3f3d7966a1dfe207aa4514c12a259a0492b6001600160a01b03166376088703735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632c2cb9fd876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561359057600080fd5b505afa1580156135a4573d6000803e3d6000fd5b505050506040513d60208110156135ba57600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018990529051735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b15801561362757600080fd5b505afa15801561363b573d6000803e3d6000fd5b505050506040513d602081101561365157600080fd5b50516040805163ffffffff851660e01b815260048101939093526001600160a01b0390911660248301523060448301819052606483015260848201859052600060a48301819052905160c48084019382900301818387803b1580156136b557600080fd5b505af1158015611c1c573d6000803e3d6000fd5b60008115806136e4575050808202828282816136e157fe5b04145b61104f57600080fd5b60008183816136f857fe5b049392505050565b60006b033b2e3c9fd0803ce800000061373261371c85856136c9565b60026b033b2e3c9fd0803ce80000005b04614e17565b816136f857fe5b6000670de0b6b3a764000061373261375185856136c9565b6002670de0b6b3a764000061372c565b60008161373261377d856b033b2e3c9fd0803ce80000006136c9565b60028561372c565b6000806137928686610f2b565b90508083106137a9576137a6816001612941565b92505b60007f555344432d41000000000000000000000000000000000000000000000000000086146137d857836137e1565b8364e8d4a51000025b9050735ef30b9986345249bc32d8928b7ee64de9435e396345e6bdcd88613807846151d0565b60000360006040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561385057600080fd5b505af1158015613864573d6000803e3d6000fd5b5050604080517f9bb8f838000000000000000000000000000000000000000000000000000000008152600481018b9052306024820152604481018590529051735ef30b9986345249bc32d8928b7ee64de9435e399350639bb8f8389250606480830192600092919082900301818387803b1580156138e157600080fd5b505af11580156138f5573d6000803e3d6000fd5b5050604080517fef693bed0000000000000000000000000000000000000000000000000000000081523060048201526024810188905290516001600160a01b038916935063ef693bed9250604480830192600092919082900301818387803b15801561396057600080fd5b505af1158015613974573d6000803e3d6000fd5b505050506001600160a01b038516732f0b23f53734252bda2277357e97e1517d6b042a1415613a8057846001600160a01b0316637bd2bea76040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156139d857600080fd5b505af11580156139ec573d6000803e3d6000fd5b505050506040513d6020811015613a0257600080fd5b5051604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810187905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015613a6757600080fd5b505af1158015613a7b573d6000803e3d6000fd5b505050505b83925050505b949350505050565b6000735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae857600080fd5b505afa158015613afc573d6000803e3d6000fd5b505050506040513d6020811015613b1257600080fd5b505190506000613b387335d1b3f3d7966a1dfe207aa4514c12a259a0492b8380886152b9565b905080841115613be857736b175474e89094c44da98b954eedeac495271d0f63a9059cbb84613b678785612941565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613bb657600080fd5b505af1158015613bca573d6000803e3d6000fd5b505050506040513d6020811015613be057600080fd5b509093508390505b739759a6ac90977b93b58547b4a71c78317f391a286001600160a01b031663f4b9fa756040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613c3757600080fd5b505af1158015613c4b573d6000803e3d6000fd5b505050506040513d6020811015613c6157600080fd5b5051604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152739759a6ac90977b93b58547b4a71c78317f391a2860048201526024810187905290516001600160a01b039092169163095ea7b39160448082019260009290919082900301818387803b158015613ce057600080fd5b505af1158015613cf4573d6000803e3d6000fd5b5050604080517f3b4da69f0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602481018890529051739759a6ac90977b93b58547b4a71c78317f391a289350633b4da69f9250604480830192600092919082900301818387803b158015613d7357600080fd5b505af1158015613d87573d6000803e3d6000fd5b50505050735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b03166345e6bdcd876000613dd07335d1b3f3d7966a1dfe207aa4514c12a259a0492b878b6154b5565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015613e1457600080fd5b505af11580156121ac573d6000803e3d6000fd5b6000613e3261569f565b6001600160a01b0316826001600160a01b03161415613e5c57506001600160a01b0382163161104f565b816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613eb257600080fd5b505afa158015613ec6573d6000803e3d6000fd5b505050506040513d6020811015613edc57600080fd5b50519392505050565b8551604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015613f5657600080fd5b505afa158015613f6a573d6000803e3d6000fd5b505050506040513d6020811015613f8057600080fd5b505190506000613f90838361174f565b60408051600480825260a0820190925291925060609190602082016080803883390190505090506000613fd8735ef30b9986345249bc32d8928b7ee64de9435e398c83610bf6565b8b51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905192935061407d92735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561404c57600080fd5b505afa158015614060573d6000803e3d6000fd5b505050506040513d602081101561407657600080fd5b5051610f2b565b8260008151811061408a57fe5b6020908102919091018101919091528b51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905161414e93735ef30b9986345249bc32d8928b7ee64de9435e3992632c2cb9fd9260248083019392829003018186803b15801561410657600080fd5b505afa15801561411a573d6000803e3d6000fd5b505050506040513d602081101561413057600080fd5b505184518c90869060009061414157fe5b6020026020010151613785565b8260018151811061415b57fe5b6020026020010181815250506141f860405180608001604052808c8560018151811061418357fe5b60200260200101510181526020018d60026006811061419e57fe5b602002015181526020018d6003600681106141b557fe5b602002015181526020018d6005600681106141cc57fe5b602002015190526141dc8b612951565b736b175474e89094c44da98b954eedeac495271d0f8b8b6129c0565b8260028151811061420557fe5b6020026020010181815250506142318260028151811061422157fe5b60200260200101516000836126bf565b8260038151811061423e57fe5b60200260200101818152505060008260038151811061425957fe5b60200260200101518360028151811061426e57fe5b60200260200101510390506143178c60006006811061428957fe5b6020020151735ef30b9986345249bc32d8928b7ee64de9435e39632c2cb9fd8f600060200201516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156142e457600080fd5b505afa1580156142f8573d6000803e3d6000fd5b505050506040513d602081101561430e57600080fd5b505183856156b7565b8c51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290519293506143be92735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b15801561438b57600080fd5b505afa15801561439f573d6000803e3d6000fd5b505050506040513d60208110156143b557600080fd5b50518385613a8e565b8b51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290516144669291735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b15801561443157600080fd5b505afa158015614445573d6000803e3d6000fd5b505050506040513d602081101561445b57600080fd5b50518c8e8b01613785565b5073ecf88e1cec2d2894a0295db3d86fe7ce4991e6df63406bb32a8d60006020020151848e8760018151811061449857fe5b602002602001015101876002815181106144ae57fe5b60200260200101516040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050600060405180830381600087803b15801561451357600080fd5b505af1158015614527573d6000803e3d6000fd5b50505050505050600061453a848461174f565b905081811180614548575080155b6121ac57600080fd5b8551604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051600091735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b1580156145c257600080fd5b505afa1580156145d6573d6000803e3d6000fd5b505050506040513d60208110156145ec57600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018590529051919250600091735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b15801561465f57600080fd5b505afa158015614673573d6000803e3d6000fd5b505050506040513d602081101561468957600080fd5b5051604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b038316602482015281519293506000927335d1b3f3d7966a1dfe207aa4514c12a259a0492b92632424be5c9260448082019391829003018186803b15801561470757600080fd5b505afa15801561471b573d6000803e3d6000fd5b505050506040513d604081101561473157600080fd5b505160408051600580825260c08201909252919250606091906020820160a080388339019050509050600061477b735ef30b9986345249bc32d8928b7ee64de9435e398d83610bf6565b8c51604080517f2c2cb9fd00000000000000000000000000000000000000000000000000000000815260048101839052905192935061482092735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd916024808301926020929190829003018186803b1580156147ef57600080fd5b505afa158015614803573d6000803e3d6000fd5b505050506040513d602081101561481957600080fd5b5051611ec0565b8260008151811061482d57fe5b6020908102919091018101919091528c51604080517f2c2cb9fd0000000000000000000000000000000000000000000000000000000081526004810183905290516148ef93735ef30b9986345249bc32d8928b7ee64de9435e3992632c2cb9fd9260248083019392829003018186803b1580156148a957600080fd5b505afa1580156148bd573d6000803e3d6000fd5b505050506040513d60208110156148d357600080fd5b5051845185906000906148e257fe5b60200260200101516121e8565b826001815181106148fc57fe5b60200260200101818152505061492a8b8360018151811061491957fe5b6020026020010151016000836126bf565b8260028151811061493757fe5b6020026020010181815250508160028151811061495057fe5b60200260200101518b8360018151811061496657fe5b602002602001015101038260038151811061497d57fe5b602002602001018181525050614a186040518060800160405280846003815181106149a457fe5b602002602001015181526020018e6002600681106149be57fe5b602002015181526020018e6003600681106149d557fe5b602002015181526020018e6005600681106149ec57fe5b60200201519052736b175474e89094c44da98b954eedeac495271d0f614a118d612951565b8c8c6129c0565b82600481518110614a2557fe5b6020908102919091010152614a568c600060200201518b84600481518110614a4957fe5b6020026020010151613283565b8b51604080517f2c2cb9fd000000000000000000000000000000000000000000000000000000008152600481018390529051614afd9291735ef30b9986345249bc32d8928b7ee64de9435e3991632c2cb9fd91602480820192602092909190829003018186803b158015614ac957600080fd5b505afa158015614add573d6000803e3d6000fd5b505050506040513d6020811015614af357600080fd5b50518d8a016121e8565b5073ecf88e1cec2d2894a0295db3d86fe7ce4991e6df63687710058d60006020020151838e86600181518110614b2f57fe5b60200260200101510186600481518110614b4557fe5b60200260200101516040518563ffffffff1660e01b815260040180858152602001846001600160a01b03166001600160a01b03168152602001838152602001828152602001945050505050600060405180830381600087803b158015614baa57600080fd5b505af1158015614bbe573d6000803e3d6000fd5b5050604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018990526001600160a01b03881660248201528151600096507335d1b3f3d7966a1dfe207aa4514c12a259a0492b9550632424be5c9450604480830194509091829003018186803b158015614c3e57600080fd5b505afa158015614c52573d6000803e3d6000fd5b505050506040513d6040811015614c6857600080fd5b505190508181116121aa57600080fd5b6000828201838110156126b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060009054906101000a90046001600160a01b03166001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015614d3b57600080fd5b505afa158015614d4f573d6000803e3d6000fd5b505050506040513d6020811015614d6557600080fd5b50519050614d7481848461598f565b505050565b6000614d91846b033b2e3c9fd0803ce80000006136c9565b8210156126b857614dc883614dbb614db5876b033b2e3c9fd0803ce80000006136c9565b85612941565b81614dc257fe5b046151d0565b9050614de0846b033b2e3c9fd0803ce80000006136c9565b614dea82856136c9565b10614df55780613a86565b6001019392505050565b600061104f826b033b2e3c9fd0803ce80000006136c9565b8082018281101561104f57600080fd5b60006001600160a01b03821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214614e53578161104f565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee919050565b6000808080878160200201516001600160a01b031686886040518082805190602001908083835b60208310614ed257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614e95565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614f34576040519150601f19603f3d011682016040523d82523d6000602084013e614f39565b606091505b50909150859050600082156151c15760208a01516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415614f7a573031915061500a565b6020808b0151604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015614fdb57600080fd5b505afa158015614fef573d6000803e3d6000fd5b505050506040513d602081101561500557600080fd5b505191505b60408a01516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561512e57604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291632e1a7d4d9183916370a082319160248083019260209291908290030181600087803b1580156150a757600080fd5b505af11580156150bb573d6000803e3d6000fd5b505050506040513d60208110156150d157600080fd5b50516040805163ffffffff841660e01b8152600481019290925251602480830192600092919082900301818387803b15801561510c57600080fd5b505af1158015615120573d6000803e3d6000fd5b5050303192506151c1915050565b6040808b015181517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291516001600160a01b03909116916370a08231916024808301926020929190829003018186803b15801561519257600080fd5b505afa1580156151a6573d6000803e3d6000fd5b505050506040513d60208110156151bc57600080fd5b505190505b91999198509650945050505050565b80600081121561134857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f696e742d6f766572666c6f770000000000000000000000000000000000000000604482015290519081900360640190fd5b60006126b882846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561528257600080fd5b505af1158015615296573d6000803e3d6000fd5b505050506040513d60208110156152ac57600080fd5b5051601203600a0a6136c9565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561530057600080fd5b505afa158015615314573d6000803e3d6000fd5b505050506040513d60a081101561532a57600080fd5b5060200151604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b15801561539a57600080fd5b505afa1580156153ae573d6000803e3d6000fd5b505050506040513d60408110156153c457600080fd5b50602090810151604080517f6c25b3460000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529151929450600093918b1692636c25b34692602480840193919291829003018186803b15801561543157600080fd5b505afa158015615445573d6000803e3d6000fd5b505050506040513d602081101561545b57600080fd5b50519050600061546e611fa984866136c9565b90506b033b2e3c9fd0803ce80000008104945080615498866b033b2e3c9fd0803ce80000006136c9565b106154a357846154a8565b846001015b9998505050505050505050565b600080846001600160a01b0316636c25b346856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561550e57600080fd5b505afa158015615522573d6000803e3d6000fd5b505050506040513d602081101561553857600080fd5b5051604080517fd9638d360000000000000000000000000000000000000000000000000000000081526004810186905290519192506000916001600160a01b0388169163d9638d369160248083019260a0929190829003018186803b1580156155a057600080fd5b505afa1580156155b4573d6000803e3d6000fd5b505050506040513d60a08110156155ca57600080fd5b5060200151604080517f2424be5c000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0388811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b15801561563a57600080fd5b505afa15801561564e573d6000803e3d6000fd5b505050506040513d604081101561566457600080fd5b50602001519050615677828481614dc257fe5b9350808411156156925761568a816151d0565b600003611faf565b5050506000039392505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b6000806157f37335d1b3f3d7966a1dfe207aa4514c12a259a0492b735ef30b9986345249bc32d8928b7ee64de9435e396001600160a01b0316632726b073896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561572a57600080fd5b505afa15801561573e573d6000803e3d6000fd5b505050506040513d602081101561575457600080fd5b5051604080517f2726b073000000000000000000000000000000000000000000000000000000008152600481018b90529051735ef30b9986345249bc32d8928b7ee64de9435e3991632726b073916024808301926020929190829003018186803b1580156157c157600080fd5b505afa1580156157d5573d6000803e3d6000fd5b505050506040513d60208110156157eb57600080fd5b5051886152b9565b9050808411156158af57604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015282860360248201529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561587a57600080fd5b505af115801561588e573d6000803e3d6000fd5b505050506040513d60208110156158a457600080fd5b50909150613a869050565b8381036801158e460913d0000081101561598457604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526801158e460913d00000839003602482018190529151736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561594c57600080fd5b505af1158015615960573d6000803e3d6000fd5b505050506040513d602081101561597657600080fd5b505085039250613a86915050565b509295945050505050565b61599761569f565b6001600160a01b0316826001600160a01b03161415615a06576040516001600160a01b038416908290600081818185875af1925050503d80600081146159f9576040519150601f19603f3d011682016040523d82523d6000602084013e6159fe565b606091505b505050614d74565b614d746001600160a01b038316848363ffffffff615a2016565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052614d74908490615aad826001600160a01b0316615cbf565b615b1857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615b7457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101615b37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615bd6576040519150601f19603f3d011682016040523d82523d6000602084013e615bdb565b606091505b509150915081615c4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156114ef57808060200190516020811015615c6857600080fd5b50516114ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d71602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611343575050151592915050565b60405180606001604052806003906020820280388339509192915050565b60405180608001604052806004906020820280388339509192915050565b6040518060c001604052806006906020820280388339509192915050565b6040518060400160405280600290602082028038833950919291505056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a165627a7a72305820d32ab7212aed2f18088ed58bc89562a0438ff554653e4730ce7217e0ef1e46a80029
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
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.