Contract 0x5b03f7c33a297afb2f2530b92abc81d6368306bf

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xe63c26770c5259e17fac1a31d3f7abed0d347c4323f31b1e2534f783a43aaab9Approve27199282022-10-07 0:23:00165 days 43 mins ago0x3a5d1766bd990e688ee012e3b17e943658c812c8 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0x13b8e72b00ecc740feca51bf1fb6c354b5be542f147ea38fe0e04ec27e04e4afApprove26986032022-10-03 22:40:48168 days 2 hrs ago0xdb8738166e0eaaddd2acbd50310298929c667261 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0x6648a4704feab8ffc0c5de3e77b9ed592dcd7e0bc1a76cbc1ba14224fc4f389aTransfer24044392022-08-19 3:46:12213 days 21 hrs ago0xa82ab0da757274c74f5ddc25096791f401b561bb IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.0000576275
0x5cfe75efe793f772cf0a932d98b4b10c7962aece7edfbc900b42a9f470ca1ab5Approve20224612022-06-14 21:26:00279 days 3 hrs ago0x6d7d2cc67f5da6587b65854a6cd5efd5d2867124 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000046328
0x822b05cd31f6da96a7c939827e36cdae74073b710ed5a7276a3883cd5e4e596eApprove18813892022-05-23 8:38:00301 days 16 hrs ago0xdb8738166e0eaaddd2acbd50310298929c667261 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0x35786bc914e144ec0b2a1906501b05b19efa8f343ee1b2299e157cc583346fc1Approve18715462022-05-21 18:44:42303 days 6 hrs ago0x22e4dab44374c25b2f954b4a6d50a0735df28390 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0x60f9fee6ad45eeefd52b8ce6191f3747a9c6598dde1c1f7b4b21e6874612890dApprove17518112022-04-27 9:40:30327 days 15 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000046304057
0x9f30b1f3aedd06b1e6b40fed20a515dd7b5dadfb491523cddb28942fada57b22Approve17320142022-04-22 2:34:00332 days 22 hrs ago0x34149eddda4c102b9e747f284b7e648a85331fe3 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0xff5e8eda297d2a96be85c621b31915b59a674283fdd4d44bfb32136d628ef409Approve15477742022-03-03 1:59:24382 days 23 hrs ago0xbe16892ed5185cbd69f3f2708de5263645240a65 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000185312
0x3b57ca5962325f90b68c9c60f4a5f36b0520b3d9915f108b0ac725dcdfa6798cApprove15219252022-02-24 16:48:30389 days 8 hrs ago0x2891a7a312a721b81c1eb1285619ef653c04fadb IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0x87365e7adb8ce956427527d7d5e9a30c3eb171821dda2971ce9e1c0f8a9268a0Approve15079222022-02-20 17:57:00393 days 7 hrs ago0xa9ca0cb73ddc610abbae9dcd126c3dfe63cc7872 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000079284
0x0d5fb03c97adc6643d3b166ecca6d3d77a56427bf4994cfe196297a0de6ccf6cApprove15079212022-02-20 17:56:42393 days 7 hrs ago0xa9ca0cb73ddc610abbae9dcd126c3dfe63cc7872 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0x5e8de799f4e5bc3566349b1f186488001f91b7240ebcf9f7eccf112f49ad909dApprove14999832022-02-18 17:01:48395 days 8 hrs ago0xc5a59813ff091096f6753eec6baffab437654c88 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0x7278156f4339f4560604105f8246122f52d275ea222269a9b1f3dc7f80cab1d1Approve14960462022-02-17 17:12:18396 days 7 hrs ago0x1050c43335344ad328b96fc835463126de993c2f IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0x2a0489820989cd6e8ed79a7fb6cbd3c1aa46cba22e91d91067c9a8ffa5f72f8eApprove14883772022-02-15 20:07:42398 days 4 hrs ago0x1ec83f24f016e6b455002f15e5a6933e9f199fcd IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000138984
0x36f05b29a5a4d18ec12da92a2dd0b2a66856e5c480406e91622db84159dbaf04Approve14704612022-02-11 9:53:36402 days 15 hrs ago0xa82ab0da757274c74f5ddc25096791f401b561bb IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000010131
0x15529b1a58555b4a7fbaaf2024686d8efbf0a2183f7b452c389799d777da23d6Approve14569432022-02-08 6:41:30405 days 18 hrs ago0x64508804e6bf512640ccc8f26f47868667f40eeb IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000132684
0xeac90e0c339bb38eba0b19a0d534fd6f8e26893438fb1499196d658efe8550ecApprove14394022022-02-05 2:19:54408 days 22 hrs ago0xbd47a345cfa680ef97b2fdcc2801cf9bc41b3cfd IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000132684
0xc16049a00f8f97990b1081fb8f3f5f4f7f2ff31773e9ca0a3ae94383508cd527Approve14239682022-02-02 18:45:30411 days 6 hrs ago0xdf79e89fecce4a9bb49ee583ad46ebfbcc60ff3f IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000132684
0x9fed1dffd56980c746d2241e126c183a90ee02b865d7660588b1a58658a95013Approve13849722022-01-28 0:15:06417 days 51 mins ago0x3a5d1766bd990e688ee012e3b17e943658c812c8 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000132684
0x66b227d64808707dd900331d1eef730412a7197eca3081ac9f30c1b89fe86d17Approve13792642022-01-27 3:43:12417 days 21 hrs ago0x7bba80e55fed1812974ea0db50e58d3f82348c1b IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000132684
0xeeaea09c0642073b54c9ca90945fcbe8aead87ea9a4b884bc6512f1384bebcb4Approve13716922022-01-26 0:33:48419 days 32 mins ago0x81ba941be7071c1a6e6d32ae3b4542e0cdabb50f IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000132684
0xa7fff0925d508973583f41cb70bb3c9eaf62cf618623b943e469d115fa0257bfApprove13700152022-01-25 18:34:30419 days 6 hrs ago0xe724ef0cdecbe7488f054e85e10d69520e2df3b6 IN  0x5b03f7c33a297afb2f2530b92abc81d6368306bf0 MOVR0.000132684
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x91a5b62b8a385b924b0fdb1c26d62c8a4c0174c0c6afd568a215b83f1db5152513687372022-01-25 13:57:48419 days 11 hrs ago 0xf36ae63d89983e3aea8aaad1086c3280eb01438d  Contract Creation0 MOVR
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xd0a57f59a7ff9cb61e64fefc987245ffb1f963ea

Contract Name:
Pair

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonriver.moonscan.io on 2022-02-04
*/

// File: contracts/libraries/UQ112x112.sol



pragma solidity >=0.8.0;

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

// File: contracts/libraries/Math.sol



pragma solidity >=0.8.0;

// a library for performing various math operations

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

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

    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

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

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

// File: contracts/core/interfaces/IFactory.sol



pragma solidity >=0.8.0;

interface IFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );
    event PairCreateLocked(
        address indexed caller
    );
    event PairCreateUnlocked(
        address indexed caller
    );
    event BootstrapSetted(
        address indexed tokenA,
        address indexed tokenB,
        address indexed bootstrap
    );
    event FeetoUpdated(
        address indexed feeto
    );
    event FeeBasePointUpdated(
        uint8 basePoint
    );

    function feeto() external view returns (address);

    function feeBasePoint() external view returns (uint8);

    function lockForPairCreate() external view returns (bool);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
    
    function getBootstrap(address tokenA, address tokenB)
        external
        view
        returns (address bootstrap);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

// File: contracts/core/interfaces/IPair.sol



pragma solidity >=0.8.0;

interface IPair {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

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

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to
    ) external;

    function initialize(address, address) external;
}

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @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: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol



pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: contracts/core/Pair.sol



pragma solidity >=0.8.0;






contract Pair is IPair, ERC20 {
    using Math for uint256;
    uint256 public constant override MINIMUM_LIQUIDITY = 10**3;
    bytes4 private constant SELECTOR =
        bytes4(keccak256(bytes("transfer(address,uint256)")));

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

    uint112 private reserve0;
    uint112 private reserve1;
    uint256 public kLast;

    uint8 private unlocked = 1;

    modifier lock() {
        require(unlocked == 1, "LOCKED");
        unlocked = 0;
        _;
        unlocked = 1;
    }

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

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

    constructor() ERC20("Zenlink LP Token", "ZLK-LP") {
        factory = msg.sender;
    }

    function initialize(address _token0, address _token1) external override {
        require(msg.sender == factory, "Only called by factory");
        token0 = _token0;
        token1 = _token1;
    }

    function _mintFee(uint112 _reserve0, uint112 _reserve1)
        private
        returns (uint8 feeBasePoint)
    {
        address feeTo = IFactory(factory).feeto();
        feeBasePoint = IFactory(factory).feeBasePoint();
        uint256 _kLast = kLast; // gas savings
        if (feeBasePoint > 0) {
            if (_kLast != 0) {
                uint256 rootK = Math.sqrt(
                    uint256(_reserve0).mul(uint256(_reserve1))
                );
                uint256 rootKLast = Math.sqrt(_kLast);
                if (rootK > rootKLast) {
                    uint256 numerator = totalSupply().mul(rootK.sub(rootKLast));
                    uint256 denominator = (rootK.mul(30 - feeBasePoint) /
                        feeBasePoint).add(rootKLast);
                    uint256 liquidity = numerator / denominator;
                    if (liquidity > 0) _mint(feeTo, liquidity);
                }
            }
        } else if (_kLast != 0) {
            kLast = 0;
        }
    }

    function mint(address to)
        external
        override
        lock
        returns (uint256 liquidity)
    {
        (uint112 _reserve0, uint112 _reserve1) = getReserves();
        uint256 balance0 = IERC20(token0).balanceOf(address(this));
        uint256 balance1 = IERC20(token1).balanceOf(address(this));
        uint256 amount0 = balance0.sub(_reserve0);
        uint256 amount1 = balance1.sub(_reserve1);

        uint8 feeBasePoint = _mintFee(_reserve0, _reserve1);
        uint256 _totalSupply = totalSupply();
        if (_totalSupply == 0) {
            address feeTo = IFactory(factory).feeto();
            liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
            _mint(feeTo, MINIMUM_LIQUIDITY);
        } else {
            liquidity = Math.min(
                amount0.mul(_totalSupply) / _reserve0,
                amount1.mul(_totalSupply) / _reserve1
            );
        }
        require(liquidity > 0, "INSUFFICIENT_LIQUIDITY_MINTED");
        _mint(to, liquidity);

        _update(balance0, balance1);
        if (feeBasePoint > 0) kLast = uint256(reserve0).mul(reserve1);
        emit Mint(msg.sender, amount0, amount1);
    }

    function burn(address to)
        external
        override
        lock
        returns (uint256 amount0, uint256 amount1)
    {
        (uint112 _reserve0, uint112 _reserve1) = getReserves();
        address _token0 = token0;
        address _token1 = token1;
        uint256 balance0 = IERC20(_token0).balanceOf(address(this));
        uint256 balance1 = IERC20(_token1).balanceOf(address(this));
        uint256 liquidity = balanceOf(address(this));

        uint8 feeBasePoint = _mintFee(_reserve0, _reserve1);
        uint256 _totalSupply = totalSupply();
        amount0 = liquidity.mul(balance0) / _totalSupply;
        amount1 = liquidity.mul(balance1) / _totalSupply;
        require(amount0 > 0 && amount1 > 0, "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);
        if (feeBasePoint > 0) kLast = uint256(reserve0).mul(reserve1);
        emit Burn(msg.sender, amount0, amount1, to);
    }

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to
    ) external override lock {
        require(amount0Out > 0 || amount1Out > 0, "INSUFFICIENT_OUTPUT_AMOUNT");
        (uint112 _reserve0, uint112 _reserve1) = getReserves();
        require(
            amount0Out < _reserve0 && amount1Out < _reserve1,
            "INSUFFICIENT_LIQUIDITY"
        );

        uint256 balance0;
        uint256 balance1;
        {
            address _token0 = token0;
            address _token1 = token1;
            require(to != _token0 && to != _token1, "INVALID_TO");
            if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out);
            if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out);
            balance0 = IERC20(_token0).balanceOf(address(this));
            balance1 = IERC20(_token1).balanceOf(address(this));
        }
        uint256 amount0In = balance0 > _reserve0 - amount0Out
            ? balance0 - (_reserve0 - amount0Out)
            : 0;
        uint256 amount1In = balance1 > _reserve1 - amount1Out
            ? balance1 - (_reserve1 - amount1Out)
            : 0;
        require(amount0In > 0 || amount1In > 0, " INSUFFICIENT_INPUT_AMOUNT");
        {
            uint256 balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));
            uint256 balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));
            require(
                balance0Adjusted.mul(balance1Adjusted) >=
                    uint256(_reserve0).mul(_reserve1).mul(1000**2),
                "Pair: K"
            );
        }

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

    function _update(uint256 balance0, uint256 balance1) private {
        require(
            balance0 <= type(uint112).max && balance1 <= type(uint112).max,
            "OVERFLOW"
        );
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6080604052600a805460ff191660011790553480156200001e57600080fd5b50604080518082018252601081526f2d32b73634b735902628102a37b5b2b760811b60208083019182528351808501909452600684526505a4c4b2d4c560d41b9084015281519192916200007591600391620000a6565b5080516200008b906004906020840190620000a6565b5050600580546001600160a01b031916331790555062000189565b828054620000b4906200014c565b90600052602060002090601f016020900481019282620000d8576000855562000123565b82601f10620000f357805160ff191683800117855562000123565b8280016001018555821562000123579182015b828111156200012357825182559160200191906001019062000106565b506200013192915062000135565b5090565b5b8082111562000131576000815560010162000136565b600181811c908216806200016157607f821691505b602082108114156200018357634e487b7160e01b600052602260045260246000fd5b50919050565b611f7e80620001996000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80636d9a640a116100b8578063a457c2d71161007c578063a457c2d7146102b6578063a9059cbb146102c9578063ba9a7a56146102dc578063c45a0155146102e5578063d21220a7146102f8578063dd62ed3e1461030b57600080fd5b80636d9a640a1461024157806370a08231146102545780637464fc3d1461027d57806389afcb441461028657806395d89b41146102ae57600080fd5b806323b872dd116100ff57806323b872dd146101e4578063313ce567146101f75780633950935114610206578063485cc955146102195780636a6278421461022e57600080fd5b806306fdde031461013c5780630902f1ac1461015a578063095ea7b3146101845780630dfe1681146101a757806318160ddd146101d2575b600080fd5b610144610344565b6040516101519190611dd3565b60405180910390f35b600854604080516001600160701b038084168252600160701b909304909216602083015201610151565b610197610192366004611cf4565b6103d6565b6040519015158152602001610151565b6006546101ba906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b6002545b604051908152602001610151565b6101976101f2366004611cb3565b6103ed565b60405160128152602001610151565b610197610214366004611cf4565b61049c565b61022c610227366004611c7a565b6104d8565b005b6101d661023c366004611c40565b610559565b61022c61024f366004611d5b565b6108e0565b6101d6610262366004611c40565b6001600160a01b031660009081526020819052604090205490565b6101d660095481565b610299610294366004611c40565b610d6e565b60408051928352602083019190915201610151565b610144611131565b6101976102c4366004611cf4565b611140565b6101976102d7366004611cf4565b6111d9565b6101d66103e881565b6005546101ba906001600160a01b031681565b6007546101ba906001600160a01b031681565b6101d6610319366004611c7a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606003805461035390611ee5565b80601f016020809104026020016040519081016040528092919081815260200182805461037f90611ee5565b80156103cc5780601f106103a1576101008083540402835291602001916103cc565b820191906000526020600020905b8154815290600101906020018083116103af57829003601f168201915b5050505050905090565b60006103e33384846111e6565b5060015b92915050565b60006103fa84848461130b565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156104845760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61049185338584036111e6565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916103e39185906104d3908690611e26565b6111e6565b6005546001600160a01b0316331461052b5760405162461bcd60e51b81526020600482015260166024820152754f6e6c792063616c6c656420627920666163746f727960501b604482015260640161047b565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b600a5460009060ff166001146105815760405162461bcd60e51b815260040161047b90611e06565b600a805460ff191690556000806105ac6008546001600160701b0380821692600160701b9092041690565b6006546040516370a0823160e01b81523060048201529294509092506000916001600160a01b03909116906370a082319060240160206040518083038186803b1580156105f857600080fd5b505afa15801561060c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106309190611d42565b6007546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561067957600080fd5b505afa15801561068d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b19190611d42565b905060006106c8836001600160701b0387166114db565b905060006106df836001600160701b0387166114db565b905060006106ed8787611531565b905060006106fa60025490565b9050806107b25760055460408051632b8fc7cb60e21b815290516000926001600160a01b03169163ae3f1f2c916004808301926020929190829003018186803b15801561074657600080fd5b505afa15801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190611c5d565b905061079e6103e86107986107938888611714565b61177b565b906114db565b99506107ac816103e86117eb565b506107f9565b6107f66001600160701b0389166107c98684611714565b6107d39190611e3e565b6001600160701b0389166107e78685611714565b6107f19190611e3e565b6118ca565b98505b600089116108495760405162461bcd60e51b815260206004820152601d60248201527f494e53554646494349454e545f4c49515549444954595f4d494e544544000000604482015260640161047b565b6108538a8a6117eb565b61085d86866118e2565b60ff82161561088a57600854610886906001600160701b0380821691600160701b900416611714565b6009555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a25050600a805460ff1916600117905550949695505050505050565b600a5460ff166001146109055760405162461bcd60e51b815260040161047b90611e06565b600a805460ff191690558215158061091d5750600082115b6109695760405162461bcd60e51b815260206004820152601a60248201527f494e53554646494349454e545f4f55545055545f414d4f554e54000000000000604482015260640161047b565b60008061098a6008546001600160701b0380821692600160701b9092041690565b91509150816001600160701b0316851080156109ae5750806001600160701b031684105b6109f35760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b604482015260640161047b565b60065460075460009182916001600160a01b03918216919081169087168214801590610a315750806001600160a01b0316876001600160a01b031614155b610a6a5760405162461bcd60e51b815260206004820152600a602482015269494e56414c49445f544f60b01b604482015260640161047b565b8815610a7b57610a7b82888b611968565b8715610a8c57610a8c81888a611968565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015610acb57600080fd5b505afa158015610adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b039190611d42565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a082319060240160206040518083038186803b158015610b4557600080fd5b505afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611d42565b92505050600087856001600160701b0316610b989190611e7f565b8311610ba5576000610bc2565b610bb8886001600160701b038716611e7f565b610bc29084611e7f565b90506000610bd9886001600160701b038716611e7f565b8311610be6576000610c03565b610bf9886001600160701b038716611e7f565b610c039084611e7f565b90506000821180610c145750600081115b610c605760405162461bcd60e51b815260206004820152601a60248201527f20494e53554646494349454e545f494e5055545f414d4f554e54000000000000604482015260640161047b565b6000610c7c610c70846003611714565b610798876103e8611714565b90506000610c8e610c70846003611714565b9050610cb3620f4240610cad6001600160701b038b8116908b16611714565b90611714565b610cbd8383611714565b1015610cf55760405162461bcd60e51b8152602060048201526007602482015266506169723a204b60c81b604482015260640161047b565b5050610d0184846118e2565b60408051838152602081018390529081018a9052606081018990526001600160a01b0388169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a35050600a805460ff1916600117905550505050505050565b600a54600090819060ff16600114610d985760405162461bcd60e51b815260040161047b90611e06565b600a805460ff19169055600080610dc36008546001600160701b0380821692600160701b9092041690565b6006546007546040516370a0823160e01b81523060048201529395509193506001600160a01b039081169291169060009083906370a082319060240160206040518083038186803b158015610e1757600080fd5b505afa158015610e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f9190611d42565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b158015610e9457600080fd5b505afa158015610ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecc9190611d42565b30600090815260208190526040812054919250610ee98888611531565b90506000610ef660025490565b905080610f038487611714565b610f0d9190611e3e565b9a5080610f1a8486611714565b610f249190611e3e565b995060008b118015610f36575060008a115b610f825760405162461bcd60e51b815260206004820152601d60248201527f494e53554646494349454e545f4c49515549444954595f4255524e4544000000604482015260640161047b565b610f8c3084611aa5565b610f97878d8d611968565b610fa2868d8c611968565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a082319060240160206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110199190611d42565b6040516370a0823160e01b81523060048201529095506001600160a01b038716906370a082319060240160206040518083038186803b15801561105b57600080fd5b505afa15801561106f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110939190611d42565b935061109f85856118e2565b60ff8216156110cc576008546110c8906001600160701b0380821691600160701b900416611714565b6009555b604080518c8152602081018c90526001600160a01b038e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050600a805460ff191660011790555096989597509495505050505050565b60606004805461035390611ee5565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156111c25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161047b565b6111cf33858584036111e6565b5060019392505050565b60006103e333848461130b565b6001600160a01b0383166112485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161047b565b6001600160a01b0382166112a95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161047b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661136f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161047b565b6001600160a01b0382166113d15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161047b565b6001600160a01b038316600090815260208190526040902054818110156114495760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161047b565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611480908490611e26565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114cc91815260200190565b60405180910390a35b50505050565b6000826114e88382611e7f565b91508111156103e75760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161047b565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663ae3f1f2c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158257600080fd5b505afa158015611596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ba9190611c5d565b9050600560009054906101000a90046001600160a01b03166001600160a01b0316631ef414f76040518163ffffffff1660e01b815260040160206040518083038186803b15801561160a57600080fd5b505afa15801561161e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116429190611d94565b60095490925060ff8316156117005780156116fb5760006116726107936001600160701b03888116908816611714565b9050600061167f8361177b565b9050808211156116f85760006116a061169884846114db565b600254610cad565b905060006116d48360ff89166116c46116ba8b601e611e96565b889060ff16611714565b6116ce9190611e3e565b90611beb565b905060006116e28284611e3e565b905080156116f4576116f487826117eb565b5050505b50505b61170c565b801561170c5760006009555b505092915050565b60008115806117385750828261172a8183611e60565b92506117369083611e3e565b145b6103e75760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161047b565b600060038211156117dc5750806000611795600283611e3e565b6117a0906001611e26565b90505b818110156117d6579050806002816117bb8186611e3e565b6117c59190611e26565b6117cf9190611e3e565b90506117a3565b50919050565b81156117e6575060015b919050565b6001600160a01b0382166118415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161047b565b80600260008282546118539190611e26565b90915550506001600160a01b03821660009081526020819052604081208054839290611880908490611e26565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008183106118d957816118db565b825b9392505050565b6001600160701b03821180159061190057506001600160701b038111155b6119375760405162461bcd60e51b81526020600482015260086024820152674f564552464c4f5760c01b604482015260640161047b565b600880546001600160701b03928316600160701b026001600160e01b03199091169290931691909117919091179055565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b179052915160009283928716916119f49190611db7565b6000604051808303816000865af19150503d8060008114611a31576040519150601f19603f3d011682016040523d82523d6000602084013e611a36565b606091505b5091509150818015611a60575080511580611a60575080806020019051810190611a609190611d20565b611a9e5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015260640161047b565b5050505050565b6001600160a01b038216611b055760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161047b565b6001600160a01b03821660009081526020819052604090205481811015611b795760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161047b565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611ba8908490611e7f565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016112fe565b600082611bf88382611e26565b91508110156103e75760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161047b565b600060208284031215611c5257600080fd5b81356118db81611f30565b600060208284031215611c6f57600080fd5b81516118db81611f30565b60008060408385031215611c8d57600080fd5b8235611c9881611f30565b91506020830135611ca881611f30565b809150509250929050565b600080600060608486031215611cc857600080fd5b8335611cd381611f30565b92506020840135611ce381611f30565b929592945050506040919091013590565b60008060408385031215611d0757600080fd5b8235611d1281611f30565b946020939093013593505050565b600060208284031215611d3257600080fd5b815180151581146118db57600080fd5b600060208284031215611d5457600080fd5b5051919050565b600080600060608486031215611d7057600080fd5b83359250602084013591506040840135611d8981611f30565b809150509250925092565b600060208284031215611da657600080fd5b815160ff811681146118db57600080fd5b60008251611dc9818460208701611eb9565b9190910192915050565b6020815260008251806020840152611df2816040850160208701611eb9565b601f01601f19169190910160400192915050565b6020808252600690820152651313d0d2d15160d21b604082015260600190565b60008219821115611e3957611e39611f1a565b500190565b600082611e5b57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611e7a57611e7a611f1a565b500290565b600082821015611e9157611e91611f1a565b500390565b600060ff821660ff841680821015611eb057611eb0611f1a565b90039392505050565b60005b83811015611ed4578181015183820152602001611ebc565b838111156114d55750506000910152565b600181811c90821680611ef957607f821691505b602082108114156117d657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611f4557600080fd5b5056fea264697066735822122044a3846722a3abce7a187b62ae6968b64269be40d7b07efb0294ff9f9810176864736f6c63430008070033

Deployed ByteCode Sourcemap

20791:7011:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10752:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21783:202;21938:8;;21783:202;;;-1:-1:-1;;;;;21938:8:0;;;13271:34:1;;-1:-1:-1;;;21969:8:0;;;;;;13336:2:1;13321:18;;13314:43;13195:18;21783:202:0;13048:315:1;12919:169:0;;;;;;:::i;:::-;;:::i;:::-;;;3764:14:1;;3757:22;3739:41;;3727:2;3712:18;12919:169:0;3599:187:1;21066:30:0;;;;;-1:-1:-1;;;;;21066:30:0;;;;;;-1:-1:-1;;;;;3276:32:1;;;3258:51;;3246:2;3231:18;21066:30:0;3112:203:1;11872:108:0;11960:12;;11872:108;;;13514:25:1;;;13502:2;13487:18;11872:108:0;13368:177:1;13570:492:0;;;;;;:::i;:::-;;:::i;11714:93::-;;;11797:2;14341:36:1;;14329:2;14314:18;11714:93:0;14199:184:1;14471:215:0;;;;;;:::i;:::-;;:::i;22090:201::-;;;;;;:::i;:::-;;:::i;:::-;;23327:1211;;;;;;:::i;:::-;;:::i;25757:1756::-;;;;;;:::i;:::-;;:::i;12043:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;12144:18:0;12117:7;12144:18;;;;;;;;;;;;12043:127;21204:20;;;;;;24546:1203;;;;;;:::i;:::-;;:::i;:::-;;;;13724:25:1;;;13780:2;13765:18;;13758:34;;;;13697:18;24546:1203:0;13550:248:1;10971:104:0;;;:::i;15189:413::-;;;;;;:::i;:::-;;:::i;12383:175::-;;;;;;:::i;:::-;;:::i;20857:58::-;;20910:5;20857:58;;21028:31;;;;;-1:-1:-1;;;;;21028:31:0;;;21103:30;;;;;-1:-1:-1;;;;;21103:30:0;;;12621:151;;;;;;:::i;:::-;-1:-1:-1;;;;;12737:18:0;;;12710:7;12737:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12621:151;10752:100;10806:13;10839:5;10832:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10752:100;:::o;12919:169::-;13002:4;13019:39;5062:10;13042:7;13051:6;13019:8;:39::i;:::-;-1:-1:-1;13076:4:0;12919:169;;;;;:::o;13570:492::-;13710:4;13727:36;13737:6;13745:9;13756:6;13727:9;:36::i;:::-;-1:-1:-1;;;;;13803:19:0;;13776:24;13803:19;;;:11;:19;;;;;;;;5062:10;13803:33;;;;;;;;13855:26;;;;13847:79;;;;-1:-1:-1;;;13847:79:0;;8422:2:1;13847:79:0;;;8404:21:1;8461:2;8441:18;;;8434:30;8500:34;8480:18;;;8473:62;-1:-1:-1;;;8551:18:1;;;8544:38;8599:19;;13847:79:0;;;;;;;;;13962:57;13971:6;5062:10;14012:6;13993:16;:25;13962:8;:57::i;:::-;-1:-1:-1;14050:4:0;;13570:492;-1:-1:-1;;;;13570:492:0:o;14471:215::-;5062:10;14559:4;14608:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14608:34:0;;;;;;;;;;14559:4;;14576:80;;14599:7;;14608:47;;14645:10;;14608:47;:::i;:::-;14576:8;:80::i;22090:201::-;22195:7;;-1:-1:-1;;;;;22195:7:0;22181:10;:21;22173:56;;;;-1:-1:-1;;;22173:56:0;;9189:2:1;22173:56:0;;;9171:21:1;9228:2;9208:18;;;9201:30;-1:-1:-1;;;9247:18:1;;;9240:52;9309:18;;22173:56:0;8987:346:1;22173:56:0;22240:6;:16;;-1:-1:-1;;;;;22240:16:0;;;-1:-1:-1;;;;;;22240:16:0;;;;;;;22267:6;:16;;;;;;;;;;;22090:201::o;23327:1211::-;21303:8;;23421:17;;21303:8;;;:13;21295:32;;;;-1:-1:-1;;;21295:32:0;;;;;;;:::i;:::-;21338:8;:12;;-1:-1:-1;;21338:12:0;;;21349:1;;23497:13:::1;21938:8:::0;;-1:-1:-1;;;;;21938:8:0;;;;-1:-1:-1;;;21969:8:0;;;;;21783:202;23497:13:::1;23547:6;::::0;23540:39:::1;::::0;-1:-1:-1;;;23540:39:0;;23573:4:::1;23540:39;::::0;::::1;3258:51:1::0;23456:54:0;;-1:-1:-1;23456:54:0;;-1:-1:-1;23521:16:0::1;::::0;-1:-1:-1;;;;;23547:6:0;;::::1;::::0;23540:24:::1;::::0;3231:18:1;;23540:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23616:6;::::0;23609:39:::1;::::0;-1:-1:-1;;;23609:39:0;;23642:4:::1;23609:39;::::0;::::1;3258:51:1::0;23521:58:0;;-1:-1:-1;23590:16:0::1;::::0;-1:-1:-1;;;;;23616:6:0;;::::1;::::0;23609:24:::1;::::0;3231:18:1;;23609:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23590:58:::0;-1:-1:-1;23659:15:0::1;23677:23;:8:::0;-1:-1:-1;;;;;23677:23:0;::::1;:12;:23::i;:::-;23659:41:::0;-1:-1:-1;23711:15:0::1;23729:23;:8:::0;-1:-1:-1;;;;;23729:23:0;::::1;:12;:23::i;:::-;23711:41;;23765:18;23786:30;23795:9;23806;23786:8;:30::i;:::-;23765:51;;23827:20;23850:13;11960:12:::0;;;11872:108;23850:13:::1;23827:36:::0;-1:-1:-1;23878:17:0;23874:398:::1;;23937:7;::::0;23928:25:::1;::::0;;-1:-1:-1;;;23928:25:0;;;;23912:13:::1;::::0;-1:-1:-1;;;;;23937:7:0::1;::::0;23928:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;23937:7;23928:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23912:41:::0;-1:-1:-1;23980:54:0::1;20910:5;23980:31;23990:20;:7:::0;24002;23990:11:::1;:20::i;:::-;23980:9;:31::i;:::-;:35:::0;::::1;:54::i;:::-;23968:66;;24049:31;24055:5;20910;24049;:31::i;:::-;23897:195;23874:398;;;24125:135;-1:-1:-1::0;;;;;24152:37:0;::::1;:25;:7:::0;24164:12;24152:11:::1;:25::i;:::-;:37;;;;:::i;:::-;-1:-1:-1::0;;;;;24208:37:0;::::1;:25;:7:::0;24220:12;24208:11:::1;:25::i;:::-;:37;;;;:::i;:::-;24125:8;:135::i;:::-;24113:147;;23874:398;24302:1;24290:9;:13;24282:55;;;::::0;-1:-1:-1;;;24282:55:0;;7046:2:1;24282:55:0::1;::::0;::::1;7028:21:1::0;7085:2;7065:18;;;7058:30;7124:31;7104:18;;;7097:59;7173:18;;24282:55:0::1;6844:353:1::0;24282:55:0::1;24348:20;24354:2;24358:9;24348:5;:20::i;:::-;24381:27;24389:8;24399;24381:7;:27::i;:::-;24423:16;::::0;::::1;::::0;24419:61:::1;;24471:8;::::0;24449:31:::1;::::0;-1:-1:-1;;;;;24457:8:0;;::::1;::::0;-1:-1:-1;;;24471:8:0;::::1;;24449:21;:31::i;:::-;24441:5;:39:::0;24419:61:::1;24496:34;::::0;;13724:25:1;;;13780:2;13765:18;;13758:34;;;24501:10:0::1;::::0;24496:34:::1;::::0;13697:18:1;24496:34:0::1;;;;;;;-1:-1:-1::0;;21373:8:0;:12;;-1:-1:-1;;21373:12:0;21384:1;21373:12;;;-1:-1:-1;23327:1211:0;;;-1:-1:-1;;;;;;23327:1211:0:o;25757:1756::-;21303:8;;;;;:13;21295:32;;;;-1:-1:-1;;;21295:32:0;;;;;;;:::i;:::-;21338:8;:12;;-1:-1:-1;;21338:12:0;;;25899:14;;;;:32:::1;;;25930:1;25917:10;:14;25899:32;25891:71;;;::::0;-1:-1:-1;;;25891:71:0;;10703:2:1;25891:71:0::1;::::0;::::1;10685:21:1::0;10742:2;10722:18;;;10715:30;10781:28;10761:18;;;10754:56;10827:18;;25891:71:0::1;10501:350:1::0;25891:71:0::1;25974:17;25993::::0;26014:13:::1;21938:8:::0;;-1:-1:-1;;;;;21938:8:0;;;;-1:-1:-1;;;21969:8:0;;;;;21783:202;26014:13:::1;25973:54;;;;26073:9;-1:-1:-1::0;;;;;26060:22:0::1;:10;:22;:48;;;;;26099:9;-1:-1:-1::0;;;;;26086:22:0::1;:10;:22;26060:48;26038:120;;;::::0;-1:-1:-1;;;26038:120:0;;11799:2:1;26038:120:0::1;::::0;::::1;11781:21:1::0;11838:2;11818:18;;;11811:30;-1:-1:-1;;;11857:18:1;;;11850:52;11919:18;;26038:120:0::1;11597:346:1::0;26038:120:0::1;26258:6;::::0;26297::::1;::::0;26171:16:::1;::::0;;;-1:-1:-1;;;;;26258:6:0;;::::1;::::0;26297;;::::1;::::0;26326:13;::::1;::::0;::::1;::::0;::::1;::::0;:30:::1;;;26349:7;-1:-1:-1::0;;;;;26343:13:0::1;:2;-1:-1:-1::0;;;;;26343:13:0::1;;;26326:30;26318:53;;;::::0;-1:-1:-1;;;26318:53:0;;7404:2:1;26318:53:0::1;::::0;::::1;7386:21:1::0;7443:2;7423:18;;;7416:30;-1:-1:-1;;;7462:18:1;;;7455:40;7512:18;;26318:53:0::1;7202:334:1::0;26318:53:0::1;26390:14:::0;;26386:58:::1;;26406:38;26420:7;26429:2;26433:10;26406:13;:38::i;:::-;26463:14:::0;;26459:58:::1;;26479:38;26493:7;26502:2;26506:10;26479:13;:38::i;:::-;26543:40;::::0;-1:-1:-1;;;26543:40:0;;26577:4:::1;26543:40;::::0;::::1;3258:51:1::0;-1:-1:-1;;;;;26543:25:0;::::1;::::0;::::1;::::0;3231:18:1;;26543:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26609;::::0;-1:-1:-1;;;26609:40:0;;26643:4:::1;26609:40;::::0;::::1;3258:51:1::0;26532::0;;-1:-1:-1;;;;;;26609:25:0;::::1;::::0;::::1;::::0;3231:18:1;;26609:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26598:51;;26225:436;;26671:17;26714:10;26702:9;-1:-1:-1::0;;;;;26702:22:0::1;;;;;:::i;:::-;26691:8;:33;:101;;26791:1;26691:101;;;26752:22;26764:10:::0;-1:-1:-1;;;;;26752:22:0;::::1;;:::i;:::-;26740:35;::::0;:8;:35:::1;:::i;:::-;26671:121:::0;-1:-1:-1;26803:17:0::1;26834:22;26846:10:::0;-1:-1:-1;;;;;26834:22:0;::::1;;:::i;:::-;26823:8;:33;:101;;26923:1;26823:101;;;26884:22;26896:10:::0;-1:-1:-1;;;;;26884:22:0;::::1;;:::i;:::-;26872:35;::::0;:8;:35:::1;:::i;:::-;26803:121;;26955:1;26943:9;:13;:30;;;;26972:1;26960:9;:13;26943:30;26935:69;;;::::0;-1:-1:-1;;;26935:69:0;;10348:2:1;26935:69:0::1;::::0;::::1;10330:21:1::0;10387:2;10367:18;;;10360:30;10426:28;10406:18;;;10399:56;10472:18;;26935:69:0::1;10146:350:1::0;26935:69:0::1;27030:24;27057:40;27080:16;:9:::0;27094:1:::1;27080:13;:16::i;:::-;27057:18;:8:::0;27070:4:::1;27057:12;:18::i;:40::-;27030:67:::0;-1:-1:-1;27112:24:0::1;27139:40;27162:16;:9:::0;27176:1:::1;27162:13;:16::i;27139:40::-;27112:67:::0;-1:-1:-1;27283:46:0::1;27321:7;27283:33;-1:-1:-1::0;;;;;27283:18:0;;::::1;::::0;:33;::::1;:22;:33::i;:::-;:37:::0;::::1;:46::i;:::-;27220:38;:16:::0;27241;27220:20:::1;:38::i;:::-;:109;;27194:178;;;::::0;-1:-1:-1;;;27194:178:0;;8087:2:1;27194:178:0::1;::::0;::::1;8069:21:1::0;8126:1;8106:18;;;8099:29;-1:-1:-1;;;8144:18:1;;;8137:37;8191:18;;27194:178:0::1;7885:330:1::0;27194:178:0::1;27015:369;;27396:27;27404:8;27414;27396:7;:27::i;:::-;27439:66;::::0;;14034:25:1;;;14090:2;14075:18;;14068:34;;;14118:18;;;14111:34;;;14176:2;14161:18;;14154:34;;;-1:-1:-1;;;;;27439:66:0;::::1;::::0;27444:10:::1;::::0;27439:66:::1;::::0;14021:3:1;14006:19;27439:66:0::1;;;;;;;-1:-1:-1::0;;21373:8:0;:12;;-1:-1:-1;;21373:12:0;21384:1;21373:12;;;-1:-1:-1;;;;;;;25757:1756:0:o;24546:1203::-;21303:8;;24640:15;;;;21303:8;;;:13;21295:32;;;;-1:-1:-1;;;21295:32:0;;;;;;;:::i;:::-;21338:8;:12;;-1:-1:-1;;21338:12:0;;;21349:1;;24731:13:::1;21938:8:::0;;-1:-1:-1;;;;;21938:8:0;;;;-1:-1:-1;;;21969:8:0;;;;;21783:202;24731:13:::1;24773:6;::::0;24808::::1;::::0;24844:40:::1;::::0;-1:-1:-1;;;24844:40:0;;24878:4:::1;24844:40;::::0;::::1;3258:51:1::0;24690:54:0;;-1:-1:-1;24690:54:0;;-1:-1:-1;;;;;;24773:6:0;;::::1;::::0;24808;::::1;::::0;24755:15:::1;::::0;24773:6;;24844:25:::1;::::0;3231:18:1;;24844:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24914;::::0;-1:-1:-1;;;24914:40:0;;24948:4:::1;24914:40;::::0;::::1;3258:51:1::0;24825:59:0;;-1:-1:-1;24895:16:0::1;::::0;-1:-1:-1;;;;;24914:25:0;::::1;::::0;::::1;::::0;3231:18:1;;24914:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25003:4;24965:17;12144:18:::0;;;;;;;;;;;24895:59;;-1:-1:-1;25043:30:0::1;25052:9:::0;25063;25043:8:::1;:30::i;:::-;25022:51;;25084:20;25107:13;11960:12:::0;;;11872:108;25107:13:::1;25084:36:::0;-1:-1:-1;25084:36:0;25141:23:::1;:9:::0;25155:8;25141:13:::1;:23::i;:::-;:38;;;;:::i;:::-;25131:48:::0;-1:-1:-1;25226:12:0;25200:23:::1;:9:::0;25214:8;25200:13:::1;:23::i;:::-;:38;;;;:::i;:::-;25190:48;;25267:1;25257:7;:11;:26;;;;;25282:1;25272:7;:11;25257:26;25249:68;;;::::0;-1:-1:-1;;;25249:68:0;;8831:2:1;25249:68:0::1;::::0;::::1;8813:21:1::0;8870:2;8850:18;;;8843:30;8909:31;8889:18;;;8882:59;8958:18;;25249:68:0::1;8629:353:1::0;25249:68:0::1;25328:31;25342:4;25349:9;25328:5;:31::i;:::-;25370:35;25384:7;25393:2;25397:7;25370:13;:35::i;:::-;25416;25430:7;25439:2;25443:7;25416:13;:35::i;:::-;25473:40;::::0;-1:-1:-1;;;25473:40:0;;25507:4:::1;25473:40;::::0;::::1;3258:51:1::0;-1:-1:-1;;;;;25473:25:0;::::1;::::0;::::1;::::0;3231:18:1;;25473:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25535;::::0;-1:-1:-1;;;25535:40:0;;25569:4:::1;25535:40;::::0;::::1;3258:51:1::0;25462::0;;-1:-1:-1;;;;;;25535:25:0;::::1;::::0;::::1;::::0;3231:18:1;;25535:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25524:51;;25588:27;25596:8;25606;25588:7;:27::i;:::-;25630:16;::::0;::::1;::::0;25626:61:::1;;25678:8;::::0;25656:31:::1;::::0;-1:-1:-1;;;;;25664:8:0;;::::1;::::0;-1:-1:-1;;;25678:8:0;::::1;;25656:21;:31::i;:::-;25648:5;:39:::0;25626:61:::1;25703:38;::::0;;13724:25:1;;;13780:2;13765:18;;13758:34;;;-1:-1:-1;;;;;25703:38:0;::::1;::::0;25708:10:::1;::::0;25703:38:::1;::::0;13697:18:1;25703:38:0::1;;;;;;;-1:-1:-1::0;;21373:8:0;:12;;-1:-1:-1;;21373:12:0;21384:1;21373:12;;;-1:-1:-1;24546:1203:0;;;;-1:-1:-1;24546:1203:0;;-1:-1:-1;;;;;;24546:1203:0:o;10971:104::-;11027:13;11060:7;11053:14;;;;;:::i;15189:413::-;5062:10;15282:4;15326:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15326:34:0;;;;;;;;;;15379:35;;;;15371:85;;;;-1:-1:-1;;;15371:85:0;;12484:2:1;15371:85:0;;;12466:21:1;12523:2;12503:18;;;12496:30;12562:34;12542:18;;;12535:62;-1:-1:-1;;;12613:18:1;;;12606:35;12658:19;;15371:85:0;12282:401:1;15371:85:0;15492:67;5062:10;15515:7;15543:15;15524:16;:34;15492:8;:67::i;:::-;-1:-1:-1;15590:4:0;;15189:413;-1:-1:-1;;;15189:413:0:o;12383:175::-;12469:4;12486:42;5062:10;12510:9;12521:6;12486:9;:42::i;18873:380::-;-1:-1:-1;;;;;19009:19:0;;19001:68;;;;-1:-1:-1;;;19001:68:0;;11058:2:1;19001:68:0;;;11040:21:1;11097:2;11077:18;;;11070:30;11136:34;11116:18;;;11109:62;-1:-1:-1;;;11187:18:1;;;11180:34;11231:19;;19001:68:0;10856:400:1;19001:68:0;-1:-1:-1;;;;;19088:21:0;;19080:68;;;;-1:-1:-1;;;19080:68:0;;5538:2:1;19080:68:0;;;5520:21:1;5577:2;5557:18;;;5550:30;5616:34;5596:18;;;5589:62;-1:-1:-1;;;5667:18:1;;;5660:32;5709:19;;19080:68:0;5336:398:1;19080:68:0;-1:-1:-1;;;;;19161:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19213:32;;13514:25:1;;;19213:32:0;;13487:18:1;19213:32:0;;;;;;;;18873:380;;;:::o;16092:733::-;-1:-1:-1;;;;;16232:20:0;;16224:70;;;;-1:-1:-1;;;16224:70:0;;9942:2:1;16224:70:0;;;9924:21:1;9981:2;9961:18;;;9954:30;10020:34;10000:18;;;9993:62;-1:-1:-1;;;10071:18:1;;;10064:35;10116:19;;16224:70:0;9740:401:1;16224:70:0;-1:-1:-1;;;;;16313:23:0;;16305:71;;;;-1:-1:-1;;;16305:71:0;;4731:2:1;16305:71:0;;;4713:21:1;4770:2;4750:18;;;4743:30;4809:34;4789:18;;;4782:62;-1:-1:-1;;;4860:18:1;;;4853:33;4903:19;;16305:71:0;4529:399:1;16305:71:0;-1:-1:-1;;;;;16473:17:0;;16449:21;16473:17;;;;;;;;;;;16509:23;;;;16501:74;;;;-1:-1:-1;;;16501:74:0;;6639:2:1;16501:74:0;;;6621:21:1;6678:2;6658:18;;;6651:30;6717:34;6697:18;;;6690:62;-1:-1:-1;;;6768:18:1;;;6761:36;6814:19;;16501:74:0;6437:402:1;16501:74:0;-1:-1:-1;;;;;16611:17:0;;;:9;:17;;;;;;;;;;;16631:22;;;16611:42;;16675:20;;;;;;;;:30;;16647:6;;16611:9;16675:30;;16647:6;;16675:30;:::i;:::-;;;;;;;;16740:9;-1:-1:-1;;;;;16723:35:0;16732:6;-1:-1:-1;;;;;16723:35:0;;16751:6;16723:35;;;;13514:25:1;;13502:2;13487:18;;13368:177;16723:35:0;;;;;;;;16771:46;16213:612;16092:733;;;:::o;1486:138::-;1544:9;1589:1;1579:5;1583:1;1589;1579:5;:::i;:::-;1575:9;;;1574:16;;1566:50;;;;-1:-1:-1;;;1566:50:0;;4381:2:1;1566:50:0;;;4363:21:1;4420:2;4400:18;;;4393:30;-1:-1:-1;;;4439:18:1;;;4432:51;4500:18;;1566:50:0;4179:345:1;22299:1020:0;22390:18;22426:13;22451:7;;;;;;;;;-1:-1:-1;;;;;22451:7:0;-1:-1:-1;;;;;22442:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22426:41;;22502:7;;;;;;;;;-1:-1:-1;;;;;22502:7:0;-1:-1:-1;;;;;22493:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22553:5;;22478:47;;-1:-1:-1;22588:16:0;;;;22584:728;;22625:11;;22621:621;;22657:13;22673:93;22705:42;-1:-1:-1;;;;;22705:18:0;;;;22728;;22705:22;:42::i;22673:93::-;22657:109;;22785:17;22805;22815:6;22805:9;:17::i;:::-;22785:37;;22853:9;22845:5;:17;22841:386;;;22887:17;22907:39;22925:20;:5;22935:9;22925;:20::i;:::-;11960:12;;22907:13;11872:108;22907:39;22887:59;-1:-1:-1;22969:19:0;22991:85;23066:9;22992:68;;;:28;23002:17;23048:12;23002:2;:17;:::i;:::-;22992:5;;:28;;:9;:28::i;:::-;:68;;;;:::i;:::-;22991:74;;:85::i;:::-;22969:107;-1:-1:-1;23099:17:0;23119:23;22969:107;23119:9;:23;:::i;:::-;23099:43;-1:-1:-1;23169:13:0;;23165:42;;23184:23;23190:5;23197:9;23184:5;:23::i;:::-;22864:363;;;22841:386;22638:604;;22621:621;22584:728;;;23263:11;;23259:53;;23299:1;23291:5;:9;23259:53;22415:904;;22299:1020;;;;:::o;1632:151::-;1690:9;1720:6;;;:30;;-1:-1:-1;1749:1:0;1744;1735:5;1744:1;1749;1735:5;:::i;:::-;1731:9;-1:-1:-1;1730:15:0;;1731:9;1730:15;:::i;:::-;:20;1720:30;1712:63;;;;-1:-1:-1;;;1712:63:0;;5941:2:1;1712:63:0;;;5923:21:1;5980:2;5960:18;;;5953:30;-1:-1:-1;;;5999:18:1;;;5992:50;6059:18;;1712:63:0;5739:344:1;1021:312:0;1069:9;1099:1;1095;:5;1091:235;;;-1:-1:-1;1121:1:0;1137:9;1149:5;1153:1;1121;1149:5;:::i;:::-;:9;;1157:1;1149:9;:::i;:::-;1137:21;;1173:92;1184:1;1180;:5;1173:92;;;1210:1;-1:-1:-1;1210:1:0;1248;1210;1235:5;1210:1;1235;:5;:::i;:::-;:9;;;;:::i;:::-;1234:15;;;;:::i;:::-;1230:19;;1173:92;;;1102:174;1021:312;;;:::o;1091:235::-;1286:6;;1282:44;;-1:-1:-1;1313:1:0;1282:44;1021:312;;;:::o;17112:399::-;-1:-1:-1;;;;;17196:21:0;;17188:65;;;;-1:-1:-1;;;17188:65:0;;12890:2:1;17188:65:0;;;12872:21:1;12929:2;12909:18;;;12902:30;12968:33;12948:18;;;12941:61;13019:18;;17188:65:0;12688:355:1;17188:65:0;17344:6;17328:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;17361:18:0;;:9;:18;;;;;;;;;;:28;;17383:6;;17361:9;:28;;17383:6;;17361:28;:::i;:::-;;;;-1:-1:-1;;17405:37:0;;13514:25:1;;;-1:-1:-1;;;;;17405:37:0;;;17422:1;;17405:37;;13502:2:1;13487:18;17405:37:0;;;;;;;17112:399;;:::o;798:105::-;856:9;886:1;882;:5;:13;;894:1;882:13;;;890:1;882:13;878:17;798:105;-1:-1:-1;;;798:105:0:o;27521:278::-;-1:-1:-1;;;;;27615:29:0;;;;;:62;;-1:-1:-1;;;;;;27648:29:0;;;27615:62;27593:120;;;;-1:-1:-1;;;27593:120:0;;11463:2:1;27593:120:0;;;11445:21:1;11502:1;11482:18;;;11475:29;-1:-1:-1;;;11520:18:1;;;11513:38;11568:18;;27593:120:0;11261:331:1;27593:120:0;27724:8;:28;;-1:-1:-1;;;;;27763:28:0;;;-1:-1:-1;;;27763:28:0;-1:-1:-1;;;;;;27763:28:0;;;27724;;;;27763;;;;;;;;;;27521:278::o;21401:374::-;20983:34;;;;;;;;;;;;;;;;;21580:43;;-1:-1:-1;;;;;3512:32:1;;;21580:43:0;;;3494:51:1;3561:18;;;;3554:34;;;21580:43:0;;;;;;;;;;3467:18:1;;;;21580:43:0;;;;;;;-1:-1:-1;;;;;21580:43:0;-1:-1:-1;;;21580:43:0;;;21555:79;;-1:-1:-1;;;;21555:10:0;;;:79;;21580:43;21555:79;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21519:115;;;;21667:7;:57;;;;-1:-1:-1;21679:11:0;;:16;;:44;;;21710:4;21699:24;;;;;;;;;;;;:::i;:::-;21645:122;;;;-1:-1:-1;;;21645:122:0;;7743:2:1;21645:122:0;;;7725:21:1;7782:2;7762:18;;;7755:30;-1:-1:-1;;;7801:18:1;;;7794:45;7856:18;;21645:122:0;7541:339:1;21645:122:0;21508:267;;21401:374;;;:::o;17844:591::-;-1:-1:-1;;;;;17928:21:0;;17920:67;;;;-1:-1:-1;;;17920:67:0;;9540:2:1;17920:67:0;;;9522:21:1;9579:2;9559:18;;;9552:30;9618:34;9598:18;;;9591:62;-1:-1:-1;;;9669:18:1;;;9662:31;9710:19;;17920:67:0;9338:397:1;17920:67:0;-1:-1:-1;;;;;18087:18:0;;18062:22;18087:18;;;;;;;;;;;18124:24;;;;18116:71;;;;-1:-1:-1;;;18116:71:0;;5135:2:1;18116:71:0;;;5117:21:1;5174:2;5154:18;;;5147:30;5213:34;5193:18;;;5186:62;-1:-1:-1;;;5264:18:1;;;5257:32;5306:19;;18116:71:0;4933:398:1;18116:71:0;-1:-1:-1;;;;;18223:18:0;;:9;:18;;;;;;;;;;18244:23;;;18223:44;;18289:12;:22;;18261:6;;18223:9;18289:22;;18261:6;;18289:22;:::i;:::-;;;;-1:-1:-1;;18329:37:0;;13514:25:1;;;18355:1:0;;-1:-1:-1;;;;;18329:37:0;;;;;13502:2:1;13487:18;18329:37:0;13368:177:1;1341:137:0;1399:9;1444:1;1434:5;1438:1;1444;1434:5;:::i;:::-;1430:9;;;1429:16;;1421:49;;;;-1:-1:-1;;;1421:49:0;;6290:2:1;1421:49:0;;;6272:21:1;6329:2;6309:18;;;6302:30;-1:-1:-1;;;6348:18:1;;;6341:50;6408:18;;1421:49:0;6088:344:1;14:247;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:315::-;1444:6;1452;1505:2;1493:9;1484:7;1480:23;1476:32;1473:52;;;1521:1;1518;1511:12;1473:52;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;1681:2;1666:18;;;;1653:32;;-1:-1:-1;;;1376:315:1:o;1696:277::-;1763:6;1816:2;1804:9;1795:7;1791:23;1787:32;1784:52;;;1832:1;1829;1822:12;1784:52;1864:9;1858:16;1917:5;1910:13;1903:21;1896:5;1893:32;1883:60;;1939:1;1936;1929:12;1978:184;2048:6;2101:2;2089:9;2080:7;2076:23;2072:32;2069:52;;;2117:1;2114;2107:12;2069:52;-1:-1:-1;2140:16:1;;1978:184;-1:-1:-1;1978:184:1:o;2167:383::-;2244:6;2252;2260;2313:2;2301:9;2292:7;2288:23;2284:32;2281:52;;;2329:1;2326;2319:12;2281:52;2365:9;2352:23;2342:33;;2422:2;2411:9;2407:18;2394:32;2384:42;;2476:2;2465:9;2461:18;2448:32;2489:31;2514:5;2489:31;:::i;:::-;2539:5;2529:15;;;2167:383;;;;;:::o;2555:273::-;2623:6;2676:2;2664:9;2655:7;2651:23;2647:32;2644:52;;;2692:1;2689;2682:12;2644:52;2724:9;2718:16;2774:4;2767:5;2763:16;2756:5;2753:27;2743:55;;2794:1;2791;2784:12;2833:274;2962:3;3000:6;2994:13;3016:53;3062:6;3057:3;3050:4;3042:6;3038:17;3016:53;:::i;:::-;3085:16;;;;;2833:274;-1:-1:-1;;2833:274:1:o;3791:383::-;3940:2;3929:9;3922:21;3903:4;3972:6;3966:13;4015:6;4010:2;3999:9;3995:18;3988:34;4031:66;4090:6;4085:2;4074:9;4070:18;4065:2;4057:6;4053:15;4031:66;:::i;:::-;4158:2;4137:15;-1:-1:-1;;4133:29:1;4118:45;;;;4165:2;4114:54;;3791:383;-1:-1:-1;;3791:383:1:o;11948:329::-;12150:2;12132:21;;;12189:1;12169:18;;;12162:29;-1:-1:-1;;;12222:2:1;12207:18;;12200:36;12268:2;12253:18;;11948:329::o;14388:128::-;14428:3;14459:1;14455:6;14452:1;14449:13;14446:39;;;14465:18;;:::i;:::-;-1:-1:-1;14501:9:1;;14388:128::o;14521:217::-;14561:1;14587;14577:132;;14631:10;14626:3;14622:20;14619:1;14612:31;14666:4;14663:1;14656:15;14694:4;14691:1;14684:15;14577:132;-1:-1:-1;14723:9:1;;14521:217::o;14743:168::-;14783:7;14849:1;14845;14841:6;14837:14;14834:1;14831:21;14826:1;14819:9;14812:17;14808:45;14805:71;;;14856:18;;:::i;:::-;-1:-1:-1;14896:9:1;;14743:168::o;14916:125::-;14956:4;14984:1;14981;14978:8;14975:34;;;14989:18;;:::i;:::-;-1:-1:-1;15026:9:1;;14916:125::o;15046:195::-;15084:4;15121;15118:1;15114:12;15153:4;15150:1;15146:12;15178:3;15173;15170:12;15167:38;;;15185:18;;:::i;:::-;15222:13;;;15046:195;-1:-1:-1;;;15046:195:1:o;15246:258::-;15318:1;15328:113;15342:6;15339:1;15336:13;15328:113;;;15418:11;;;15412:18;15399:11;;;15392:39;15364:2;15357:10;15328:113;;;15459:6;15456:1;15453:13;15450:48;;;-1:-1:-1;;15494:1:1;15476:16;;15469:27;15246:258::o;15509:380::-;15588:1;15584:12;;;;15631;;;15652:61;;15706:4;15698:6;15694:17;15684:27;;15652:61;15759:2;15751:6;15748:14;15728:18;15725:38;15722:161;;;15805:10;15800:3;15796:20;15793:1;15786:31;15840:4;15837:1;15830:15;15868:4;15865:1;15858:15;15894:127;15955:10;15950:3;15946:20;15943:1;15936:31;15986:4;15983:1;15976:15;16010:4;16007:1;16000:15;16026:131;-1:-1:-1;;;;;16101:31:1;;16091:42;;16081:70;;16147:1;16144;16137:12;16081:70;16026:131;:::o

Swarm Source

ipfs://44a3846722a3abce7a187b62ae6968b64269be40d7b07efb0294ff9f98101768
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.