Contract 0xF49255205Dfd7933c4D0f25A57D40B1511F92fEF 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x39a35d062fdf67b1aaf9f96f0c5872f6ea83906bf04aaab0564aa0f358ac0d81Set Admin Candid...16076152022-08-08 8:04:42171 days 14 hrs ago0x51f88b624a1ca566ff8175a5c7d2e22087fb65bd IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.004774371
0xb958c9474e163e6778d0cc926d5975483a7dff98ee34f1468a58307958d7c468Candidate Confir...13962282022-07-08 9:15:24202 days 13 hrs ago0x51f88b624a1ca566ff8175a5c7d2e22087fb65bd IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.00223412
0xcf8803e9bd378e2e83fd6ba48dbb88622d12e08551125823fc650bb5d1b2a44bSet Admin Candid...13962192022-07-08 9:13:36202 days 13 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.004774371
0x81071cfa72577f1f3f12521f938a3c0d1982211e46055423b15f831137e7a548Set Feeto10642842022-05-20 8:04:24251 days 14 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.002734800033
0x85b4060814c4db5eb2c6790de9c566848d1e2d8c68d434df92797e66264e9152Set Bootstrap9683132022-05-06 7:44:18265 days 14 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.003380200041
0x7aef36fb97d324845cbc0a883d2f234f241753cf0b99e8e7c847407d5c6b37f8Set Bootstrap9670622022-05-06 3:17:48265 days 19 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.00736020009
0x5b1c0c94904d8a3fa6189b1101ed8d4eddb9177c969538e6dd3f465cbb97b166Set Bootstrap2755642022-01-26 9:23:24365 days 13 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.001488100018
0x01c4c3180f77136b5b4a2fcf41dc2da719d45b28ec6a3f32afa9ad5e7c9a9680Set Bootstrap2755582022-01-26 9:22:12365 days 13 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.001488100018
0x365cf4629f7718362a3239014416c30a06ba9da281e8dddc88f2c736165425c6Set Bootstrap2266122022-01-19 8:54:42372 days 13 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.006840200084
0xcca30dad07d1a44278474850bbe02bed6901c4e6eec783d908295b6d652d2e7cSet Bootstrap2266042022-01-19 8:53:06372 days 13 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.006840200084
0x166254a6d33af3892d5c444f4c59ec05f7cf05d407334c4f768a035b35c5ce39Set Bootstrap1793002022-01-12 14:09:48379 days 8 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.006840200084
0x661abea52ada82a95b8940ba4a80a90d09e3f6b661a5416daaaa4535ef52a3cfSet Bootstrap1792942022-01-12 14:08:36379 days 8 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.006840200084
0x42f71ee86844b37f5aa03970b5e88c6f5e586cd69a3e553a9cb1278a2401d91bCreate Pair1722482022-01-11 14:07:24380 days 8 hrs agoZenlink Network: Deployer IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.1884095
0x682d332aa3c146d8c6525f65eda6109844990ce7594af3a6b0c966d5762f2f39Create Pair1722462022-01-11 14:07:00380 days 8 hrs agoZenlink Network: Deployer IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.1884095
0x9bbdb6ed4b3ed9646f5af88dabb535fa7b14ed5f51eabb3fab459023c0312e41Create Pair1722442022-01-11 14:06:36380 days 8 hrs agoZenlink Network: Deployer IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.1884095
0x067e188e128c3dae942e0307858b5755f70327aa413daeedd911d67f4ccb81cdSet Bootstrap1713562022-01-11 11:06:12380 days 11 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.006840200084
0xe2baa9412457f23c1d1a63027b1e20c8793fdd508212838400ec69b4cf090ab7Candidate Confir...1713342022-01-11 11:01:48380 days 11 hrs ago0xe1e76edb74cca82cea5ae2512f024466818dc6c6 IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.001427500017
0x767c79327524000c212bb548d2400a87f195f7ef3d77adb228cf6030f3cbbef3Set Admin Candid...1713212022-01-11 10:59:06380 days 11 hrs agoZenlink Network: Deployer IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.0044671
0x5bb5a8ccfcc46595a64a3b0f07398848ac710b2abb9c6de7e2c296fb41ccd98dSet Feeto1713192022-01-11 10:58:42380 days 11 hrs agoZenlink Network: Deployer IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.0025448
0x203bbd93beb8c54e3abce47550840bf522cb50b05a6d6588a1a0adea22840be3Set Fee Base Poi...1712572022-01-11 10:46:12380 days 11 hrs agoZenlink Network: Deployer IN  0xf49255205dfd7933c4d0f25a57d40b1511f92fef0 GLMR0.0025148
0xbd7faa3aaea8e4ea64998fdd5cbd549847f0bd5617376d18f30fa0ad5c480cc10x608060401712522022-01-11 10:45:12380 days 11 hrs agoZenlink Network: Deployer IN  Create: Factory0 GLMR0.2630455
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x9d71946d3d6035f9cd10ee969e20e7f77f315e63a2c7ec2a6233dba98f5ad63316357542022-08-12 9:10:42167 days 13 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x19729918cdbe802f9279809378a8fcdc7410837114dd5540a60e8b603124049316130002022-08-09 2:33:54170 days 20 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x084cf563b4e63a6a8adca43b8a26f7b0995b4f7838bdd21117aa40b93f61299115185812022-07-26 8:04:12184 days 14 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0xa430d883fba76a3858e1d154c6174adcb17934361bc6fa30ac04a13d19541d1e14267052022-07-12 20:38:12198 days 1 hr ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x5615e78eac9818732c2a4e3c4b332ffdb3ad43c1187106859713e1508106ce3214257462022-07-12 17:13:48198 days 5 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x73920c33686bfdbce358464c862c197f05a32c6a5c32e62506bd3edf9a9c70c412646322022-06-18 20:58:54222 days 1 hr ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x8c5347fb3c0a449d8a842d808df182fdb6bfbd09ecbee433a3b3d5c4df3517cb11473972022-06-01 9:54:48239 days 12 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0xd2892e30cb79105dc45bd108cb097372e22f11315757821a76bd01e55e617c7910949762022-05-24 18:38:36247 days 3 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x246537b879fc0d471cfc43f41bbe8c5ac16fe2e0802dbc9d63e4c7e2ed81d7d99762572022-05-07 12:00:12264 days 10 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0xba15ad827c90d707b7f03a2ecc38bce09447decf33cbc35131de7099eefd21328039902022-04-12 13:35:12289 days 8 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0xc5c6b0ccd48d4e96291702c4843f80110b865669c9a038ea38989bda9d686ffa7736512022-04-08 5:08:12293 days 17 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x9dfaef233cff4b81ea9653ea994ce9abcf712bd9682cb602d41a58726cac4a987052922022-03-29 9:07:06303 days 13 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x9d2733eb22f5cdeff97cb71712d4945f9f56cbdd3892303eb038b3e30e472b916415092022-03-20 5:02:12312 days 17 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x9bb45cc8b094e35bcd60a3b9fd69e81d66ce00ff3a46f1b080c5c18781f75b605408172022-03-05 20:30:48327 days 2 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x8e8e6861b85d47b24f70ce3fadaf1dd3226d915430372e0c69416c57bb8224524341122022-02-18 10:32:54342 days 12 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x5b0c4cddde0aca6f773de6169fad355261e9fafa9b3b2e288c7a76e367402e6b4271802022-02-17 10:01:18343 days 12 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x66977af6d4f482d5a113d5478854f6f3bfc4a9faa2d159ff8589b879d37af0be4271592022-02-17 9:56:36343 days 12 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0xa957d106988f3cfd78a465b69feb4d9332c012efdfe1fd796282e4af9b9c89b83930032022-02-12 4:15:36348 days 18 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x31d131308557e3ac146b0013f97c53f0aeaba2b13d1566202dbed22ba6bba31d3266612022-02-02 16:33:42358 days 6 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x477bd41ca98fc62857246c21687ff4fe78547677cc8b787426935efede70c1042876302022-01-28 2:55:12363 days 19 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0xcfe00caaef3d6d7c33aa53bad7a8b750e96fa24f06f45c122c4bd314e8a4d2e72756102022-01-26 9:33:00365 days 13 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0xc7b3512ac721bb942ccc70da0e547375a8520e15d14079ffbeba2b4be20a3baa2755872022-01-26 9:28:12365 days 13 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0xf639a1be75f246e1b4c99cdd7ecdd73c5c523944e1ee0946ba2e2feed25afe662452892022-01-22 1:33:42369 days 21 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0xafd6b0bc60510daaa93eb9282b75db0b5566530c03af026b28687f9c8332b4932452382022-01-22 1:23:24369 days 21 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
0x90992bc97a675c1a3696e98b6884013b41715bee66430b544da412a54fd6872e2347852022-01-20 13:21:30371 days 9 hrs ago 0xf49255205dfd7933c4d0f25a57d40b1511f92fef  Contract Creation0 GLMR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Factory

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 moonbeam.moonscan.io on 2022-03-01
*/

// File: contracts/libraries/AdminUpgradeable.sol



pragma solidity >=0.8.0;

abstract contract AdminUpgradeable {
    address public admin;
    address public adminCandidate;

    function _initializeAdmin(address _admin) internal {
        require(admin == address(0), "admin already set");

        admin = _admin;
    }

    function candidateConfirm() external {
        require(msg.sender == adminCandidate, "not Candidate");
        emit AdminChanged(admin, adminCandidate);

        admin = adminCandidate;
        adminCandidate = address(0);
    }

    function setAdminCandidate(address _candidate) external onlyAdmin {
        adminCandidate = _candidate;
        emit Candidate(_candidate);
    }

    modifier onlyAdmin {
        require(msg.sender == admin, "not admin");
        _;
    }

    event Candidate(address indexed newAdmin);
    event AdminChanged(address indexed oldAdmin, address indexed newAdmin);
}
// 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/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
    );

    event Sync(uint112 reserve0, uint112 reserve1);

    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/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/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);
        emit Sync(reserve0, reserve1);
    }
}

// File: contracts/core/Factory.sol



pragma solidity >=0.8.0;




contract Factory is AdminUpgradeable, IFactory {
    address public override feeto;
    uint8 public override feeBasePoint;
    bool public override lockForPairCreate;

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

    constructor(address _admin) {
        _initializeAdmin(_admin);
        feeto = _admin;
    }

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

    function createPair(address tokenA, address tokenB)
        external
        override
        returns (address pair)
    {
        require(
            !lockForPairCreate || (lockForPairCreate && msg.sender == admin), 
            "CREATE_PAIR_LOCKED"
        );
        require(tokenA != tokenB, "IDENTICAL_ADDRESSES");
        (address token0, address token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "ZERO_ADDRESS");
        require(getPair[token0][token1] == address(0), "Factory: PAIR_EXISTS");
        if (getBootstrap[token0][token1] != address(0)) {
            require(getBootstrap[token0][token1] == msg.sender, 'NOT_BOOTSTRAP_OWNER');
        }
        bytes memory bytecode = type(Pair).creationCode;
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));
        assembly {
            pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
        }
        IPair(pair).initialize(token0, token1);
        getPair[token0][token1] = pair;
        getPair[token1][token0] = pair;
        allPairs.push(pair);
        emit PairCreated(token0, token1, pair, allPairs.length);
    }

    function setBootstrap(address tokenA, address tokenB, address bootstrap) external onlyAdmin {
        require(getPair[tokenA][tokenB] == address(0), "Factory: PAIR_EXISTS");
        getBootstrap[tokenA][tokenB] = bootstrap;
        getBootstrap[tokenB][tokenA] = bootstrap;
        emit BootstrapSetted(tokenA, tokenB, bootstrap);
    }

    function lockPairCreate() external onlyAdmin {
        lockForPairCreate = true;
        emit PairCreateLocked(msg.sender);
    }

    function unlockPairCreate() external onlyAdmin {
        lockForPairCreate = false;
        emit PairCreateUnlocked(msg.sender);
    }

    function setFeeto(address _feeto) external onlyAdmin {
        feeto = _feeto;
        emit FeetoUpdated(_feeto);
    }

    function setFeeBasePoint(uint8 _basePoint) external onlyAdmin {
        require(_basePoint <= 30, "FORBIDDEN");
        feeBasePoint = _basePoint;
        emit FeeBasePointUpdated(_basePoint);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":true,"internalType":"address","name":"bootstrap","type":"address"}],"name":"BootstrapSetted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"Candidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"basePoint","type":"uint8"}],"name":"FeeBasePointUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeto","type":"address"}],"name":"FeetoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"PairCreateLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"PairCreateUnlocked","type":"event"},{"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"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminCandidate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"candidateConfirm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeBasePoint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeto","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"getBootstrap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockForPairCreate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockPairCreate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"setAdminCandidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"address","name":"bootstrap","type":"address"}],"name":"setBootstrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_basePoint","type":"uint8"}],"name":"setFeeBasePoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeto","type":"address"}],"name":"setFeeto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockPairCreate","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051612ed5380380612ed583398101604081905261002f916100d0565b6100388161005d565b600280546001600160a01b0319166001600160a01b0392909216919091179055610100565b6000546001600160a01b0316156100ae5760405162461bcd60e51b815260206004820152601160248201527018591b5a5b88185b1c9958591e481cd95d607a1b604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000602082840312156100e257600080fd5b81516001600160a01b03811681146100f957600080fd5b9392505050565b612dc68061010f6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80634812d2cf116100a2578063ae3f1f2c11610071578063ae3f1f2c14610235578063c9c6539614610248578063e31622741461025b578063e6a439051461026e578063f851a440146102a257600080fd5b80634812d2cf146101f6578063574f2ba314610209578063798ad1691461021a57806396de7aa01461022257600080fd5b806325095b18116100de57806325095b18146101835780633accfa6c146101b75780633f023230146101ca578063405d31e0146101d257600080fd5b80630406bd3f146101105780631e3dd18b1461011a5780631ef414f71461014a57806324f0b18914610170575b600080fd5b6101186102b5565b005b61012d610128366004610bda565b610322565b6040516001600160a01b0390911681526020015b60405180910390f35b60025461015e90600160a01b900460ff1681565b60405160ff9091168152602001610141565b61011861017e366004610bf3565b61034c565b61012d610191366004610b64565b60046020908152600092835260408084209091529082529020546001600160a01b031681565b60015461012d906001600160a01b031681565b61011861040a565b6002546101e690600160a81b900460ff1681565b6040519015158152602001610141565b610118610204366004610b97565b6104b8565b600554604051908152602001610141565b6101186105d3565b610118610230366004610b42565b61063d565b60025461012d906001600160a01b031681565b61012d610256366004610b64565b6106b1565b610118610269366004610b42565b610aa5565b61012d61027c366004610b64565b60036020908152600092835260408084209091529082529020546001600160a01b031681565b60005461012d906001600160a01b031681565b6000546001600160a01b031633146102e85760405162461bcd60e51b81526004016102df90610c16565b60405180910390fd5b6002805460ff60a81b1916905560405133907fac45e0df4d004774ac0f710c9a0c240c354961a2f45e65cdd916c3974168c66090600090a2565b6005818154811061033257600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146103765760405162461bcd60e51b81526004016102df90610c16565b601e8160ff1611156103b65760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b60448201526064016102df565b6002805460ff60a01b1916600160a01b60ff8416908102919091179091556040519081527fcea85db5939aa6fa66ddd5c784e7284a46f4fba4e44f1e3d690f32d9acec167d9060200160405180910390a150565b6001546001600160a01b031633146104545760405162461bcd60e51b815260206004820152600d60248201526c6e6f742043616e64696461746560981b60448201526064016102df565b600154600080546040516001600160a01b0393841693909116917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031633146104e25760405162461bcd60e51b81526004016102df90610c16565b6001600160a01b0383811660009081526003602090815260408083208685168452909152902054161561054e5760405162461bcd60e51b8152602060048201526014602482015273466163746f72793a20504149525f45584953545360601b60448201526064016102df565b6001600160a01b03808416600081815260046020818152604080842088871680865290835281852080549789166001600160a01b03199889168117909155938352818520868652909252808420805490961683179095559351909392917f8fbdc74091620b8104c8c6e08d389b29cefbb460df289e035349571f5a18781491a4505050565b6000546001600160a01b031633146105fd5760405162461bcd60e51b81526004016102df90610c16565b6002805460ff60a81b1916600160a81b17905560405133907fc1524b448adbef1e113beb21fe1c291939668b9561ac836d3555e8c95963d4b090600090a2565b6000546001600160a01b031633146106675760405162461bcd60e51b81526004016102df90610c16565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f8cc40b9abca4a505a92028908f9d913d621d18112c69412806506f02333f26b490600090a250565b600254600090600160a81b900460ff1615806106eb5750600254600160a81b900460ff1680156106eb57506000546001600160a01b031633145b61072c5760405162461bcd60e51b815260206004820152601260248201527110d49150551157d410525497d313d0d2d15160721b60448201526064016102df565b816001600160a01b0316836001600160a01b031614156107845760405162461bcd60e51b81526020600482015260136024820152724944454e544943414c5f41444452455353455360681b60448201526064016102df565b600080836001600160a01b0316856001600160a01b0316106107a75783856107aa565b84845b90925090506001600160a01b0382166107f45760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064016102df565b6001600160a01b038281166000908152600360209081526040808320858516845290915290205416156108605760405162461bcd60e51b8152602060048201526014602482015273466163746f72793a20504149525f45584953545360601b60448201526064016102df565b6001600160a01b038281166000908152600460209081526040808320858516845290915290205416156108f9576001600160a01b03828116600090815260046020908152604080832085851684529091529020541633146108f95760405162461bcd60e51b81526020600482015260136024820152722727aa2fa127a7aa29aa2920a82fa7aba722a960691b60448201526064016102df565b60006040518060200161090b90610b19565b601f1982820381018352601f9091011660408190526bffffffffffffffffffffffff19606086811b8216602084015285901b166034820152909150600090604801604051602081830303815290604052805190602001209050808251602084016000f560405163485cc95560e01b81526001600160a01b03868116600483015285811660248301529196509086169063485cc95590604401600060405180830381600087803b1580156109bd57600080fd5b505af11580156109d1573d6000803e3d6000fd5b505050506001600160a01b0384811660008181526003602081815260408084208987168086529083528185208054978d166001600160a01b031998891681179091559383528185208686528352818520805488168517905560058054600181018255958190527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09095018054909716841790965592548351928352908201527f0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9910160405180910390a35050505092915050565b6000546001600160a01b03163314610acf5760405162461bcd60e51b81526004016102df90610c16565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f4d7837711202d0d7574a0e818fc3ab5ad3bcb1bf388b35ce649fefcb1f46a47c90600090a250565b61215780610c3a83390190565b80356001600160a01b0381168114610b3d57600080fd5b919050565b600060208284031215610b5457600080fd5b610b5d82610b26565b9392505050565b60008060408385031215610b7757600080fd5b610b8083610b26565b9150610b8e60208401610b26565b90509250929050565b600080600060608486031215610bac57600080fd5b610bb584610b26565b9250610bc360208501610b26565b9150610bd160408501610b26565b90509250925092565b600060208284031215610bec57600080fd5b5035919050565b600060208284031215610c0557600080fd5b813560ff81168114610b5d57600080fd5b6020808252600990820152683737ba1030b236b4b760b91b60408201526060019056fe6080604052600a805460ff191660011790553480156200001e57600080fd5b50604080518082018252601081526f2d32b73634b735902628102a37b5b2b760811b60208083019182528351808501909452600684526505a4c4b2d4c560d41b9084015281519192916200007591600391620000a6565b5080516200008b906004906020840190620000a6565b5050600580546001600160a01b031916331790555062000189565b828054620000b4906200014c565b90600052602060002090601f016020900481019282620000d8576000855562000123565b82601f10620000f357805160ff191683800117855562000123565b8280016001018555821562000123579182015b828111156200012357825182559160200191906001019062000106565b506200013192915062000135565b5090565b5b8082111562000131576000815560010162000136565b600181811c908216806200016157607f821691505b602082108114156200018357634e487b7160e01b600052602260045260246000fd5b50919050565b611fbe80620001996000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80636d9a640a116100b8578063a457c2d71161007c578063a457c2d7146102b6578063a9059cbb146102c9578063ba9a7a56146102dc578063c45a0155146102e5578063d21220a7146102f8578063dd62ed3e1461030b57600080fd5b80636d9a640a1461024157806370a08231146102545780637464fc3d1461027d57806389afcb441461028657806395d89b41146102ae57600080fd5b806323b872dd116100ff57806323b872dd146101e4578063313ce567146101f75780633950935114610206578063485cc955146102195780636a6278421461022e57600080fd5b806306fdde031461013c5780630902f1ac1461015a578063095ea7b3146101845780630dfe1681146101a757806318160ddd146101d2575b600080fd5b610144610344565b6040516101519190611e13565b60405180910390f35b600854604080516001600160701b038084168252600160701b909304909216602083015201610151565b610197610192366004611d34565b6103d6565b6040519015158152602001610151565b6006546101ba906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b6002545b604051908152602001610151565b6101976101f2366004611cf3565b6103ed565b60405160128152602001610151565b610197610214366004611d34565b61049c565b61022c610227366004611cba565b6104d8565b005b6101d661023c366004611c80565b610559565b61022c61024f366004611d9b565b6108e0565b6101d6610262366004611c80565b6001600160a01b031660009081526020819052604090205490565b6101d660095481565b610299610294366004611c80565b610d6e565b60408051928352602083019190915201610151565b610144611131565b6101976102c4366004611d34565b611140565b6101976102d7366004611d34565b6111d9565b6101d66103e881565b6005546101ba906001600160a01b031681565b6007546101ba906001600160a01b031681565b6101d6610319366004611cba565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606003805461035390611f25565b80601f016020809104026020016040519081016040528092919081815260200182805461037f90611f25565b80156103cc5780601f106103a1576101008083540402835291602001916103cc565b820191906000526020600020905b8154815290600101906020018083116103af57829003601f168201915b5050505050905090565b60006103e33384846111e6565b5060015b92915050565b60006103fa84848461130b565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156104845760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61049185338584036111e6565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916103e39185906104d3908690611e66565b6111e6565b6005546001600160a01b0316331461052b5760405162461bcd60e51b81526020600482015260166024820152754f6e6c792063616c6c656420627920666163746f727960501b604482015260640161047b565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b600a5460009060ff166001146105815760405162461bcd60e51b815260040161047b90611e46565b600a805460ff191690556000806105ac6008546001600160701b0380821692600160701b9092041690565b6006546040516370a0823160e01b81523060048201529294509092506000916001600160a01b03909116906370a082319060240160206040518083038186803b1580156105f857600080fd5b505afa15801561060c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106309190611d82565b6007546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561067957600080fd5b505afa15801561068d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b19190611d82565b905060006106c8836001600160701b0387166114db565b905060006106df836001600160701b0387166114db565b905060006106ed8787611531565b905060006106fa60025490565b9050806107b25760055460408051632b8fc7cb60e21b815290516000926001600160a01b03169163ae3f1f2c916004808301926020929190829003018186803b15801561074657600080fd5b505afa15801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190611c9d565b905061079e6103e86107986107938888611714565b61177b565b906114db565b99506107ac816103e86117eb565b506107f9565b6107f66001600160701b0389166107c98684611714565b6107d39190611e7e565b6001600160701b0389166107e78685611714565b6107f19190611e7e565b6118ca565b98505b600089116108495760405162461bcd60e51b815260206004820152601d60248201527f494e53554646494349454e545f4c49515549444954595f4d494e544544000000604482015260640161047b565b6108538a8a6117eb565b61085d86866118e2565b60ff82161561088a57600854610886906001600160701b0380821691600160701b900416611714565b6009555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a25050600a805460ff1916600117905550949695505050505050565b600a5460ff166001146109055760405162461bcd60e51b815260040161047b90611e46565b600a805460ff191690558215158061091d5750600082115b6109695760405162461bcd60e51b815260206004820152601a60248201527f494e53554646494349454e545f4f55545055545f414d4f554e54000000000000604482015260640161047b565b60008061098a6008546001600160701b0380821692600160701b9092041690565b91509150816001600160701b0316851080156109ae5750806001600160701b031684105b6109f35760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b604482015260640161047b565b60065460075460009182916001600160a01b03918216919081169087168214801590610a315750806001600160a01b0316876001600160a01b031614155b610a6a5760405162461bcd60e51b815260206004820152600a602482015269494e56414c49445f544f60b01b604482015260640161047b565b8815610a7b57610a7b82888b6119a8565b8715610a8c57610a8c81888a6119a8565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015610acb57600080fd5b505afa158015610adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b039190611d82565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a082319060240160206040518083038186803b158015610b4557600080fd5b505afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611d82565b92505050600087856001600160701b0316610b989190611ebf565b8311610ba5576000610bc2565b610bb8886001600160701b038716611ebf565b610bc29084611ebf565b90506000610bd9886001600160701b038716611ebf565b8311610be6576000610c03565b610bf9886001600160701b038716611ebf565b610c039084611ebf565b90506000821180610c145750600081115b610c605760405162461bcd60e51b815260206004820152601a60248201527f20494e53554646494349454e545f494e5055545f414d4f554e54000000000000604482015260640161047b565b6000610c7c610c70846003611714565b610798876103e8611714565b90506000610c8e610c70846003611714565b9050610cb3620f4240610cad6001600160701b038b8116908b16611714565b90611714565b610cbd8383611714565b1015610cf55760405162461bcd60e51b8152602060048201526007602482015266506169723a204b60c81b604482015260640161047b565b5050610d0184846118e2565b60408051838152602081018390529081018a9052606081018990526001600160a01b0388169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a35050600a805460ff1916600117905550505050505050565b600a54600090819060ff16600114610d985760405162461bcd60e51b815260040161047b90611e46565b600a805460ff19169055600080610dc36008546001600160701b0380821692600160701b9092041690565b6006546007546040516370a0823160e01b81523060048201529395509193506001600160a01b039081169291169060009083906370a082319060240160206040518083038186803b158015610e1757600080fd5b505afa158015610e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f9190611d82565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b158015610e9457600080fd5b505afa158015610ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecc9190611d82565b30600090815260208190526040812054919250610ee98888611531565b90506000610ef660025490565b905080610f038487611714565b610f0d9190611e7e565b9a5080610f1a8486611714565b610f249190611e7e565b995060008b118015610f36575060008a115b610f825760405162461bcd60e51b815260206004820152601d60248201527f494e53554646494349454e545f4c49515549444954595f4255524e4544000000604482015260640161047b565b610f8c3084611ae5565b610f97878d8d6119a8565b610fa2868d8c6119a8565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a082319060240160206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110199190611d82565b6040516370a0823160e01b81523060048201529095506001600160a01b038716906370a082319060240160206040518083038186803b15801561105b57600080fd5b505afa15801561106f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110939190611d82565b935061109f85856118e2565b60ff8216156110cc576008546110c8906001600160701b0380821691600160701b900416611714565b6009555b604080518c8152602081018c90526001600160a01b038e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050600a805460ff191660011790555096989597509495505050505050565b60606004805461035390611f25565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156111c25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161047b565b6111cf33858584036111e6565b5060019392505050565b60006103e333848461130b565b6001600160a01b0383166112485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161047b565b6001600160a01b0382166112a95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161047b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661136f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161047b565b6001600160a01b0382166113d15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161047b565b6001600160a01b038316600090815260208190526040902054818110156114495760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161047b565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611480908490611e66565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114cc91815260200190565b60405180910390a35b50505050565b6000826114e88382611ebf565b91508111156103e75760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161047b565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663ae3f1f2c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158257600080fd5b505afa158015611596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ba9190611c9d565b9050600560009054906101000a90046001600160a01b03166001600160a01b0316631ef414f76040518163ffffffff1660e01b815260040160206040518083038186803b15801561160a57600080fd5b505afa15801561161e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116429190611dd4565b60095490925060ff8316156117005780156116fb5760006116726107936001600160701b03888116908816611714565b9050600061167f8361177b565b9050808211156116f85760006116a061169884846114db565b600254610cad565b905060006116d48360ff89166116c46116ba8b601e611ed6565b889060ff16611714565b6116ce9190611e7e565b90611c2b565b905060006116e28284611e7e565b905080156116f4576116f487826117eb565b5050505b50505b61170c565b801561170c5760006009555b505092915050565b60008115806117385750828261172a8183611ea0565b92506117369083611e7e565b145b6103e75760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161047b565b600060038211156117dc5750806000611795600283611e7e565b6117a0906001611e66565b90505b818110156117d6579050806002816117bb8186611e7e565b6117c59190611e66565b6117cf9190611e7e565b90506117a3565b50919050565b81156117e6575060015b919050565b6001600160a01b0382166118415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161047b565b80600260008282546118539190611e66565b90915550506001600160a01b03821660009081526020819052604081208054839290611880908490611e66565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008183106118d957816118db565b825b9392505050565b6001600160701b03821180159061190057506001600160701b038111155b6119375760405162461bcd60e51b81526020600482015260086024820152674f564552464c4f5760c01b604482015260640161047b565b600880546001600160701b03838116600160701b9081026001600160e01b0319909316868316179290921792839055604080518483168152929093041660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a15050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b17905291516000928392871691611a349190611df7565b6000604051808303816000865af19150503d8060008114611a71576040519150601f19603f3d011682016040523d82523d6000602084013e611a76565b606091505b5091509150818015611aa0575080511580611aa0575080806020019051810190611aa09190611d60565b611ade5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015260640161047b565b5050505050565b6001600160a01b038216611b455760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161047b565b6001600160a01b03821660009081526020819052604090205481811015611bb95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161047b565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611be8908490611ebf565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016112fe565b600082611c388382611e66565b91508110156103e75760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161047b565b600060208284031215611c9257600080fd5b81356118db81611f70565b600060208284031215611caf57600080fd5b81516118db81611f70565b60008060408385031215611ccd57600080fd5b8235611cd881611f70565b91506020830135611ce881611f70565b809150509250929050565b600080600060608486031215611d0857600080fd5b8335611d1381611f70565b92506020840135611d2381611f70565b929592945050506040919091013590565b60008060408385031215611d4757600080fd5b8235611d5281611f70565b946020939093013593505050565b600060208284031215611d7257600080fd5b815180151581146118db57600080fd5b600060208284031215611d9457600080fd5b5051919050565b600080600060608486031215611db057600080fd5b83359250602084013591506040840135611dc981611f70565b809150509250925092565b600060208284031215611de657600080fd5b815160ff811681146118db57600080fd5b60008251611e09818460208701611ef9565b9190910192915050565b6020815260008251806020840152611e32816040850160208701611ef9565b601f01601f19169190910160400192915050565b6020808252600690820152651313d0d2d15160d21b604082015260600190565b60008219821115611e7957611e79611f5a565b500190565b600082611e9b57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611eba57611eba611f5a565b500290565b600082821015611ed157611ed1611f5a565b500390565b600060ff821660ff841680821015611ef057611ef0611f5a565b90039392505050565b60005b83811015611f14578181015183820152602001611efc565b838111156114d55750506000910152565b600181811c90821680611f3957607f821691505b602082108114156117d657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611f8557600080fd5b5056fea2646970667358221220d0fe593d6d142c865c583e0055763d6e06b2537f4511fb51e4b847159ca2ef7c64736f6c63430008070033a2646970667358221220c761625583191f926053025890e566d46f00a14d1b97fb4eb3f36e1d8b4301a064736f6c63430008070033000000000000000000000000ff617c9e13865e19fb29af0f7e3c68452a703e8c

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

000000000000000000000000ff617c9e13865e19fb29af0f7e3c68452a703e8c

-----Decoded View---------------
Arg [0] : _admin (address): 0xff617c9e13865e19fb29af0f7e3c68452a703e8c

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff617c9e13865e19fb29af0f7e3c68452a703e8c


Deployed ByteCode Sourcemap

28946:2795:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31261:137;;;:::i;:::-;;29285:34;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1948:32:1;;;1930:51;;1918:2;1903:18;29285:34:0;;;;;;;;29036;;;;;-1:-1:-1;;;29036:34:0;;;;;;;;;5875:4:1;5863:17;;;5845:36;;5833:2;5818:18;29036:34:0;5703:184:1;31536:202:0;;;;;;:::i;:::-;;:::i;29202:76::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29202:76:0;;;154:29;;;;;-1:-1:-1;;;;;154:29:0;;;346:234;;;:::i;29077:38::-;;;;;-1:-1:-1;;;29077:38:0;;;;;;;;;2745:14:1;;2738:22;2720:41;;2708:2;2693:18;29077:38:0;2580:187:1;30772:341:0;;;;;;:::i;:::-;;:::i;29432:108::-;29517:8;:15;29432:108;;5667:25:1;;;5655:2;5640:18;29432:108:0;5521:177:1;31121:132:0;;;:::i;588:149::-;;;;;;:::i;:::-;;:::i;29000:29::-;;;;;-1:-1:-1;;;;;29000:29:0;;;29548:1216;;;;;;:::i;:::-;;:::i;31406:122::-;;;;;;:::i;:::-;;:::i;29124:71::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29124:71:0;;;127:20;;;;;-1:-1:-1;;;;;127:20:0;;;31261:137;797:5;;-1:-1:-1;;;;;797:5:0;783:10;:19;775:41;;;;-1:-1:-1;;;775:41:0;;;;;;;:::i;:::-;;;;;;;;;31319:17:::1;:25:::0;;-1:-1:-1;;;;31319:25:0::1;::::0;;31360:30:::1;::::0;31379:10:::1;::::0;31360:30:::1;::::0;31339:5:::1;::::0;31360:30:::1;31261:137::o:0;29285:34::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29285:34:0;;-1:-1:-1;29285:34:0;:::o;31536:202::-;797:5;;-1:-1:-1;;;;;797:5:0;783:10;:19;775:41;;;;-1:-1:-1;;;775:41:0;;;;;;;:::i;:::-;31631:2:::1;31617:10;:16;;;;31609:38;;;::::0;-1:-1:-1;;;31609:38:0;;4359:2:1;31609:38:0::1;::::0;::::1;4341:21:1::0;4398:1;4378:18;;;4371:29;-1:-1:-1;;;4416:18:1;;;4409:39;4465:18;;31609:38:0::1;4157:332:1::0;31609:38:0::1;31658:12;:25:::0;;-1:-1:-1;;;;31658:25:0::1;-1:-1:-1::0;;;31658:25:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;31699:31:::1;::::0;5845:36:1;;;31699:31:0::1;::::0;5833:2:1;5818:18;31699:31:0::1;;;;;;;31536:202:::0;:::o;346:234::-;416:14;;-1:-1:-1;;;;;416:14:0;402:10;:28;394:54;;;;-1:-1:-1;;;394:54:0;;5044:2:1;394:54:0;;;5026:21:1;5083:2;5063:18;;;5056:30;-1:-1:-1;;;5102:18:1;;;5095:43;5155:18;;394:54:0;4842:337:1;394:54:0;484:14;;;477:5;;464:35;;-1:-1:-1;;;;;484:14:0;;;;477:5;;;;464:35;;;520:14;;;;512:22;;-1:-1:-1;;;;;;512:22:0;;;-1:-1:-1;;;;;520:14:0;;512:22;;;;545:27;;;346:234::o;30772:341::-;797:5;;-1:-1:-1;;;;;797:5:0;783:10;:19;775:41;;;;-1:-1:-1;;;775:41:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30883:15:0;;::::1;30918:1;30883:15:::0;;;:7:::1;:15;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;::::1;:37:::0;30875:70:::1;;;::::0;-1:-1:-1;;;30875:70:0;;3669:2:1;30875:70:0::1;::::0;::::1;3651:21:1::0;3708:2;3688:18;;;3681:30;-1:-1:-1;;;3727:18:1;;;3720:50;3787:18;;30875:70:0::1;3467:344:1::0;30875:70:0::1;-1:-1:-1::0;;;;;30956:20:0;;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;:28;;::::1;::::0;;;;;;;;;:40;;;;::::1;-1:-1:-1::0;;;;;;30956:40:0;;::::1;::::0;::::1;::::0;;;31007:20;;;;;;:28;;;;;;;;;:40;;;;::::1;::::0;::::1;::::0;;;31063:42;;30956:40;;:28;:20;31063:42:::1;::::0;::::1;30772:341:::0;;;:::o;31121:132::-;797:5;;-1:-1:-1;;;;;797:5:0;783:10;:19;775:41;;;;-1:-1:-1;;;775:41:0;;;;;;;:::i;:::-;31177:17:::1;:24:::0;;-1:-1:-1;;;;31177:24:0::1;-1:-1:-1::0;;;31177:24:0::1;::::0;;31217:28:::1;::::0;31234:10:::1;::::0;31217:28:::1;::::0;31177:24;;31217:28:::1;31121:132::o:0;588:149::-;797:5;;-1:-1:-1;;;;;797:5:0;783:10;:19;775:41;;;;-1:-1:-1;;;775:41:0;;;;;;;:::i;:::-;665:14:::1;:27:::0;;-1:-1:-1;;;;;;665:27:0::1;-1:-1:-1::0;;;;;665:27:0;::::1;::::0;;::::1;::::0;;;708:21:::1;::::0;::::1;::::0;-1:-1:-1;;708:21:0::1;588:149:::0;:::o;29548:1216::-;29707:17;;29654:12;;-1:-1:-1;;;29707:17:0;;;;29706:18;;:64;;-1:-1:-1;29729:17:0;;-1:-1:-1;;;29729:17:0;;;;:40;;;;-1:-1:-1;29764:5:0;;-1:-1:-1;;;;;29764:5:0;29750:10;:19;29729:40;29684:133;;;;-1:-1:-1;;;29684:133:0;;2974:2:1;29684:133:0;;;2956:21:1;3013:2;2993:18;;;2986:30;-1:-1:-1;;;3032:18:1;;;3025:48;3090:18;;29684:133:0;2772:342:1;29684:133:0;29846:6;-1:-1:-1;;;;;29836:16:0;:6;-1:-1:-1;;;;;29836:16:0;;;29828:48;;;;-1:-1:-1;;;29828:48:0;;4696:2:1;29828:48:0;;;4678:21:1;4735:2;4715:18;;;4708:30;-1:-1:-1;;;4754:18:1;;;4747:49;4813:18;;29828:48:0;4494:343:1;29828:48:0;29888:14;29904;29931:6;-1:-1:-1;;;;;29922:15:0;:6;-1:-1:-1;;;;;29922:15:0;;:79;;29986:6;29994;29922:79;;;29954:6;29962;29922:79;29887:114;;-1:-1:-1;29887:114:0;-1:-1:-1;;;;;;30020:20:0;;30012:45;;;;-1:-1:-1;;;30012:45:0;;4018:2:1;30012:45:0;;;4000:21:1;4057:2;4037:18;;;4030:30;-1:-1:-1;;;4076:18:1;;;4069:42;4128:18;;30012:45:0;3816:336:1;30012:45:0;-1:-1:-1;;;;;30076:15:0;;;30111:1;30076:15;;;:7;:15;;;;;;;;:23;;;;;;;;;;;;:37;30068:70;;;;-1:-1:-1;;;30068:70:0;;3669:2:1;30068:70:0;;;3651:21:1;3708:2;3688:18;;;3681:30;-1:-1:-1;;;3727:18:1;;;3720:50;3787:18;;30068:70:0;3467:344:1;30068:70:0;-1:-1:-1;;;;;30153:20:0;;;30193:1;30153:20;;;:12;:20;;;;;;;;:28;;;;;;;;;;;;:42;30149:149;;-1:-1:-1;;;;;30220:20:0;;;;;;;:12;:20;;;;;;;;:28;;;;;;;;;;;;30252:10;30220:42;30212:74;;;;-1:-1:-1;;;30212:74:0;;3321:2:1;30212:74:0;;;3303:21:1;3360:2;3340:18;;;3333:30;-1:-1:-1;;;3379:18:1;;;3372:49;3438:18;;30212:74:0;3119:343:1;30212:74:0;30308:21;30332:23;;;;;;;;:::i;:::-;-1:-1:-1;;30332:23:0;;;;;;;;;;;;;;;;-1:-1:-1;;1673:2:1;1669:15;;;1665:24;;30332:23:0;30391:32;;1653:37:1;1724:15;;;1720:24;1706:12;;;1699:46;30332:23:0;;-1:-1:-1;30366:12:0;;1761::1;;30391:32:0;;;;;;;;;;;;30381:43;;;;;;30366:58;;30514:4;30503:8;30497:15;30492:2;30482:8;30478:17;30475:1;30467:52;30540:38;;-1:-1:-1;;;30540:38:0;;-1:-1:-1;;;;;2222:15:1;;;30540:38:0;;;2204:34:1;2274:15;;;2254:18;;;2247:43;30459:60:0;;-1:-1:-1;30540:22:0;;;;;;2139:18:1;;30540:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;30589:15:0;;;;;;;:7;:15;;;;;;;;:23;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;;30589:30:0;;;;;;;;30630:15;;;;;;:23;;;;;;;;:30;;;;;;;;30671:8;:19;;-1:-1:-1;30671:19:0;;;;;;;;;;;;;;;;;;;;;;30740:15;;30706:50;;2475:51:1;;;2542:18;;;2535:34;30706:50:0;;2448:18:1;30706:50:0;;;;;;;29673:1091;;;;29548:1216;;;;:::o;31406:122::-;797:5;;-1:-1:-1;;;;;797:5:0;783:10;:19;775:41;;;;-1:-1:-1;;;775:41:0;;;;;;;:::i;:::-;31470:5:::1;:14:::0;;-1:-1:-1;;;;;;31470:14:0::1;-1:-1:-1::0;;;;;31470:14:0;::::1;::::0;;::::1;::::0;;;31500:20:::1;::::0;::::1;::::0;-1:-1:-1;;31500:20:0::1;31406:122:::0;:::o;-1:-1:-1:-;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:334::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;938:38;972:2;961:9;957:18;938:38;:::i;:::-;928:48;;648:334;;;;;:::o;987:180::-;1046:6;1099:2;1087:9;1078:7;1074:23;1070:32;1067:52;;;1115:1;1112;1105:12;1067:52;-1:-1:-1;1138:23:1;;987:180;-1:-1:-1;987:180:1:o;1172:269::-;1229:6;1282:2;1270:9;1261:7;1257:23;1253:32;1250:52;;;1298:1;1295;1288:12;1250:52;1337:9;1324:23;1387:4;1380:5;1376:16;1369:5;1366:27;1356:55;;1407:1;1404;1397:12;5184:332;5386:2;5368:21;;;5425:1;5405:18;;;5398:29;-1:-1:-1;;;5458:2:1;5443:18;;5436:39;5507:2;5492:18;;5184:332::o

Swarm Source

ipfs://c761625583191f926053025890e566d46f00a14d1b97fb4eb3f36e1d8b4301a0
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.