{
  "address": "0xAaDa30E4502399c262dF6e1D5Befc97e8E7A9898",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_symbol",
          "type": "string"
        },
        {
          "internalType": "uint8",
          "name": "_decimals",
          "type": "uint8"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "addr",
          "type": "address"
        }
      ],
      "name": "balanceOfToken",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "subtractedValue",
          "type": "uint256"
        }
      ],
      "name": "decreaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "depositToken",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "addedValue",
          "type": "uint256"
        }
      ],
      "name": "increaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "redeemToken",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "sharesToTokens",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "supplyTokenTo",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "contract ERC20Mintable",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokens",
          "type": "uint256"
        }
      ],
      "name": "tokensToShares",
      "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": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "yield",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x10c00ecab1c449915c518041609143e4b423e5ffc464e292cf138a708e21d59a",
  "receipt": {
    "to": null,
    "from": "0x0fB374787B0bB7e62bD82A1B020b12fa239aB788",
    "contractAddress": "0xAaDa30E4502399c262dF6e1D5Befc97e8E7A9898",
    "transactionIndex": 0,
    "gasUsed": "1970901",
    "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000200000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000021000000000000000001000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000",
    "blockHash": "0x839422c56f7c06e609260e989bebfd4868e61cd86946f6689efa145a979c96e7",
    "transactionHash": "0x10c00ecab1c449915c518041609143e4b423e5ffc464e292cf138a708e21d59a",
    "logs": [
      {
        "transactionIndex": 0,
        "blockNumber": 22751249,
        "transactionHash": "0x10c00ecab1c449915c518041609143e4b423e5ffc464e292cf138a708e21d59a",
        "address": "0x0000000000000000000000000000000000001010",
        "topics": [
          "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63",
          "0x0000000000000000000000000000000000000000000000000000000000001010",
          "0x0000000000000000000000000fb374787b0bb7e62bd82a1b020b12fa239ab788",
          "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8"
        ],
        "data": "0x00000000000000000000000000000000000000000000000000e7114ae4edce2d00000000000000000000000000000000000000000000000083088a563570d13b00000000000000000000000000000000000000000000034a29910bba6cb7705c0000000000000000000000000000000000000000000000008221790b5083030e00000000000000000000000000000000000000000000034a2a781d0551a53e89",
        "logIndex": 0,
        "blockHash": "0x839422c56f7c06e609260e989bebfd4868e61cd86946f6689efa145a979c96e7"
      }
    ],
    "blockNumber": 22751249,
    "cumulativeGasUsed": "1970901",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "Token",
    "TOK",
    6
  ],
  "solcInputHash": "d82604c280a326795e4a4877e691c4c0",
  "metadata": "{\"compiler\":{\"version\":\"0.8.6+commit.11564f7e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"balanceOfToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"redeemToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"sharesToTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"supplyTokenTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract ERC20Mintable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"tokensToShares\",\"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\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"yield\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Extension of {ERC20} that adds a set of accounts with the {MinterRole}, which have permission to mint (create) new tokens as they see fit. At construction, the deployer of the contract is the only minter.\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"balanceOfToken(address)\":{\"returns\":{\"_0\":\"The underlying balance of asset tokens.\"}},\"decimals()\":{\"details\":\"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}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"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`.\"},\"depositToken()\":{\"returns\":{\"_0\":\"The ERC20 asset token address.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"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.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"redeemToken(uint256)\":{\"params\":{\"amount\":\"The amount of asset tokens to withdraw.  Denominated in `depositToken()` as above.\"},\"returns\":{\"_0\":\"The actual amount of interst bearing tokens that were redeemed.\"}},\"supplyTokenTo(uint256,address)\":{\"params\":{\"amount\":\"The amount of asset tokens to be supplied.  Denominated in `depositToken()` as above.\",\"to\":\"The user whose balance will receive the tokens\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"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`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"balanceOfToken(address)\":{\"notice\":\"Returns the total balance (in asset tokens).  This includes the deposits and interest.\"},\"depositToken()\":{\"notice\":\"Returns the ERC20 asset token used for deposits.\"},\"redeemToken(uint256)\":{\"notice\":\"Redeems tokens from the yield source.\"},\"supplyTokenTo(uint256,address)\":{\"notice\":\"Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol\":\"MockYieldSource\"},\"evmVersion\":\"berlin\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":2000},\"remappings\":[]},\"sources\":{\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\\ninterface IYieldSource {\\n    /// @notice Returns the ERC20 asset token used for deposits.\\n    /// @return The ERC20 asset token address.\\n    function depositToken() external view returns (address);\\n\\n    /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n    /// @return The underlying balance of asset tokens.\\n    function balanceOfToken(address addr) external returns (uint256);\\n\\n    /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\\n    /// @param amount The amount of asset tokens to be supplied.  Denominated in `depositToken()` as above.\\n    /// @param to The user whose balance will receive the tokens\\n    function supplyTokenTo(uint256 amount, address to) external;\\n\\n    /// @notice Redeems tokens from the yield source.\\n    /// @param amount The amount of asset tokens to withdraw.  Denominated in `depositToken()` as above.\\n    /// @return The actual amount of interst bearing tokens that were redeemed.\\n    function redeemToken(uint256 amount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0x659c59f7b0a4cac6ce4c46a8ccec1d8d7ab14aa08451c0d521804fec9ccc95f1\",\"license\":\"GPL-3.0\"},\"@pooltogether/yield-source-interface/contracts/test/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0;\\n\\n/**\\n * NOTE: Copied from OpenZeppelin\\n *\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 {\\n    mapping(address => uint256) private _balances;\\n\\n    mapping(address => mapping(address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\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 Sets the values for {name} and {symbol}.\\n     *\\n     * The default value of {decimals} is 18. To select a different value for\\n     * {decimals} you should overload it.\\n     *\\n     * All two of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    constructor(\\n        string memory name_,\\n        string memory symbol_,\\n        uint8 decimals_\\n    ) {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n     * overridden;\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual returns (bool) {\\n        _transfer(msg.sender, recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual returns (bool) {\\n        _approve(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(\\n        address sender,\\n        address recipient,\\n        uint256 amount\\n    ) public virtual returns (bool) {\\n        _transfer(sender, recipient, amount);\\n\\n        uint256 currentAllowance = _allowances[sender][msg.sender];\\n        require(currentAllowance >= amount, \\\"ERC20: transfer amount exceeds allowance\\\");\\n        unchecked {\\n            _approve(sender, msg.sender, currentAllowance - amount);\\n        }\\n\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue)\\n        public\\n        virtual\\n        returns (bool)\\n    {\\n        uint256 currentAllowance = _allowances[msg.sender][spender];\\n        require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n        unchecked {\\n            _approve(msg.sender, spender, currentAllowance - subtractedValue);\\n        }\\n\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n     *\\n     * This internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(\\n        address sender,\\n        address recipient,\\n        uint256 amount\\n    ) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        uint256 senderBalance = _balances[sender];\\n        require(senderBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        unchecked {\\n            _balances[sender] = senderBalance - amount;\\n        }\\n        _balances[recipient] += amount;\\n\\n        emit Transfer(sender, recipient, amount);\\n\\n        _afterTokenTransfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply += amount;\\n        _balances[account] += amount;\\n        emit Transfer(address(0), account, amount);\\n\\n        _afterTokenTransfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        uint256 accountBalance = _balances[account];\\n        require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        unchecked {\\n            _balances[account] = accountBalance - amount;\\n        }\\n        _totalSupply -= amount;\\n\\n        emit Transfer(account, address(0), amount);\\n\\n        _afterTokenTransfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(\\n        address owner,\\n        address spender,\\n        uint256 amount\\n    ) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal virtual {}\\n\\n    /**\\n     * @dev Hook that is called after any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * has been transferred to `to`.\\n     * - when `from` is zero, `amount` tokens have been minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _afterTokenTransfer(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal virtual {}\\n\\n    uint256[45] private __gap;\\n}\\n\",\"keccak256\":\"0xdd443b9630201b27f09fdacb9ed000005c769e320718534f9147ebb2863570b8\",\"license\":\"MIT\"},\"@pooltogether/yield-source-interface/contracts/test/ERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\nimport \\\"./ERC20.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole},\\n * which have permission to mint (create) new tokens as they see fit.\\n *\\n * At construction, the deployer of the contract is the only minter.\\n */\\ncontract ERC20Mintable is ERC20 {\\n    constructor(\\n        string memory _name,\\n        string memory _symbol,\\n        uint8 _decimals\\n    ) ERC20(_name, _symbol, _decimals) {}\\n\\n    /**\\n     * @dev See {ERC20-_mint}.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have the {MinterRole}.\\n     */\\n    function mint(address account, uint256 amount) public returns (bool) {\\n        _mint(account, amount);\\n        return true;\\n    }\\n\\n    function burn(address account, uint256 amount) public returns (bool) {\\n        _burn(account, amount);\\n        return true;\\n    }\\n\\n    function masterTransfer(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public {\\n        _transfer(from, to, amount);\\n    }\\n}\\n\",\"keccak256\":\"0x875d7981f3050f693d95b7660bd8d460757f1a523801e70d3add7fc7fa8ae338\",\"license\":\"GPL-3.0\"},\"@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\nimport \\\"../IYieldSource.sol\\\";\\nimport \\\"./ERC20Mintable.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole},\\n * which have permission to mint (create) new tokens as they see fit.\\n *\\n * At construction, the deployer of the contract is the only minter.\\n */\\ncontract MockYieldSource is ERC20, IYieldSource {\\n    ERC20Mintable public token;\\n\\n    constructor(\\n        string memory _name,\\n        string memory _symbol,\\n        uint8 _decimals\\n    ) ERC20(\\\"YIELD\\\", \\\"YLD\\\", 18) {\\n        token = new ERC20Mintable(_name, _symbol, _decimals);\\n    }\\n\\n    function yield(uint256 amount) external {\\n        token.mint(address(this), amount);\\n    }\\n\\n    /// @notice Returns the ERC20 asset token used for deposits.\\n    /// @return The ERC20 asset token address.\\n    function depositToken() external view override returns (address) {\\n        return address(token);\\n    }\\n\\n    /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n    /// @return The underlying balance of asset tokens.\\n    function balanceOfToken(address addr) external view override returns (uint256) {\\n        return sharesToTokens(balanceOf(addr));\\n    }\\n\\n    /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\\n    /// @param amount The amount of asset tokens to be supplied.  Denominated in `depositToken()` as above.\\n    /// @param to The user whose balance will receive the tokens\\n    function supplyTokenTo(uint256 amount, address to) external override {\\n        uint256 shares = tokensToShares(amount);\\n        token.transferFrom(msg.sender, address(this), amount);\\n        _mint(to, shares);\\n    }\\n\\n    /// @notice Redeems tokens from the yield source.\\n    /// @param amount The amount of asset tokens to withdraw.  Denominated in `depositToken()` as above.\\n    /// @return The actual amount of interst bearing tokens that were redeemed.\\n    function redeemToken(uint256 amount) external override returns (uint256) {\\n        uint256 shares = tokensToShares(amount);\\n        _burn(msg.sender, shares);\\n        token.transfer(msg.sender, amount);\\n\\n        return amount;\\n    }\\n\\n    function tokensToShares(uint256 tokens) public view returns (uint256) {\\n        uint256 tokenBalance = token.balanceOf(address(this));\\n\\n        if (tokenBalance == 0) {\\n            return tokens;\\n        } else {\\n            return (tokens * totalSupply()) / tokenBalance;\\n        }\\n    }\\n\\n    function sharesToTokens(uint256 shares) public view returns (uint256) {\\n        uint256 supply = totalSupply();\\n\\n        if (supply == 0) {\\n            return shares;\\n        } else {\\n            return (shares * token.balanceOf(address(this))) / supply;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xd8bc48b506ff8423b382d4f23b1aae3c2746046b0c37d38e3ee4aebbffd62dfe\",\"license\":\"GPL-3.0\"}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b506040516200259738038062002597833981016040819052620000349162000264565b60405180604001604052806005815260200164165251531160da1b8152506040518060400160405280600381526020016216531160ea1b81525060128260039080519060200190620000889291906200011f565b5081516200009e9060049060208501906200011f565b506005805460ff191660ff929092169190911790555050604051839083908390620000c990620001ae565b620000d79392919062000317565b604051809103906000f080158015620000f4573d6000803e3d6000fd5b50603380546001600160a01b0319166001600160a01b039290921691909117905550620003da915050565b8280546200012d9062000387565b90600052602060002090601f0160209004810192826200015157600085556200019c565b82601f106200016c57805160ff19168380011785556200019c565b828001600101855582156200019c579182015b828111156200019c5782518255916020019190600101906200017f565b50620001aa929150620001bc565b5090565b610fb680620015e183390190565b5b80821115620001aa5760008155600101620001bd565b600082601f830112620001e557600080fd5b81516001600160401b0380821115620002025762000202620003c4565b604051601f8301601f19908116603f011681019082821181831017156200022d576200022d620003c4565b816040528381528660208588010111156200024757600080fd5b6200025a84602083016020890162000354565b9695505050505050565b6000806000606084860312156200027a57600080fd5b83516001600160401b03808211156200029257600080fd5b620002a087838801620001d3565b94506020860151915080821115620002b757600080fd5b50620002c686828701620001d3565b925050604084015160ff81168114620002de57600080fd5b809150509250925092565b600081518084526200030381602086016020860162000354565b601f01601f19169290920160200192915050565b6060815260006200032c6060830186620002e9565b8281036020840152620003408186620002e9565b91505060ff83166040830152949350505050565b60005b838110156200037157818101518382015260200162000357565b8381111562000381576000848401525b50505050565b600181811c908216806200039c57607f821691505b60208210811415620003be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6111f780620003ea6000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063765287ef116100cd578063b99152d011610081578063dd62ed3e11610066578063dd62ed3e146102c1578063f3044ac7146102fa578063fc0c546a1461030d57600080fd5b8063b99152d014610289578063c89039c51461029c57600080fd5b806395d89b41116100b257806395d89b411461025b578063a457c2d714610263578063a9059cbb1461027657600080fd5b8063765287ef1461023357806387a6eeef1461024857600080fd5b806323b872dd11610124578063313ce56711610109578063313ce567146101e257806339509351146101f757806370a082311461020a57600080fd5b806323b872dd146101bc57806327def4fd146101cf57600080fd5b8063013054c21461015657806306fdde031461017c578063095ea7b31461019157806318160ddd146101b4575b600080fd5b610169610164366004611020565b610320565b6040519081526020015b60405180910390f35b6101846103dd565b6040516101739190611075565b6101a461019f366004610fd4565b61046f565b6040519015158152602001610173565b600254610169565b6101a46101ca366004610f98565b610485565b6101696101dd366004611020565b610549565b60055460405160ff9091168152602001610173565b6101a4610205366004610fd4565b610618565b610169610218366004610f4a565b6001600160a01b031660009081526020819052604090205490565b610246610241366004611020565b610654565b005b610246610256366004611052565b6106f5565b6101846107b4565b6101a4610271366004610fd4565b6107c3565b6101a4610284366004610fd4565b610874565b610169610297366004610f4a565b610881565b6033546001600160a01b03165b6040516001600160a01b039091168152602001610173565b6101696102cf366004610f65565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610169610308366004611020565b6108a9565b6033546102a9906001600160a01b031681565b60008061032c836108a9565b9050610338338261095a565b6033546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018590526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561039d57600080fd5b505af11580156103b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d59190610ffe565b509192915050565b6060600380546103ec90611176565b80601f016020809104026020016040519081016040528092919081815260200182805461041890611176565b80156104655780601f1061043a57610100808354040283529160200191610465565b820191906000526020600020905b81548152906001019060200180831161044857829003601f168201915b5050505050905090565b600061047c338484610adf565b50600192915050565b6000610492848484610c37565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105315760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61053e8533858403610adf565b506001949350505050565b60008061055560025490565b905080610563575090919050565b6033546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156105bf57600080fd5b505afa1580156105d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f79190611039565b6106019085611122565b61060b9190611100565b9392505050565b50919050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161047c91859061064f9086906110e8565b610adf565b6033546040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018390526001600160a01b03909116906340c10f1990604401602060405180830381600087803b1580156106b957600080fd5b505af11580156106cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190610ffe565b5050565b6000610700836108a9565b6033546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561076c57600080fd5b505af1158015610780573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a49190610ffe565b506107af8282610e4f565b505050565b6060600480546103ec90611176565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561085d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610528565b61086a3385858403610adf565b5060019392505050565b600061047c338484610c37565b6001600160a01b0381166000908152602081905260408120546108a390610549565b92915050565b6033546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009182916001600160a01b03909116906370a082319060240160206040518083038186803b15801561090a57600080fd5b505afa15801561091e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109429190611039565b905080610950575090919050565b806105f760025490565b6001600160a01b0382166109d65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b03821660009081526020819052604090205481811015610a655760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b0383166000908152602081905260408120838303905560028054849290610a9490849061115f565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6001600160a01b038316610b5a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b038216610bd65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610cb35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b038216610d2f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b03831660009081526020819052604090205481811015610dbe5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610df59084906110e8565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e4191815260200190565b60405180910390a350505050565b6001600160a01b038216610ea55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610528565b8060026000828254610eb791906110e8565b90915550506001600160a01b03821660009081526020819052604081208054839290610ee49084906110e8565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b0381168114610f4557600080fd5b919050565b600060208284031215610f5c57600080fd5b61060b82610f2e565b60008060408385031215610f7857600080fd5b610f8183610f2e565b9150610f8f60208401610f2e565b90509250929050565b600080600060608486031215610fad57600080fd5b610fb684610f2e565b9250610fc460208501610f2e565b9150604084013590509250925092565b60008060408385031215610fe757600080fd5b610ff083610f2e565b946020939093013593505050565b60006020828403121561101057600080fd5b8151801515811461060b57600080fd5b60006020828403121561103257600080fd5b5035919050565b60006020828403121561104b57600080fd5b5051919050565b6000806040838503121561106557600080fd5b82359150610f8f60208401610f2e565b600060208083528351808285015260005b818110156110a257858101830151858201604001528201611086565b818111156110b4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600082198211156110fb576110fb6111ab565b500190565b60008261111d57634e487b7160e01b600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561115a5761115a6111ab565b500290565b600082821015611171576111716111ab565b500390565b600181811c9082168061118a57607f821691505b6020821081141561061257634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fdfea2646970667358221220b0d0be68a96eb65dff25f8029835bce2abb1d1a48ef76bf55bb9abf97a1df9ac64736f6c6343000806003360806040523480156200001157600080fd5b5060405162000fb638038062000fb68339810160408190526200003491620001e3565b82828282600390805190602001906200004f92919062000086565b5081516200006590600490602085019062000086565b506005805460ff191660ff9290921691909117905550620002bb9350505050565b828054620000949062000268565b90600052602060002090601f016020900481019282620000b8576000855562000103565b82601f10620000d357805160ff191683800117855562000103565b8280016001018555821562000103579182015b8281111562000103578251825591602001919060010190620000e6565b506200011192915062000115565b5090565b5b8082111562000111576000815560010162000116565b600082601f8301126200013e57600080fd5b81516001600160401b03808211156200015b576200015b620002a5565b604051601f8301601f19908116603f01168101908282118183101715620001865762000186620002a5565b81604052838152602092508683858801011115620001a357600080fd5b600091505b83821015620001c75785820183015181830184015290820190620001a8565b83821115620001d95760008385830101525b9695505050505050565b600080600060608486031215620001f957600080fd5b83516001600160401b03808211156200021157600080fd5b6200021f878388016200012c565b945060208601519150808211156200023657600080fd5b5062000245868287016200012c565b925050604084015160ff811681146200025d57600080fd5b809150509250925092565b600181811c908216806200027d57607f821691505b602082108114156200029f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b610ceb80620002cb6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806340c10f191161008c5780639dc29fac116100665780639dc29fac146101d6578063a457c2d7146101e9578063a9059cbb146101fc578063dd62ed3e1461020f57600080fd5b806340c10f191461019257806370a08231146101a557806395d89b41146101ce57600080fd5b80631c9c7903116100c85780631c9c79031461014257806323b872dd14610157578063313ce5671461016a578063395093511461017f57600080fd5b806306fdde03146100ef578063095ea7b31461010d57806318160ddd14610130575b600080fd5b6100f7610248565b6040516101049190610b90565b60405180910390f35b61012061011b366004610b66565b6102da565b6040519015158152602001610104565b6002545b604051908152602001610104565b610155610150366004610b2a565b6102f0565b005b610120610165366004610b2a565b610300565b60055460405160ff9091168152602001610104565b61012061018d366004610b66565b6103c4565b6101206101a0366004610b66565b610400565b6101346101b3366004610ad5565b6001600160a01b031660009081526020819052604090205490565b6100f761040c565b6101206101e4366004610b66565b61041b565b6101206101f7366004610b66565b610427565b61012061020a366004610b66565b6104d8565b61013461021d366004610af7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606003805461025790610c32565b80601f016020809104026020016040519081016040528092919081815260200182805461028390610c32565b80156102d05780601f106102a5576101008083540402835291602001916102d0565b820191906000526020600020905b8154815290600101906020018083116102b357829003601f168201915b5050505050905090565b60006102e73384846104e5565b50600192915050565b6102fb83838361063d565b505050565b600061030d84848461063d565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156103ac5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103b985338584036104e5565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916102e79185906103fb908690610c03565b6104e5565b60006102e78383610855565b60606004805461025790610c32565b60006102e78383610934565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156104c15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016103a3565b6104ce33858584036104e5565b5060019392505050565b60006102e733848461063d565b6001600160a01b0383166105605760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016103a3565b6001600160a01b0382166105dc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016103a3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166106b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103a3565b6001600160a01b0382166107355760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016103a3565b6001600160a01b038316600090815260208190526040902054818110156107c45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016103a3565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906107fb908490610c03565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161084791815260200190565b60405180910390a350505050565b6001600160a01b0382166108ab5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103a3565b80600260008282546108bd9190610c03565b90915550506001600160a01b038216600090815260208190526040812080548392906108ea908490610c03565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166109b05760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016103a3565b6001600160a01b03821660009081526020819052604090205481811015610a3f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016103a3565b6001600160a01b0383166000908152602081905260408120838303905560028054849290610a6e908490610c1b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b80356001600160a01b0381168114610ad057600080fd5b919050565b600060208284031215610ae757600080fd5b610af082610ab9565b9392505050565b60008060408385031215610b0a57600080fd5b610b1383610ab9565b9150610b2160208401610ab9565b90509250929050565b600080600060608486031215610b3f57600080fd5b610b4884610ab9565b9250610b5660208501610ab9565b9150604084013590509250925092565b60008060408385031215610b7957600080fd5b610b8283610ab9565b946020939093013593505050565b600060208083528351808285015260005b81811015610bbd57858101830151858201604001528201610ba1565b81811115610bcf576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008219821115610c1657610c16610c86565b500190565b600082821015610c2d57610c2d610c86565b500390565b600181811c90821680610c4657607f821691505b60208210811415610c80577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212200d8946b5eb130740744d8a31937c9971ac977e9fddfc4c96a792b9ef1e4e0a5c64736f6c63430008060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063765287ef116100cd578063b99152d011610081578063dd62ed3e11610066578063dd62ed3e146102c1578063f3044ac7146102fa578063fc0c546a1461030d57600080fd5b8063b99152d014610289578063c89039c51461029c57600080fd5b806395d89b41116100b257806395d89b411461025b578063a457c2d714610263578063a9059cbb1461027657600080fd5b8063765287ef1461023357806387a6eeef1461024857600080fd5b806323b872dd11610124578063313ce56711610109578063313ce567146101e257806339509351146101f757806370a082311461020a57600080fd5b806323b872dd146101bc57806327def4fd146101cf57600080fd5b8063013054c21461015657806306fdde031461017c578063095ea7b31461019157806318160ddd146101b4575b600080fd5b610169610164366004611020565b610320565b6040519081526020015b60405180910390f35b6101846103dd565b6040516101739190611075565b6101a461019f366004610fd4565b61046f565b6040519015158152602001610173565b600254610169565b6101a46101ca366004610f98565b610485565b6101696101dd366004611020565b610549565b60055460405160ff9091168152602001610173565b6101a4610205366004610fd4565b610618565b610169610218366004610f4a565b6001600160a01b031660009081526020819052604090205490565b610246610241366004611020565b610654565b005b610246610256366004611052565b6106f5565b6101846107b4565b6101a4610271366004610fd4565b6107c3565b6101a4610284366004610fd4565b610874565b610169610297366004610f4a565b610881565b6033546001600160a01b03165b6040516001600160a01b039091168152602001610173565b6101696102cf366004610f65565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610169610308366004611020565b6108a9565b6033546102a9906001600160a01b031681565b60008061032c836108a9565b9050610338338261095a565b6033546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018590526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561039d57600080fd5b505af11580156103b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d59190610ffe565b509192915050565b6060600380546103ec90611176565b80601f016020809104026020016040519081016040528092919081815260200182805461041890611176565b80156104655780601f1061043a57610100808354040283529160200191610465565b820191906000526020600020905b81548152906001019060200180831161044857829003601f168201915b5050505050905090565b600061047c338484610adf565b50600192915050565b6000610492848484610c37565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105315760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61053e8533858403610adf565b506001949350505050565b60008061055560025490565b905080610563575090919050565b6033546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156105bf57600080fd5b505afa1580156105d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f79190611039565b6106019085611122565b61060b9190611100565b9392505050565b50919050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161047c91859061064f9086906110e8565b610adf565b6033546040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018390526001600160a01b03909116906340c10f1990604401602060405180830381600087803b1580156106b957600080fd5b505af11580156106cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190610ffe565b5050565b6000610700836108a9565b6033546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561076c57600080fd5b505af1158015610780573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a49190610ffe565b506107af8282610e4f565b505050565b6060600480546103ec90611176565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561085d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610528565b61086a3385858403610adf565b5060019392505050565b600061047c338484610c37565b6001600160a01b0381166000908152602081905260408120546108a390610549565b92915050565b6033546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009182916001600160a01b03909116906370a082319060240160206040518083038186803b15801561090a57600080fd5b505afa15801561091e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109429190611039565b905080610950575090919050565b806105f760025490565b6001600160a01b0382166109d65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b03821660009081526020819052604090205481811015610a655760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b0383166000908152602081905260408120838303905560028054849290610a9490849061115f565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6001600160a01b038316610b5a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b038216610bd65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610cb35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b038216610d2f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b03831660009081526020819052604090205481811015610dbe5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610528565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610df59084906110e8565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e4191815260200190565b60405180910390a350505050565b6001600160a01b038216610ea55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610528565b8060026000828254610eb791906110e8565b90915550506001600160a01b03821660009081526020819052604081208054839290610ee49084906110e8565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b0381168114610f4557600080fd5b919050565b600060208284031215610f5c57600080fd5b61060b82610f2e565b60008060408385031215610f7857600080fd5b610f8183610f2e565b9150610f8f60208401610f2e565b90509250929050565b600080600060608486031215610fad57600080fd5b610fb684610f2e565b9250610fc460208501610f2e565b9150604084013590509250925092565b60008060408385031215610fe757600080fd5b610ff083610f2e565b946020939093013593505050565b60006020828403121561101057600080fd5b8151801515811461060b57600080fd5b60006020828403121561103257600080fd5b5035919050565b60006020828403121561104b57600080fd5b5051919050565b6000806040838503121561106557600080fd5b82359150610f8f60208401610f2e565b600060208083528351808285015260005b818110156110a257858101830151858201604001528201611086565b818111156110b4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600082198211156110fb576110fb6111ab565b500190565b60008261111d57634e487b7160e01b600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561115a5761115a6111ab565b500290565b600082821015611171576111716111ab565b500390565b600181811c9082168061118a57607f821691505b6020821081141561061257634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fdfea2646970667358221220b0d0be68a96eb65dff25f8029835bce2abb1d1a48ef76bf55bb9abf97a1df9ac64736f6c63430008060033",
  "devdoc": {
    "details": "Extension of {ERC20} that adds a set of accounts with the {MinterRole}, which have permission to mint (create) new tokens as they see fit. At construction, the deployer of the contract is the only minter.",
    "kind": "dev",
    "methods": {
      "allowance(address,address)": {
        "details": "See {IERC20-allowance}."
      },
      "approve(address,uint256)": {
        "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
      },
      "balanceOf(address)": {
        "details": "See {IERC20-balanceOf}."
      },
      "balanceOfToken(address)": {
        "returns": {
          "_0": "The underlying balance of asset tokens."
        }
      },
      "decimals()": {
        "details": "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}."
      },
      "decreaseAllowance(address,uint256)": {
        "details": "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`."
      },
      "depositToken()": {
        "returns": {
          "_0": "The ERC20 asset token address."
        }
      },
      "increaseAllowance(address,uint256)": {
        "details": "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."
      },
      "name()": {
        "details": "Returns the name of the token."
      },
      "redeemToken(uint256)": {
        "params": {
          "amount": "The amount of asset tokens to withdraw.  Denominated in `depositToken()` as above."
        },
        "returns": {
          "_0": "The actual amount of interst bearing tokens that were redeemed."
        }
      },
      "supplyTokenTo(uint256,address)": {
        "params": {
          "amount": "The amount of asset tokens to be supplied.  Denominated in `depositToken()` as above.",
          "to": "The user whose balance will receive the tokens"
        }
      },
      "symbol()": {
        "details": "Returns the symbol of the token, usually a shorter version of the name."
      },
      "totalSupply()": {
        "details": "See {IERC20-totalSupply}."
      },
      "transfer(address,uint256)": {
        "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
      },
      "transferFrom(address,address,uint256)": {
        "details": "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`."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "balanceOfToken(address)": {
        "notice": "Returns the total balance (in asset tokens).  This includes the deposits and interest."
      },
      "depositToken()": {
        "notice": "Returns the ERC20 asset token used for deposits."
      },
      "redeemToken(uint256)": {
        "notice": "Redeems tokens from the yield source."
      },
      "supplyTokenTo(uint256,address)": {
        "notice": "Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 15901,
        "contract": "@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol:MockYieldSource",
        "label": "_balances",
        "offset": 0,
        "slot": "0",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 15907,
        "contract": "@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol:MockYieldSource",
        "label": "_allowances",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 15909,
        "contract": "@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol:MockYieldSource",
        "label": "_totalSupply",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 15911,
        "contract": "@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol:MockYieldSource",
        "label": "_name",
        "offset": 0,
        "slot": "3",
        "type": "t_string_storage"
      },
      {
        "astId": 15913,
        "contract": "@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol:MockYieldSource",
        "label": "_symbol",
        "offset": 0,
        "slot": "4",
        "type": "t_string_storage"
      },
      {
        "astId": 15915,
        "contract": "@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol:MockYieldSource",
        "label": "_decimals",
        "offset": 0,
        "slot": "5",
        "type": "t_uint8"
      },
      {
        "astId": 16451,
        "contract": "@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol:MockYieldSource",
        "label": "__gap",
        "offset": 0,
        "slot": "6",
        "type": "t_array(t_uint256)45_storage"
      },
      {
        "astId": 16537,
        "contract": "@pooltogether/yield-source-interface/contracts/test/MockYieldSource.sol:MockYieldSource",
        "label": "token",
        "offset": 0,
        "slot": "51",
        "type": "t_contract(ERC20Mintable)16525"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_uint256)45_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[45]",
        "numberOfBytes": "1440"
      },
      "t_contract(ERC20Mintable)16525": {
        "encoding": "inplace",
        "label": "contract ERC20Mintable",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => mapping(address => uint256))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_uint256)"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}