{
  "address": "0x8a9f66b8E23C87A85736e31783397ae9e2960D05",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "auth",
          "type": "address"
        }
      ],
      "name": "AuthUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Minted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "TokenUpdated",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "_auths",
          "type": "address[]"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0x374692c11a7e8045756e9ac9f3da6773bc5f388d3daed0553d50e45d01dd71b1",
  "receipt": {
    "to": null,
    "from": "0xF1658C608708172655A8e70a1624c29F956Ee63D",
    "contractAddress": "0x8a9f66b8E23C87A85736e31783397ae9e2960D05",
    "transactionIndex": 40,
    "gasUsed": "474092",
    "logsBloom": "0x00000000000000020800000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000010000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000020000000000000000001000000000000000000000000004000000000000000000001200000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000",
    "blockHash": "0x851d94418cc553df8b2f97d978ef13388f96762759a6f724be2e5c0fa78aac32",
    "transactionHash": "0x374692c11a7e8045756e9ac9f3da6773bc5f388d3daed0553d50e45d01dd71b1",
    "logs": [
      {
        "transactionIndex": 40,
        "blockNumber": 28316091,
        "transactionHash": "0x374692c11a7e8045756e9ac9f3da6773bc5f388d3daed0553d50e45d01dd71b1",
        "address": "0x0000000000000000000000000000000000001010",
        "topics": [
          "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63",
          "0x0000000000000000000000000000000000000000000000000000000000001010",
          "0x000000000000000000000000f1658c608708172655a8e70a1624c29f956ee63d",
          "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8"
        ],
        "data": "0x000000000000000000000000000000000000000000000000000435f5ddb8765c00000000000000000000000000000000000000000000000049fd922b37806ffd0000000000000000000000000000000000000000000015b53046323fa1aae68a00000000000000000000000000000000000000000000000049f95c3559c7f9a10000000000000000000000000000000000000000000015b5304a68357f635ce6",
        "logIndex": 206,
        "blockHash": "0x851d94418cc553df8b2f97d978ef13388f96762759a6f724be2e5c0fa78aac32"
      }
    ],
    "blockNumber": 28316091,
    "cumulativeGasUsed": "7662706",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "numDeployments": 1,
  "solcInputHash": "28a0b0bba0d34a2e0f97b06f2c3c6d0b",
  "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"auth\",\"type\":\"address\"}],\"name\":\"AuthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"_auths\",\"type\":\"address[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Alexandas\",\"details\":\"Rewarder contract\",\"kind\":\"dev\",\"methods\":{\"initialize(address,address[])\":{\"details\":\"proxy initialize function\",\"params\":{\"_auths\":\"authorized addresses\",\"_token\":\"ERC20 token address\"}},\"mint(address,uint256)\":{\"details\":\"mint reward to receiver\",\"params\":{\"amount\":\"token amount\",\"to\":\"receiver address\"}}},\"stateVariables\":{\"token\":{\"details\":\"return ERC20 token address\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/stake/Rewarder.sol\":\"Rewarder\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":false},\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n *     function initialize() initializer public {\\n *         __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n *     }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n *     function initializeV2() reinitializer(2) public {\\n *         __ERC20Permit_init(\\\"MyToken\\\");\\n *     }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n *     _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     * @custom:oz-retyped-from bool\\n     */\\n    uint8 private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Triggered when the contract has been initialized or reinitialized.\\n     */\\n    event Initialized(uint8 version);\\n\\n    /**\\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n     */\\n    modifier initializer() {\\n        bool isTopLevelCall = !_initializing;\\n        require(\\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n            \\\"Initializable: contract is already initialized\\\"\\n        );\\n        _initialized = 1;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n            emit Initialized(1);\\n        }\\n    }\\n\\n    /**\\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n     * used to initialize parent contracts.\\n     *\\n     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n     * initialization step. This is essential to configure modules that are added through upgrades and that require\\n     * initialization.\\n     *\\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n     * a contract, executing them in the right order is up to the developer or operator.\\n     */\\n    modifier reinitializer(uint8 version) {\\n        require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n        _initialized = version;\\n        _initializing = true;\\n        _;\\n        _initializing = false;\\n        emit Initialized(version);\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n     * through proxies.\\n     */\\n    function _disableInitializers() internal virtual {\\n        require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n        if (_initialized < type(uint8).max) {\\n            _initialized = type(uint8).max;\\n            emit Initialized(type(uint8).max);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `from` to `to` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n                /// @solidity memory-safe-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\"},\"contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol';\\n\\n/// @dev Burnable ERC20 Token interface\\n/// @author Alexandas\\ninterface IERC20 is IERC20Upgradeable {\\n\\n\\t/// @dev burn tokens\\n\\t/// @param amount token amount\\n\\tfunction burn(uint256 amount) external;\\n\\n\\t/// @dev burn tokens\\n\\t/// @param account user address\\n\\t/// @param amount token amount\\n\\tfunction burnFrom(address account, uint256 amount) external;\\n\\n}\\n\",\"keccak256\":\"0xb45f4f11d5a0a93d60c5238dfce558196db50b3986cee01f2e65b8781bcb7d4f\",\"license\":\"GPL-2.0-or-later\"},\"contracts/interfaces/IRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol';\\nimport './IERC20.sol';\\n\\n/// @dev Rewarder interface\\n/// @author Alexandas\\ninterface IRewarder {\\n\\n\\t/// @dev emit when ERC20 token address updated\\n\\t/// @param token ERC20 token address\\n\\tevent TokenUpdated(IERC20 token);\\n\\n\\t/// @dev emit when auth address updated\\n\\t/// @param auth authorized address\\n\\tevent AuthUpdated(address auth);\\n\\n\\t/// @dev emit when reward minted\\n\\t/// @param from authorized address\\n\\t/// @param to receiver address\\n\\t/// @param amount token amount\\n\\tevent Minted(address from, address to, uint256 amount);\\n\\n\\t/// @dev return ERC20 token address\\n\\tfunction token() external view returns(IERC20);\\n\\n\\t/// @dev mint reward to receiver\\n\\t/// @param to receiver address\\n\\t/// @param amount token amount\\n\\tfunction mint(address to, uint256 amount) external;\\n\\n}\",\"keccak256\":\"0xc41fb19972737ba746c9dea24922b35745aaff3a6c5839993269a843bffe3160\",\"license\":\"GPL-2.0-or-later\"},\"contracts/stake/Rewarder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\\nimport '../interfaces/IRewarder.sol';\\n\\n/// @dev Rewarder contract\\n/// @author Alexandas\\ncontract Rewarder is IRewarder, Initializable {\\n\\n\\t/// @dev return ERC20 token address\\n\\tIERC20 public override token;\\n\\n\\tmapping(address => bool) internal auths;\\n\\n\\tmodifier isAuth() {\\n\\t\\trequire(auths[msg.sender], 'Rewarder: caller is not allowed to call');\\n\\t\\t_;\\n\\t}\\n\\n\\t/// @dev proxy initialize function\\n\\t/// @param _token ERC20 token address\\n\\t/// @param _auths authorized addresses\\n\\tfunction initialize(IERC20 _token, address[] memory _auths) external initializer {\\n\\t\\t_setToken(_token);\\n\\t\\tfor(uint256 i = 0; i < _auths.length; i++) {\\n\\t\\t\\t_auth(_auths[i]);\\n\\t\\t}\\n\\t}\\n\\n\\t/// @dev mint reward to receiver\\n\\t/// @param to receiver address\\n\\t/// @param amount token amount\\n\\tfunction mint(address to, uint256 amount) external override isAuth {\\n\\t\\ttoken.transfer(to, amount);\\n\\t\\temit Minted(msg.sender, to, amount);\\n\\t}\\n\\n\\tfunction _auth(address auth) internal {\\n\\t\\tauths[auth] = true;\\n\\t\\temit AuthUpdated(auth);\\n\\t}\\n\\n\\tfunction _setToken(IERC20 _token) internal {\\n\\t\\ttoken = _token;\\n\\t\\temit TokenUpdated(token);\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0xcda7589f15f414c6de24ea552d416f13195f9e8c2d63d43dfe2bc898491ab4d9\",\"license\":\"GPL-2.0-or-later\"}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b5061079e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806340c10f1914610046578063946d92041461005b578063fc0c546a1461006e575b600080fd5b6100596100543660046103b5565b61009d565b005b610059610069366004610520565b61019e565b600054610087906201000090046001600160a01b031681565b60405161009491906105a4565b60405180910390f35b3360009081526001602052604090205460ff166100d55760405162461bcd60e51b81526004016100cc906105f9565b60405180910390fd5b60005460405163a9059cbb60e01b8152620100009091046001600160a01b03169063a9059cbb9061010c9085908590600401610618565b602060405180830381600087803b15801561012657600080fd5b505af115801561013a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015e919061064d565b507f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f03383836040516101929392919061066e565b60405180910390a15050565b600054610100900460ff16158080156101be5750600054600160ff909116105b806101d85750303b1580156101d8575060005460ff166001145b6101f45760405162461bcd60e51b81526004016100cc906106e1565b6000805460ff191660011790558015610217576000805461ff0019166101001790555b610220836102b1565b60005b82518110156102605761024e838281518110610241576102416106f1565b602002602001015161031a565b806102588161071d565b915050610223565b5080156102ac576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906102a39060019061074c565b60405180910390a15b505050565b6000805462010000600160b01b031916620100006001600160a01b03848116820292909217928390556040517f5ba6b30cd4b2f9e9e67f4feb9b9df10d5da3b057598e6901b217b7d590345e309361030f93929004909116906105a4565b60405180910390a150565b6001600160a01b038116600090815260016020819052604091829020805460ff19169091179055517fdcb0bc5ecfadc1f3129303f7c1f12b82107806277374a010dffe2c367708ef419061030f90839061075a565b60006001600160a01b0382165b92915050565b61038b8161036f565b811461039657600080fd5b50565b803561037c81610382565b8061038b565b803561037c816103a4565b600080604083850312156103cb576103cb600080fd5b60006103d78585610399565b92505060206103e8858286016103aa565b9150509250929050565b600061037c8261036f565b61038b816103f2565b803561037c816103fd565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff8211171561044d5761044d610411565b6040525050565b600061045f60405190565b905061046b8282610427565b919050565b600067ffffffffffffffff82111561048a5761048a610411565b5060209081020190565b60006104a76104a284610470565b610454565b838152905060208082019084028301858111156104c6576104c6600080fd5b835b818110156104ea57806104db8882610399565b845250602092830192016104c8565b5050509392505050565b600082601f83011261050857610508600080fd5b8135610518848260208601610494565b949350505050565b6000806040838503121561053657610536600080fd5b60006105428585610406565b925050602083013567ffffffffffffffff81111561056257610562600080fd5b6103e8858286016104f4565b60006001600160a01b03821661037c565b600061037c8261056e565b600061037c8261057f565b61059e8161058a565b82525050565b6020810161037c8284610595565b602781526000602082017f52657761726465723a2063616c6c6572206973206e6f7420616c6c6f776564208152661d1bc818d85b1b60ca1b602082015291505b5060400190565b6020808252810161037c816105b2565b61059e8161036f565b8061059e565b604081016106268285610609565b6106336020830184610612565b9392505050565b80151561038b565b805161037c8161063a565b60006020828403121561066257610662600080fd5b60006105188484610642565b6060810161067c8286610609565b6106896020830185610609565b6105186040830184610612565b602e81526000602082017f496e697469616c697a61626c653a20636f6e747261637420697320616c72656181526d191e481a5b9a5d1a585b1a5e995960921b602082015291506105f2565b6020808252810161037c81610696565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561073157610731610707565b5060010190565b600060ff821661037c565b61059e81610738565b6020810161037c8284610743565b6020810161037c828461060956fea264697066735822122066a6f794480381590e7e2fe2a07007a03f12bc8020f1ffc9e88451e49aa990ce64736f6c63430008090033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806340c10f1914610046578063946d92041461005b578063fc0c546a1461006e575b600080fd5b6100596100543660046103b5565b61009d565b005b610059610069366004610520565b61019e565b600054610087906201000090046001600160a01b031681565b60405161009491906105a4565b60405180910390f35b3360009081526001602052604090205460ff166100d55760405162461bcd60e51b81526004016100cc906105f9565b60405180910390fd5b60005460405163a9059cbb60e01b8152620100009091046001600160a01b03169063a9059cbb9061010c9085908590600401610618565b602060405180830381600087803b15801561012657600080fd5b505af115801561013a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015e919061064d565b507f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f03383836040516101929392919061066e565b60405180910390a15050565b600054610100900460ff16158080156101be5750600054600160ff909116105b806101d85750303b1580156101d8575060005460ff166001145b6101f45760405162461bcd60e51b81526004016100cc906106e1565b6000805460ff191660011790558015610217576000805461ff0019166101001790555b610220836102b1565b60005b82518110156102605761024e838281518110610241576102416106f1565b602002602001015161031a565b806102588161071d565b915050610223565b5080156102ac576000805461ff00191690556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906102a39060019061074c565b60405180910390a15b505050565b6000805462010000600160b01b031916620100006001600160a01b03848116820292909217928390556040517f5ba6b30cd4b2f9e9e67f4feb9b9df10d5da3b057598e6901b217b7d590345e309361030f93929004909116906105a4565b60405180910390a150565b6001600160a01b038116600090815260016020819052604091829020805460ff19169091179055517fdcb0bc5ecfadc1f3129303f7c1f12b82107806277374a010dffe2c367708ef419061030f90839061075a565b60006001600160a01b0382165b92915050565b61038b8161036f565b811461039657600080fd5b50565b803561037c81610382565b8061038b565b803561037c816103a4565b600080604083850312156103cb576103cb600080fd5b60006103d78585610399565b92505060206103e8858286016103aa565b9150509250929050565b600061037c8261036f565b61038b816103f2565b803561037c816103fd565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff8211171561044d5761044d610411565b6040525050565b600061045f60405190565b905061046b8282610427565b919050565b600067ffffffffffffffff82111561048a5761048a610411565b5060209081020190565b60006104a76104a284610470565b610454565b838152905060208082019084028301858111156104c6576104c6600080fd5b835b818110156104ea57806104db8882610399565b845250602092830192016104c8565b5050509392505050565b600082601f83011261050857610508600080fd5b8135610518848260208601610494565b949350505050565b6000806040838503121561053657610536600080fd5b60006105428585610406565b925050602083013567ffffffffffffffff81111561056257610562600080fd5b6103e8858286016104f4565b60006001600160a01b03821661037c565b600061037c8261056e565b600061037c8261057f565b61059e8161058a565b82525050565b6020810161037c8284610595565b602781526000602082017f52657761726465723a2063616c6c6572206973206e6f7420616c6c6f776564208152661d1bc818d85b1b60ca1b602082015291505b5060400190565b6020808252810161037c816105b2565b61059e8161036f565b8061059e565b604081016106268285610609565b6106336020830184610612565b9392505050565b80151561038b565b805161037c8161063a565b60006020828403121561066257610662600080fd5b60006105188484610642565b6060810161067c8286610609565b6106896020830185610609565b6105186040830184610612565b602e81526000602082017f496e697469616c697a61626c653a20636f6e747261637420697320616c72656181526d191e481a5b9a5d1a585b1a5e995960921b602082015291506105f2565b6020808252810161037c81610696565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561073157610731610707565b5060010190565b600060ff821661037c565b61059e81610738565b6020810161037c8284610743565b6020810161037c828461060956fea264697066735822122066a6f794480381590e7e2fe2a07007a03f12bc8020f1ffc9e88451e49aa990ce64736f6c63430008090033",
  "devdoc": {
    "author": "Alexandas",
    "details": "Rewarder contract",
    "kind": "dev",
    "methods": {
      "initialize(address,address[])": {
        "details": "proxy initialize function",
        "params": {
          "_auths": "authorized addresses",
          "_token": "ERC20 token address"
        }
      },
      "mint(address,uint256)": {
        "details": "mint reward to receiver",
        "params": {
          "amount": "token amount",
          "to": "receiver address"
        }
      }
    },
    "stateVariables": {
      "token": {
        "details": "return ERC20 token address"
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 138,
        "contract": "contracts/stake/Rewarder.sol:Rewarder",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 141,
        "contract": "contracts/stake/Rewarder.sol:Rewarder",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 8706,
        "contract": "contracts/stake/Rewarder.sol:Rewarder",
        "label": "token",
        "offset": 2,
        "slot": "0",
        "type": "t_contract(IERC20)5771"
      },
      {
        "astId": 8710,
        "contract": "contracts/stake/Rewarder.sol:Rewarder",
        "label": "auths",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_address,t_bool)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_contract(IERC20)5771": {
        "encoding": "inplace",
        "label": "contract IERC20",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}