Contract 0x8992eea8B6D388af1Df04800E69e66b2d8799895

 
Ad
Ad
Txn Hash Method
Block
From
To
Value
0xffc42be799aa20c663651484b4d65692575cd981e12fc48da91a1421abab940bFlash Exercise111999822020-11-05 22:37:35228 days 22 hrs ago0xc3d37f3e2c28672b4669ebedf7e7012eb2782ea4 IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.006460672321.1
0x7eab5f4b0eced80f9b98babfb7e5cb3b88e6a2d78c80b8ead502e78c6f80e6b4Flash Exercise111993032020-11-05 20:11:40229 days 1 hr ago0xf940ce19b9cd0b9efd586381b488cefb75eb413f IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.00769043121
0xa83620726b6cc44919ff012f1f1141837581f26c0c463156eccab2f7c6605ab9Flash Exercise111559992020-10-30 4:28:39235 days 16 hrs ago0xf940ce19b9cd0b9efd586381b488cefb75eb413f IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.02131858550961.000001459
0x1137fac1f4f7bcde33e99af030b60b38370e17bca82ad5880f9843f06324650aFlash Exercise111559882020-10-30 4:25:06235 days 16 hrs ago0xf940ce19b9cd0b9efd586381b488cefb75eb413f IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.02058560949261.000001459
0x2c91c0d9924b4c2412bc12ed89be5b8470841f7987427d27ea9fd139e67d77a8Flash Exercise111063142020-10-22 13:37:18243 days 7 hrs agoENS Name gnartham.eth IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.01591489343853.000001459
0x1bc75327fbff4b433910b80d1bc6dda26532761671501136ceeb21b12877cd27Flash Exercise110100912020-10-07 18:08:12258 days 3 hrs ago0x24ee78f038525eccae186bc3bcf5d2badd850bd9 IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.031166976103
0x767ffcee5c81bdcac78217d9bcb783dc6472fbec329edaa7cc99493e04984b20Flash Exercise109089032020-09-21 23:50:21273 days 21 hrs ago0x24ee78f038525eccae186bc3bcf5d2badd850bd9 IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.02654528888
0x91b2c59482e760d44f5f6b0e8334b1657c6cb1c7b725fca80079648cc0164704Flash Exercise108822162020-09-17 21:43:36277 days 23 hrs agoENS Name gnartham.eth IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.109280400398400.000001459
0x543ef1a6a248511c7bf16df8f143e628a9e3142b2fe4880417931a09a6b57682Flash Exercise108814532020-09-17 18:48:16278 days 2 hrs ago0x07356b0edf9b934330f41952b09d076c3810c608 IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.15528302948460.211042953
0x03af250ab6afbdc9ea11ae6f8126f2c4ef6459e103ebf07806291e56d7b1e0b2Flash Exercise107451102020-08-27 21:42:20298 days 23 hrs ago0xb5e736993c725fa1eee65e333dabe9fcc0221e36 IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.01417800349
0x32718001860559db757f21d05932f80af02c53bc5e5bdc224c2216bf2761f16fFlash Exercise107450772020-08-27 21:36:22298 days 23 hrs ago0x665ddd5ce3a16e96ae10f0d842d4ba4b55175585 IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.01401250551
0x290b3b0e9e2d83dc4c98f0a7fcee0be7dc3324193cd2c4b60e388090c5cbbe3fFlash Exercise106829602020-08-18 8:44:22308 days 12 hrs agoENS Name hotwater.eth IN  0x8992eea8b6d388af1df04800e69e66b2d87998950 Ether0.041959000489125.000001459
0xf26b3d219d44015415ff36c2eb376ea9863b803c6b75ed1552e3e4a87edb09430x61012060106018582020-08-05 20:16:53321 days 1 hr agoACO Factory: Deployer IN  Contract Creation0 Ether0.05850064836
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xffc42be799aa20c663651484b4d65692575cd981e12fc48da91a1421abab940b111999822020-11-05 22:37:35228 days 22 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895 Wrapped Ether9.89220345656508306 Ether
0xffc42be799aa20c663651484b4d65692575cd981e12fc48da91a1421abab940b111999822020-11-05 22:37:35228 days 22 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d87998950xc3d37f3e2c28672b4669ebedf7e7012eb2782ea40.10779654343491694 Ether
0xffc42be799aa20c663651484b4d65692575cd981e12fc48da91a1421abab940b111999822020-11-05 22:37:35228 days 22 hrs ago 0x7ec47478c30394ea98d030c1abbf50c1ed41c4c7 0x8992eea8b6d388af1df04800e69e66b2d879989510 Ether
0x7eab5f4b0eced80f9b98babfb7e5cb3b88e6a2d78c80b8ead502e78c6f80e6b4111993032020-11-05 20:11:40229 days 1 hr ago 0x8992eea8b6d388af1df04800e69e66b2d8799895 Wrapped Ether34.024122060141218933 Ether
0x7eab5f4b0eced80f9b98babfb7e5cb3b88e6a2d78c80b8ead502e78c6f80e6b4111993032020-11-05 20:11:40229 days 1 hr ago 0x8992eea8b6d388af1df04800e69e66b2d87998950xf940ce19b9cd0b9efd586381b488cefb75eb413f0.975877939858781067 Ether
0x7eab5f4b0eced80f9b98babfb7e5cb3b88e6a2d78c80b8ead502e78c6f80e6b4111993032020-11-05 20:11:40229 days 1 hr ago 0x5c1d9f5e72f0fc5229d64c2956c74b4efe5bbcf6 0x8992eea8b6d388af1df04800e69e66b2d879989535 Ether
0xa83620726b6cc44919ff012f1f1141837581f26c0c463156eccab2f7c6605ab9111559992020-10-30 4:28:39235 days 16 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895 Wrapped Ether18.747761748832584518 Ether
0xa83620726b6cc44919ff012f1f1141837581f26c0c463156eccab2f7c6605ab9111559992020-10-30 4:28:39235 days 16 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d87998950xf940ce19b9cd0b9efd586381b488cefb75eb413f1.252238251167415482 Ether
0xa83620726b6cc44919ff012f1f1141837581f26c0c463156eccab2f7c6605ab9111559992020-10-30 4:28:39235 days 16 hrs ago 0xc725f35dc572c01ba9193d5c8534b712d6982a82 0x8992eea8b6d388af1df04800e69e66b2d879989520 Ether
0x1137fac1f4f7bcde33e99af030b60b38370e17bca82ad5880f9843f06324650a111559882020-10-30 4:25:06235 days 16 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895 Wrapped Ether29.683152528047434799 Ether
0x1137fac1f4f7bcde33e99af030b60b38370e17bca82ad5880f9843f06324650a111559882020-10-30 4:25:06235 days 16 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d87998950xf940ce19b9cd0b9efd586381b488cefb75eb413f0.316847471952565201 Ether
0x1137fac1f4f7bcde33e99af030b60b38370e17bca82ad5880f9843f06324650a111559882020-10-30 4:25:06235 days 16 hrs ago 0x2bd8c10ed052e6d297a4c341d6c833be11c81944 0x8992eea8b6d388af1df04800e69e66b2d879989530 Ether
0x2c91c0d9924b4c2412bc12ed89be5b8470841f7987427d27ea9fd139e67d77a8111063142020-10-22 13:37:18243 days 7 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895 Wrapped Ether16.076187944201301571 Ether
0x2c91c0d9924b4c2412bc12ed89be5b8470841f7987427d27ea9fd139e67d77a8111063142020-10-22 13:37:18243 days 7 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895ENS Name gnartham.eth0.923812055798698429 Ether
0x2c91c0d9924b4c2412bc12ed89be5b8470841f7987427d27ea9fd139e67d77a8111063142020-10-22 13:37:18243 days 7 hrs ago 0xb10677e2b51ac6684d9e1da60354a10193ffce12 0x8992eea8b6d388af1df04800e69e66b2d879989517 Ether
0x1bc75327fbff4b433910b80d1bc6dda26532761671501136ceeb21b12877cd27110100912020-10-07 18:08:12258 days 3 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895 0xa2ce7b696632615344e003bc111ba1744844a99f11.24000000000000013 Ether
0x1bc75327fbff4b433910b80d1bc6dda26532761671501136ceeb21b12877cd27110100912020-10-07 18:08:12258 days 3 hrs ago Wrapped Ether 0x8992eea8b6d388af1df04800e69e66b2d879989511.24000000000000013 Ether
0x767ffcee5c81bdcac78217d9bcb783dc6472fbec329edaa7cc99493e04984b20109089032020-09-21 23:50:21273 days 21 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895 0xc3eab6960e0cd51dcf304248e4bbb08d8eeab55222.00000000000000013 Ether
0x767ffcee5c81bdcac78217d9bcb783dc6472fbec329edaa7cc99493e04984b20109089032020-09-21 23:50:21273 days 21 hrs ago Wrapped Ether 0x8992eea8b6d388af1df04800e69e66b2d879989522.00000000000000013 Ether
0x91b2c59482e760d44f5f6b0e8334b1657c6cb1c7b725fca80079648cc0164704108822162020-09-17 21:43:36277 days 23 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895 Wrapped Ether7.560075983914286413 Ether
0x91b2c59482e760d44f5f6b0e8334b1657c6cb1c7b725fca80079648cc0164704108822162020-09-17 21:43:36277 days 23 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895ENS Name gnartham.eth0.439924016085713587 Ether
0x91b2c59482e760d44f5f6b0e8334b1657c6cb1c7b725fca80079648cc0164704108822162020-09-17 21:43:36277 days 23 hrs ago 0xda69a4dfa3d7e785cc7a9e824bfe524e0dd22d07 0x8992eea8b6d388af1df04800e69e66b2d87998958 Ether
0x543ef1a6a248511c7bf16df8f143e628a9e3142b2fe4880417931a09a6b57682108814532020-09-17 18:48:16278 days 2 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d8799895 Wrapped Ether37.383134733473423619 Ether
0x543ef1a6a248511c7bf16df8f143e628a9e3142b2fe4880417931a09a6b57682108814532020-09-17 18:48:16278 days 2 hrs ago 0x8992eea8b6d388af1df04800e69e66b2d87998950x07356b0edf9b934330f41952b09d076c3810c6081.616865266526576381 Ether
0x543ef1a6a248511c7bf16df8f143e628a9e3142b2fe4880417931a09a6b57682108814532020-09-17 18:48:16278 days 2 hrs ago 0xda69a4dfa3d7e785cc7a9e824bfe524e0dd22d07 0x8992eea8b6d388af1df04800e69e66b2d879989539 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ACOFlashExercise

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 8: ACOFlashExercise.sol
pragma solidity ^0.6.6;

import "./IWETH.sol";
import "./IUniswapV2Pair.sol";
import "./IUniswapV2Callee.sol";
import "./IUniswapV2Factory.sol";
import "./IUniswapV2Router02.sol";
import "./IACOToken.sol";

/**
 * @title ACOFlashExercise
 * @dev Contract to exercise ACO tokens using Uniswap Flash Swap.
 */
contract ACOFlashExercise is IUniswapV2Callee {
    
    /**
     * @dev The Uniswap factory address.
     */
    address immutable public uniswapFactory;
    
    /**
     * @dev The Uniswap Router address.
     */
    address immutable public uniswapRouter;

    /**
     * @dev The WETH address used on Uniswap.
     */
    address immutable public weth;
    
    /**
     * @dev Selector for ERC20 approve function.
     */
    bytes4 immutable internal _approveSelector;
    
    /**
     * @dev Selector for ERC20 transfer function.
     */
    bytes4 immutable internal _transferSelector;
    
    constructor(address _uniswapRouter) public {
        uniswapRouter = _uniswapRouter;
        uniswapFactory = IUniswapV2Router02(_uniswapRouter).factory();
        weth = IUniswapV2Router02(_uniswapRouter).WETH();
        
        _approveSelector = bytes4(keccak256(bytes("approve(address,uint256)")));
        _transferSelector = bytes4(keccak256(bytes("transfer(address,uint256)")));
    }
    
    /**
     * @dev To accept ether from the WETH.
     */
    receive() external payable {}
    
    /**
     * @dev Function to get the Uniswap pair for an ACO token.
     * @param acoToken Address of the ACO token.
     * @return The Uniswap pair for the ACO token.
     */
    function getUniswapPair(address acoToken) public view returns(address) {
        address underlying = _getUniswapToken(IACOToken(acoToken).underlying());
        address strikeAsset = _getUniswapToken(IACOToken(acoToken).strikeAsset());
        return IUniswapV2Factory(uniswapFactory).getPair(underlying, strikeAsset);
    }
    
    /**
     * @dev Function to get the required amount of collateral to be paid to Uniswap and the expected amount to exercise the ACO token.
     * @param acoToken Address of the ACO token.
     * @param tokenAmount Amount of tokens to be exercised.
     * @param accounts The array of addresses to be exercised. Whether the array is empty the exercise will be executed using the standard method.
     * @return The required amount of collateral to be paid to Uniswap and the expected amount to exercise the ACO token.
     */
    function getExerciseData(address acoToken, uint256 tokenAmount, address[] memory accounts) public view returns(uint256, uint256) {
        if (tokenAmount > 0) {
            address pair = getUniswapPair(acoToken);
            if (pair != address(0)) {
                address token0 = IUniswapV2Pair(pair).token0();
                address token1 = IUniswapV2Pair(pair).token1();
                (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(pair).getReserves();
                
                (address exerciseAddress, uint256 expectedAmount) = _getAcoExerciseData(acoToken, tokenAmount, accounts);
                
				exerciseAddress = _getUniswapToken(exerciseAddress);
                
                uint256 reserveIn = 0; 
                uint256 reserveOut = 0;
                if (exerciseAddress == token0 && expectedAmount < reserve0) {
                    reserveIn = reserve1;
                    reserveOut = reserve0;
                } else if (exerciseAddress == token1 && expectedAmount < reserve1) {
                    reserveIn = reserve0;
                    reserveOut = reserve1;
                }
                
                if (reserveIn > 0 && reserveOut > 0) {
                    uint256 amountRequired = IUniswapV2Router02(uniswapRouter).getAmountIn(expectedAmount, reserveIn, reserveOut);
                    return (amountRequired, expectedAmount);
                }
            }
        }
        return (0, 0);
    }
    
    /**
     * @dev Function to get the estimated collateral to be received through a flash exercise.
     * @param acoToken Address of the ACO token.
     * @param tokenAmount Amount of tokens to be exercised.
     * @return The estimated collateral to be received through a flash exercise using the standard exercise function.
     */
    function getEstimatedReturn(address acoToken, uint256 tokenAmount) public view returns(uint256) {
        (uint256 amountRequired,) = getExerciseData(acoToken, tokenAmount, new address[](0));
        if (amountRequired > 0) {
            (uint256 collateralAmount,) = IACOToken(acoToken).getCollateralOnExercise(tokenAmount);
            if (amountRequired < collateralAmount) {
                return collateralAmount - amountRequired;
            }
        }
        return 0;
    }
    
    /**
     * @dev Function to flash exercise ACO tokens.
     * The flash exercise uses the flash swap functionality on Uniswap.
     * No asset is required to exercise the ACO token because the own collateral redeemed is used to fulfill the terms of the contract.
     * The account will receive the remaining difference.
     * @param acoToken Address of the ACO token.
     * @param tokenAmount Amount of tokens to be exercised.
     * @param minimumCollateral The minimum amount of collateral accepted to be received on the flash exercise.
     * @param salt Random number to calculate the start index of the array of accounts to be exercised.
     */
    function flashExercise(address acoToken, uint256 tokenAmount, uint256 minimumCollateral, uint256 salt) public {
        _flashExercise(acoToken, tokenAmount, minimumCollateral, salt, new address[](0));
    }
    
    /**
     * @dev Function to flash exercise ACO tokens.
     * The flash exercise uses the flash swap functionality on Uniswap.
     * No asset is required to exercise the ACO token because the own collateral redeemed is used to fulfill the terms of the contract.
     * The account will receive the remaining difference.
     * @param acoToken Address of the ACO token.
     * @param tokenAmount Amount of tokens to be exercised.
     * @param minimumCollateral The minimum amount of collateral accepted to be received on the flash exercise.
     * @param accounts The array of addresses to get the deposited collateral. 
     */
    function flashExerciseAccounts(
        address acoToken, 
        uint256 tokenAmount, 
        uint256 minimumCollateral, 
        address[] memory accounts
    ) public {
        require(accounts.length > 0, "ACOFlashExercise::flashExerciseAccounts: Accounts are required");
        _flashExercise(acoToken, tokenAmount, minimumCollateral, 0, accounts);
    }
    
     /**
     * @dev External function to be called by the Uniswap pair on flash swap transaction.
     * @param sender Address of the sender of the Uniswap swap. It must be the ACOFlashExercise contract.
     * @param amount0Out Amount of token0 on Uniswap pair to be received on the flash swap.
     * @param amount1Out Amount of token1 on Uniswap pair to be received on the flash swap.
     * @param data The ABI encoded with ACO token flash exercise data.
     */
    function uniswapV2Call(
        address sender, 
        uint256 amount0Out, 
        uint256 amount1Out, 
        bytes calldata data
    ) external override {
        require(sender == address(this), "ACOFlashExercise::uniswapV2Call: Invalid sender");
        
        uint256 amountRequired;
        {
        address token0 = IUniswapV2Pair(msg.sender).token0();
        address token1 = IUniswapV2Pair(msg.sender).token1();
        require(msg.sender == IUniswapV2Factory(uniswapFactory).getPair(token0, token1), "ACOFlashExercise::uniswapV2Call: Invalid transaction sender"); 
        require(amount0Out == 0 || amount1Out == 0, "ACOFlashExercise::uniswapV2Call: Invalid out amounts"); 
        
        (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(msg.sender).getReserves();
        uint256 reserveIn = amount0Out == 0 ? reserve0 : reserve1; 
        uint256 reserveOut = amount0Out == 0 ? reserve1 : reserve0; 
        amountRequired = IUniswapV2Router02(uniswapRouter).getAmountIn((amount0Out + amount1Out), reserveIn, reserveOut);
        }
        
        address acoToken;
        uint256 tokenAmount; 
        uint256 ethValue = 0;
        uint256 remainingAmount;
        uint256 salt;
        address from;
        address[] memory accounts;
        {
        uint256 minimumCollateral;
        (from, acoToken, tokenAmount, minimumCollateral, salt, accounts) = abi.decode(data, (address, address, uint256, uint256, uint256, address[]));
        
		(address exerciseAddress, uint256 expectedAmount) = _getAcoExerciseData(acoToken, tokenAmount, accounts);
        
        require(expectedAmount == (amount1Out + amount0Out), "ACOFlashExercise::uniswapV2Call: Invalid expected amount");
        
        (uint256 collateralAmount,) = IACOToken(acoToken).getCollateralOnExercise(tokenAmount);
        require(amountRequired <= collateralAmount, "ACOFlashExercise::uniswapV2Call: Insufficient collateral amount");
        
        remainingAmount = collateralAmount - amountRequired;
        require(remainingAmount >= minimumCollateral, "ACOFlashExercise::uniswapV2Call: Minimum amount not satisfied");
        
        if (_isEther(exerciseAddress)) {
            ethValue = expectedAmount;
            IWETH(weth).withdraw(expectedAmount);
        } else {
            _callApproveERC20(exerciseAddress, acoToken, expectedAmount);
        }
        }
        
        if (accounts.length == 0) {
            IACOToken(acoToken).exerciseFrom{value: ethValue}(from, tokenAmount, salt);
        } else {
            IACOToken(acoToken).exerciseAccountsFrom{value: ethValue}(from, tokenAmount, accounts);
        }
        
        address collateral = IACOToken(acoToken).collateral();
        address uniswapPayment;
        if (_isEther(collateral)) {
            payable(from).transfer(remainingAmount);
            IWETH(weth).deposit{value: amountRequired}();
            uniswapPayment = weth;
        } else {
            _callTransferERC20(collateral, from, remainingAmount); 
            uniswapPayment = collateral;
        }
        
        _callTransferERC20(uniswapPayment, msg.sender, amountRequired); 
    }
	
	/**
     * @dev Internal function to get the ACO tokens exercise data.
     * @param acoToken Address of the ACO token.
     * @param tokenAmount Amount of tokens to be exercised.
     * @param accounts The array of addresses to be exercised. Whether the array is empty the exercise will be executed using the standard method.
	 * @return The asset and the respective amount that should be sent to get the collateral.
     */
	function _getAcoExerciseData(address acoToken, uint256 tokenAmount, address[] memory accounts) internal view returns(address, uint256) {
		(address exerciseAddress, uint256 expectedAmount) = IACOToken(acoToken).getBaseExerciseData(tokenAmount);
		if (accounts.length == 0) {
			expectedAmount = expectedAmount + IACOToken(acoToken).maxExercisedAccounts();
		} else {
			expectedAmount = expectedAmount + accounts.length;
		}
		return (exerciseAddress, expectedAmount);
	}
	
    /**
     * @dev Internal function to flash exercise ACO tokens.
     * @param acoToken Address of the ACO token.
     * @param tokenAmount Amount of tokens to be exercised.
     * @param minimumCollateral The minimum amount of collateral accepted to be received on the flash exercise.
     * @param salt Random number to calculate the start index of the array of accounts to be exercised when using standard method.
     * @param accounts The array of addresses to get the deposited collateral. Whether the array is empty the exercise will be executed using the standard method.
     */
    function _flashExercise(
        address acoToken, 
        uint256 tokenAmount, 
        uint256 minimumCollateral, 
        uint256 salt,
        address[] memory accounts
    ) internal {
        address pair = getUniswapPair(acoToken);
        require(pair != address(0), "ACOFlashExercise::_flashExercise: Invalid Uniswap pair");
        
        (address exerciseAddress, uint256 expectedAmount) = _getAcoExerciseData(acoToken, tokenAmount, accounts);

        uint256 amount0Out = 0;
        uint256 amount1Out = 0;
        if (_getUniswapToken(exerciseAddress) == IUniswapV2Pair(pair).token0()) {
            amount0Out = expectedAmount;
        } else {
            amount1Out = expectedAmount;  
        }
        
        IUniswapV2Pair(pair).swap(amount0Out, amount1Out, address(this), abi.encode(msg.sender, acoToken, tokenAmount, minimumCollateral, salt, accounts));
    }
    
    /**
     * @dev Internal function to get Uniswap token address.
     * The Ethereum address on ACO must be swapped to WETH to be used on Uniswap.
     * @param token Address of the token on ACO.
     * @return Uniswap token address.
     */
    function _getUniswapToken(address token) internal view returns(address) {
        if (_isEther(token)) {
            return weth;
        } else {
            return token;
        }
    }
    
    /**
     * @dev Internal function to get if the token is for Ethereum (0x0).
     * @param token Address to be checked.
     * @return Whether the address is for Ethereum.
     */ 
    function _isEther(address token) internal pure returns(bool) {
        return token == address(0);
    }
    
    /**
     * @dev Internal function to approve ERC20 tokens.
     * @param token Address of the token.
     * @param spender Authorized address.
     * @param amount Amount to transfer.
     */
    function _callApproveERC20(address token, address spender, uint256 amount) internal {
        (bool success, bytes memory returndata) = token.call(abi.encodeWithSelector(_approveSelector, spender, amount));
        require(success && (returndata.length == 0 || abi.decode(returndata, (bool))), "ACOTokenExercise::_callApproveERC20");
    }
    
    /**
     * @dev Internal function to transfer ERC20 tokens.
     * @param token Address of the token.
     * @param recipient Address of the transfer destination.
     * @param amount Amount to transfer.
     */
    function _callTransferERC20(address token, address recipient, uint256 amount) internal {
        (bool success, bytes memory returndata) = token.call(abi.encodeWithSelector(_transferSelector, recipient, amount));
        require(success && (returndata.length == 0 || abi.decode(returndata, (bool))), "ACOTokenExercise::_callTransferERC20");
    }
}

File 2 of 8: IACOToken.sol
pragma solidity ^0.6.6;

import "./IERC20.sol";

interface IACOToken is IERC20 {
	function init(address _underlying, address _strikeAsset, bool _isCall, uint256 _strikePrice, uint256 _expiryTime, uint256 _acoFee, address payable _feeDestination, uint256 _maxExercisedAccounts) external;
    function name() external view returns(string memory);
    function symbol() external view returns(string memory);
    function decimals() external view returns(uint8);
    function underlying() external view returns (address);
    function strikeAsset() external view returns (address);
    function feeDestination() external view returns (address);
    function isCall() external view returns (bool);
    function strikePrice() external view returns (uint256);
    function expiryTime() external view returns (uint256);
    function totalCollateral() external view returns (uint256);
    function acoFee() external view returns (uint256);
	function maxExercisedAccounts() external view returns (uint256);
    function underlyingSymbol() external view returns (string memory);
    function strikeAssetSymbol() external view returns (string memory);
    function underlyingDecimals() external view returns (uint8);
    function strikeAssetDecimals() external view returns (uint8);
    function currentCollateral(address account) external view returns(uint256);
    function unassignableCollateral(address account) external view returns(uint256);
    function assignableCollateral(address account) external view returns(uint256);
    function currentCollateralizedTokens(address account) external view returns(uint256);
    function unassignableTokens(address account) external view returns(uint256);
    function assignableTokens(address account) external view returns(uint256);
    function getCollateralAmount(uint256 tokenAmount) external view returns(uint256);
    function getTokenAmount(uint256 collateralAmount) external view returns(uint256);
    function getBaseExerciseData(uint256 tokenAmount) external view returns(address, uint256);
    function numberOfAccountsWithCollateral() external view returns(uint256);
    function getCollateralOnExercise(uint256 tokenAmount) external view returns(uint256, uint256);
    function collateral() external view returns(address);
    function mintPayable() external payable;
    function mintToPayable(address account) external payable;
    function mint(uint256 collateralAmount) external;
    function mintTo(address account, uint256 collateralAmount) external;
    function burn(uint256 tokenAmount) external;
    function burnFrom(address account, uint256 tokenAmount) external;
    function redeem() external;
    function redeemFrom(address account) external;
    function exercise(uint256 tokenAmount, uint256 salt) external payable;
    function exerciseFrom(address account, uint256 tokenAmount, uint256 salt) external payable;
    function exerciseAccounts(uint256 tokenAmount, address[] calldata accounts) external payable;
    function exerciseAccountsFrom(address account, uint256 tokenAmount, address[] calldata accounts) external payable;
}

File 3 of 8: IERC20.sol
pragma solidity ^0.6.6;

// Contract on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 8: IUniswapV2Callee.sol
pragma solidity ^0.6.6;

interface IUniswapV2Callee {
    function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
}

File 5 of 8: IUniswapV2Factory.sol
pragma solidity ^0.6.6;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 6 of 8: IUniswapV2Pair.sol
pragma solidity ^0.6.6;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 7 of 8: IUniswapV2Router02.sol
pragma solidity 0.6.6;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 8 of 8: IWETH.sol
pragma solidity ^0.6.6;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_uniswapRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minimumCollateral","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"flashExercise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minimumCollateral","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"flashExerciseAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getEstimatedReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"getExerciseData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"acoToken","type":"address"}],"name":"getUniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uniswapV2Call","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

61012060405234801561001157600080fd5b5060405162001e8938038062001e898339818101604052602081101561003657600080fd5b50516001600160601b0319606082901b1660a0526040805163c45a015560e01b815290516001600160a01b0383169163c45a0155916004808301926020929190829003018186803b15801561008a57600080fd5b505afa15801561009e573d6000803e3d6000fd5b505050506040513d60208110156100b457600080fd5b505160601b6001600160601b031916608052604080516315ab88c960e31b815290516001600160a01b0383169163ad5c4648916004808301926020929190829003018186803b15801561010657600080fd5b505afa15801561011a573d6000803e3d6000fd5b505050506040513d602081101561013057600080fd5b50516001600160601b031960609190911b1660c05250604080518082018252601881527f617070726f766528616464726573732c75696e7432353629000000000000000060209182015263095ea7b360e01b60e0528151808301909252601982527f7472616e7366657228616464726573732c75696e74323536290000000000000091015263a9059cbb60e01b6101005260805160601c60a05160601c60c05160601c60e05160e01c60e01b6101005160e01c60e01b611c4b6200023e600039806118a152508061172a525080610a365280610cba5280610d2e5280610d8052806119dd5250806107325280610e9552806110f252508061058c5280610eb952806112725250611c4b6000f3fe60806040526004361061008a5760003560e01c80635caec24f116100595780635caec24f1461026f578063735de9f7146102ba5780638bdb2afa146102cf578063a66d363e146102e4578063dec5db66146103c057610091565b80630152ef951461009657806310d1e85c146101625780633fc8cef3146101f95780634b721f371461022a57610091565b3661009157005b600080fd5b3480156100a257600080fd5b50610160600480360360808110156100b957600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156100ef57600080fd5b82018360208201111561010157600080fd5b803590602001918460208302840111600160201b8311171561012257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506103f3945050505050565b005b34801561016e57600080fd5b506101606004803603608081101561018557600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156101bb57600080fd5b8201836020820111156101cd57600080fd5b803590602001918460018302840111600160201b831117156101ee57600080fd5b509092509050610447565b34801561020557600080fd5b5061020e610d7e565b604080516001600160a01b039092168252519081900360200190f35b34801561023657600080fd5b506101606004803603608081101561024d57600080fd5b506001600160a01b038135169060208101359060408101359060600135610da2565b34801561027b57600080fd5b506102a86004803603604081101561029257600080fd5b506001600160a01b038135169060200135610dda565b60408051918252519081900360200190f35b3480156102c657600080fd5b5061020e610e93565b3480156102db57600080fd5b5061020e610eb7565b3480156102f057600080fd5b506103a76004803603606081101561030757600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561033657600080fd5b82018360208201111561034857600080fd5b803590602001918460208302840111600160201b8311171561036957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610edb945050505050565b6040805192835260208301919091528051918290030190f35b3480156103cc57600080fd5b5061020e600480360360208110156103e357600080fd5b50356001600160a01b03166111be565b60008151116104335760405162461bcd60e51b815260040180806020018281038252603e815260200180611aca603e913960400191505060405180910390fd5b610441848484600085611336565b50505050565b6001600160a01b038516301461048e5760405162461bcd60e51b815260040180806020018281038252602f815260200180611b76602f913960400191505060405180910390fd5b600080336001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ca57600080fd5b505afa1580156104de573d6000803e3d6000fd5b505050506040513d60208110156104f457600080fd5b50516040805163d21220a760e01b81529051919250600091339163d21220a7916004808301926020929190829003018186803b15801561053357600080fd5b505afa158015610547573d6000803e3d6000fd5b505050506040513d602081101561055d57600080fd5b50516040805163e6a4390560e01b81526001600160a01b038581166004830152808416602483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163e6a4390591604480820192602092909190829003018186803b1580156105d557600080fd5b505afa1580156105e9573d6000803e3d6000fd5b505050506040513d60208110156105ff57600080fd5b50516001600160a01b031633146106475760405162461bcd60e51b815260040180806020018281038252603b815260200180611a6b603b913960400191505060405180910390fd5b861580610652575085155b61068d5760405162461bcd60e51b8152600401808060200182810382526034815260200180611be26034913960400191505060405180910390fd5b600080336001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156106c957600080fd5b505afa1580156106dd573d6000803e3d6000fd5b505050506040513d60608110156106f357600080fd5b5080516020909101516001600160701b0391821693501690506000891561071a578161071c565b825b905060008a1561072c578361072e565b825b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166385f8c2598b8d0184846040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156107a657600080fd5b505afa1580156107ba573d6000803e3d6000fd5b505050506040513d60208110156107d057600080fd5b50519650600095508594508493508392508291508190506060818a8a60c08110156107fa57600080fd5b6001600160a01b0382358116926020810135909116916040820135916060810135916080820135919081019060c0810160a0820135600160201b81111561084057600080fd5b82018360208201111561085257600080fd5b803590602001918460208302840111600160201b8311171561087357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050859550849450809750819950829650839c50849d508598505050505050506000806108e98a8a866115d4565b915091508e8e01811461092d5760405162461bcd60e51b8152600401808060200182810382526038815260200180611b086038913960400191505060405180910390fd5b60008a6001600160a01b0316636f012b8d8b6040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561097257600080fd5b505afa158015610986573d6000803e3d6000fd5b505050506040513d604081101561099c57600080fd5b50519050808c11156109df5760405162461bcd60e51b815260040180806020018281038252603f815260200180611a2c603f913960400191505060405180910390fd5b8b8103975083881015610a235760405162461bcd60e51b815260040180806020018281038252603d815260200180611ba5603d913960400191505060405180910390fd5b610a2c836116d6565b15610ab7578198507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610a9a57600080fd5b505af1158015610aae573d6000803e3d6000fd5b50505050610ac2565b610ac2838c846116e3565b50505050805160001415610b4857604080516308ee261360e31b81526001600160a01b03848116600483015260248201899052604482018690529151918916916347713098918891606480830192600092919082900301818588803b158015610b2a57600080fd5b505af1158015610b3e573d6000803e3d6000fd5b5050505050610c08565b866001600160a01b0316637c974fc4868489856040518563ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610bc8578181015183820152602001610bb0565b505050509050019450505050506000604051808303818588803b158015610bee57600080fd5b505af1158015610c02573d6000803e3d6000fd5b50505050505b6000876001600160a01b031663d8dfeb456040518163ffffffff1660e01b815260040160206040518083038186803b158015610c4357600080fd5b505afa158015610c57573d6000803e3d6000fd5b505050506040513d6020811015610c6d57600080fd5b505190506000610c7c826116d6565b15610d54576040516001600160a01b0385169087156108fc029088906000818181858888f19350505050158015610cb7573d6000803e3d6000fd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08b6040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d1357600080fd5b505af1158015610d27573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000009050610d62565b610d5f82858861185a565b50805b610d6d81338c61185a565b505050505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610441848484846000604051908082528060200260200182016040528015610dd4578160200160208202803683370190505b50611336565b604080516000808252602082019092528190610df99085908590610edb565b5090508015610e87576000846001600160a01b0316636f012b8d856040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b158015610e4757600080fd5b505afa158015610e5b573d6000803e3d6000fd5b505050506040513d6040811015610e7157600080fd5b5051905080821015610e8557039050610e8d565b505b60009150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008083156111af576000610eef866111be565b90506001600160a01b038116156111ad576000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3b57600080fd5b505afa158015610f4f573d6000803e3d6000fd5b505050506040513d6020811015610f6557600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0385169163d21220a7916004808301926020929190829003018186803b158015610fad57600080fd5b505afa158015610fc1573d6000803e3d6000fd5b505050506040513d6020811015610fd757600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03871691630902f1ac91600480820192606092909190829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d606081101561104c57600080fd5b5080516020909101516001600160701b0391821693501690506000806110738c8c8c6115d4565b91509150611080826119ca565b91506000806001600160a01b0380851690891614801561109f57508583105b156110ae5750839050846110d9565b866001600160a01b0316846001600160a01b03161480156110ce57508483105b156110d95750849050835b6000821180156110e95750600081115b156111a45760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166385f8c2598585856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561116457600080fd5b505afa158015611178573d6000803e3d6000fd5b505050506040513d602081101561118e57600080fd5b50519b509299506111b698505050505050505050565b50505050505050505b505b5060009050805b935093915050565b60008061122e836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156111fd57600080fd5b505afa158015611211573d6000803e3d6000fd5b505050506040513d602081101561122757600080fd5b50516119ca565b9050600061126e846001600160a01b03166317d69bc86040518163ffffffff1660e01b815260040160206040518083038186803b1580156111fd57600080fd5b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a4390583836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561130057600080fd5b505afa158015611314573d6000803e3d6000fd5b505050506040513d602081101561132a57600080fd5b5051925050505b919050565b6000611341866111be565b90506001600160a01b0381166113885760405162461bcd60e51b8152600401808060200182810382526036815260200180611b406036913960400191505060405180910390fd5b6000806113968888866115d4565b9150915060008090506000809050846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156113dd57600080fd5b505afa1580156113f1573d6000803e3d6000fd5b505050506040513d602081101561140757600080fd5b50516001600160a01b031661141b856119ca565b6001600160a01b0316141561143257829150611435565b50815b846001600160a01b031663022c0d9f838330338f8f8f8f8f60405160200180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b0316815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156114d25781810151838201526020016114ba565b505050509050019750505050505050506040516020818303038152906040526040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611561578181015183820152602001611549565b50505050905090810190601f16801561158e5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156115b057600080fd5b505af11580156115c4573d6000803e3d6000fd5b5050505050505050505050505050565b600080600080866001600160a01b0316635d97d3e2876040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561161d57600080fd5b505afa158015611631573d6000803e3d6000fd5b505050506040513d604081101561164757600080fd5b508051602090910151865191935091506116c657866001600160a01b031663313a9b4e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561169457600080fd5b505afa1580156116a8573d6000803e3d6000fd5b505050506040513d60208110156116be57600080fd5b5051016116ca565b8451015b90969095509350505050565b6001600160a01b03161590565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03166001600160e01b03197f000000000000000000000000000000000000000000000000000000000000000016178152925182516000946060949389169392918291908083835b602083106117835780518252601f199092019160209182019101611764565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146117e5576040519150601f19603f3d011682016040523d82523d6000602084013e6117ea565b606091505b5091509150818015611818575080511580611818575080806020019051602081101561181557600080fd5b50515b6118535760405162461bcd60e51b8152600401808060200182810382526023815260200180611a096023913960400191505060405180910390fd5b5050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03166001600160e01b03197f000000000000000000000000000000000000000000000000000000000000000016178152925182516000946060949389169392918291908083835b602083106118fa5780518252601f1990920191602091820191016118db565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461195c576040519150601f19603f3d011682016040523d82523d6000602084013e611961565b606091505b509150915081801561198f57508051158061198f575080806020019051602081101561198c57600080fd5b50515b6118535760405162461bcd60e51b8152600401808060200182810382526024815260200180611aa66024913960400191505060405180910390fd5b60006119d5826116d6565b15611a0157507f0000000000000000000000000000000000000000000000000000000000000000611331565b508061133156fe41434f546f6b656e45786572636973653a3a5f63616c6c417070726f7665455243323041434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e73756666696369656e7420636f6c6c61746572616c20616d6f756e7441434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c6964207472616e73616374696f6e2073656e64657241434f546f6b656e45786572636973653a3a5f63616c6c5472616e73666572455243323041434f466c61736845786572636973653a3a666c61736845786572636973654163636f756e74733a204163636f756e74732061726520726571756972656441434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c696420657870656374656420616d6f756e7441434f466c61736845786572636973653a3a5f666c61736845786572636973653a20496e76616c696420556e6973776170207061697241434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c69642073656e64657241434f466c61736845786572636973653a3a756e6973776170563243616c6c3a204d696e696d756d20616d6f756e74206e6f742073617469736669656441434f466c61736845786572636973653a3a756e6973776170563243616c6c3a20496e76616c6964206f757420616d6f756e7473a264697066735822122080e7d2a3c96e7d9395a948916565e0774f13c7fd1e8d887f0e71036037c90b4564736f6c634300060600330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

-----Decoded View---------------
Arg [0] : _uniswapRouter (address): 0x7a250d5630b4cf539739df2c5dacb4c659f2488d

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d


Deployed ByteCode Sourcemap

321:14509:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;6418:370:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6418:370:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;6418:370:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;6418:370:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;6418:370:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;6418:370:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;6418:370:0;;-1:-1:-1;6418:370:0;;-1:-1:-1;;;;;6418:370:0:i;:::-;;7275:3214;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7275:3214:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;7275:3214:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;7275:3214:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;7275:3214:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;7275:3214:0;;-1:-1:-1;7275:3214:0;-1:-1:-1;7275:3214:0;:::i;663:29::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;663:29:0;;;:::i;:::-;;;;-1:-1:-1;;;;;663:29:0;;;;;;;;;;;;;;5553:209;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5553:209:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;5553:209:0;;;;;;;;;;;;;;;;;;:::i;4380:493::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4380:493:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;4380:493:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;551:38;;5:9:-1;2:2;;;27:1;24;17:12;2:2;551:38:0;;;:::i;440:39::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;440:39:0;;;:::i;2528:1497::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2528:1497:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;2528:1497:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;2528:1497:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;2528:1497:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;2528:1497:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2528:1497:0;;-1:-1:-1;2528:1497:0;;-1:-1:-1;;;;;2528:1497:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;1651:329;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1651:329:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1651:329:0;-1:-1:-1;;;;;1651:329:0;;:::i;6418:370::-;6632:1;6614:8;:15;:19;6606:94;;;;-1:-1:-1;;;6606:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6711:69;6726:8;6736:11;6749:17;6768:1;6771:8;6711:14;:69::i;:::-;6418:370;;;;:::o;7275:3214::-;-1:-1:-1;;;;;7458:23:0;;7476:4;7458:23;7450:83;;;;-1:-1:-1;;;7450:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7554:22;7598:14;7630:10;-1:-1:-1;;;;;7615:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7615:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7615:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7615:35:0;7678;;;-1:-1:-1;;;7678:35:0;;;;7615;;-1:-1:-1;7661:14:0;;7693:10;;7678:33;;:35;;;;;7615;;7678;;;;;;;7693:10;7678:35;;;2:2:-1;;;;27:1;24;17:12;2:2;7678:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7678:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7678:35:0;7746:57;;;-1:-1:-1;;;7746:57:0;;-1:-1:-1;;;;;7746:57:0;;;;;;;;;;;;;;;;7678:35;;-1:-1:-1;7764:14:0;7746:41;;;;;;:57;;;;;7678:35;;7746:57;;;;;;;;:41;:57;;;2:2:-1;;;;27:1;24;17:12;2:2;7746:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7746:57:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7746:57:0;-1:-1:-1;;;;;7732:71:0;:10;:71;7724:143;;;;-1:-1:-1;;;7724:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7887:15;;;:34;;-1:-1:-1;7906:15:0;;7887:34;7879:99;;;;-1:-1:-1;;;7879:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8001:16;8019;8055:10;-1:-1:-1;;;;;8040:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8040:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8040:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8040:40:0;;;;;;;-1:-1:-1;;;;;8000:80:0;;;;-1:-1:-1;8000:80:0;;-1:-1:-1;8091:17:0;8111:15;;:37;;8140:8;8111:37;;;8129:8;8111:37;8091:57;-1:-1:-1;8160:18:0;8181:15;;:37;;8210:8;8181:37;;;8199:8;8181:37;8160:58;;8266:13;-1:-1:-1;;;;;8247:45:0;;8307:10;8294;:23;8320:9;8331:10;8247:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8247:95:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8247:95:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8247:95:0;;-1:-1:-1;8374:16:0;;-1:-1:-1;8374:16:0;;-1:-1:-1;8374:16:0;;-1:-1:-1;8374:16:0;;-1:-1:-1;8374:16:0;;-1:-1:-1;8374:16:0;;-1:-1:-1;8543:25:0;8374:16;8704:4;;15:3:-1;7:12;;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;8693:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;8693:74:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;8693:74:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8693:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;8693:74:0;;;;;;;;;;;;;;8626:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8783:23;8808:22;8834:52;8854:8;8864:11;8877:8;8834:19;:52::i;:::-;8782:104;;;;8947:10;8934;:23;8915:14;:43;8907:112;;;;-1:-1:-1;;;8907:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9041:24;9080:8;-1:-1:-1;;;;;9070:43:0;;9114:11;9070:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9070:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9070:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9070:56:0;;-1:-1:-1;9145:34:0;;;;9137:110;;;;-1:-1:-1;;;9137:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9305:14;9286:16;:33;9268:51;;9357:17;9338:15;:36;;9330:110;;;;-1:-1:-1;;;9330:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9465:25;9474:15;9465:8;:25::i;:::-;9461:227;;;9518:14;9507:25;;9553:4;-1:-1:-1;;;;;9547:20:0;;9568:14;9547:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9547:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9547:36:0;;;;9461:227;;;9616:60;9634:15;9651:8;9661:14;9616:17;:60::i;:::-;7275:3214;;;;9723:8;:15;9742:1;9723:20;9719:246;;;9760:74;;;-1:-1:-1;;;9760:74:0;;-1:-1:-1;;;;;9760:74:0;;;;;;;;;;;;;;;;;;;;;:32;;;;;;9800:8;;9760:74;;;;;-1:-1:-1;;9760:74:0;;;;;;;9800:8;9760:32;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;9760:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9760:74:0;;;;;9719:246;;;9877:8;-1:-1:-1;;;;;9867:40:0;;9915:8;9925:4;9931:11;9944:8;9867:86;;;;;;;;;;;;;-1:-1:-1;;;;;9867:86:0;-1:-1:-1;;;;;9867:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9867:86:0;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9867:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9867:86:0;;;;;9719:246;9985:18;10016:8;-1:-1:-1;;;;;10006:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10006:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10006:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10006:32:0;;-1:-1:-1;10049:22:0;10086:20;10006:32;10086:8;:20::i;:::-;10082:316;;;10123:39;;-1:-1:-1;;;;;10123:22:0;;;:39;;;;;10146:15;;10123:39;;;;10146:15;10123:22;:39;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10123:39:0;10183:4;-1:-1:-1;;;;;10177:19:0;;10204:14;10177:44;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10177:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10177:44:0;;;;;10253:4;10236:21;;10082:316;;;10290:53;10309:10;10321:4;10327:15;10290:18;:53::i;:::-;-1:-1:-1;10376:10:0;10082:316;10418:62;10437:14;10453:10;10465:14;10418:18;:62::i;:::-;7275:3214;;;;;;;;;;;;;;;:::o;663:29::-;;;:::o;5553:209::-;5674:80;5689:8;5699:11;5712:17;5731:4;5751:1;5737:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;5737:16:0;;5674:14;:80::i;4380:493::-;4554:16;;;4467:7;4554:16;;;;;;;;;4467:7;;4515:56;;4531:8;;4541:11;;4515:15;:56::i;:::-;-1:-1:-1;4487:84:0;-1:-1:-1;4586:18:0;;4582:265;;4622:24;4661:8;-1:-1:-1;;;;;4651:43:0;;4695:11;4651:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4651:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4651:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4651:56:0;;-1:-1:-1;4726:33:0;;;4722:114;;;4787:33;;-1:-1:-1;4780:40:0;;4722:114;4582:265;;4864:1;4857:8;;;4380:493;;;;;:::o;551:38::-;;;:::o;440:39::-;;;:::o;2528:1497::-;2639:7;;2672:15;;2668:1326;;2704:12;2719:24;2734:8;2719:14;:24::i;:::-;2704:39;-1:-1:-1;;;;;;2762:18:0;;;2758:1225;;2801:14;2833:4;-1:-1:-1;;;;;2818:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2818:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2818:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2818:29:0;2883;;;-1:-1:-1;;;2883:29:0;;;;2818;;-1:-1:-1;2866:14:0;;-1:-1:-1;;;;;2883:27:0;;;;;:29;;;;;2818;;2883;;;;;;;:27;:29;;;2:2:-1;;;;27:1;24;17:12;2:2;2883:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2883:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2883:29:0;2971:34;;;-1:-1:-1;;;2971:34:0;;;;2883:29;;-1:-1:-1;2932:16:0;;;;-1:-1:-1;;;;;2971:32:0;;;;;:34;;;;;;;;;;;;;;;:32;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;2971:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2971:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2971:34:0;;;;;;;-1:-1:-1;;;;;2931:74:0;;;;-1:-1:-1;2931:74:0;;-1:-1:-1;3043:23:0;;3094:52;3114:8;3124:11;3137:8;3094:19;:52::i;:::-;3042:104;;;;3189:33;3206:15;3189:16;:33::i;:::-;3171:51;-1:-1:-1;3259:17:0;;-1:-1:-1;;;;;3345:25:0;;;;;;;:54;;;;;3391:8;3374:14;:25;3345:54;3341:340;;;-1:-1:-1;3436:8:0;;-1:-1:-1;3480:8:0;3341:340;;;3537:6;-1:-1:-1;;;;;3518:25:0;:15;-1:-1:-1;;;;;3518:25:0;;:54;;;;;3564:8;3547:14;:25;3518:54;3514:167;;;-1:-1:-1;3609:8:0;;-1:-1:-1;3653:8:0;3514:167;3733:1;3721:9;:13;:31;;;;;3751:1;3738:10;:14;3721:31;3717:251;;;3777:22;3821:13;-1:-1:-1;;;;;3802:45:0;;3848:14;3864:9;3875:10;3802:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3802:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3802:84:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3802:84:0;;-1:-1:-1;3933:14:0;;-1:-1:-1;3909:39:0;;-1:-1:-1;;;;;;;;;3909:39:0;3717:251;2758:1225;;;;;;;;;2668:1326;;-1:-1:-1;4012:1:0;;-1:-1:-1;4012:1:0;2528:1497;;;;;;;:::o;1651:329::-;1713:7;1733:18;1754:50;1781:8;-1:-1:-1;;;;;1771:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1771:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1771:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1771:32:0;1754:16;:50::i;:::-;1733:71;;1815:19;1837:51;1864:8;-1:-1:-1;;;;;1854:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;1837:51:0;1815:73;;1924:14;-1:-1:-1;;;;;1906:41:0;;1948:10;1960:11;1906:66;;;;;;;;;;;;;-1:-1:-1;;;;;1906:66:0;-1:-1:-1;;;;;1906:66:0;;;;;;-1:-1:-1;;;;;1906:66:0;-1:-1:-1;;;;;1906:66:0;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1906:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1906:66:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1906:66:0;;-1:-1:-1;;;1651:329:0;;;;:::o;12016:907::-;12222:12;12237:24;12252:8;12237:14;:24::i;:::-;12222:39;-1:-1:-1;;;;;;12280:18:0;;12272:85;;;;-1:-1:-1;;;12272:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12379:23;12404:22;12430:52;12450:8;12460:11;12473:8;12430:19;:52::i;:::-;12378:104;;;;12495:18;12516:1;12495:22;;12528:18;12549:1;12528:22;;12617:4;-1:-1:-1;;;;;12602:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12602:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12602:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12602:29:0;-1:-1:-1;;;;;12565:66:0;:33;12582:15;12565:16;:33::i;:::-;-1:-1:-1;;;;;12565:66:0;;12561:188;;;12661:14;12648:27;;12561:188;;;-1:-1:-1;12721:14:0;12561:188;12784:4;-1:-1:-1;;;;;12769:25:0;;12795:10;12807;12827:4;12845:10;12857:8;12867:11;12880:17;12899:4;12905:8;12834:80;;;;;;-1:-1:-1;;;;;12834:80:0;-1:-1:-1;;;;;12834:80:0;;;;;;-1:-1:-1;;;;;12834:80:0;-1:-1:-1;;;;;12834:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12834:80:0;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12834:80:0;;;12769:146;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12769:146:0;-1:-1:-1;;;;;12769:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12769:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12769:146:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12769:146:0;;;;12016:907;;;;;;;;;;:::o;10929:479::-;11046:7;11055;11070:23;11095:22;11131:8;-1:-1:-1;;;;;11121:39:0;;11161:11;11121:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11121:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11121:52:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11121:52:0;;;;;;;11182:15;;11121:52;;-1:-1:-1;11121:52:0;-1:-1:-1;11178:181:0;;11254:8;-1:-1:-1;;;;;11244:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11244:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11244:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11244:42:0;11227:59;11178:181;;;11338:15;;11321:32;11178:181;11371:15;;;;-1:-1:-1;10929:479:0;-1:-1:-1;;;;10929:479:0:o;13582:106::-;-1:-1:-1;;;;;13661:19:0;;;13582:106::o;13902:342::-;14050:57;;;-1:-1:-1;;;;;14050:57:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14050:57:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;14073:16:0;14050:57;179:29:-1;160:49;;14039:69:0;;;;13998:12;;14012:23;;14039:10;;;;14050:57;14039:69;;;25:18:-1;14039:69:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14039:69:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;13997:111:0;;;;14127:7;:69;;;;-1:-1:-1;14139:17:0;;:22;;:56;;;14176:10;14165:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14165:30:0;14139:56;14119:117;;;;-1:-1:-1;;;14119:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13902:342;;;;;:::o;14478:349::-;14629:60;;;-1:-1:-1;;;;;14629:60:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14629:60:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;14652:17:0;14629:60;179:29:-1;160:49;;14618:72:0;;;;14577:12;;14591:23;;14618:10;;;;14629:60;14618:72;;;25:18:-1;14618:72:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14618:72:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;14576:114:0;;;;14709:7;:69;;;;-1:-1:-1;14721:17:0;;:22;;:56;;;14758:10;14747:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14747:30:0;14721:56;14701:118;;;;-1:-1:-1;;;14701:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13186:194;13249:7;13273:15;13282:5;13273:8;:15::i;:::-;13269:104;;;-1:-1:-1;13312:4:0;13305:11;;13269:104;-1:-1:-1;13356:5:0;13349:12;

Swarm Source

ipfs://80e7d2a3c96e7d9395a948916565e0774f13c7fd1e8d887f0e71036037c90b45
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.