Contract 0x78491c44fc63067b19e1ba4eef379f358123b552

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8dfa5e2f9639218114415cb05d9ea6b38937281422a4de26ad03e97390691960Set Fee To126008722022-04-21 23:18:28410 days 18 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  0x78491c44fc63067b19e1ba4eef379f358123b5520 CELO0.0000217495
0xf87f8f1c49d5d4f6234bb0836bdf71210cd21bbb72beaf72573a75f72ba365510x60806040126008442022-04-21 23:16:08410 days 18 hrs ago0x7e31af176da39a9986c8f5c7632178b4acf0c868 IN  Create: PadiFactory0 CELO0.0011945425
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa2085eef3cf45b13add20280577e271755ada1f2b91c213664118330e877755f150811982022-09-13 12:58:28266 days 4 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xafeb1c6cbf4a84270c10db5ae0873ca2f5a36e2b8edd602c4f432d82ba49cc09150811752022-09-13 12:56:33266 days 4 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xb54eaa61a36d55ab49a686cc22c6c333986042410e05e2c78336ec3f44e9ed81150811552022-09-13 12:54:53266 days 4 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x4527d0ed6a4823c4f8809cd737c31a19d20d7fc6c0f1c020163dc3c85c51caea150811332022-09-13 12:53:03266 days 4 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x0350c21a03dc804b7c45b7fd1a2c5733b253df6e679ac905ba197eb7555479ee145704092022-08-14 23:31:40295 days 18 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x026df3388378d157571a9c6e6c6f3bd765f1bc6ba273b7a88cb47abbad033e8d145702272022-08-14 23:16:30295 days 18 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xe864bb91eb2b4d3f2a90f7af0364cf2cfde16f0b74756ac521d887d1ea3d1b35145702112022-08-14 23:15:10295 days 18 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x58c072700c50ecdf48b07da1b349cc90808f2c707be76669c8275722afa7c205145701422022-08-14 23:09:25295 days 18 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xb8ea979a4f6c96fca6345aacbbe84debf21e98bcc45f0d44e0d4646705b49852145700952022-08-14 23:05:30295 days 18 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x6ee197a6508134107a1e736d91ce0b05973da4fece29623f9c6dc3e4ca8af82b145699902022-08-14 22:56:45295 days 18 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xe19d20a999d301b7cff9af2d9513b834f1b9401f9dea7e386b5bb2a61ca03e28145639682022-08-14 14:34:55296 days 3 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x0b9901d07478da2ebc3cd8971bfbeaf874a44dd3197442c504be9818f25ca8bc141164432022-07-19 17:00:13322 days 36 mins ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x214484696a7cc3c2739bbfcbb4cba7130d777a36eebf4813be3106e43836f87e141162332022-07-19 16:42:43322 days 53 mins ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xdafbf5a648023d86e7f8dc374fd7367ff0c187a654429d8bfabcc94167d10a38141161972022-07-19 16:39:43322 days 56 mins ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xc1ad3acb71e6b580779b26a366c64b37b7652beaf7900194328174e6c2408311141153962022-07-19 15:32:58322 days 2 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xc283cff1c4f778c0dbf23cc7431f60d4163757fb9896cf870839c25777120d1c141063992022-07-19 3:03:12322 days 14 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x2deff6e90565ae47a3b6b64778888f9c2d3aef89dcac80968fb7cb01228ed475128899312022-05-08 16:47:04394 days 49 mins ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xc8b0380ee7ce578081b497fa265dac1b0618a0387f91f3a3a041f8fc80842c44128898282022-05-08 16:38:29394 days 58 mins ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x6cd4dafe03068c68836e01aeca38726f01f406c65524338f0b60347dddc92ca2128897222022-05-08 16:29:39394 days 1 hr ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x5ebb2157aab8129635311f9ae6b63987638df72f9e898b35a47188b12cc0fa87128021422022-05-03 14:51:13399 days 2 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xba5d16832d1d62db7f483b105d91a09105e4e8a662b6cb64ff857e7e1613dc1b127529002022-04-30 18:27:41401 days 23 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xb8fd5eac385cbd44ef45c5d50a741eb60bce46b98ec03e9e7d117790898aecb9127527482022-04-30 18:15:01401 days 23 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0xd5fe0f4435cfeb4dd3e2c24b66b75abf8b999b4073dcc8c564cc9cdf3f37d316127526612022-04-30 18:07:46401 days 23 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x62086fd2fb2c78b662bd1c7bc674c1f98cdc871447d49e08ecbcef1a01b15931127525022022-04-30 17:54:31401 days 23 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
0x5ed994ca638c8537fa18ff4450b3cdb58ef8365e9921abf8e3ee1f00a59c2453127524882022-04-30 17:53:21401 days 23 hrs ago 0x78491c44fc63067b19e1ba4eef379f358123b552  Contract Creation0 CELO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PadiFactory

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 50 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at celoscan.io on 2022-07-19
*/

pragma solidity =0.5.16;


interface IPadiFactory {
    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;
}

interface IPadiPair {
    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;
}

interface IPadiERC20 {
    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;
}

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}

contract PadiERC20 is IPadiERC20 {
    using SafeMath for uint;

    string public constant name = 'PadiSwap LPs';
    string public constant symbol = 'PADI-LP';
    uint8 public constant decimals = 18;
    uint  public totalSupply;
    mapping(address => uint) public balanceOf;
    mapping(address => mapping(address => uint)) public allowance;

    bytes32 public DOMAIN_SEPARATOR;
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint) public nonces;

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

    constructor() public {
        uint chainId;
        assembly {
            chainId := chainid
        }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes(name)),
                keccak256(bytes('1')),
                chainId,
                address(this)
            )
        );
    }

    function _mint(address to, uint value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint value) internal {
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(address owner, address spender, uint value) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(address from, address to, uint value) private {
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function approve(address spender, uint value) external returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint value) external returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint value) external returns (bool) {
        if (allowance[from][msg.sender] != uint(-1)) {
            allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        require(deadline >= block.timestamp, 'Padi: EXPIRED');
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'Padi: INVALID_SIGNATURE');
        _approve(owner, spender, value);
    }
}

// a library for performing various math operations
library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
// range: [0, 2**112 - 1]
// resolution: 1 / 2**112
library UQ112x112 {
    uint224 constant Q112 = 2**112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; // never overflows
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}

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

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view 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);
}

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

contract PadiPair is IPadiPair, PadiERC20 {
    using SafeMath  for uint;
    using UQ112x112 for uint224;

    uint public constant MINIMUM_LIQUIDITY = 10**3;
    bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));

    address public factory;
    address public token0;
    address public token1;

    uint112 private reserve0;           // uses single storage slot, accessible via getReserves
    uint112 private reserve1;           // uses single storage slot, accessible via getReserves
    uint32  private blockTimestampLast; // uses single storage slot, accessible via getReserves

    uint public price0CumulativeLast;
    uint public price1CumulativeLast;
    uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event

    uint private unlocked = 1;
    modifier lock() {
        require(unlocked == 1, 'Padi: LOCKED');
        unlocked = 0;
        _;
        unlocked = 1;
    }

    function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
        _blockTimestampLast = blockTimestampLast;
    }

    function _safeTransfer(address token, address to, uint value) private {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'Padi: TRANSFER_FAILED');
    }

    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);

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

    // called once by the factory at time of deployment
    function initialize(address _token0, address _token1) external {
        require(msg.sender == factory, 'Padi: FORBIDDEN'); // sufficient check
        token0 = _token0;
        token1 = _token1;
    }

    // update reserves and, on the first call per block, price accumulators
    function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
        require(balance0 <= uint112(-1) && balance1 <= uint112(-1), 'Padi: OVERFLOW');
        uint32 blockTimestamp = uint32(block.timestamp % 2**32);
        uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
        if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
            // * never overflows, and + overflow is desired
            price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
            price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
        }
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
        blockTimestampLast = blockTimestamp;
        emit Sync(reserve0, reserve1);
    }

    // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)
    function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) {
        address feeTo = IPadiFactory(factory).feeTo();
        feeOn = feeTo != address(0);
        uint _kLast = kLast; // gas savings
        if (feeOn) {
            if (_kLast != 0) {
                uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1));
                uint rootKLast = Math.sqrt(_kLast);
                if (rootK > rootKLast) {
                    uint numerator = totalSupply.mul(rootK.sub(rootKLast));
                    uint denominator = rootK.mul(3).add(rootKLast);
                    uint liquidity = numerator / denominator;
                    if (liquidity > 0) _mint(feeTo, liquidity);
                }
            }
        } else if (_kLast != 0) {
            kLast = 0;
        }
    }

    // this low-level function should be called from a contract which performs important safety checks
    function mint(address to) external lock returns (uint liquidity) {
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        uint balance0 = IERC20(token0).balanceOf(address(this));
        uint balance1 = IERC20(token1).balanceOf(address(this));
        uint amount0 = balance0.sub(_reserve0);
        uint amount1 = balance1.sub(_reserve1);

        bool feeOn = _mintFee(_reserve0, _reserve1);
        uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        if (_totalSupply == 0) {
            liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
           _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
        } else {
            liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
        }
        require(liquidity > 0, 'Padi: INSUFFICIENT_LIQUIDITY_MINTED');
        _mint(to, liquidity);

        _update(balance0, balance1, _reserve0, _reserve1);
        if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
        emit Mint(msg.sender, amount0, amount1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function burn(address to) external lock returns (uint amount0, uint amount1) {
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        address _token0 = token0;                                // gas savings
        address _token1 = token1;                                // gas savings
        uint balance0 = IERC20(_token0).balanceOf(address(this));
        uint balance1 = IERC20(_token1).balanceOf(address(this));
        uint liquidity = balanceOf[address(this)];

        bool feeOn = _mintFee(_reserve0, _reserve1);
        uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
        amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
        require(amount0 > 0 && amount1 > 0, 'Padi: INSUFFICIENT_LIQUIDITY_BURNED');
        _burn(address(this), liquidity);
        _safeTransfer(_token0, to, amount0);
        _safeTransfer(_token1, to, amount1);
        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));

        _update(balance0, balance1, _reserve0, _reserve1);
        if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
        emit Burn(msg.sender, amount0, amount1, to);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {
        require(amount0Out > 0 || amount1Out > 0, 'Padi: INSUFFICIENT_OUTPUT_AMOUNT');
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        require(amount0Out < _reserve0 && amount1Out < _reserve1, 'Padi: INSUFFICIENT_LIQUIDITY');

        uint balance0;
        uint balance1;
        { // scope for _token{0,1}, avoids stack too deep errors
        address _token0 = token0;
        address _token1 = token1;
        require(to != _token0 && to != _token1, 'Padi: INVALID_TO');
        if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
        if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
        if (data.length > 0) IPadiCallee(to).pantherCall(msg.sender, amount0Out, amount1Out, data);
        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));
        }
        uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
        uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
        require(amount0In > 0 || amount1In > 0, 'Padi: INSUFFICIENT_INPUT_AMOUNT');
        { // scope for reserve{0,1}Adjusted, avoids stack too deep errors
        uint balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(2));
        uint balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(2));
        require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'Padi: K');
        }

        _update(balance0, balance1, _reserve0, _reserve1);
        emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
    }

    // force balances to match reserves
    function skim(address to) external lock {
        address _token0 = token0; // gas savings
        address _token1 = token1; // gas savings
        _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));
        _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));
    }

    // force reserves to match balances
    function sync() external lock {
        _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);
    }
}

contract PadiFactory is IPadiFactory {
    bytes32 public constant INIT_CODE_PAIR_HASH = keccak256(abi.encodePacked(type(PadiPair).creationCode));

    address public feeTo;
    address public feeToSetter;

    mapping(address => mapping(address => address)) public getPair;
    address[] public allPairs;

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

    constructor(address _feeToSetter) public {
        feeToSetter = _feeToSetter;
    }

    function allPairsLength() external view returns (uint) {
        return allPairs.length;
    }

    function createPair(address tokenA, address tokenB) external returns (address pair) {
        require(tokenA != tokenB, 'Padi: IDENTICAL_ADDRESSES');
        (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'Padi: ZERO_ADDRESS');
        require(getPair[token0][token1] == address(0), 'Padi: PAIR_EXISTS'); // single check is sufficient
        bytes memory bytecode = type(PadiPair).creationCode;
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));
        assembly {
            pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
        }
        IPadiPair(pair).initialize(token0, token1);
        getPair[token0][token1] = pair;
        getPair[token1][token0] = pair; // populate mapping in the reverse direction
        allPairs.push(pair);
        emit PairCreated(token0, token1, pair, allPairs.length);
    }

    function setFeeTo(address _feeTo) external {
        require(msg.sender == feeToSetter, 'Padi: FORBIDDEN');
        feeTo = _feeTo;
    }

    function setFeeToSetter(address _feeToSetter) external {
        require(msg.sender == feeToSetter, 'Padi: FORBIDDEN');
        feeToSetter = _feeToSetter;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"constant":true,"inputs":[],"name":"INIT_CODE_PAIR_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"name":"setFeeToSetter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051612a3a380380612a3a8339818101604052602081101561003357600080fd5b5051600180546001600160a01b0319166001600160a01b039092169190911790556129d7806100636000396000f3fe608060405234801561001057600080fd5b50600436106100835760003560e01c8063017e7e5814610088578063094b7415146100ac5780631e3dd18b146100b4578063574f2ba3146100d15780635855a25a146100eb578063a2e74af6146100f3578063c9c653961461011b578063e6a4390514610149578063f46901ed14610177575b600080fd5b61009061019d565b604080516001600160a01b039092168252519081900360200190f35b6100906101ac565b610090600480360360208110156100ca57600080fd5b50356101bb565b6100d96101e2565b60408051918252519081900360200190f35b6100d96101e8565b6101196004803603602081101561010957600080fd5b50356001600160a01b031661027b565b005b6100906004803603604081101561013157600080fd5b506001600160a01b03813581169160200135166102ee565b6100906004803603604081101561015f57600080fd5b506001600160a01b038135811691602001351661060b565b6101196004803603602081101561018d57600080fd5b50356001600160a01b0316610631565b6000546001600160a01b031681565b6001546001600160a01b031681565b600381815481106101c857fe5b6000918252602090912001546001600160a01b0316905081565b60035490565b6040516101f7602082016106a4565b6020820181038252601f19601f820116604052506040516020018082805190602001908083835b6020831061023d5780518252601f19909201916020918201910161021e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b6001546001600160a01b031633146102cc576040805162461bcd60e51b815260206004820152600f60248201526e2830b2349d102327a92124a22222a760891b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000816001600160a01b0316836001600160a01b03161415610353576040805162461bcd60e51b8152602060048201526019602482015278506164693a204944454e544943414c5f41444452455353455360381b604482015290519081900360640190fd5b600080836001600160a01b0316856001600160a01b031610610376578385610379565b84845b90925090506001600160a01b0382166103ce576040805162461bcd60e51b8152602060048201526012602482015271506164693a205a45524f5f4144445245535360701b604482015290519081900360640190fd5b6001600160a01b0382811660009081526002602090815260408083208585168452909152902054161561043c576040805162461bcd60e51b8152602060048201526011602482015270506164693a20504149525f45584953545360781b604482015290519081900360640190fd5b60606040518060200161044e906106a4565b6020820181038252601f19601f8201166040525090506000838360405160200180836001600160a01b03166001600160a01b031660601b8152601401826001600160a01b03166001600160a01b031660601b815260140192505050604051602081830303815290604052805190602001209050808251602084016000f56040805163485cc95560e01b81526001600160a01b038781166004830152868116602483015291519297509087169163485cc9559160448082019260009290919082900301818387803b15801561052157600080fd5b505af1158015610535573d6000803e3d6000fd5b505050506001600160a01b0384811660008181526002602081815260408084208987168086529083528185208054978d166001600160a01b031998891681179091559383528185208686528352818520805488168517905560038054600181018255958190527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90950180549097168417909655925483519283529082015281517f0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9929181900390910190a35050505092915050565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b6001546001600160a01b03163314610682576040805162461bcd60e51b815260206004820152600f60248201526e2830b2349d102327a92124a22222a760891b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6122f1806106b28339019056fe60806040526001600c5534801561001557600080fd5b50604051469080605261229f8239604080519182900360520182208282018252600c83526b5061646953776170204c507360a01b6020938401528151808301835260018152603160f81b908401528151808401919091527f80deb7d82d41500082fd3de3280f94452b9c015c226c43882cd6878ed011d0a2818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101949094523060a0808601919091528151808603909101815260c09094019052825192019190912060035550600580546001600160a01b03191633179055612198806101076000396000f3fe608060405234801561001057600080fd5b50600436106101595760003560e01c80636a627842116100c95780636a627842146103bf57806370a08231146103e55780637464fc3d1461040b5780637ecebe001461041357806389afcb441461043957806395d89b4114610478578063a9059cbb14610480578063ba9a7a56146104ac578063bc25cf77146104b4578063c45a0155146104da578063d21220a7146104e2578063d505accf146104ea578063dd62ed3e1461053b578063fff6cae91461056957610159565b8063022c0d9f1461015e57806306fdde03146101ea5780630902f1ac14610267578063095ea7b31461029f5780630dfe1681146102df57806318160ddd1461030357806323b872dd1461031d57806330adf81f14610353578063313ce5671461035b5780633644e51514610379578063485cc955146103815780635909c0d5146103af5780635a3d5493146103b7575b600080fd5b6101e86004803603608081101561017457600080fd5b8135916020810135916001600160a01b036040830135169190810190608081016060820135600160201b8111156101aa57600080fd5b8201836020820111156101bc57600080fd5b803590602001918460018302840111600160201b831117156101dd57600080fd5b509092509050610571565b005b6101f2610adf565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561022c578181015183820152602001610214565b50505050905090810190601f1680156102595780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61026f610b07565b604080516001600160701b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b6102cb600480360360408110156102b557600080fd5b506001600160a01b038135169060200135610b31565b604080519115158252519081900360200190f35b6102e7610b48565b604080516001600160a01b039092168252519081900360200190f35b61030b610b57565b60408051918252519081900360200190f35b6102cb6004803603606081101561033357600080fd5b506001600160a01b03813581169160208101359091169060400135610b5d565b61030b610bf7565b610363610c1b565b6040805160ff9092168252519081900360200190f35b61030b610c20565b6101e86004803603604081101561039757600080fd5b506001600160a01b0381358116916020013516610c26565b61030b610ca5565b61030b610cab565b61030b600480360360208110156103d557600080fd5b50356001600160a01b0316610cb1565b61030b600480360360208110156103fb57600080fd5b50356001600160a01b0316610fac565b61030b610fbe565b61030b6004803603602081101561042957600080fd5b50356001600160a01b0316610fc4565b61045f6004803603602081101561044f57600080fd5b50356001600160a01b0316610fd6565b6040805192835260208301919091528051918290030190f35b6101f2611377565b6102cb6004803603604081101561049657600080fd5b506001600160a01b03813516906020013561139a565b61030b6113a7565b6101e8600480360360208110156104ca57600080fd5b50356001600160a01b03166113ad565b6102e7611513565b6102e7611522565b6101e8600480360360e081101561050057600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611531565b61030b6004803603604081101561055157600080fd5b506001600160a01b0381358116916020013516611728565b6101e8611745565b600c546001146105b7576040805162461bcd60e51b815260206004820152600c60248201526b1418591a4e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600c55841515806105ca5750600084115b61061b576040805162461bcd60e51b815260206004820181905260248201527f506164693a20494e53554646494349454e545f4f55545055545f414d4f554e54604482015290519081900360640190fd5b600080610626610b07565b5091509150816001600160701b03168710801561064b5750806001600160701b031686105b61069c576040805162461bcd60e51b815260206004820152601c60248201527f506164693a20494e53554646494349454e545f4c495155494449545900000000604482015290519081900360640190fd5b60065460075460009182916001600160a01b039182169190811690891682148015906106da5750806001600160a01b0316896001600160a01b031614155b61071e576040805162461bcd60e51b815260206004820152601060248201526f506164693a20494e56414c49445f544f60801b604482015290519081900360640190fd5b8a1561072f5761072f828a8d6118a2565b891561074057610740818a8c6118a2565b86156107fb57886001600160a01b0316631c8f37b3338d8d8c8c6040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b1580156107e257600080fd5b505af11580156107f6573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561084157600080fd5b505afa158015610855573d6000803e3d6000fd5b505050506040513d602081101561086b57600080fd5b5051604080516370a0823160e01b815230600482015290519195506001600160a01b038316916370a0823191602480820192602092909190829003018186803b1580156108b757600080fd5b505afa1580156108cb573d6000803e3d6000fd5b505050506040513d60208110156108e157600080fd5b5051925060009150506001600160701b0385168a90038311610904576000610913565b89856001600160701b03160383035b9050600089856001600160701b031603831161093057600061093f565b89856001600160701b03160383035b905060008211806109505750600081115b6109a1576040805162461bcd60e51b815260206004820152601f60248201527f506164693a20494e53554646494349454e545f494e5055545f414d4f554e5400604482015290519081900360640190fd5b60006109d56109b784600263ffffffff611a3016565b6109c9876103e863ffffffff611a3016565b9063ffffffff611a9316565b905060006109ed6109b784600263ffffffff611a3016565b9050610a1e620f4240610a126001600160701b038b8116908b1663ffffffff611a3016565b9063ffffffff611a3016565b610a2e838363ffffffff611a3016565b1015610a6b576040805162461bcd60e51b8152602060048201526007602482015266506164693a204b60c81b604482015290519081900360640190fd5b5050610a7984848888611ae3565b60408051838152602081018390528082018d9052606081018c905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600c55505050505050505050565b6040518060400160405280600c81526020016b5061646953776170204c507360a01b81525081565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b6000610b3e338484611c95565b5060015b92915050565b6006546001600160a01b031681565b60005481565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610be2576001600160a01b0384166000908152600260209081526040808320338452909152902054610bbd908363ffffffff611a9316565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610bed848484611cf7565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b6005546001600160a01b03163314610c77576040805162461bcd60e51b815260206004820152600f60248201526e2830b2349d102327a92124a22222a760891b604482015290519081900360640190fd5b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b60095481565b600a5481565b6000600c54600114610cf9576040805162461bcd60e51b815260206004820152600c60248201526b1418591a4e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600c81905580610d09610b07565b50600654604080516370a0823160e01b815230600482015290519395509193506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d6020811015610d8757600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610dda57600080fd5b505afa158015610dee573d6000803e3d6000fd5b505050506040513d6020811015610e0457600080fd5b505190506000610e23836001600160701b03871663ffffffff611a9316565b90506000610e40836001600160701b03871663ffffffff611a9316565b90506000610e4e8787611d9f565b60005490915080610e8b57610e776103e86109c9610e72878763ffffffff611a3016565b611efd565b9850610e8660006103e8611f4f565b610eda565b610ed76001600160701b038916610ea8868463ffffffff611a3016565b81610eaf57fe5b046001600160701b038916610eca868563ffffffff611a3016565b81610ed157fe5b04611fd3565b98505b60008911610f195760405162461bcd60e51b81526004018080602001828103825260238152602001806121416023913960400191505060405180910390fd5b610f238a8a611f4f565b610f2f86868a8a611ae3565b8115610f5f57600854610f5b906001600160701b0380821691600160701b90041663ffffffff611a3016565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600c5550949695505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600c5460011461101f576040805162461bcd60e51b815260206004820152600c60248201526b1418591a4e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600c8190558061102f610b07565b50600654600754604080516370a0823160e01b815230600482015290519496509294506001600160a01b039182169391169160009184916370a08231916024808301926020929190829003018186803b15801561108b57600080fd5b505afa15801561109f573d6000803e3d6000fd5b505050506040513d60208110156110b557600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561110357600080fd5b505afa158015611117573d6000803e3d6000fd5b505050506040513d602081101561112d57600080fd5b50513060009081526001602052604081205491925061114c8888611d9f565b60005490915080611163848763ffffffff611a3016565b8161116a57fe5b049a508061117e848663ffffffff611a3016565b8161118557fe5b04995060008b118015611198575060008a115b6111d35760405162461bcd60e51b815260040180806020018281038252602381526020018061211e6023913960400191505060405180910390fd5b6111dd3084611feb565b6111e8878d8d6118a2565b6111f3868d8c6118a2565b604080516370a0823160e01b815230600482015290516001600160a01b038916916370a08231916024808301926020929190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d602081101561126357600080fd5b5051604080516370a0823160e01b815230600482015290519196506001600160a01b038816916370a0823191602480820192602092909190829003018186803b1580156112af57600080fd5b505afa1580156112c3573d6000803e3d6000fd5b505050506040513d60208110156112d957600080fd5b505193506112e985858b8b611ae3565b811561131957600854611315906001600160701b0380821691600160701b90041663ffffffff611a3016565b600b555b604080518c8152602081018c905281516001600160a01b038f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600c81905550915091565b604051806040016040528060078152602001660504144492d4c560cc1b81525081565b6000610b3e338484611cf7565b6103e881565b600c546001146113f3576040805162461bcd60e51b815260206004820152600c60248201526b1418591a4e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600c55600654600754600854604080516370a0823160e01b815230600482015290516001600160a01b0394851694909316926114a2928592879261149d926001600160701b03169185916370a0823191602480820192602092909190829003018186803b15801561146557600080fd5b505afa158015611479573d6000803e3d6000fd5b505050506040513d602081101561148f57600080fd5b50519063ffffffff611a9316565b6118a2565b600854604080516370a0823160e01b81523060048201529051611509928492879261149d92600160701b90046001600160701b0316916001600160a01b038616916370a0823191602480820192602092909190829003018186803b15801561146557600080fd5b50506001600c5550565b6005546001600160a01b031681565b6007546001600160a01b031681565b42841015611576576040805162461bcd60e51b815260206004820152600d60248201526c1418591a4e8811561412549151609a1b604482015290519081900360640190fd5b6003546001600160a01b0380891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015611691573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906116c75750886001600160a01b0316816001600160a01b0316145b611712576040805162461bcd60e51b8152602060048201526017602482015276506164693a20494e56414c49445f5349474e415455524560481b604482015290519081900360640190fd5b61171d898989611c95565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600c5460011461178b576040805162461bcd60e51b815260206004820152600c60248201526b1418591a4e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600c55600654604080516370a0823160e01b8152306004820152905161189b926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156117dc57600080fd5b505afa1580156117f0573d6000803e3d6000fd5b505050506040513d602081101561180657600080fd5b5051600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561185357600080fd5b505afa158015611867573d6000803e3d6000fd5b505050506040513d602081101561187d57600080fd5b50516008546001600160701b0380821691600160701b900416611ae3565b6001600c55565b60408051808201825260198152787472616e7366657228616464726573732c75696e743235362960381b60209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b1781529251815160009460609489169392918291908083835b6020831061194b5780518252601f19909201916020918201910161192c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146119ad576040519150601f19603f3d011682016040523d82523d6000602084013e6119b2565b606091505b50915091508180156119e05750805115806119e057508080602001905160208110156119dd57600080fd5b50515b611a29576040805162461bcd60e51b81526020600482015260156024820152741418591a4e881514905394d1915497d19052531151605a1b604482015290519081900360640190fd5b5050505050565b6000811580611a4b57505080820282828281611a4857fe5b04145b610b42576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820382811115610b42576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6001600160701b038411801590611b0157506001600160701b038311155b611b43576040805162461bcd60e51b815260206004820152600e60248201526d506164693a204f564552464c4f5760901b604482015290519081900360640190fd5b60085463ffffffff42811691600160e01b90048116820390811615801590611b7357506001600160701b03841615155b8015611b8757506001600160701b03831615155b15611bf8578063ffffffff16611bb585611ba086612077565b6001600160e01b03169063ffffffff61208916565b600980546001600160e01b03929092169290920201905563ffffffff8116611be084611ba087612077565b600a80546001600160e01b0392909216929092020190555b600880546001600160701b0319166001600160701b0388811691909117600160701b600160e01b031916600160701b8883168102919091176001600160e01b0316600160e01b63ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316600090815260016020526040902054611d20908263ffffffff611a9316565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611d55908263ffffffff6120ae16565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716926000805160206120fe83398151915292918290030190a3505050565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015611df057600080fd5b505afa158015611e04573d6000803e3d6000fd5b505050506040513d6020811015611e1a57600080fd5b5051600b546001600160a01b038216158015945091925090611ee9578015611ee4576000611e5d610e726001600160701b0388811690881663ffffffff611a3016565b90506000611e6a83611efd565b905080821115611ee1576000611e98611e89848463ffffffff611a9316565b6000549063ffffffff611a3016565b90506000611ebd83611eb186600363ffffffff611a3016565b9063ffffffff6120ae16565b90506000818381611eca57fe5b0490508015611edd57611edd8782611f4f565b5050505b50505b611ef5565b8015611ef5576000600b555b505092915050565b60006003821115611f40575080600160028204015b81811015611f3a57809150600281828581611f2957fe5b040181611f3257fe5b049050611f12565b50611f4a565b8115611f4a575060015b919050565b600054611f62908263ffffffff6120ae16565b60009081556001600160a01b038316815260016020526040902054611f8d908263ffffffff6120ae16565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391926000805160206120fe8339815191529281900390910190a35050565b6000818310611fe25781611fe4565b825b9392505050565b6001600160a01b038216600090815260016020526040902054612014908263ffffffff611a9316565b6001600160a01b03831660009081526001602052604081209190915554612041908263ffffffff611a9316565b60009081556040805183815290516001600160a01b038516916000805160206120fe833981519152919081900360200190a35050565b6001600160701b0316600160701b0290565b60006001600160701b0382166001600160e01b038416816120a657fe5b049392505050565b80820182811015610b42576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef506164693a20494e53554646494349454e545f4c49515549444954595f4255524e4544506164693a20494e53554646494349454e545f4c49515549444954595f4d494e544544a265627a7a72315820f206a1c4e079842693f89df3c5f61d70fcb6df34f92b2de7fa11e3ce9c986c8264736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429a265627a7a72315820b50b1bf2240e794d5ef6225241ae7d1895fb107cbbf184deb321bd4c3236ef5c64736f6c634300051000320000000000000000000000007e31af176da39a9986c8f5c7632178b4acf0c868

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

0000000000000000000000007e31af176da39a9986c8f5c7632178b4acf0c868

-----Decoded View---------------
Arg [0] : _feeToSetter (address): 0x7e31af176da39a9986c8f5c7632178b4acf0c868

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


Deployed ByteCode Sourcemap

19937:1873:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19937:1873:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20092:20;;;:::i;:::-;;;;-1:-1:-1;;;;;20092:20:0;;;;;;;;;;;;;;20119:26;;;:::i;20223:25::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20223:25:0;;:::i;20445:96::-;;;:::i;:::-;;;;;;;;;;;;;;;;19981:102;;;:::i;21643:164::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21643:164:0;-1:-1:-1;;;;;21643:164:0;;:::i;:::-;;20549:938;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20549:938:0;;;;;;;;;;:::i;20154:62::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20154:62:0;;;;;;;;;;:::i;21495:140::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21495:140:0;-1:-1:-1;;;;;21495:140:0;;:::i;20092:20::-;;;-1:-1:-1;;;;;20092:20:0;;:::o;20119:26::-;;;-1:-1:-1;;;;;20119:26:0;;:::o;20223:25::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20223:25:0;;-1:-1:-1;20223:25:0;:::o;20445:96::-;20518:8;:15;20445:96;:::o;19981:102::-;20054:27;;;;;;;:::i;:::-;41:4:-1;34:5;30:16;25:3;21:26;14:5;7:41;87:2;83:7;78:2;73:3;69:12;65:26;61:2;54:38;20054:27:0;20037:45;;;;;;;;;;;;;;;36:153:-1;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;;;20037:45:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20037:45:0;;;20027:56;;;;;;19981:102;:::o;21643:164::-;21731:11;;-1:-1:-1;;;;;21731:11:0;21717:10;:25;21709:53;;;;;-1:-1:-1;;;21709:53:0;;;;;;;;;;;;-1:-1:-1;;;21709:53:0;;;;;;;;;;;;;;;21773:11;:26;;-1:-1:-1;;;;;;21773:26:0;-1:-1:-1;;;;;21773:26:0;;;;;;;;;;21643:164::o;20549:938::-;20619:12;20662:6;-1:-1:-1;;;;;20652:16:0;:6;-1:-1:-1;;;;;20652:16:0;;;20644:54;;;;;-1:-1:-1;;;20644:54:0;;;;;;;;;;;;-1:-1:-1;;;20644:54:0;;;;;;;;;;;;;;;20710:14;20726;20753:6;-1:-1:-1;;;;;20744:15:0;:6;-1:-1:-1;;;;;20744:15:0;;:53;;20782:6;20790;20744:53;;;20763:6;20771;20744:53;20709:88;;-1:-1:-1;20709:88:0;-1:-1:-1;;;;;;20816:20:0;;20808:51;;;;;-1:-1:-1;;;20808:51:0;;;;;;;;;;;;-1:-1:-1;;;20808:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20878:15:0;;;20913:1;20878:15;;;:7;:15;;;;;;;;:23;;;;;;;;;;;;:37;20870:67;;;;;-1:-1:-1;;;20870:67:0;;;;;;;;;;;;-1:-1:-1;;;20870:67:0;;;;;;;;;;;;;;;20978:21;21002:27;;;;;;;;:::i;:::-;41:4:-1;34:5;30:16;25:3;21:26;14:5;7:41;87:2;83:7;78:2;73:3;69:12;65:26;61:2;54:38;21002:27:0;20978:51;;21040:12;21082:6;21090;21065:32;;;;;;-1:-1:-1;;;;;21065:32:0;-1:-1:-1;;;;;21065:32:0;;;;;;;;-1:-1:-1;;;;;21065:32:0;-1:-1:-1;;;;;21065:32:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21065:32:0;;;21055:43;;;;;;21040:58;;21188:4;21177:8;21171:15;21166:2;21156:8;21152:17;21149:1;21141:52;21214:42;;;-1:-1:-1;;;21214:42:0;;-1:-1:-1;;;;;21214:42:0;;;;;;;;;;;;;;;;21133:60;;-1:-1:-1;21214:26:0;;;;;;:42;;;;;-1:-1:-1;;21214:42:0;;;;;;;;-1:-1:-1;21214:26:0;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;21214:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;21267:15:0;;;;;;;:7;:15;;;;;;;;:23;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;;21267:30:0;;;;;;;;21308:15;;;;;;:23;;;;;;;;:30;;;;;;;;21394:8;27:10:-1;;-1:-1;23:18;;45:23;;21394:19:0;;;;;;;;;;;;;;;;;;21463:15;;21429:50;;;;;;;;;;;;;;;;;;;;;;20549:938;;;;;;;;:::o;20154:62::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20154:62:0;;:::o;21495:140::-;21571:11;;-1:-1:-1;;;;;21571:11:0;21557:10;:25;21549:53;;;;;-1:-1:-1;;;21549:53:0;;;;;;;;;;;;-1:-1:-1;;;21549:53:0;;;;;;;;;;;;;;;21613:5;:14;;-1:-1:-1;;;;;;21613:14:0;-1:-1:-1;;;;;21613:14:0;;;;;;;;;;21495:140::o;19937:1873::-;;;;;;;;:::o

Swarm Source

bzzr://b50b1bf2240e794d5ef6225241ae7d1895fb107cbbf184deb321bd4c3236ef5c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.