Contract 0x155a7ec2c100108921855e612e98a50a13118777 3

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x87c9d67008a19b2d2050f37dbc05d87f6be5427e907a911326644861e7006873Endorse291615192022-11-15 7:19:5117 days 15 hrs ago0x3ecff2cdb27b7ac271f1dec715a9a2e200988b6f IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000618670983 1.500095737
0xd6c2907b2438b65e33c87dcac44daac2fa17161f108616ebcad7d8ebe1280b58Endorse291615092022-11-15 7:19:0117 days 15 hrs ago0x3ecff2cdb27b7ac271f1dec715a9a2e200988b6f IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000618664005 1.500078817
0x84644e8626824a424aeced89a36f160ded352e0eb4db9fb08ff6f99b8581dd95Endorse291528752022-11-14 19:17:1618 days 3 hrs ago0x3ecff2cdb27b7ac271f1dec715a9a2e200988b6f IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000620074976 1.503500008
0x1588786efe267aa467d4cb2ead65d2a3206b18886c50f19566d553529151bcefTransfer282693182022-09-24 10:24:1469 days 12 hrs ago0x824af8db1fec736caa70186063a5ecbc15d06b37 IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000127567355 5.650073327
0xffd7301ae5af4726f34c5f71e70406ff556ff45aab64298692c4a0aa84c4d2fdTransfer278815152022-09-01 21:56:0992 days 39 mins ago0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.0000338851.500000008
0xc963c49b448cc29b37b01a9664ebd3975493a740d0215f4a874b85c9d929eb97Endorse278700952022-09-01 6:01:3092 days 16 hrs ago0x8d902032e4a868010cc11cb94cc7ba0d4aaa92c0 IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000618915003 1.500000008
0xba60fef473a752a09bdf1836fd88eb34efe1e1d74d4a4a3a941e2de167cd8fccEndorse278700942022-09-01 6:01:2592 days 16 hrs ago0x8d902032e4a868010cc11cb94cc7ba0d4aaa92c0 IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000618915003 1.500000008
0x2dcfdfedf6009747a52a8e68197ad7ca361d485095634e9df9793ee2371973ccTransfer278275232022-08-29 10:21:2795 days 12 hrs ago0xc8c745de6a84dff8e604c1fd4be18badd8433135 IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.00005472255 2.425000007
0x6e1a0791664cd9eeba7a25851584baa6de530933de5efe03ec31f0904578f1ffEndorse277858262022-08-26 12:31:3098 days 10 hrs ago0x61021f95f27e63611e2acfb267c97cf96fb89712 IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000618960003 1.500000008
0x5273bee84549df70723589e2fc79f6853e8708ebf7c7f7751883f0657621edbbEndorse277607412022-08-24 19:08:15100 days 3 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.002744597986 6.6542
0x8af04af5749daf179268ec8a0505d7ae0ffda2b337c8b47b463eebef0a4acaf3Endorse277606302022-08-24 18:55:48100 days 3 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.002100457648 5.092500015
0x05b523db93dc1e85281116dc408b3622906c8f849a6a3031b71b5db50f1da524Endorse277604802022-08-24 18:37:56100 days 3 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000618691503 1.500000008
0xb7928f9d7c377f18b160a155f6507570f9f58afff6e23a3f38e3dbcbe2f41d8aEndorse277603862022-08-24 18:30:05100 days 4 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.002608301627 6.323753342
0x74b7df5fc857b6001a3f198d9d395207c11c4e8e3a4fab0793dadc6b68668330Endorse277603322022-08-24 18:25:34100 days 4 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000618691503 1.500000008
0x070c3ec560dd11550c26d1fab903e0533f83612bf3ab353576bb05d1f6e904adEndorse277603022022-08-24 18:21:38100 days 4 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000618691504 1.500000011
0x2854d01996807958add593b5b6747ac14335b54e10590515b0453b635e77f2daEndorse277601442022-08-24 18:04:31100 days 4 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.00200043585 4.850000001
0xa0ac885a9f2d7e5d9609668c00c92904d66568636d67d1cf9acb1b1bc891e726Endorse277600362022-08-24 17:53:14100 days 4 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000840183054 2.036999995
0xbcd561d65cfc9165810b79f0e166f310840e6aa75d2c65c2979e2bd2f688017cEndorse277599942022-08-24 17:46:38100 days 4 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000618691507 1.500000017
0xc694d9c880000abfcdf64f9cc52a607a1723ecc32ee9cdde6d4412caf3e8c1aeEndorse277568622022-08-24 12:04:44100 days 10 hrs ago0x3d9d5e0b5ad16e1f5f6b5c0ad30d465e68a85e74 IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.000619655798 1.501831795
0xb3276e4cd99d2eeb39aae05a0edb49e77c995c728edd01c533d7f67cd8491ed5Endorse277568622022-08-24 12:04:44100 days 10 hrs ago0x3d9d5e0b5ad16e1f5f6b5c0ad30d465e68a85e74 IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.012488639367 30.267271352
0xe7a96c58890d1713670f2a3b62a7cc7b3cc790be6283f313d076fb1bca2d7ec5Endorse277494622022-08-23 19:24:20101 days 3 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.012823491958 31.09019267
0x914b28672cb8b68bc05bc475b167367a2292a28ee63942e27e004dfb105b0750Endorse277493962022-08-23 19:18:49101 days 3 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.013409875218 32.511862257
0x732906379eef6eba08123cb124ab6c4d72816d941e56f51427665a720b069e05Endorse277492522022-08-23 19:01:52101 days 3 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.01320287661 32.01
0xb5eb8698f622209fb68ab1b0e7c36c251e4a83ca9b325cc3ddf74244b76f0bd9Endorse277482772022-08-23 17:29:16101 days 5 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.01266118892 30.695800502
0x362c802296db0461c5b66cd066579207457db7800d0689d1aa9c32b26e130d4eEndorse277471752022-08-23 15:39:09101 days 6 hrs ago0x0681929880a65c17f6ed3c6584444196e2eaeccc IN  0x155a7ec2c100108921855e612e98a50a131187770 MATIC0.013366319511 32.406262681
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UTT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 20 : UTT.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";

contract UTT is ERC20Burnable, ERC20Pausable, Ownable, ChainlinkClient {
    using Chainlink for Chainlink.Request;

    /**
     * The `socialConnections` mapping is storing the connected socialIds
     * as so: address => socialTypeId => socialUserIdHash
     */
    mapping (address => mapping (uint256 => bytes32) ) socialConnections;

    /**
     * The `socialConnectionReward` variable is the amount of tokens to be minted
     * as a reward for connecting/verifying with a social platform user id.
     * Configurable by admin.
     */
    uint256 public socialConnectionReward = 10000;


    // See the whitepaper for the meaning of the following parameters:

    /** New stake offset */
    uint256 public constant O_n = 1;

    /** Discounting component for the new stake */
    uint256 public constant D_n = 30;

    /** Discounting component for the stake of first-level previous endorsers */
    uint256 public constant D_lvl1 = 2;

    /** Discounting component for the stake of second-level previous endorsers */
    uint256 public constant D_lvl2 = 20; //

    /** Discounting component for other previous endorsers' total stake */
    uint256 public constant D_o = 5000;


    /** A map targetAddress => endorserAddress => stake mapping all endorser's stakes by their endorsement target */
    mapping (address => mapping(address => uint256)) public previousEndorserStakes;

    /** A map targetAddress => stake with the total stake by target */
    mapping (address => uint) public totalStake;

    // Oracle related
    struct OracleRequest {
        address from;
        address target;
        uint256 amount;
        string transactionId;
    }
    mapping (bytes32 => OracleRequest) private oracleRequests;
    address private oracle;
    bytes32 private jobId;
    uint256 private fee;

    // Events for connecting social media accounts/other user ids.
    event AddConnection(address indexed _user, uint indexed _connectedTypeId, bytes32 indexed _connectedUserIdHash);
    event RemoveConnection(address indexed _user, uint indexed _connectedTypeId, bytes32 indexed _connectedUserIdHash);

    // Events for endorsements.
    event Endorse(address indexed _from, address indexed _to, uint _value, string _transactionId);
    event RewardPreviousEndorserLevel1(address endorser, uint256 reward);
    event RewardPreviousEndorserLevel2(address endorser, uint256 reward);

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract. Grants `MINTER_ROLE` to the bridge.
     *
     * See {ERC20-constructor}.
     */
    constructor(
        uint256 _mintAmount,
        address _oracle,
        string memory _jobId,
        uint256 _fee,
        address _link
    )
        ERC20("UTU Trust Token", "UTT")
    {
        _mint(msg.sender, _mintAmount);
        setChainlinkToken(_link);
        oracle = _oracle;
        jobId = stringToBytes32(_jobId);
        fee = _fee;
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_pause}.
     *
     */
    function pause()
        public
        virtual
        onlyOwner
    {
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC20Pausable} and {Pausable-_unpause}.
     *
     */
    function unpause()
        public
        virtual
        onlyOwner
    {
        _unpause();
    }

    /**
     * 
     * Setting the decimals to 0 instead of 18 since we don't need decimals for this particular use case
     *
     */
    function decimals() public view virtual override returns (uint8) {
        return 0;
    }

    /**
     * Computes the reward to be given to previousEndorser for a new endorsement of s_n on the given target and the
     * previous endorser level-dependent discount D_lvl_p. It assumes that the new endorsement s_n has not yet been
     * added to the totalStake map.
     */
    function computeReward(
        address target,
        address previousEndorser,
        uint256 D_lvl_p,
        uint256 s_n
    )
    private
    view
    returns (uint256)
    {
        uint256 s_p = previousEndorserStakes[target][previousEndorser];
        uint256 s_o = totalStake[target] - s_p;

        return
            (s_p *  (s_n + O_n) * D_o)
            /
            (D_lvl_p * (s_n + D_n) * (D_o + s_o));
    }


    /**
     * @dev Sends a tip of tokens to the previous address
     * that endorsed the current one.
     *
     * Invokes `super._transfer()`.
     */
    function _endorse(
        address from,
        address target,
        uint256 amount,
        string memory transactionId,
        address[] memory endorsersLevel1,
        address[] memory endorsersLevel2
    )
        internal
    {
        //reward first-level previous endorsers
        for(uint8 i=0; i < endorsersLevel1.length; i++){
            uint256 endorserReward = computeReward(target, endorsersLevel1[i], D_lvl1, amount);

            // mint rewarded tokens to endorser
            super._mint(address(endorsersLevel1[i]), endorserReward);
            emit RewardPreviousEndorserLevel1(endorsersLevel1[i], endorserReward);
        }

        //reward first-level previous endorsers
        for(uint8 i=0; i < endorsersLevel2.length; i++){
            uint256 endorserReward = computeReward(target, endorsersLevel2[i], D_lvl2, amount);

            // mint rewarded tokens to endorser
            super._mint(endorsersLevel2[i], endorserReward);
            emit RewardPreviousEndorserLevel2(endorsersLevel2[i], endorserReward);
        }

        totalStake[target] += amount;
        previousEndorserStakes[target][from] += amount;

        emit Endorse(from, target, amount, transactionId);
    }

    function endorse(address target, uint256 amount, string memory transactionId) external {
        require(msg.sender == tx.origin, "should be an user");
        Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfillEndorse.selector);
        request.add("targetAddress", addressToString(target));
        request.add("sourceAddress", addressToString(msg.sender));
        request.add("transactionId", transactionId);
        bytes32 requestId = sendOperatorRequestTo(oracle, request, fee);
        oracleRequests[requestId] = OracleRequest({ from: msg.sender, target: target, amount: amount, transactionId: transactionId });
    }

    function fulfillEndorse(
        bytes32 _requestId,
        address[] calldata endorsersLevel1,
        address[] calldata endorsersLevel2
    )
        external
        recordChainlinkFulfillment(_requestId)
    {
        OracleRequest memory r = oracleRequests[_requestId];
        require(r.target != address(0), "unknown endorsment");
        _burn(r.from, r.amount);
        _endorse(r.from, r.target, r.amount, r.transactionId, endorsersLevel1, endorsersLevel2);
    }

    /**
     * @dev The admin (backend) can set verified social media
     * connections.
     */
    function addConnection(
        address user,
        uint256 connectedTypeId,
        bytes32 connectedUserIdHash
    )
        public
        onlyOwner
    {
        // only add connection if not previously added
        if (socialConnections[user][connectedTypeId] == 0) {
            socialConnections[user][connectedTypeId] = connectedUserIdHash;

            // mint reward
            super._mint(user, socialConnectionReward);

            emit AddConnection(user, connectedTypeId, connectedUserIdHash);
        }
    }

    /**
     * @dev The admin (backend) can remove social media connections.
     */
    function removeConnection(
        address user,
        uint256 connectedTypeId
    )
        public
        onlyOwner
    {
        // only remove connection if currently connected
        if (socialConnections[user][connectedTypeId] != 0) {
            socialConnections[user][connectedTypeId] = 0;

            emit RemoveConnection(user, connectedTypeId, 0);
        }
    }

    /**
     * @dev The admin (backend) can set the social connection reward amount.
     */
    function setSocialConnectionReward(
        uint256 amount
    )
        public
        onlyOwner
    {
        socialConnectionReward = amount;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    )
        internal
        override(ERC20, ERC20Pausable)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    /**
     * @dev - forbid external calls on transfer
     */
    function transfer(address recipient, uint256 amount) public pure override returns (bool) {
      revert('Not allowed.');
    }

    /**
     * @dev - forbid external calls on approve
     */
    function approve(address spender, uint256 amount) public pure override returns (bool) {
      revert('Not allowed.');
    }

    function addressToString(address x) internal pure returns (string memory) {
        bytes memory s = new bytes(40);
        for (uint i = 0; i < 20; i++) {
            bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
            bytes1 hi = bytes1(uint8(b) / 16);
            bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
            s[2*i] = char(hi);
            s[2*i+1] = char(lo);
        }
        return string(abi.encodePacked("0x", string(s)));
    }

    function char(bytes1 b) internal pure returns (bytes1 c) {
        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
        else return bytes1(uint8(b) + 0x57);
    }

    function stringToBytes32(string memory source) public pure returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }
        assembly {
            result := mload(add(source, 32))
        }
    }
}

File 2 of 20 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 20 : ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @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 Contracts guidelines: functions revert
 * instead 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 4 of 20 : ERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC20.sol";
import "../../../utils/Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

File 5 of 20 : ERC20Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC20.sol";
import "../../../security/Pausable.sol";

/**
 * @dev ERC20 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC20Pausable is ERC20, Pausable {
    /**
     * @dev See {ERC20-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        require(!paused(), "ERC20Pausable: token transfer while paused");
    }
}

File 6 of 20 : ChainlinkClient.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./Chainlink.sol";
import "./interfaces/ENSInterface.sol";
import "./interfaces/LinkTokenInterface.sol";
import "./interfaces/ChainlinkRequestInterface.sol";
import "./interfaces/OperatorInterface.sol";
import "./interfaces/PointerInterface.sol";
import {ENSResolver as ENSResolver_Chainlink} from "./vendor/ENSResolver.sol";

/**
 * @title The ChainlinkClient contract
 * @notice Contract writers can inherit this contract in order to create requests for the
 * Chainlink network
 */
abstract contract ChainlinkClient {
  using Chainlink for Chainlink.Request;

  uint256 internal constant LINK_DIVISIBILITY = 10**18;
  uint256 private constant AMOUNT_OVERRIDE = 0;
  address private constant SENDER_OVERRIDE = address(0);
  uint256 private constant ORACLE_ARGS_VERSION = 1;
  uint256 private constant OPERATOR_ARGS_VERSION = 2;
  bytes32 private constant ENS_TOKEN_SUBNAME = keccak256("link");
  bytes32 private constant ENS_ORACLE_SUBNAME = keccak256("oracle");
  address private constant LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;

  ENSInterface private s_ens;
  bytes32 private s_ensNode;
  LinkTokenInterface private s_link;
  OperatorInterface private s_oracle;
  uint256 private s_requestCount = 1;
  mapping(bytes32 => address) private s_pendingRequests;

  event ChainlinkRequested(bytes32 indexed id);
  event ChainlinkFulfilled(bytes32 indexed id);
  event ChainlinkCancelled(bytes32 indexed id);

  /**
   * @notice Creates a request that can hold additional parameters
   * @param specId The Job Specification ID that the request will be created for
   * @param callbackAddr address to operate the callback on
   * @param callbackFunctionSignature function signature to use for the callback
   * @return A Chainlink Request struct in memory
   */
  function buildChainlinkRequest(
    bytes32 specId,
    address callbackAddr,
    bytes4 callbackFunctionSignature
  ) internal pure returns (Chainlink.Request memory) {
    Chainlink.Request memory req;
    return req.initialize(specId, callbackAddr, callbackFunctionSignature);
  }

  /**
   * @notice Creates a request that can hold additional parameters
   * @param specId The Job Specification ID that the request will be created for
   * @param callbackFunctionSignature function signature to use for the callback
   * @return A Chainlink Request struct in memory
   */
  function buildOperatorRequest(bytes32 specId, bytes4 callbackFunctionSignature)
    internal
    view
    returns (Chainlink.Request memory)
  {
    Chainlink.Request memory req;
    return req.initialize(specId, address(this), callbackFunctionSignature);
  }

  /**
   * @notice Creates a Chainlink request to the stored oracle address
   * @dev Calls `chainlinkRequestTo` with the stored oracle address
   * @param req The initialized Chainlink Request
   * @param payment The amount of LINK to send for the request
   * @return requestId The request ID
   */
  function sendChainlinkRequest(Chainlink.Request memory req, uint256 payment) internal returns (bytes32) {
    return sendChainlinkRequestTo(address(s_oracle), req, payment);
  }

  /**
   * @notice Creates a Chainlink request to the specified oracle address
   * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to
   * send LINK which creates a request on the target oracle contract.
   * Emits ChainlinkRequested event.
   * @param oracleAddress The address of the oracle for the request
   * @param req The initialized Chainlink Request
   * @param payment The amount of LINK to send for the request
   * @return requestId The request ID
   */
  function sendChainlinkRequestTo(
    address oracleAddress,
    Chainlink.Request memory req,
    uint256 payment
  ) internal returns (bytes32 requestId) {
    uint256 nonce = s_requestCount;
    s_requestCount = nonce + 1;
    bytes memory encodedRequest = abi.encodeWithSelector(
      ChainlinkRequestInterface.oracleRequest.selector,
      SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address
      AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent
      req.id,
      address(this),
      req.callbackFunctionId,
      nonce,
      ORACLE_ARGS_VERSION,
      req.buf.buf
    );
    return _rawRequest(oracleAddress, nonce, payment, encodedRequest);
  }

  /**
   * @notice Creates a Chainlink request to the stored oracle address
   * @dev This function supports multi-word response
   * @dev Calls `sendOperatorRequestTo` with the stored oracle address
   * @param req The initialized Chainlink Request
   * @param payment The amount of LINK to send for the request
   * @return requestId The request ID
   */
  function sendOperatorRequest(Chainlink.Request memory req, uint256 payment) internal returns (bytes32) {
    return sendOperatorRequestTo(address(s_oracle), req, payment);
  }

  /**
   * @notice Creates a Chainlink request to the specified oracle address
   * @dev This function supports multi-word response
   * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to
   * send LINK which creates a request on the target oracle contract.
   * Emits ChainlinkRequested event.
   * @param oracleAddress The address of the oracle for the request
   * @param req The initialized Chainlink Request
   * @param payment The amount of LINK to send for the request
   * @return requestId The request ID
   */
  function sendOperatorRequestTo(
    address oracleAddress,
    Chainlink.Request memory req,
    uint256 payment
  ) internal returns (bytes32 requestId) {
    uint256 nonce = s_requestCount;
    s_requestCount = nonce + 1;
    bytes memory encodedRequest = abi.encodeWithSelector(
      OperatorInterface.operatorRequest.selector,
      SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address
      AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent
      req.id,
      req.callbackFunctionId,
      nonce,
      OPERATOR_ARGS_VERSION,
      req.buf.buf
    );
    return _rawRequest(oracleAddress, nonce, payment, encodedRequest);
  }

  /**
   * @notice Make a request to an oracle
   * @param oracleAddress The address of the oracle for the request
   * @param nonce used to generate the request ID
   * @param payment The amount of LINK to send for the request
   * @param encodedRequest data encoded for request type specific format
   * @return requestId The request ID
   */
  function _rawRequest(
    address oracleAddress,
    uint256 nonce,
    uint256 payment,
    bytes memory encodedRequest
  ) private returns (bytes32 requestId) {
    requestId = keccak256(abi.encodePacked(this, nonce));
    s_pendingRequests[requestId] = oracleAddress;
    emit ChainlinkRequested(requestId);
    require(s_link.transferAndCall(oracleAddress, payment, encodedRequest), "unable to transferAndCall to oracle");
  }

  /**
   * @notice Allows a request to be cancelled if it has not been fulfilled
   * @dev Requires keeping track of the expiration value emitted from the oracle contract.
   * Deletes the request from the `pendingRequests` mapping.
   * Emits ChainlinkCancelled event.
   * @param requestId The request ID
   * @param payment The amount of LINK sent for the request
   * @param callbackFunc The callback function specified for the request
   * @param expiration The time of the expiration for the request
   */
  function cancelChainlinkRequest(
    bytes32 requestId,
    uint256 payment,
    bytes4 callbackFunc,
    uint256 expiration
  ) internal {
    OperatorInterface requested = OperatorInterface(s_pendingRequests[requestId]);
    delete s_pendingRequests[requestId];
    emit ChainlinkCancelled(requestId);
    requested.cancelOracleRequest(requestId, payment, callbackFunc, expiration);
  }

  /**
   * @notice the next request count to be used in generating a nonce
   * @dev starts at 1 in order to ensure consistent gas cost
   * @return returns the next request count to be used in a nonce
   */
  function getNextRequestCount() internal view returns (uint256) {
    return s_requestCount;
  }

  /**
   * @notice Sets the stored oracle address
   * @param oracleAddress The address of the oracle contract
   */
  function setChainlinkOracle(address oracleAddress) internal {
    s_oracle = OperatorInterface(oracleAddress);
  }

  /**
   * @notice Sets the LINK token address
   * @param linkAddress The address of the LINK token contract
   */
  function setChainlinkToken(address linkAddress) internal {
    s_link = LinkTokenInterface(linkAddress);
  }

  /**
   * @notice Sets the Chainlink token address for the public
   * network as given by the Pointer contract
   */
  function setPublicChainlinkToken() internal {
    setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());
  }

  /**
   * @notice Retrieves the stored address of the LINK token
   * @return The address of the LINK token
   */
  function chainlinkTokenAddress() internal view returns (address) {
    return address(s_link);
  }

  /**
   * @notice Retrieves the stored address of the oracle contract
   * @return The address of the oracle contract
   */
  function chainlinkOracleAddress() internal view returns (address) {
    return address(s_oracle);
  }

  /**
   * @notice Allows for a request which was created on another contract to be fulfilled
   * on this contract
   * @param oracleAddress The address of the oracle contract that will fulfill the request
   * @param requestId The request ID used for the response
   */
  function addChainlinkExternalRequest(address oracleAddress, bytes32 requestId) internal notPendingRequest(requestId) {
    s_pendingRequests[requestId] = oracleAddress;
  }

  /**
   * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS
   * @dev Accounts for subnodes having different resolvers
   * @param ensAddress The address of the ENS contract
   * @param node The ENS node hash
   */
  function useChainlinkWithENS(address ensAddress, bytes32 node) internal {
    s_ens = ENSInterface(ensAddress);
    s_ensNode = node;
    bytes32 linkSubnode = keccak256(abi.encodePacked(s_ensNode, ENS_TOKEN_SUBNAME));
    ENSResolver_Chainlink resolver = ENSResolver_Chainlink(s_ens.resolver(linkSubnode));
    setChainlinkToken(resolver.addr(linkSubnode));
    updateChainlinkOracleWithENS();
  }

  /**
   * @notice Sets the stored oracle contract with the address resolved by ENS
   * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously
   */
  function updateChainlinkOracleWithENS() internal {
    bytes32 oracleSubnode = keccak256(abi.encodePacked(s_ensNode, ENS_ORACLE_SUBNAME));
    ENSResolver_Chainlink resolver = ENSResolver_Chainlink(s_ens.resolver(oracleSubnode));
    setChainlinkOracle(resolver.addr(oracleSubnode));
  }

  /**
   * @notice Ensures that the fulfillment is valid for this contract
   * @dev Use if the contract developer prefers methods instead of modifiers for validation
   * @param requestId The request ID for fulfillment
   */
  function validateChainlinkCallback(bytes32 requestId)
    internal
    recordChainlinkFulfillment(requestId)
  // solhint-disable-next-line no-empty-blocks
  {

  }

  /**
   * @dev Reverts if the sender is not the oracle of the request.
   * Emits ChainlinkFulfilled event.
   * @param requestId The request ID for fulfillment
   */
  modifier recordChainlinkFulfillment(bytes32 requestId) {
    require(msg.sender == s_pendingRequests[requestId], "Source must be the oracle of the request");
    delete s_pendingRequests[requestId];
    emit ChainlinkFulfilled(requestId);
    _;
  }

  /**
   * @dev Reverts if the request is already pending
   * @param requestId The request ID for fulfillment
   */
  modifier notPendingRequest(bytes32 requestId) {
    require(s_pendingRequests[requestId] == address(0), "Request is already pending");
    _;
  }
}

File 7 of 20 : Context.sol
// SPDX-License-Identifier: MIT

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 8 of 20 : IERC20.sol
// SPDX-License-Identifier: MIT

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 9 of 20 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @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 10 of 20 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 11 of 20 : Chainlink.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {CBORChainlink} from "./vendor/CBORChainlink.sol";
import {BufferChainlink} from "./vendor/BufferChainlink.sol";

/**
 * @title Library for common Chainlink functions
 * @dev Uses imported CBOR library for encoding to buffer
 */
library Chainlink {
  uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase

  using CBORChainlink for BufferChainlink.buffer;

  struct Request {
    bytes32 id;
    address callbackAddress;
    bytes4 callbackFunctionId;
    uint256 nonce;
    BufferChainlink.buffer buf;
  }

  /**
   * @notice Initializes a Chainlink request
   * @dev Sets the ID, callback address, and callback function signature on the request
   * @param self The uninitialized request
   * @param jobId The Job Specification ID
   * @param callbackAddr The callback address
   * @param callbackFunc The callback function signature
   * @return The initialized request
   */
  function initialize(
    Request memory self,
    bytes32 jobId,
    address callbackAddr,
    bytes4 callbackFunc
  ) internal pure returns (Chainlink.Request memory) {
    BufferChainlink.init(self.buf, defaultBufferSize);
    self.id = jobId;
    self.callbackAddress = callbackAddr;
    self.callbackFunctionId = callbackFunc;
    return self;
  }

  /**
   * @notice Sets the data for the buffer without encoding CBOR on-chain
   * @dev CBOR can be closed with curly-brackets {} or they can be left off
   * @param self The initialized request
   * @param data The CBOR data
   */
  function setBuffer(Request memory self, bytes memory data) internal pure {
    BufferChainlink.init(self.buf, data.length);
    BufferChainlink.append(self.buf, data);
  }

  /**
   * @notice Adds a string value to the request with a given key name
   * @param self The initialized request
   * @param key The name of the key
   * @param value The string value to add
   */
  function add(
    Request memory self,
    string memory key,
    string memory value
  ) internal pure {
    self.buf.encodeString(key);
    self.buf.encodeString(value);
  }

  /**
   * @notice Adds a bytes value to the request with a given key name
   * @param self The initialized request
   * @param key The name of the key
   * @param value The bytes value to add
   */
  function addBytes(
    Request memory self,
    string memory key,
    bytes memory value
  ) internal pure {
    self.buf.encodeString(key);
    self.buf.encodeBytes(value);
  }

  /**
   * @notice Adds a int256 value to the request with a given key name
   * @param self The initialized request
   * @param key The name of the key
   * @param value The int256 value to add
   */
  function addInt(
    Request memory self,
    string memory key,
    int256 value
  ) internal pure {
    self.buf.encodeString(key);
    self.buf.encodeInt(value);
  }

  /**
   * @notice Adds a uint256 value to the request with a given key name
   * @param self The initialized request
   * @param key The name of the key
   * @param value The uint256 value to add
   */
  function addUint(
    Request memory self,
    string memory key,
    uint256 value
  ) internal pure {
    self.buf.encodeString(key);
    self.buf.encodeUInt(value);
  }

  /**
   * @notice Adds an array of strings to the request with a given key name
   * @param self The initialized request
   * @param key The name of the key
   * @param values The array of string values to add
   */
  function addStringArray(
    Request memory self,
    string memory key,
    string[] memory values
  ) internal pure {
    self.buf.encodeString(key);
    self.buf.startArray();
    for (uint256 i = 0; i < values.length; i++) {
      self.buf.encodeString(values[i]);
    }
    self.buf.endSequence();
  }
}

File 12 of 20 : ENSInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ENSInterface {
  // Logged when the owner of a node assigns a new owner to a subnode.
  event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);

  // Logged when the owner of a node transfers ownership to a new account.
  event Transfer(bytes32 indexed node, address owner);

  // Logged when the resolver for a node changes.
  event NewResolver(bytes32 indexed node, address resolver);

  // Logged when the TTL of a node changes
  event NewTTL(bytes32 indexed node, uint64 ttl);

  function setSubnodeOwner(
    bytes32 node,
    bytes32 label,
    address owner
  ) external;

  function setResolver(bytes32 node, address resolver) external;

  function setOwner(bytes32 node, address owner) external;

  function setTTL(bytes32 node, uint64 ttl) external;

  function owner(bytes32 node) external view returns (address);

  function resolver(bytes32 node) external view returns (address);

  function ttl(bytes32 node) external view returns (uint64);
}

File 13 of 20 : LinkTokenInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);

  function approve(address spender, uint256 value) external returns (bool success);

  function balanceOf(address owner) external view returns (uint256 balance);

  function decimals() external view returns (uint8 decimalPlaces);

  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

  function increaseApproval(address spender, uint256 subtractedValue) external;

  function name() external view returns (string memory tokenName);

  function symbol() external view returns (string memory tokenSymbol);

  function totalSupply() external view returns (uint256 totalTokensIssued);

  function transfer(address to, uint256 value) external returns (bool success);

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  ) external returns (bool success);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool success);
}

File 14 of 20 : ChainlinkRequestInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ChainlinkRequestInterface {
  function oracleRequest(
    address sender,
    uint256 requestPrice,
    bytes32 serviceAgreementID,
    address callbackAddress,
    bytes4 callbackFunctionId,
    uint256 nonce,
    uint256 dataVersion,
    bytes calldata data
  ) external;

  function cancelOracleRequest(
    bytes32 requestId,
    uint256 payment,
    bytes4 callbackFunctionId,
    uint256 expiration
  ) external;
}

File 15 of 20 : OperatorInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./OracleInterface.sol";
import "./ChainlinkRequestInterface.sol";

interface OperatorInterface is OracleInterface, ChainlinkRequestInterface {
  function operatorRequest(
    address sender,
    uint256 payment,
    bytes32 specId,
    bytes4 callbackFunctionId,
    uint256 nonce,
    uint256 dataVersion,
    bytes calldata data
  ) external;

  function fulfillOracleRequest2(
    bytes32 requestId,
    uint256 payment,
    address callbackAddress,
    bytes4 callbackFunctionId,
    uint256 expiration,
    bytes calldata data
  ) external returns (bool);

  function ownerTransferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  ) external returns (bool success);

  function distributeFunds(address payable[] calldata receivers, uint256[] calldata amounts) external payable;

  function getAuthorizedSenders() external returns (address[] memory);

  function setAuthorizedSenders(address[] calldata senders) external;

  function getForwarder() external returns (address);
}

File 16 of 20 : PointerInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface PointerInterface {
  function getAddress() external view returns (address);
}

File 17 of 20 : ENSResolver.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

abstract contract ENSResolver {
  function addr(bytes32 node) public view virtual returns (address);
}

File 18 of 20 : CBORChainlink.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.19;

import {BufferChainlink} from "./BufferChainlink.sol";

library CBORChainlink {
  using BufferChainlink for BufferChainlink.buffer;

  uint8 private constant MAJOR_TYPE_INT = 0;
  uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;
  uint8 private constant MAJOR_TYPE_BYTES = 2;
  uint8 private constant MAJOR_TYPE_STRING = 3;
  uint8 private constant MAJOR_TYPE_ARRAY = 4;
  uint8 private constant MAJOR_TYPE_MAP = 5;
  uint8 private constant MAJOR_TYPE_TAG = 6;
  uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;

  uint8 private constant TAG_TYPE_BIGNUM = 2;
  uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;

  function encodeFixedNumeric(BufferChainlink.buffer memory buf, uint8 major, uint64 value) private pure {
    if(value <= 23) {
      buf.appendUint8(uint8((major << 5) | value));
    } else if (value <= 0xFF) {
      buf.appendUint8(uint8((major << 5) | 24));
      buf.appendInt(value, 1);
    } else if (value <= 0xFFFF) {
      buf.appendUint8(uint8((major << 5) | 25));
      buf.appendInt(value, 2);
    } else if (value <= 0xFFFFFFFF) {
      buf.appendUint8(uint8((major << 5) | 26));
      buf.appendInt(value, 4);
    } else {
      buf.appendUint8(uint8((major << 5) | 27));
      buf.appendInt(value, 8);
    }
  }

  function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {
    buf.appendUint8(uint8((major << 5) | 31));
  }

  function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {
    if(value > 0xFFFFFFFFFFFFFFFF) {
      encodeBigNum(buf, value);
    } else {
      encodeFixedNumeric(buf, MAJOR_TYPE_INT, uint64(value));
    }
  }

  function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {
    if(value < -0x10000000000000000) {
      encodeSignedBigNum(buf, value);
    } else if(value > 0xFFFFFFFFFFFFFFFF) {
      encodeBigNum(buf, uint(value));
    } else if(value >= 0) {
      encodeFixedNumeric(buf, MAJOR_TYPE_INT, uint64(uint256(value)));
    } else {
      encodeFixedNumeric(buf, MAJOR_TYPE_NEGATIVE_INT, uint64(uint256(-1 - value)));
    }
  }

  function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {
    encodeFixedNumeric(buf, MAJOR_TYPE_BYTES, uint64(value.length));
    buf.append(value);
  }

  function encodeBigNum(BufferChainlink.buffer memory buf, uint value) internal pure {
    buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));
    encodeBytes(buf, abi.encode(value));
  }

  function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {
    buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));
    encodeBytes(buf, abi.encode(uint256(-1 - input)));
  }

  function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {
    encodeFixedNumeric(buf, MAJOR_TYPE_STRING, uint64(bytes(value).length));
    buf.append(bytes(value));
  }

  function startArray(BufferChainlink.buffer memory buf) internal pure {
    encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);
  }

  function startMap(BufferChainlink.buffer memory buf) internal pure {
    encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);
  }

  function endSequence(BufferChainlink.buffer memory buf) internal pure {
    encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);
  }
}

File 19 of 20 : BufferChainlink.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @dev A library for working with mutable byte buffers in Solidity.
 *
 * Byte buffers are mutable and expandable, and provide a variety of primitives
 * for writing to them. At any time you can fetch a bytes object containing the
 * current contents of the buffer. The bytes object should not be stored between
 * operations, as it may change due to resizing of the buffer.
 */
library BufferChainlink {
  /**
   * @dev Represents a mutable buffer. Buffers have a current value (buf) and
   *      a capacity. The capacity may be longer than the current value, in
   *      which case it can be extended without the need to allocate more memory.
   */
  struct buffer {
    bytes buf;
    uint256 capacity;
  }

  /**
   * @dev Initializes a buffer with an initial capacity.
   * @param buf The buffer to initialize.
   * @param capacity The number of bytes of space to allocate the buffer.
   * @return The buffer, for chaining.
   */
  function init(buffer memory buf, uint256 capacity) internal pure returns (buffer memory) {
    if (capacity % 32 != 0) {
      capacity += 32 - (capacity % 32);
    }
    // Allocate space for the buffer data
    buf.capacity = capacity;
    assembly {
      let ptr := mload(0x40)
      mstore(buf, ptr)
      mstore(ptr, 0)
      mstore(0x40, add(32, add(ptr, capacity)))
    }
    return buf;
  }

  /**
   * @dev Initializes a new buffer from an existing bytes object.
   *      Changes to the buffer may mutate the original value.
   * @param b The bytes object to initialize the buffer with.
   * @return A new buffer.
   */
  function fromBytes(bytes memory b) internal pure returns (buffer memory) {
    buffer memory buf;
    buf.buf = b;
    buf.capacity = b.length;
    return buf;
  }

  function resize(buffer memory buf, uint256 capacity) private pure {
    bytes memory oldbuf = buf.buf;
    init(buf, capacity);
    append(buf, oldbuf);
  }

  function max(uint256 a, uint256 b) private pure returns (uint256) {
    if (a > b) {
      return a;
    }
    return b;
  }

  /**
   * @dev Sets buffer length to 0.
   * @param buf The buffer to truncate.
   * @return The original buffer, for chaining..
   */
  function truncate(buffer memory buf) internal pure returns (buffer memory) {
    assembly {
      let bufptr := mload(buf)
      mstore(bufptr, 0)
    }
    return buf;
  }

  /**
   * @dev Writes a byte string to a buffer. Resizes if doing so would exceed
   *      the capacity of the buffer.
   * @param buf The buffer to append to.
   * @param off The start offset to write to.
   * @param data The data to append.
   * @param len The number of bytes to copy.
   * @return The original buffer, for chaining.
   */
  function write(
    buffer memory buf,
    uint256 off,
    bytes memory data,
    uint256 len
  ) internal pure returns (buffer memory) {
    require(len <= data.length);

    if (off + len > buf.capacity) {
      resize(buf, max(buf.capacity, len + off) * 2);
    }

    uint256 dest;
    uint256 src;
    assembly {
      // Memory address of the buffer data
      let bufptr := mload(buf)
      // Length of existing buffer data
      let buflen := mload(bufptr)
      // Start address = buffer address + offset + sizeof(buffer length)
      dest := add(add(bufptr, 32), off)
      // Update buffer length if we're extending it
      if gt(add(len, off), buflen) {
        mstore(bufptr, add(len, off))
      }
      src := add(data, 32)
    }

    // Copy word-length chunks while possible
    for (; len >= 32; len -= 32) {
      assembly {
        mstore(dest, mload(src))
      }
      dest += 32;
      src += 32;
    }

    // Copy remaining bytes
    unchecked {
      uint256 mask = (256**(32 - len)) - 1;
      assembly {
        let srcpart := and(mload(src), not(mask))
        let destpart := and(mload(dest), mask)
        mstore(dest, or(destpart, srcpart))
      }
    }

    return buf;
  }

  /**
   * @dev Appends a byte string to a buffer. Resizes if doing so would exceed
   *      the capacity of the buffer.
   * @param buf The buffer to append to.
   * @param data The data to append.
   * @param len The number of bytes to copy.
   * @return The original buffer, for chaining.
   */
  function append(
    buffer memory buf,
    bytes memory data,
    uint256 len
  ) internal pure returns (buffer memory) {
    return write(buf, buf.buf.length, data, len);
  }

  /**
   * @dev Appends a byte string to a buffer. Resizes if doing so would exceed
   *      the capacity of the buffer.
   * @param buf The buffer to append to.
   * @param data The data to append.
   * @return The original buffer, for chaining.
   */
  function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {
    return write(buf, buf.buf.length, data, data.length);
  }

  /**
   * @dev Writes a byte to the buffer. Resizes if doing so would exceed the
   *      capacity of the buffer.
   * @param buf The buffer to append to.
   * @param off The offset to write the byte at.
   * @param data The data to append.
   * @return The original buffer, for chaining.
   */
  function writeUint8(
    buffer memory buf,
    uint256 off,
    uint8 data
  ) internal pure returns (buffer memory) {
    if (off >= buf.capacity) {
      resize(buf, buf.capacity * 2);
    }

    assembly {
      // Memory address of the buffer data
      let bufptr := mload(buf)
      // Length of existing buffer data
      let buflen := mload(bufptr)
      // Address = buffer address + sizeof(buffer length) + off
      let dest := add(add(bufptr, off), 32)
      mstore8(dest, data)
      // Update buffer length if we extended it
      if eq(off, buflen) {
        mstore(bufptr, add(buflen, 1))
      }
    }
    return buf;
  }

  /**
   * @dev Appends a byte to the buffer. Resizes if doing so would exceed the
   *      capacity of the buffer.
   * @param buf The buffer to append to.
   * @param data The data to append.
   * @return The original buffer, for chaining.
   */
  function appendUint8(buffer memory buf, uint8 data) internal pure returns (buffer memory) {
    return writeUint8(buf, buf.buf.length, data);
  }

  /**
   * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would
   *      exceed the capacity of the buffer.
   * @param buf The buffer to append to.
   * @param off The offset to write at.
   * @param data The data to append.
   * @param len The number of bytes to write (left-aligned).
   * @return The original buffer, for chaining.
   */
  function write(
    buffer memory buf,
    uint256 off,
    bytes32 data,
    uint256 len
  ) private pure returns (buffer memory) {
    if (len + off > buf.capacity) {
      resize(buf, (len + off) * 2);
    }

    unchecked {
      uint256 mask = (256**len) - 1;
      // Right-align data
      data = data >> (8 * (32 - len));
      assembly {
        // Memory address of the buffer data
        let bufptr := mload(buf)
        // Address = buffer address + sizeof(buffer length) + off + len
        let dest := add(add(bufptr, off), len)
        mstore(dest, or(and(mload(dest), not(mask)), data))
        // Update buffer length if we extended it
        if gt(add(off, len), mload(bufptr)) {
          mstore(bufptr, add(off, len))
        }
      }
    }
    return buf;
  }

  /**
   * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the
   *      capacity of the buffer.
   * @param buf The buffer to append to.
   * @param off The offset to write at.
   * @param data The data to append.
   * @return The original buffer, for chaining.
   */
  function writeBytes20(
    buffer memory buf,
    uint256 off,
    bytes20 data
  ) internal pure returns (buffer memory) {
    return write(buf, off, bytes32(data), 20);
  }

  /**
   * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed
   *      the capacity of the buffer.
   * @param buf The buffer to append to.
   * @param data The data to append.
   * @return The original buffer, for chhaining.
   */
  function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {
    return write(buf, buf.buf.length, bytes32(data), 20);
  }

  /**
   * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed
   *      the capacity of the buffer.
   * @param buf The buffer to append to.
   * @param data The data to append.
   * @return The original buffer, for chaining.
   */
  function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {
    return write(buf, buf.buf.length, data, 32);
  }

  /**
   * @dev Writes an integer to the buffer. Resizes if doing so would exceed
   *      the capacity of the buffer.
   * @param buf The buffer to append to.
   * @param off The offset to write at.
   * @param data The data to append.
   * @param len The number of bytes to write (right-aligned).
   * @return The original buffer, for chaining.
   */
  function writeInt(
    buffer memory buf,
    uint256 off,
    uint256 data,
    uint256 len
  ) private pure returns (buffer memory) {
    if (len + off > buf.capacity) {
      resize(buf, (len + off) * 2);
    }

    uint256 mask = (256**len) - 1;
    assembly {
      // Memory address of the buffer data
      let bufptr := mload(buf)
      // Address = buffer address + off + sizeof(buffer length) + len
      let dest := add(add(bufptr, off), len)
      mstore(dest, or(and(mload(dest), not(mask)), data))
      // Update buffer length if we extended it
      if gt(add(off, len), mload(bufptr)) {
        mstore(bufptr, add(off, len))
      }
    }
    return buf;
  }

  /**
   * @dev Appends a byte to the end of the buffer. Resizes if doing so would
   * exceed the capacity of the buffer.
   * @param buf The buffer to append to.
   * @param data The data to append.
   * @return The original buffer.
   */
  function appendInt(
    buffer memory buf,
    uint256 data,
    uint256 len
  ) internal pure returns (buffer memory) {
    return writeInt(buf, buf.buf.length, data, len);
  }
}

File 20 of 20 : OracleInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface OracleInterface {
  function fulfillOracleRequest(
    bytes32 requestId,
    uint256 payment,
    address callbackAddress,
    bytes4 callbackFunctionId,
    uint256 expiration,
    bytes32 data
  ) external returns (bool);

  function isAuthorizedSender(address node) external view returns (bool);

  function withdraw(address recipient, uint256 amount) external;

  function withdrawable() external view returns (uint256);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"string","name":"_jobId","type":"string"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"address","name":"_link","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"uint256","name":"_connectedTypeId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"_connectedUserIdHash","type":"bytes32"}],"name":"AddConnection","type":"event"},{"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":"bytes32","name":"id","type":"bytes32"}],"name":"ChainlinkCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"ChainlinkFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"ChainlinkRequested","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"},{"indexed":false,"internalType":"string","name":"_transactionId","type":"string"}],"name":"Endorse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"uint256","name":"_connectedTypeId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"_connectedUserIdHash","type":"bytes32"}],"name":"RemoveConnection","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"endorser","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPreviousEndorserLevel1","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"endorser","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPreviousEndorserLevel2","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"D_lvl1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"D_lvl2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"D_n","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"D_o","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"O_n","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"connectedTypeId","type":"uint256"},{"internalType":"bytes32","name":"connectedUserIdHash","type":"bytes32"}],"name":"addConnection","outputs":[],"stateMutability":"nonpayable","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":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"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":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"transactionId","type":"string"}],"name":"endorse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_requestId","type":"bytes32"},{"internalType":"address[]","name":"endorsersLevel1","type":"address[]"},{"internalType":"address[]","name":"endorsersLevel2","type":"address[]"}],"name":"fulfillEndorse","outputs":[],"stateMutability":"nonpayable","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"previousEndorserStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"connectedTypeId","type":"uint256"}],"name":"removeConnection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSocialConnectionReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"socialConnectionReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"source","type":"string"}],"name":"stringToBytes32","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pure","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600a55612710600d553480156200001c57600080fd5b50604051620058163803806200581683398181016040528101906200004291906200066b565b6040518060400160405280600f81526020017f55545520547275737420546f6b656e00000000000000000000000000000000008152506040518060400160405280600381526020017f55545400000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000c69291906200050f565b508060049080519060200190620000df9291906200050f565b5050506000600560006101000a81548160ff0219169083151502179055506200011d62000111620001aa60201b60201c565b620001b260201b60201c565b6200012f33866200027860201b60201c565b6200014081620003f160201b60201c565b83601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000192836200043560201b60201c565b60128190555081601381905550505050505062000add565b600033905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e29062000771565b60405180910390fd5b620002ff600083836200046160201b60201c565b806002600082825462000313919062000842565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200036a919062000842565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003d19190620007b5565b60405180910390a3620003ed600083836200047e60201b60201c565b5050565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008082905060008151141562000453576000801b9150506200045c565b60208301519150505b919050565b620004798383836200048360201b6200191c1760201c565b505050565b505050565b6200049b838383620004f360201b620019741760201c565b620004ab620004f860201b60201c565b15620004ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e59062000793565b60405180910390fd5b505050565b505050565b6000600560009054906101000a900460ff16905090565b8280546200051d9062000913565b90600052602060002090601f0160209004810192826200054157600085556200058d565b82601f106200055c57805160ff19168380011785556200058d565b828001600101855582156200058d579182015b828111156200058c5782518255916020019190600101906200056f565b5b5090506200059c9190620005a0565b5090565b5b80821115620005bb576000816000905550600101620005a1565b5090565b6000620005d6620005d084620007fb565b620007d2565b905082815260208101848484011115620005f557620005f462000a11565b5b62000602848285620008dd565b509392505050565b6000815190506200061b8162000aa9565b92915050565b600082601f83011262000639576200063862000a0c565b5b81516200064b848260208601620005bf565b91505092915050565b600081519050620006658162000ac3565b92915050565b600080600080600060a086880312156200068a576200068962000a1b565b5b60006200069a8882890162000654565b9550506020620006ad888289016200060a565b945050604086015167ffffffffffffffff811115620006d157620006d062000a16565b5b620006df8882890162000621565b9350506060620006f28882890162000654565b925050608062000705888289016200060a565b9150509295509295909350565b600062000721601f8362000831565b91506200072e8262000a31565b602082019050919050565b600062000748602a8362000831565b9150620007558262000a5a565b604082019050919050565b6200076b81620008d3565b82525050565b600060208201905081810360008301526200078c8162000712565b9050919050565b60006020820190508181036000830152620007ae8162000739565b9050919050565b6000602082019050620007cc600083018462000760565b92915050565b6000620007de620007f1565b9050620007ec828262000949565b919050565b6000604051905090565b600067ffffffffffffffff821115620008195762000818620009dd565b5b620008248262000a20565b9050602081019050919050565b600082825260208201905092915050565b60006200084f82620008d3565b91506200085c83620008d3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200089457620008936200097f565b5b828201905092915050565b6000620008ac82620008b3565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620008fd578082015181840152602081019050620008e0565b838111156200090d576000848401525b50505050565b600060028204905060018216806200092c57607f821691505b60208210811415620009435762000942620009ae565b5b50919050565b620009548262000a20565b810181811067ffffffffffffffff82111715620009765762000975620009dd565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b62000ab4816200089f565b811462000ac057600080fd5b50565b62000ace81620008d3565b811462000ada57600080fd5b50565b614d298062000aed6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063b36cc8e7116100ad578063d51d81271161007c578063d51d8127146105a2578063dd62ed3e146105c0578063f1af4829146105f0578063f2fde38b1461060c578063fa01fc2114610628576101fb565b8063b36cc8e71461050a578063b5a5767c1461053a578063c5c58b8914610556578063cfb5192814610572576101fb565b806395d89b41116100e957806395d89b411461045c578063a457c2d71461047a578063a9059cbb146104aa578063b273fc9a146104da576101fb565b8063715018a61461040e57806379cc6790146104185780638456cb59146104345780638da5cb5b1461043e576101fb565b806337e75f6d116101925780634349138e116101615780634349138e146103865780635c975abb146103a257806360f55699146103c057806370a08231146103de576101fb565b806337e75f6d1461031457806339509351146103305780633f4ba83a1461036057806342966c681461036a576101fb565b80631a147def116101ce5780631a147def1461028a57806323b872dd146102a85780632652c493146102d8578063313ce567146102f6576101fb565b806306fdde031461020057806307cd206e1461021e578063095ea7b31461023c57806318160ddd1461026c575b600080fd5b610208610646565b6040516102159190613c73565b60405180910390f35b6102266106d8565b6040516102339190613f35565b60405180910390f35b61025660048036038101906102519190613490565b6106dd565b6040516102639190613c3d565b60405180910390f35b61027461071a565b6040516102819190613f35565b60405180910390f35b610292610724565b60405161029f9190613f35565b60405180910390f35b6102c260048036038101906102bd919061343d565b610729565b6040516102cf9190613c3d565b60405180910390f35b6102e0610821565b6040516102ed9190613f35565b60405180910390f35b6102fe610826565b60405161030b9190613f80565b60405180910390f35b61032e600480360381019061032991906134d0565b61082b565b005b61034a60048036038101906103459190613490565b6109ae565b6040516103579190613c3d565b60405180910390f35b610368610a5a565b005b610384600480360381019061037f919061369d565b610ae0565b005b6103a0600480360381019061039b91906135bf565b610af4565b005b6103aa610e92565b6040516103b79190613c3d565b60405180910390f35b6103c8610ea9565b6040516103d59190613f35565b60405180910390f35b6103f860048036038101906103f391906133d0565b610eae565b6040516104059190613f35565b60405180910390f35b610416610ef6565b005b610432600480360381019061042d9190613490565b610f7e565b005b61043c610ff9565b005b61044661107f565b6040516104539190613b45565b60405180910390f35b6104646110a9565b6040516104719190613c73565b60405180910390f35b610494600480360381019061048f9190613490565b61113b565b6040516104a19190613c3d565b60405180910390f35b6104c460048036038101906104bf9190613490565b611226565b6040516104d19190613c3d565b60405180910390f35b6104f460048036038101906104ef91906133d0565b611263565b6040516105019190613f35565b60405180910390f35b610524600480360381019061051f91906133fd565b61127b565b6040516105319190613f35565b60405180910390f35b610554600480360381019061054f919061369d565b6112a0565b005b610570600480360381019061056b9190613490565b611326565b005b61058c60048036038101906105879190613654565b6114a1565b6040516105999190613c58565b60405180910390f35b6105aa6114cb565b6040516105b79190613f35565b60405180910390f35b6105da60048036038101906105d591906133fd565b6114d1565b6040516105e79190613f35565b60405180910390f35b61060a60048036038101906106059190613523565b611558565b005b610626600480360381019061062191906133d0565b61181e565b005b610630611916565b60405161063d9190613f35565b60405180910390f35b60606003805461065590614494565b80601f016020809104026020016040519081016040528092919081815260200182805461068190614494565b80156106ce5780601f106106a3576101008083540402835291602001916106ce565b820191906000526020600020905b8154815290600101906020018083116106b157829003601f168201915b5050505050905090565b601481565b60006040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071190613cd5565b60405180910390fd5b6000600254905090565b600181565b6000610736848484611979565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610781611bfa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f890613df5565b60405180910390fd5b6108158561080d611bfa565b858403611c02565b60019150509392505050565b601e81565b600090565b610833611bfa565b73ffffffffffffffffffffffffffffffffffffffff1661085161107f565b73ffffffffffffffffffffffffffffffffffffffff16146108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e90613e15565b60405180910390fd5b6000801b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205414156109a95780600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555061096383600d54611dcd565b80828473ffffffffffffffffffffffffffffffffffffffff167fa47d864ce75457dd6fd6ea2212dfd39907f59d0a81f7c8abfe743e7f910cfa3260405160405180910390a45b505050565b6000610a506109bb611bfa565b8484600160006109c9611bfa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a4b9190614034565b611c02565b6001905092915050565b610a62611bfa565b73ffffffffffffffffffffffffffffffffffffffff16610a8061107f565b73ffffffffffffffffffffffffffffffffffffffff1614610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90613e15565b60405180910390fd5b610ade611f2d565b565b610af1610aeb611bfa565b82611fcf565b50565b84600b600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d90613eb5565b60405180910390fd5b600b600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055807f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a60405160405180910390a26000601060008881526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382018054610cdf90614494565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0b90614494565b8015610d585780601f10610d2d57610100808354040283529160200191610d58565b820191906000526020600020905b815481529060010190602001808311610d3b57829003601f168201915b5050505050815250509050600073ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff161415610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90613d75565b60405180910390fd5b610de981600001518260400151611fcf565b610e8981600001518260200151836040015184606001518a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050898980806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506121a6565b50505050505050565b6000600560009054906101000a900460ff16905090565b600281565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610efe611bfa565b73ffffffffffffffffffffffffffffffffffffffff16610f1c61107f565b73ffffffffffffffffffffffffffffffffffffffff1614610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6990613e15565b60405180910390fd5b610f7c600061249c565b565b6000610f9183610f8c611bfa565b6114d1565b905081811015610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90613e35565b60405180910390fd5b610fea83610fe2611bfa565b848403611c02565b610ff48383611fcf565b505050565b611001611bfa565b73ffffffffffffffffffffffffffffffffffffffff1661101f61107f565b73ffffffffffffffffffffffffffffffffffffffff1614611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c90613e15565b60405180910390fd5b61107d612562565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546110b890614494565b80601f01602080910402602001604051908101604052809291908181526020018280546110e490614494565b80156111315780601f1061110657610100808354040283529160200191611131565b820191906000526020600020905b81548152906001019060200180831161111457829003601f168201915b5050505050905090565b6000806001600061114a611bfa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe90613ed5565b60405180910390fd5b61121b611212611bfa565b85858403611c02565b600191505092915050565b60006040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a90613cd5565b60405180910390fd5b600f6020528060005260406000206000915090505481565b600e602052816000526040600020602052806000526040600020600091509150505481565b6112a8611bfa565b73ffffffffffffffffffffffffffffffffffffffff166112c661107f565b73ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390613e15565b60405180910390fd5b80600d8190555050565b61132e611bfa565b73ffffffffffffffffffffffffffffffffffffffff1661134c61107f565b73ffffffffffffffffffffffffffffffffffffffff16146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139990613e15565b60405180910390fd5b6000801b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020541461149d576000801b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506000801b818373ffffffffffffffffffffffffffffffffffffffff167f633cace5793d041e54c2c70b3b27c6f59d15fd4ec6dd309f906a31369d42c34260405160405180910390a45b5050565b6000808290506000815114156114bd576000801b9150506114c6565b60208301519150505b919050565b61138881565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd90613d15565b60405180910390fd5b60006115dc60125430634349138e60e01b612605565b90506116306040518060400160405280600d81526020017f746172676574416464726573730000000000000000000000000000000000000081525061162086612636565b836128189092919063ffffffff16565b6116826040518060400160405280600d81526020017f736f75726365416464726573730000000000000000000000000000000000000081525061167233612636565b836128189092919063ffffffff16565b6116cc6040518060400160405280600d81526020017f7472616e73616374696f6e49640000000000000000000000000000000000000081525083836128189092919063ffffffff16565b60006116fd601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360135461284b565b905060405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152506010600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301908051906020019061181392919061318c565b509050505050505050565b611826611bfa565b73ffffffffffffffffffffffffffffffffffffffff1661184461107f565b73ffffffffffffffffffffffffffffffffffffffff161461189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190613e15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561190a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190190613d35565b60405180910390fd5b6119138161249c565b50565b600d5481565b611927838383611974565b61192f610e92565b1561196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196690613f15565b60405180910390fd5b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e090613e75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090613c95565b60405180910390fd5b611a64838383612915565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae190613db5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b7d9190614034565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611be19190613f35565b60405180910390a3611bf4848484612925565b50505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6990613e95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd990613d55565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611dc09190613f35565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490613ef5565b60405180910390fd5b611e4960008383612915565b8060026000828254611e5b9190614034565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb09190614034565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f159190613f35565b60405180910390a3611f2960008383612925565b5050565b611f35610e92565b611f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6b90613cb5565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611fb8611bfa565b604051611fc59190613b45565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561203f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203690613e55565b60405180910390fd5b61204b82600083612915565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c890613cf5565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546121289190614329565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161218d9190613f35565b60405180910390a36121a183600084612925565b505050565b60005b82518160ff1610156122745760006121e187858460ff16815181106121d1576121d0614656565b5b602002602001015160028961292a565b905061220a848360ff16815181106121fc576121fb614656565b5b602002602001015182611dcd565b7fd10a84a6af20735b834fa7634e3c2f819fc7108ea4498c21dc1a853eeadb02da848360ff168151811061224157612240614656565b5b602002602001015182604051612258929190613b60565b60405180910390a150808061226c90614540565b9150506121a9565b5060005b81518160ff1610156123435760006122b087848460ff16815181106122a05761229f614656565b5b602002602001015160148961292a565b90506122d9838360ff16815181106122cb576122ca614656565b5b602002602001015182611dcd565b7f215c1a1edf8a8bef237b56242f6856daff6ec173a64970dd07fa5c8852aebe47838360ff16815181106123105761230f614656565b5b602002602001015182604051612327929190613b60565b60405180910390a150808061233b90614540565b915050612278565b5083600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123939190614034565b9250508190555083600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124269190614034565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f28f6e4bebd410ff24835163f718e2ba8c267a2ba3b1bdc05c5bd100907356fa7868660405161248c929190613f50565b60405180910390a3505050505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61256a610e92565b156125aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a190613dd5565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125ee611bfa565b6040516125fb9190613b45565b60405180910390a1565b61260d613212565b612615613212565b61262c85858584612a66909392919063ffffffff16565b9150509392505050565b60606000602867ffffffffffffffff81111561265557612654614685565b5b6040519080825280601f01601f1916602001820160405280156126875781602001600182028036833780820191505090505b50905060005b60148110156127ef5760008160136126a59190614329565b60086126b19190614294565b60026126bd9190614176565b8573ffffffffffffffffffffffffffffffffffffffff166126de91906140c1565b60f81b9050600060108260f81c6126f591906140f2565b60f81b905060008160f81c601061270c91906142ee565b8360f81c61271a919061435d565b60f81b905061272882612b16565b858560026127369190614294565b8151811061274757612746614656565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061277f81612b16565b85600186600261278f9190614294565b6127999190614034565b815181106127aa576127a9614656565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050505080806127e7906144f7565b91505061268d565b50806040516020016128019190613b23565b604051602081830303815290604052915050919050565b61282f828460800151612b5c90919063ffffffff16565b612846818460800151612b5c90919063ffffffff16565b505050565b600080600a5490506001816128609190614034565b600a819055506000633c6d41b960e01b600080876000015188604001518660028b608001516000015160405160240161289f9796959493929190613b89565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905061290a86838684612b81565b925050509392505050565b61292083838361191c565b505050565b505050565b600080600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129f99190614329565b905080611388612a099190614034565b601e85612a169190614034565b86612a219190614294565b612a2b9190614294565b611388600186612a3b9190614034565b84612a469190614294565b612a509190614294565b612a5a91906140c1565b92505050949350505050565b612a6e613212565b612a7e8560800151610100612d25565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b6000600a8260f81c60ff161015612b415760308260f81c612b37919061408a565b60f81b9050612b57565b60578260f81c612b51919061408a565b60f81b90505b919050565b612b698260038351612d8f565b612b7c8183612f1490919063ffffffff16565b505050565b60003084604051602001612b96929190613af7565b60405160208183030381529060405280519060200120905084600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550807fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af960405160405180910390a2600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634000aea08685856040518463ffffffff1660e01b8152600401612c8c93929190613bff565b602060405180830381600087803b158015612ca657600080fd5b505af1158015612cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cde9190613592565b612d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1490613d95565b60405180910390fd5b949350505050565b612d2d61327f565b6000602083612d3c9190614598565b14612d6857602082612d4e9190614598565b6020612d5a9190614329565b82612d659190614034565b91505b81836020018181525050604051808452600081528281016020016040525082905092915050565b60178167ffffffffffffffff1611612dc657612dc08160058460ff16901b60ff161784612f3690919063ffffffff16565b50612f0f565b60ff8167ffffffffffffffff1611612e1c57612df5601860058460ff16901b1784612f3690919063ffffffff16565b50612e168167ffffffffffffffff16600185612f569092919063ffffffff16565b50612f0e565b61ffff8167ffffffffffffffff1611612e7357612e4c601960058460ff16901b1784612f3690919063ffffffff16565b50612e6d8167ffffffffffffffff16600285612f569092919063ffffffff16565b50612f0d565b63ffffffff8167ffffffffffffffff1611612ecc57612ea5601a60058460ff16901b1784612f3690919063ffffffff16565b50612ec68167ffffffffffffffff16600485612f569092919063ffffffff16565b50612f0c565b612ee9601b60058460ff16901b1784612f3690919063ffffffff16565b50612f0a8167ffffffffffffffff16600885612f569092919063ffffffff16565b505b5b5b5b505050565b612f1c61327f565b612f2e83846000015151848551612f78565b905092915050565b612f3e61327f565b612f4e8384600001515184613067565b905092915050565b612f5e61327f565b612f6f8485600001515185856130be565b90509392505050565b612f8061327f565b8251821115612f8e57600080fd5b84602001518285612f9f9190614034565b1115612fd457612fd3856002612fc488602001518887612fbf9190614034565b61314c565b612fce9190614294565b613168565b5b600080865180518760208301019350808887011115612ff35787860182525b60208701925050505b6020841061303a57805182526020826130159190614034565b91506020816130249190614034565b90506020846130339190614329565b9350612ffc565b60006001856020036101000a03905080198251168184511681811785525050508692505050949350505050565b61306f61327f565b8360200151831061309557613094846002866020015161308f9190614294565b613168565b5b83518051602085830101848153818614156130b1576001820183525b5050508390509392505050565b6130c661327f565b846020015184836130d79190614034565b11156130ff576130fe85600286856130ef9190614034565b6130f99190614294565b613168565b5b60006001836101006131119190614176565b61311b9190614329565b9050855183868201018583198251161781528151858801111561313e5784870182525b505085915050949350505050565b60008183111561315e57829050613162565b8190505b92915050565b60008260000151905061317b8383612d25565b506131868382612f14565b50505050565b82805461319890614494565b90600052602060002090601f0160209004810192826131ba5760008555613201565b82601f106131d357805160ff1916838001178555613201565b82800160010185558215613201579182015b828111156132005782518255916020019190600101906131e5565b5b50905061320e9190613299565b5090565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020016000815260200161327961327f565b81525090565b604051806040016040528060608152602001600081525090565b5b808211156132b257600081600090555060010161329a565b5090565b60006132c96132c484613fc0565b613f9b565b9050828152602081018484840111156132e5576132e46146c3565b5b6132f0848285614452565b509392505050565b60008135905061330781614c97565b92915050565b60008083601f840112613323576133226146b9565b5b8235905067ffffffffffffffff8111156133405761333f6146b4565b5b60208301915083602082028301111561335c5761335b6146be565b5b9250929050565b60008151905061337281614cae565b92915050565b60008135905061338781614cc5565b92915050565b600082601f8301126133a2576133a16146b9565b5b81356133b28482602086016132b6565b91505092915050565b6000813590506133ca81614cdc565b92915050565b6000602082840312156133e6576133e56146cd565b5b60006133f4848285016132f8565b91505092915050565b60008060408385031215613414576134136146cd565b5b6000613422858286016132f8565b9250506020613433858286016132f8565b9150509250929050565b600080600060608486031215613456576134556146cd565b5b6000613464868287016132f8565b9350506020613475868287016132f8565b9250506040613486868287016133bb565b9150509250925092565b600080604083850312156134a7576134a66146cd565b5b60006134b5858286016132f8565b92505060206134c6858286016133bb565b9150509250929050565b6000806000606084860312156134e9576134e86146cd565b5b60006134f7868287016132f8565b9350506020613508868287016133bb565b925050604061351986828701613378565b9150509250925092565b60008060006060848603121561353c5761353b6146cd565b5b600061354a868287016132f8565b935050602061355b868287016133bb565b925050604084013567ffffffffffffffff81111561357c5761357b6146c8565b5b6135888682870161338d565b9150509250925092565b6000602082840312156135a8576135a76146cd565b5b60006135b684828501613363565b91505092915050565b6000806000806000606086880312156135db576135da6146cd565b5b60006135e988828901613378565b955050602086013567ffffffffffffffff81111561360a576136096146c8565b5b6136168882890161330d565b9450945050604086013567ffffffffffffffff811115613639576136386146c8565b5b6136458882890161330d565b92509250509295509295909350565b60006020828403121561366a576136696146cd565b5b600082013567ffffffffffffffff811115613688576136876146c8565b5b6136948482850161338d565b91505092915050565b6000602082840312156136b3576136b26146cd565b5b60006136c1848285016133bb565b91505092915050565b6136d381614391565b82525050565b6136e2816143a3565b82525050565b6136f1816143af565b82525050565b613700816143b9565b82525050565b600061371182613ff1565b61371b8185614007565b935061372b818560208601614461565b613734816146d2565b840191505092915050565b61375061374b8261441c565b61456a565b82525050565b600061376182613ffc565b61376b8185614018565b935061377b818560208601614461565b613784816146d2565b840191505092915050565b600061379a82613ffc565b6137a48185614029565b93506137b4818560208601614461565b80840191505092915050565b60006137cd602383614018565b91506137d8826146fd565b604082019050919050565b60006137f0601483614018565b91506137fb8261474c565b602082019050919050565b6000613813600c83614018565b915061381e82614775565b602082019050919050565b6000613836602283614018565b91506138418261479e565b604082019050919050565b6000613859601183614018565b9150613864826147ed565b602082019050919050565b600061387c602683614018565b915061388782614816565b604082019050919050565b600061389f602283614018565b91506138aa82614865565b604082019050919050565b60006138c2601283614018565b91506138cd826148b4565b602082019050919050565b60006138e5600283614029565b91506138f0826148dd565b600282019050919050565b6000613908602383614018565b915061391382614906565b604082019050919050565b600061392b602683614018565b915061393682614955565b604082019050919050565b600061394e601083614018565b9150613959826149a4565b602082019050919050565b6000613971602883614018565b915061397c826149cd565b604082019050919050565b6000613994602083614018565b915061399f82614a1c565b602082019050919050565b60006139b7602483614018565b91506139c282614a45565b604082019050919050565b60006139da602183614018565b91506139e582614a94565b604082019050919050565b60006139fd602583614018565b9150613a0882614ae3565b604082019050919050565b6000613a20602483614018565b9150613a2b82614b32565b604082019050919050565b6000613a43602883614018565b9150613a4e82614b81565b604082019050919050565b6000613a66602583614018565b9150613a7182614bd0565b604082019050919050565b6000613a89601f83614018565b9150613a9482614c1f565b602082019050919050565b6000613aac602a83614018565b9150613ab782614c48565b604082019050919050565b613acb81614405565b82525050565b613ae2613add82614405565b61458e565b82525050565b613af18161440f565b82525050565b6000613b03828561373f565b601482019150613b138284613ad1565b6020820191508190509392505050565b6000613b2e826138d8565b9150613b3a828461378f565b915081905092915050565b6000602082019050613b5a60008301846136ca565b92915050565b6000604082019050613b7560008301856136ca565b613b826020830184613ac2565b9392505050565b600060e082019050613b9e600083018a6136ca565b613bab6020830189613ac2565b613bb860408301886136e8565b613bc560608301876136f7565b613bd26080830186613ac2565b613bdf60a0830185613ac2565b81810360c0830152613bf18184613706565b905098975050505050505050565b6000606082019050613c1460008301866136ca565b613c216020830185613ac2565b8181036040830152613c338184613706565b9050949350505050565b6000602082019050613c5260008301846136d9565b92915050565b6000602082019050613c6d60008301846136e8565b92915050565b60006020820190508181036000830152613c8d8184613756565b905092915050565b60006020820190508181036000830152613cae816137c0565b9050919050565b60006020820190508181036000830152613cce816137e3565b9050919050565b60006020820190508181036000830152613cee81613806565b9050919050565b60006020820190508181036000830152613d0e81613829565b9050919050565b60006020820190508181036000830152613d2e8161384c565b9050919050565b60006020820190508181036000830152613d4e8161386f565b9050919050565b60006020820190508181036000830152613d6e81613892565b9050919050565b60006020820190508181036000830152613d8e816138b5565b9050919050565b60006020820190508181036000830152613dae816138fb565b9050919050565b60006020820190508181036000830152613dce8161391e565b9050919050565b60006020820190508181036000830152613dee81613941565b9050919050565b60006020820190508181036000830152613e0e81613964565b9050919050565b60006020820190508181036000830152613e2e81613987565b9050919050565b60006020820190508181036000830152613e4e816139aa565b9050919050565b60006020820190508181036000830152613e6e816139cd565b9050919050565b60006020820190508181036000830152613e8e816139f0565b9050919050565b60006020820190508181036000830152613eae81613a13565b9050919050565b60006020820190508181036000830152613ece81613a36565b9050919050565b60006020820190508181036000830152613eee81613a59565b9050919050565b60006020820190508181036000830152613f0e81613a7c565b9050919050565b60006020820190508181036000830152613f2e81613a9f565b9050919050565b6000602082019050613f4a6000830184613ac2565b92915050565b6000604082019050613f656000830185613ac2565b8181036020830152613f778184613756565b90509392505050565b6000602082019050613f956000830184613ae8565b92915050565b6000613fa5613fb6565b9050613fb182826144c6565b919050565b6000604051905090565b600067ffffffffffffffff821115613fdb57613fda614685565b5b613fe4826146d2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061403f82614405565b915061404a83614405565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561407f5761407e6145c9565b5b828201905092915050565b60006140958261440f565b91506140a08361440f565b92508260ff038211156140b6576140b56145c9565b5b828201905092915050565b60006140cc82614405565b91506140d783614405565b9250826140e7576140e66145f8565b5b828204905092915050565b60006140fd8261440f565b91506141088361440f565b925082614118576141176145f8565b5b828204905092915050565b6000808291508390505b600185111561416d57808604811115614149576141486145c9565b5b60018516156141585780820291505b8081029050614166856146f0565b945061412d565b94509492505050565b600061418182614405565b915061418c83614405565b92506141b97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846141c1565b905092915050565b6000826141d1576001905061428d565b816141df576000905061428d565b81600181146141f557600281146141ff5761422e565b600191505061428d565b60ff841115614211576142106145c9565b5b8360020a915084821115614228576142276145c9565b5b5061428d565b5060208310610133831016604e8410600b84101617156142635782820a90508381111561425e5761425d6145c9565b5b61428d565b6142708484846001614123565b92509050818404811115614287576142866145c9565b5b81810290505b9392505050565b600061429f82614405565b91506142aa83614405565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142e3576142e26145c9565b5b828202905092915050565b60006142f98261440f565b91506143048361440f565b92508160ff048311821515161561431e5761431d6145c9565b5b828202905092915050565b600061433482614405565b915061433f83614405565b925082821015614352576143516145c9565b5b828203905092915050565b60006143688261440f565b91506143738361440f565b925082821015614386576143856145c9565b5b828203905092915050565b600061439c826143e5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006144278261442e565b9050919050565b600061443982614440565b9050919050565b600061444b826143e5565b9050919050565b82818337600083830152505050565b60005b8381101561447f578082015181840152602081019050614464565b8381111561448e576000848401525b50505050565b600060028204905060018216806144ac57607f821691505b602082108114156144c0576144bf614627565b5b50919050565b6144cf826146d2565b810181811067ffffffffffffffff821117156144ee576144ed614685565b5b80604052505050565b600061450282614405565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614535576145346145c9565b5b600182019050919050565b600061454b8261440f565b915060ff82141561455f5761455e6145c9565b5b600182019050919050565b60006145758261457c565b9050919050565b6000614587826146e3565b9050919050565b6000819050919050565b60006145a382614405565b91506145ae83614405565b9250826145be576145bd6145f8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4e6f7420616c6c6f7765642e0000000000000000000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f73686f756c6420626520616e2075736572000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f756e6b6e6f776e20656e646f72736d656e740000000000000000000000000000600082015250565b7f3078000000000000000000000000000000000000000000000000000000000000600082015250565b7f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160008201527f636c650000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f536f75726365206d75737420626520746865206f7261636c65206f662074686560008201527f2072657175657374000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b614ca081614391565b8114614cab57600080fd5b50565b614cb7816143a3565b8114614cc257600080fd5b50565b614cce816143af565b8114614cd957600080fd5b50565b614ce581614405565b8114614cf057600080fd5b5056fea264697066735822122025cfe18ca7184b1929eb7847b845269802850dc86719d19092e6f33ccbce452864736f6c634300080700330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f64991a3c1c448df967e5dc8e8cc1d3b3bd0034f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb00000000000000000000000000000000000000000000000000000000000000203065656337653164643064323437366361316138373264666236363333663438

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

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f64991a3c1c448df967e5dc8e8cc1d3b3bd0034f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb00000000000000000000000000000000000000000000000000000000000000203065656337653164643064323437366361316138373264666236363333663438

-----Decoded View---------------
Arg [0] : _mintAmount (uint256): 0
Arg [1] : _oracle (address): 0xf64991a3c1c448df967e5dc8e8cc1d3b3bd0034f
Arg [2] : _jobId (string): 0eec7e1dd0d2476ca1a872dfb6633f48
Arg [3] : _fee (uint256): 10000000000000000
Arg [4] : _link (address): 0x326c977e6efc84e512bb9c30f76e30c160ed06fb

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000f64991a3c1c448df967e5dc8e8cc1d3b3bd0034f
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [4] : 000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [6] : 3065656337653164643064323437366361316138373264666236363333663438


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading