{
  "contractName": "TBTCToken",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_VendingMachine",
          "type": "address"
        }
      ],
      "payable": false,
      "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"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "subtractedValue",
          "type": "uint256"
        }
      ],
      "name": "decreaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "addedValue",
          "type": "uint256"
        }
      ],
      "name": "increaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "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"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "burnFrom",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "burn",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "contract ITokenRecipient",
          "name": "_spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "approveAndCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.5.17+commit.d19bba13\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_VendingMachine\",\"type\":\"address\"}],\"payable\":false,\"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\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"contract ITokenRecipient\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"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\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Tokens can only be minted by the `VendingMachine` contract.\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See `IERC20.allowance`.\"},\"approve(address,uint256)\":{\"details\":\"See `IERC20.approve`.     * Requirements:     * - `spender` cannot be the zero address.\"},\"approveAndCall(address,uint256,bytes)\":{\"details\":\"The `_spender` should implement the `ITokenRecipient`                   interface to receive approval notifications.\",\"params\":{\"_extraData\":\"Extra information to send to the approved contract.\",\"_spender\":\"Address of contract authorized to spend.\",\"_value\":\"The max amount they can spend.\"},\"return\":\"true if the `_spender` was successfully approved and acted on         the approval, false (or revert) otherwise.\"},\"balanceOf(address)\":{\"details\":\"See `IERC20.balanceOf`.\"},\"burn(uint256)\":{\"details\":\"Destroys `amount` tokens from `msg.sender`, reducing the total supply.\",\"params\":{\"_amount\":\"The amount of tokens that will be burnt.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Burns an amount of the token from the given account's balance.                  deducting from the sender's allowance for said account.                  Uses the internal _burn function.\",\"params\":{\"_account\":\"The account whose tokens will be burnt.\",\"_amount\":\"The amount of tokens that will be burnt.\"}},\"constructor\":{\"details\":\"Constructor, calls ERC20Detailed constructor to set Token info      ERC20Detailed(TokenName, TokenSymbol, NumberOfDecimals)\"},\"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.     * > Note that 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`.\"},\"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.\"},\"mint(address,uint256)\":{\"details\":\"Mints an amount of the token and assigns it to an account.                  Uses the internal _mint function.\",\"params\":{\"_account\":\"The account that will receive the created tokens.\",\"_amount\":\"The amount of tokens that will be created.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"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 `value`. - the caller must have allowance for `sender`'s tokens of at least `amount`.\"}},\"title\":\"TBTC Token.\"},\"userdoc\":{\"methods\":{\"approveAndCall(address,uint256,bytes)\":{\"notice\":\"Set allowance for other address and notify.                   Allows `_spender` to spend no more than `_value`                   tokens on your behalf and then ping the contract about                   it.\"}},\"notice\":\"This is the TBTC ERC20 contract.\"}},\"settings\":{\"compilationTarget\":{\"/home/runner/work/tbtc/tbtc/solidity/contracts/system/TBTCToken.sol\":\"TBTCToken\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/home/runner/work/tbtc/tbtc/solidity/contracts/interfaces/ITokenRecipient.sol\":{\"keccak256\":\"0x4ac6830ad44d0b0d70ebabc60150e9c915c7c0bd0129ef868d5d2cd8da0c32bd\",\"urls\":[\"bzz-raw://a5c6465285add41f07a951f90405800a8802e323ea11e9c7bdb5625ce109c7f7\",\"dweb:/ipfs/QmRf7B4WxsS7gbSwUotgQM633BQc2ye7rhYC1RNVFamBfp\"]},\"/home/runner/work/tbtc/tbtc/solidity/contracts/system/TBTCToken.sol\":{\"keccak256\":\"0x167b07029df8d350996d7f82d853437d1a2562401eeac98037c2eb4c5f295319\",\"urls\":[\"bzz-raw://7d2601ac8dcd5d59b3e479a61262de2162c96ed7ad1cd161331e2e4500b8346a\",\"dweb:/ipfs/QmWVjBSvHFg9W5zsSxgdpNSYKgfLa28fr3mPjjKQaDBxmk\"]},\"/home/runner/work/tbtc/tbtc/solidity/contracts/system/VendingMachineAuthority.sol\":{\"keccak256\":\"0x7ad8a2cee5e6bbc187d04b147dc0d2bc2ae12bb8c3680870be9013dd5543bfd6\",\"urls\":[\"bzz-raw://733f2370c788437b0034c40a8df07f4714009769ed8134a9c656e2a103996687\",\"dweb:/ipfs/Qma9LAGQDzyUvsbhLx3FUKRCx3FmnoZuMxG4SUdjLr8bRm\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x4ccf2d7b51873db1ccfd54ca2adae5eac3b184f9699911ed4490438419f1c690\",\"urls\":[\"bzz-raw://d62d769b2219d5de39013093412623e624fa887f871826ea3bae6052ee893610\",\"dweb:/ipfs/QmV3yVktya1s617QmuzQR2CfuJgUi3dR2xEZY9ecmqZ2G1\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x852793a3c2f86d336a683b30d688ec3dcfc57451af5a2bf5975cda3b7191a901\",\"urls\":[\"bzz-raw://4f5b57664069671648fb81f55b0082faecdf1b2f159eec6b1fa6cef9b7d73bc5\",\"dweb:/ipfs/QmcyytaLs7zFdb4Uu7C5PmQRhQdB3wA3fUdkV6mkYfdDFH\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol\":{\"keccak256\":\"0xc61b3603089b09a730d8ca72e9133a496cc4405da40e9b87c12f073245d774bf\",\"urls\":[\"bzz-raw://de8bb0003d53de236913f0e0102e7a9d015e02098f2495edd000f207fe2be2f4\",\"dweb:/ipfs/QmbtwNwAJEehWWL7yGGyyMoenQvcqtz91pqLgQPpLRoLYC\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x90e8c2521653bbb1768b05889c5760031e688d9cd361f167489b89215e201b95\",\"urls\":[\"bzz-raw://d0abb99bb8bfc2bc0a89902b8ed1dc0442ad08cc78cee64c291b3df6a27bcccc\",\"dweb:/ipfs/QmP5NaEwZthQeM2ESz4WTT3osrP7jhbvu7ocbttBi2JAw6\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b50604051610f66380380610f668339818101604052602081101561003357600080fd5b50516040805180820182526004808252637442544360e01b60208381019182528451808601909552918452635442544360e01b918401919091528151849391601291610081916000916100d2565b5081516100959060019060208501906100d2565b506002805460ff191660ff929092169190911790555050600680546001600160a01b0319166001600160a01b03929092169190911790555061016d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061011357805160ff1916838001178555610140565b82800160010185558215610140579182015b82811115610140578251825591602001919060010190610125565b5061014c929150610150565b5090565b61016a91905b8082111561014c5760008155600101610156565b90565b610dea8061017c6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806342966c6811610097578063a457c2d711610066578063a457c2d7146102f6578063a9059cbb14610322578063cae9ca511461034e578063dd62ed3e14610409576100f5565b806342966c681461027d57806370a082311461029c57806379cc6790146102c257806395d89b41146102ee576100f5565b806323b872dd116100d357806323b872dd146101d1578063313ce56714610207578063395093511461022557806340c10f1914610251576100f5565b806306fdde03146100fa578063095ea7b31461017757806318160ddd146101b7575b600080fd5b610102610437565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561013c578181015183820152602001610124565b50505050905090810190601f1680156101695780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101a36004803603604081101561018d57600080fd5b506001600160a01b0381351690602001356104cd565b604080519115158252519081900360200190f35b6101bf6104e3565b60408051918252519081900360200190f35b6101a3600480360360608110156101e757600080fd5b506001600160a01b038135811691602081013590911690604001356104e9565b61020f610541565b6040805160ff9092168252519081900360200190f35b6101a36004803603604081101561023b57600080fd5b506001600160a01b03813516906020013561054a565b6101a36004803603604081101561026757600080fd5b506001600160a01b038135169060200135610586565b61029a6004803603602081101561029357600080fd5b50356105dc565b005b6101bf600480360360208110156102b257600080fd5b50356001600160a01b03166105e9565b61029a600480360360408110156102d857600080fd5b506001600160a01b038135169060200135610604565b610102610612565b6101a36004803603604081101561030c57600080fd5b506001600160a01b038135169060200135610672565b6101a36004803603604081101561033857600080fd5b506001600160a01b0381351690602001356106ae565b6101a36004803603606081101561036457600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561039457600080fd5b8201836020820111156103a657600080fd5b803590602001918460018302840111640100000000831117156103c857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106bb945050505050565b6101bf6004803603604081101561041f57600080fd5b506001600160a01b03813581169160200135166107c0565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104c35780601f10610498576101008083540402835291602001916104c3565b820191906000526020600020905b8154815290600101906020018083116104a657829003601f168201915b5050505050905090565b60006104da3384846107eb565b50600192915050565b60055490565b60006104f68484846108d7565b6001600160a01b038416600090815260046020908152604080832033808552925290912054610536918691610531908663ffffffff610a1b16565b6107eb565b5060015b9392505050565b60025460ff1690565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916104da918590610531908663ffffffff610a7816565b6006546000906001600160a01b031633146105d25760405162461bcd60e51b8152600401808060200182810382526022815260200180610ce56022913960400191505060405180910390fd5b6104da8383610ad2565b6105e63382610bc4565b50565b6001600160a01b031660009081526003602052604090205490565b61060e8282610c9f565b5050565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104c35780601f10610498576101008083540402835291602001916104c3565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916104da918590610531908663ffffffff610a1b16565b60006104da3384846108d7565b60006106c784846104cd565b156107b657604051638f4ffcb160e01b815233600482018181526024830186905230604484018190526080606485019081528651608486015286516001600160a01b038a1695638f4ffcb195948a94938a939192909160a490910190602085019080838360005b8381101561074657818101518382015260200161072e565b50505050905090810190601f1680156107735780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561079557600080fd5b505af11580156107a9573d6000803e3d6000fd5b505050506001905061053a565b5060009392505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6001600160a01b0383166108305760405162461bcd60e51b8152600401808060200182810382526024815260200180610d926024913960400191505060405180910390fd5b6001600160a01b0382166108755760405162461bcd60e51b8152600401808060200182810382526022815260200180610d2a6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661091c5760405162461bcd60e51b8152600401808060200182810382526025815260200180610d6d6025913960400191505060405180910390fd5b6001600160a01b0382166109615760405162461bcd60e51b8152600401808060200182810382526023815260200180610d076023913960400191505060405180910390fd5b6001600160a01b03831660009081526003602052604090205461098a908263ffffffff610a1b16565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546109bf908263ffffffff610a7816565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115610a72576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561053a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038216610b2d576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554610b40908263ffffffff610a7816565b6005556001600160a01b038216600090815260036020526040902054610b6c908263ffffffff610a7816565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610c095760405162461bcd60e51b8152600401808060200182810382526021815260200180610d4c6021913960400191505060405180910390fd5b600554610c1c908263ffffffff610a1b16565b6005556001600160a01b038216600090815260036020526040902054610c48908263ffffffff610a1b16565b6001600160a01b0383166000818152600360209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b610ca98282610bc4565b6001600160a01b03821660009081526004602090815260408083203380855292529091205461060e918491610531908563ffffffff610a1b1656fe63616c6c6572206d757374206265207468652076656e64696e67206d616368696e6545524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723158202d2552d0e5b628908444f4b0d15232a4ca6351f8e3a2a9af18cc615a1dab587464736f6c63430005110032",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806342966c6811610097578063a457c2d711610066578063a457c2d7146102f6578063a9059cbb14610322578063cae9ca511461034e578063dd62ed3e14610409576100f5565b806342966c681461027d57806370a082311461029c57806379cc6790146102c257806395d89b41146102ee576100f5565b806323b872dd116100d357806323b872dd146101d1578063313ce56714610207578063395093511461022557806340c10f1914610251576100f5565b806306fdde03146100fa578063095ea7b31461017757806318160ddd146101b7575b600080fd5b610102610437565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561013c578181015183820152602001610124565b50505050905090810190601f1680156101695780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101a36004803603604081101561018d57600080fd5b506001600160a01b0381351690602001356104cd565b604080519115158252519081900360200190f35b6101bf6104e3565b60408051918252519081900360200190f35b6101a3600480360360608110156101e757600080fd5b506001600160a01b038135811691602081013590911690604001356104e9565b61020f610541565b6040805160ff9092168252519081900360200190f35b6101a36004803603604081101561023b57600080fd5b506001600160a01b03813516906020013561054a565b6101a36004803603604081101561026757600080fd5b506001600160a01b038135169060200135610586565b61029a6004803603602081101561029357600080fd5b50356105dc565b005b6101bf600480360360208110156102b257600080fd5b50356001600160a01b03166105e9565b61029a600480360360408110156102d857600080fd5b506001600160a01b038135169060200135610604565b610102610612565b6101a36004803603604081101561030c57600080fd5b506001600160a01b038135169060200135610672565b6101a36004803603604081101561033857600080fd5b506001600160a01b0381351690602001356106ae565b6101a36004803603606081101561036457600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561039457600080fd5b8201836020820111156103a657600080fd5b803590602001918460018302840111640100000000831117156103c857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106bb945050505050565b6101bf6004803603604081101561041f57600080fd5b506001600160a01b03813581169160200135166107c0565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104c35780601f10610498576101008083540402835291602001916104c3565b820191906000526020600020905b8154815290600101906020018083116104a657829003601f168201915b5050505050905090565b60006104da3384846107eb565b50600192915050565b60055490565b60006104f68484846108d7565b6001600160a01b038416600090815260046020908152604080832033808552925290912054610536918691610531908663ffffffff610a1b16565b6107eb565b5060015b9392505050565b60025460ff1690565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916104da918590610531908663ffffffff610a7816565b6006546000906001600160a01b031633146105d25760405162461bcd60e51b8152600401808060200182810382526022815260200180610ce56022913960400191505060405180910390fd5b6104da8383610ad2565b6105e63382610bc4565b50565b6001600160a01b031660009081526003602052604090205490565b61060e8282610c9f565b5050565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104c35780601f10610498576101008083540402835291602001916104c3565b3360008181526004602090815260408083206001600160a01b038716845290915281205490916104da918590610531908663ffffffff610a1b16565b60006104da3384846108d7565b60006106c784846104cd565b156107b657604051638f4ffcb160e01b815233600482018181526024830186905230604484018190526080606485019081528651608486015286516001600160a01b038a1695638f4ffcb195948a94938a939192909160a490910190602085019080838360005b8381101561074657818101518382015260200161072e565b50505050905090810190601f1680156107735780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561079557600080fd5b505af11580156107a9573d6000803e3d6000fd5b505050506001905061053a565b5060009392505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6001600160a01b0383166108305760405162461bcd60e51b8152600401808060200182810382526024815260200180610d926024913960400191505060405180910390fd5b6001600160a01b0382166108755760405162461bcd60e51b8152600401808060200182810382526022815260200180610d2a6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661091c5760405162461bcd60e51b8152600401808060200182810382526025815260200180610d6d6025913960400191505060405180910390fd5b6001600160a01b0382166109615760405162461bcd60e51b8152600401808060200182810382526023815260200180610d076023913960400191505060405180910390fd5b6001600160a01b03831660009081526003602052604090205461098a908263ffffffff610a1b16565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546109bf908263ffffffff610a7816565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115610a72576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561053a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038216610b2d576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554610b40908263ffffffff610a7816565b6005556001600160a01b038216600090815260036020526040902054610b6c908263ffffffff610a7816565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610c095760405162461bcd60e51b8152600401808060200182810382526021815260200180610d4c6021913960400191505060405180910390fd5b600554610c1c908263ffffffff610a1b16565b6005556001600160a01b038216600090815260036020526040902054610c48908263ffffffff610a1b16565b6001600160a01b0383166000818152600360209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b610ca98282610bc4565b6001600160a01b03821660009081526004602090815260408083203380855292529091205461060e918491610531908563ffffffff610a1b1656fe63616c6c6572206d757374206265207468652076656e64696e67206d616368696e6545524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723158202d2552d0e5b628908444f4b0d15232a4ca6351f8e3a2a9af18cc615a1dab587464736f6c63430005110032",
  "sourceMap": "481:3044:27:-;;;700:210;8:9:-1;5:2;;;30:1;27;20:12;5:2;700:210:27;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;700:210:27;416:163:63;;;;;;;;;;;;-1:-1:-1;;;700:210:27;416:163:63;;;;;;;;;;;;;;;;;-1:-1:-1;;;416:163:63;;;;;;;504:12;;700:210:27;;416:163:63;790:2:27;;504:12:63;;-1:-1:-1;;504:12:63;:::i;:::-;-1:-1:-1;526:16:63;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;552:9:63;:20;;-1:-1:-1;;552:20:63;;;;;;;;;;;;-1:-1:-1;;413:14:29;:32;;-1:-1:-1;;;;;;413:32:29;-1:-1:-1;;;;;413:32:29;;;;;;;;;;-1:-1:-1;481:3044:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;481:3044:27;;;-1:-1:-1;481:3044:27;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;",
  "deployedSourceMap": "481:3044:27:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;481:3044:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;644:81:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;644:81:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2453:145:62;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2453:145:62;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1514:89;;;:::i;:::-;;;;;;;;;;;;;;;;3055:252;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3055:252:62;;;;;;;;;;;;;;;;;:::i;1478:81:63:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3702:203:62;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3702:203:62;;;;;;;;:::i;1202:373:27:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1202:373:27;;;;;;;;:::i;2211:83::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2211:83:27;;:::i;:::-;;1661:108:62;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1661:108:62;-1:-1:-1;;;;;1661:108:62;;:::i;1940:107:27:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1940:107:27;;;;;;;;:::i;838:85:63:-;;;:::i;4392:213:62:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4392:213:62;;;;;;;;:::i;1972:153::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1972:153:62;;;;;;;;:::i;3046:477:27:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;3046:477:27;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;3046:477:27;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3046:477:27;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3046:477:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3046:477:27;;-1:-1:-1;3046:477:27;;-1:-1:-1;;;;;3046:477:27:i;2183:132:62:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2183:132:62;;;;;;;;;;:::i;644:81:63:-;713:5;706:12;;;;;;;;-1:-1:-1;;706:12:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;681:13;;706:12;;713:5;;706:12;;713:5;706:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;644:81;:::o;2453:145:62:-;2518:4;2534:36;2543:10;2555:7;2564:5;2534:8;:36::i;:::-;-1:-1:-1;2587:4:62;2453:145;;;;:::o;1514:89::-;1584:12;;1514:89;:::o;3055:252::-;3144:4;3160:36;3170:6;3178:9;3189:6;3160:9;:36::i;:::-;-1:-1:-1;;;;;3235:19:62;;;;;;:11;:19;;;;;;;;3223:10;3235:31;;;;;;;;;3206:73;;3215:6;;3235:43;;3271:6;3235:43;:35;:43;:::i;:::-;3206:8;:73::i;:::-;-1:-1:-1;3296:4:62;3055:252;;;;;;:::o;1478:81:63:-;1543:9;;;;1478:81;:::o;3702:203:62:-;3807:10;3782:4;3828:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;3828:32:62;;;;;;;;;;3782:4;;3798:79;;3819:7;;3828:48;;3865:10;3828:48;:36;:48;:::i;1202:373:27:-;632:14:29;;1312:4:27;;-1:-1:-1;;;;;632:14:29;618:10;:28;597:109;;;;-1:-1:-1;;;597:109:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1523:24:27;1529:8;1539:7;1523:5;:24::i;2211:83::-;2261:26;2267:10;2279:7;2261:5;:26::i;:::-;2211:83;:::o;1661:108:62:-;-1:-1:-1;;;;;1744:18:62;1718:7;1744:18;;;:9;:18;;;;;;;1661:108::o;1940:107:27:-;2012:28;2022:8;2032:7;2012:9;:28::i;:::-;1940:107;;:::o;838:85:63:-;909:7;902:14;;;;;;;;-1:-1:-1;;902:14:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;877:13;;902:14;;909:7;;902:14;;909:7;902:14;;;;;;;;;;;;;;;;;;;;;;;;4392:213:62;4502:10;4477:4;4523:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4523:32:62;;;;;;;;;;4477:4;;4493:84;;4514:7;;4523:53;;4560:15;4523:53;:36;:53;:::i;1972:153::-;2041:4;2057:40;2067:10;2079:9;2090:6;2057:9;:40::i;3046:477:27:-;3183:4;3260:34;3276:8;3287:6;3260:7;:34::i;:::-;3256:239;;;3310:149;;-1:-1:-1;;;3310:149:27;;3352:10;3310:149;;;;;;;;;;;;3412:4;3310:149;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3310:24:27;;;;;3352:10;3380:6;;3412:4;3435:10;;3310:149;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3310:149:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3310:149:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3310:149:27;;;;3480:4;3473:11;;;;3256:239;-1:-1:-1;3511:5:27;3046:477;;;;;:::o;2183:132:62:-;-1:-1:-1;;;;;2281:18:62;;;2255:7;2281:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2183:132::o;7117:329::-;-1:-1:-1;;;;;7209:19:62;;7201:68;;;;-1:-1:-1;;;7201:68:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7287:21:62;;7279:68;;;;-1:-1:-1;;;7279:68:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7358:18:62;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;7408:31;;;;;;;;;;;;;;;;;7117:329;;;:::o;5079:422::-;-1:-1:-1;;;;;5176:20:62;;5168:70;;;;-1:-1:-1;;;5168:70:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5256:23:62;;5248:71;;;;-1:-1:-1;;;5248:71:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5350:17:62;;;;;;:9;:17;;;;;;:29;;5372:6;5350:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;5330:17:62;;;;;;;:9;:17;;;;;;:49;;;;5412:20;;;;;;;:32;;5437:6;5412:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;5389:20:62;;;;;;;:9;:20;;;;;;;;;:55;;;;5459:35;;;;;;;5389:20;;5459:35;;;;;;;;;;;;;5079:422;;;:::o;1274:179:60:-;1332:7;1364:1;1359;:6;;1351:49;;;;;-1:-1:-1;;;1351:49:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1422:5:60;;;1274:179::o;834:176::-;892:7;923:5;;;946:6;;;;938:46;;;;;-1:-1:-1;;;938:46:60;;;;;;;;;;;;;;;;;;;;;;;;;;;5771:302:62;-1:-1:-1;;;;;5846:21:62;;5838:65;;;;;-1:-1:-1;;;5838:65:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;5929:12;;:24;;5946:6;5929:24;:16;:24;:::i;:::-;5914:12;:39;-1:-1:-1;;;;;5984:18:62;;;;;;:9;:18;;;;;;:30;;6007:6;5984:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;5963:18:62;;;;;;:9;:18;;;;;;;;:51;;;;6029:37;;;;;;;5963:18;;;;6029:37;;;;;;;;;;5771:302;;:::o;6392:300::-;-1:-1:-1;;;;;6466:21:62;;6458:67;;;;-1:-1:-1;;;6458:67:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6551:12;;:23;;6568:5;6551:23;:16;:23;:::i;:::-;6536:12;:38;-1:-1:-1;;;;;6605:18:62;;;;;;:9;:18;;;;;;:29;;6628:5;6605:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;6584:18:62;;;;;;:9;:18;;;;;;;;:50;;;;6649:36;;;;;;;6584:18;;6649:36;;;;;;;;;;;6392:300;;:::o;7623:185::-;7694:22;7700:7;7709:6;7694:5;:22::i;:::-;-1:-1:-1;;;;;7756:20:62;;;;;;:11;:20;;;;;;;;7744:10;7756:32;;;;;;;;;7726:75;;7735:7;;7756:44;;7793:6;7756:44;:36;:44;:::i",
  "source": "pragma solidity 0.5.17;\n\nimport {ERC20} from \"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\nimport {\n    ERC20Detailed\n} from \"openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol\";\nimport {VendingMachineAuthority} from \"./VendingMachineAuthority.sol\";\nimport {ITokenRecipient} from \"../interfaces/ITokenRecipient.sol\";\n\n/// @title  TBTC Token.\n/// @notice This is the TBTC ERC20 contract.\n/// @dev    Tokens can only be minted by the `VendingMachine` contract.\ncontract TBTCToken is ERC20Detailed, ERC20, VendingMachineAuthority {\n    /// @dev Constructor, calls ERC20Detailed constructor to set Token info\n    ///      ERC20Detailed(TokenName, TokenSymbol, NumberOfDecimals)\n    constructor(address _VendingMachine)\n        public\n        ERC20Detailed(\"tBTC\", \"TBTC\", 18)\n        VendingMachineAuthority(_VendingMachine)\n    {\n        // solium-disable-previous-line no-empty-blocks\n    }\n\n    /// @dev             Mints an amount of the token and assigns it to an account.\n    ///                  Uses the internal _mint function.\n    /// @param _account  The account that will receive the created tokens.\n    /// @param _amount   The amount of tokens that will be created.\n    function mint(address _account, uint256 _amount)\n        external\n        onlyVendingMachine\n        returns (bool)\n    {\n        // NOTE: this is a public function with unchecked minting. Only the\n        // vending machine is allowed to call it, and it is in charge of\n        // ensuring minting is permitted.\n        _mint(_account, _amount);\n        return true;\n    }\n\n    /// @dev             Burns an amount of the token from the given account's balance.\n    ///                  deducting from the sender's allowance for said account.\n    ///                  Uses the internal _burn function.\n    /// @param _account  The account whose tokens will be burnt.\n    /// @param _amount   The amount of tokens that will be burnt.\n    function burnFrom(address _account, uint256 _amount) external {\n        _burnFrom(_account, _amount);\n    }\n\n    /// @dev Destroys `amount` tokens from `msg.sender`, reducing the\n    /// total supply.\n    /// @param _amount   The amount of tokens that will be burnt.\n    function burn(uint256 _amount) external {\n        _burn(msg.sender, _amount);\n    }\n\n    /// @notice           Set allowance for other address and notify.\n    ///                   Allows `_spender` to spend no more than `_value`\n    ///                   tokens on your behalf and then ping the contract about\n    ///                   it.\n    /// @dev              The `_spender` should implement the `ITokenRecipient`\n    ///                   interface to receive approval notifications.\n    /// @param _spender   Address of contract authorized to spend.\n    /// @param _value     The max amount they can spend.\n    /// @param _extraData Extra information to send to the approved contract.\n    /// @return true if the `_spender` was successfully approved and acted on\n    ///         the approval, false (or revert) otherwise.\n    function approveAndCall(\n        ITokenRecipient _spender,\n        uint256 _value,\n        bytes memory _extraData\n    ) public returns (bool) {\n        // not external to allow bytes memory parameters\n        if (approve(address(_spender), _value)) {\n            _spender.receiveApproval(\n                msg.sender,\n                _value,\n                address(this),\n                _extraData\n            );\n            return true;\n        }\n        return false;\n    }\n}\n",
  "sourcePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/system/TBTCToken.sol",
  "ast": {
    "absolutePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/system/TBTCToken.sol",
    "exportedSymbols": {
      "TBTCToken": [
        8561
      ]
    },
    "id": 8562,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 8452,
        "literals": [
          "solidity",
          "0.5",
          ".17"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:27"
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol",
        "file": "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol",
        "id": 8454,
        "nodeType": "ImportDirective",
        "scope": 8562,
        "sourceUnit": 17364,
        "src": "25:76:27",
        "symbolAliases": [
          {
            "foreign": 8453,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol",
        "file": "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol",
        "id": 8456,
        "nodeType": "ImportDirective",
        "scope": 8562,
        "sourceUnit": 17422,
        "src": "102:98:27",
        "symbolAliases": [
          {
            "foreign": 8455,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/system/VendingMachineAuthority.sol",
        "file": "./VendingMachineAuthority.sol",
        "id": 8458,
        "nodeType": "ImportDirective",
        "scope": 8562,
        "sourceUnit": 9151,
        "src": "201:70:27",
        "symbolAliases": [
          {
            "foreign": 8457,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/interfaces/ITokenRecipient.sol",
        "file": "../interfaces/ITokenRecipient.sol",
        "id": 8460,
        "nodeType": "ImportDirective",
        "scope": 8562,
        "sourceUnit": 5526,
        "src": "272:66:27",
        "symbolAliases": [
          {
            "foreign": 8459,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 8461,
              "name": "ERC20Detailed",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 17421,
              "src": "503:13:27",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC20Detailed_$17421",
                "typeString": "contract ERC20Detailed"
              }
            },
            "id": 8462,
            "nodeType": "InheritanceSpecifier",
            "src": "503:13:27"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 8463,
              "name": "ERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 17363,
              "src": "518:5:27",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC20_$17363",
                "typeString": "contract ERC20"
              }
            },
            "id": 8464,
            "nodeType": "InheritanceSpecifier",
            "src": "518:5:27"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 8465,
              "name": "VendingMachineAuthority",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 9150,
              "src": "525:23:27",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_VendingMachineAuthority_$9150",
                "typeString": "contract VendingMachineAuthority"
              }
            },
            "id": 8466,
            "nodeType": "InheritanceSpecifier",
            "src": "525:23:27"
          }
        ],
        "contractDependencies": [
          9150,
          17363,
          17421,
          17490
        ],
        "contractKind": "contract",
        "documentation": "@title  TBTC Token.\n @notice This is the TBTC ERC20 contract.\n @dev    Tokens can only be minted by the `VendingMachine` contract.",
        "fullyImplemented": true,
        "id": 8561,
        "linearizedBaseContracts": [
          8561,
          9150,
          17363,
          17421,
          17490
        ],
        "name": "TBTCToken",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 8479,
              "nodeType": "Block",
              "src": "847:63:27",
              "statements": []
            },
            "documentation": "@dev Constructor, calls ERC20Detailed constructor to set Token info\n      ERC20Detailed(TokenName, TokenSymbol, NumberOfDecimals)",
            "id": 8480,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "hexValue": "74425443",
                    "id": 8471,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "774:6:27",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_be48a2d9f12f1a3e7f0bb4f9c7ffbcc0d6672b7993cab6f941e6ebaeb2bedc26",
                      "typeString": "literal_string \"tBTC\""
                    },
                    "value": "tBTC"
                  },
                  {
                    "argumentTypes": null,
                    "hexValue": "54425443",
                    "id": 8472,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "782:6:27",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_bd4e6a494fe721b497dd9fef4db5889943de69e7cecd23b2c097f81f747771ec",
                      "typeString": "literal_string \"TBTC\""
                    },
                    "value": "TBTC"
                  },
                  {
                    "argumentTypes": null,
                    "hexValue": "3138",
                    "id": 8473,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "790:2:27",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_18_by_1",
                      "typeString": "int_const 18"
                    },
                    "value": "18"
                  }
                ],
                "id": 8474,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 8470,
                  "name": "ERC20Detailed",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 17421,
                  "src": "760:13:27",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_ERC20Detailed_$17421_$",
                    "typeString": "type(contract ERC20Detailed)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "760:33:27"
              },
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "id": 8476,
                    "name": "_VendingMachine",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 8468,
                    "src": "826:15:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                ],
                "id": 8477,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 8475,
                  "name": "VendingMachineAuthority",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 9150,
                  "src": "802:23:27",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_VendingMachineAuthority_$9150_$",
                    "typeString": "type(contract VendingMachineAuthority)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "802:40:27"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 8469,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 8468,
                  "name": "_VendingMachine",
                  "nodeType": "VariableDeclaration",
                  "scope": 8480,
                  "src": "712:23:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 8467,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "712:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "711:25:27"
            },
            "returnParameters": {
              "id": 8478,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "847:0:27"
            },
            "scope": 8561,
            "src": "700:210:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 8498,
              "nodeType": "Block",
              "src": "1322:253:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 8492,
                        "name": "_account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8482,
                        "src": "1529:8:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 8493,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8484,
                        "src": "1539:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 8491,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17249,
                      "src": "1523:5:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 8494,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1523:24:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 8495,
                  "nodeType": "ExpressionStatement",
                  "src": "1523:24:27"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 8496,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1564:4:27",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 8490,
                  "id": 8497,
                  "nodeType": "Return",
                  "src": "1557:11:27"
                }
              ]
            },
            "documentation": "@dev             Mints an amount of the token and assigns it to an account.\n                  Uses the internal _mint function.\n @param _account  The account that will receive the created tokens.\n @param _amount   The amount of tokens that will be created.",
            "id": 8499,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 8487,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 8486,
                  "name": "onlyVendingMachine",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 9149,
                  "src": "1276:18:27",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1276:18:27"
              }
            ],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 8485,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 8482,
                  "name": "_account",
                  "nodeType": "VariableDeclaration",
                  "scope": 8499,
                  "src": "1216:16:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 8481,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1216:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 8484,
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 8499,
                  "src": "1234:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 8483,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1234:7:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1215:35:27"
            },
            "returnParameters": {
              "id": 8490,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 8489,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 8499,
                  "src": "1312:4:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 8488,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1312:4:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1311:6:27"
            },
            "scope": 8561,
            "src": "1202:373:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 8511,
              "nodeType": "Block",
              "src": "2002:45:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 8507,
                        "name": "_account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8501,
                        "src": "2022:8:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 8508,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8503,
                        "src": "2032:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 8506,
                      "name": "_burnFrom",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17362,
                      "src": "2012:9:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 8509,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2012:28:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 8510,
                  "nodeType": "ExpressionStatement",
                  "src": "2012:28:27"
                }
              ]
            },
            "documentation": "@dev             Burns an amount of the token from the given account's balance.\n                  deducting from the sender's allowance for said account.\n                  Uses the internal _burn function.\n @param _account  The account whose tokens will be burnt.\n @param _amount   The amount of tokens that will be burnt.",
            "id": 8512,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "burnFrom",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 8504,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 8501,
                  "name": "_account",
                  "nodeType": "VariableDeclaration",
                  "scope": 8512,
                  "src": "1958:16:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 8500,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1958:7:27",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 8503,
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 8512,
                  "src": "1976:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 8502,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1976:7:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1957:35:27"
            },
            "returnParameters": {
              "id": 8505,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2002:0:27"
            },
            "scope": 8561,
            "src": "1940:107:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 8523,
              "nodeType": "Block",
              "src": "2251:43:27",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 8518,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18360,
                          "src": "2267:3:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 8519,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2267:10:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 8520,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8514,
                        "src": "2279:7:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 8517,
                      "name": "_burn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17292,
                      "src": "2261:5:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 8521,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2261:26:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 8522,
                  "nodeType": "ExpressionStatement",
                  "src": "2261:26:27"
                }
              ]
            },
            "documentation": "@dev Destroys `amount` tokens from `msg.sender`, reducing the\n total supply.\n @param _amount   The amount of tokens that will be burnt.",
            "id": 8524,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "burn",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 8515,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 8514,
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 8524,
                  "src": "2225:15:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 8513,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2225:7:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2224:17:27"
            },
            "returnParameters": {
              "id": 8516,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2251:0:27"
            },
            "scope": 8561,
            "src": "2211:83:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 8559,
              "nodeType": "Block",
              "src": "3189:334:27",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 8537,
                            "name": "_spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8526,
                            "src": "3276:8:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ITokenRecipient_$5525",
                              "typeString": "contract ITokenRecipient"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_ITokenRecipient_$5525",
                              "typeString": "contract ITokenRecipient"
                            }
                          ],
                          "id": 8536,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3268:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 8538,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3268:17:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 8539,
                        "name": "_value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8528,
                        "src": "3287:6:27",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 8535,
                      "name": "approve",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17061,
                      "src": "3260:7:27",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) returns (bool)"
                      }
                    },
                    "id": 8540,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3260:34:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 8556,
                  "nodeType": "IfStatement",
                  "src": "3256:239:27",
                  "trueBody": {
                    "id": 8555,
                    "nodeType": "Block",
                    "src": "3296:199:27",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 8544,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18360,
                                "src": "3352:3:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 8545,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3352:10:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8546,
                              "name": "_value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8528,
                              "src": "3380:6:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 8548,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18426,
                                  "src": "3412:4:27",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TBTCToken_$8561",
                                    "typeString": "contract TBTCToken"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TBTCToken_$8561",
                                    "typeString": "contract TBTCToken"
                                  }
                                ],
                                "id": 8547,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3404:7:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": "address"
                              },
                              "id": 8549,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3404:13:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8550,
                              "name": "_extraData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8530,
                              "src": "3435:10:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 8541,
                              "name": "_spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8526,
                              "src": "3310:8:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ITokenRecipient_$5525",
                                "typeString": "contract ITokenRecipient"
                              }
                            },
                            "id": 8543,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "receiveApproval",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5524,
                            "src": "3310:24:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (address,uint256,address,bytes memory) external"
                            }
                          },
                          "id": 8551,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3310:149:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8552,
                        "nodeType": "ExpressionStatement",
                        "src": "3310:149:27"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 8553,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3480:4:27",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 8534,
                        "id": 8554,
                        "nodeType": "Return",
                        "src": "3473:11:27"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "66616c7365",
                    "id": 8557,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3511:5:27",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "false"
                  },
                  "functionReturnParameters": 8534,
                  "id": 8558,
                  "nodeType": "Return",
                  "src": "3504:12:27"
                }
              ]
            },
            "documentation": "@notice           Set allowance for other address and notify.\n                   Allows `_spender` to spend no more than `_value`\n                   tokens on your behalf and then ping the contract about\n                   it.\n @dev              The `_spender` should implement the `ITokenRecipient`\n                   interface to receive approval notifications.\n @param _spender   Address of contract authorized to spend.\n @param _value     The max amount they can spend.\n @param _extraData Extra information to send to the approved contract.\n @return true if the `_spender` was successfully approved and acted on\n         the approval, false (or revert) otherwise.",
            "id": 8560,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "approveAndCall",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 8531,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 8526,
                  "name": "_spender",
                  "nodeType": "VariableDeclaration",
                  "scope": 8560,
                  "src": "3079:24:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ITokenRecipient_$5525",
                    "typeString": "contract ITokenRecipient"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 8525,
                    "name": "ITokenRecipient",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5525,
                    "src": "3079:15:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ITokenRecipient_$5525",
                      "typeString": "contract ITokenRecipient"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 8528,
                  "name": "_value",
                  "nodeType": "VariableDeclaration",
                  "scope": 8560,
                  "src": "3113:14:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 8527,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3113:7:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 8530,
                  "name": "_extraData",
                  "nodeType": "VariableDeclaration",
                  "scope": 8560,
                  "src": "3137:23:27",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 8529,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3137:5:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3069:97:27"
            },
            "returnParameters": {
              "id": 8534,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 8533,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 8560,
                  "src": "3183:4:27",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 8532,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3183:4:27",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3182:6:27"
            },
            "scope": 8561,
            "src": "3046:477:27",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 8562,
        "src": "481:3044:27"
      }
    ],
    "src": "0:3526:27"
  },
  "legacyAST": {
    "attributes": {
      "absolutePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/system/TBTCToken.sol",
      "exportedSymbols": {
        "TBTCToken": [
          8561
        ]
      }
    },
    "children": [
      {
        "attributes": {
          "literals": [
            "solidity",
            "0.5",
            ".17"
          ]
        },
        "id": 8452,
        "name": "PragmaDirective",
        "src": "0:23:27"
      },
      {
        "attributes": {
          "SourceUnit": 17364,
          "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol",
          "file": "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol",
          "scope": 8562,
          "symbolAliases": [
            {
              "foreign": 8453,
              "local": null
            }
          ],
          "unitAlias": ""
        },
        "id": 8454,
        "name": "ImportDirective",
        "src": "25:76:27"
      },
      {
        "attributes": {
          "SourceUnit": 17422,
          "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol",
          "file": "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol",
          "scope": 8562,
          "symbolAliases": [
            {
              "foreign": 8455,
              "local": null
            }
          ],
          "unitAlias": ""
        },
        "id": 8456,
        "name": "ImportDirective",
        "src": "102:98:27"
      },
      {
        "attributes": {
          "SourceUnit": 9151,
          "absolutePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/system/VendingMachineAuthority.sol",
          "file": "./VendingMachineAuthority.sol",
          "scope": 8562,
          "symbolAliases": [
            {
              "foreign": 8457,
              "local": null
            }
          ],
          "unitAlias": ""
        },
        "id": 8458,
        "name": "ImportDirective",
        "src": "201:70:27"
      },
      {
        "attributes": {
          "SourceUnit": 5526,
          "absolutePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/interfaces/ITokenRecipient.sol",
          "file": "../interfaces/ITokenRecipient.sol",
          "scope": 8562,
          "symbolAliases": [
            {
              "foreign": 8459,
              "local": null
            }
          ],
          "unitAlias": ""
        },
        "id": 8460,
        "name": "ImportDirective",
        "src": "272:66:27"
      },
      {
        "attributes": {
          "contractDependencies": [
            9150,
            17363,
            17421,
            17490
          ],
          "contractKind": "contract",
          "documentation": "@title  TBTC Token.\n @notice This is the TBTC ERC20 contract.\n @dev    Tokens can only be minted by the `VendingMachine` contract.",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            8561,
            9150,
            17363,
            17421,
            17490
          ],
          "name": "TBTCToken",
          "scope": 8562
        },
        "children": [
          {
            "attributes": {
              "arguments": null
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "ERC20Detailed",
                  "referencedDeclaration": 17421,
                  "type": "contract ERC20Detailed"
                },
                "id": 8461,
                "name": "UserDefinedTypeName",
                "src": "503:13:27"
              }
            ],
            "id": 8462,
            "name": "InheritanceSpecifier",
            "src": "503:13:27"
          },
          {
            "attributes": {
              "arguments": null
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "ERC20",
                  "referencedDeclaration": 17363,
                  "type": "contract ERC20"
                },
                "id": 8463,
                "name": "UserDefinedTypeName",
                "src": "518:5:27"
              }
            ],
            "id": 8464,
            "name": "InheritanceSpecifier",
            "src": "518:5:27"
          },
          {
            "attributes": {
              "arguments": null
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "VendingMachineAuthority",
                  "referencedDeclaration": 9150,
                  "type": "contract VendingMachineAuthority"
                },
                "id": 8465,
                "name": "UserDefinedTypeName",
                "src": "525:23:27"
              }
            ],
            "id": 8466,
            "name": "InheritanceSpecifier",
            "src": "525:23:27"
          },
          {
            "attributes": {
              "documentation": "@dev Constructor, calls ERC20Detailed constructor to set Token info\n      ERC20Detailed(TokenName, TokenSymbol, NumberOfDecimals)",
              "implemented": true,
              "isConstructor": true,
              "kind": "constructor",
              "name": "",
              "scope": 8561,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_VendingMachine",
                      "scope": 8480,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 8467,
                        "name": "ElementaryTypeName",
                        "src": "712:7:27"
                      }
                    ],
                    "id": 8468,
                    "name": "VariableDeclaration",
                    "src": "712:23:27"
                  }
                ],
                "id": 8469,
                "name": "ParameterList",
                "src": "711:25:27"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 8478,
                "name": "ParameterList",
                "src": "847:0:27"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 17421,
                      "type": "type(contract ERC20Detailed)",
                      "value": "ERC20Detailed"
                    },
                    "id": 8470,
                    "name": "Identifier",
                    "src": "760:13:27"
                  },
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "hexvalue": "74425443",
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "subdenomination": null,
                      "token": "string",
                      "type": "literal_string \"tBTC\"",
                      "value": "tBTC"
                    },
                    "id": 8471,
                    "name": "Literal",
                    "src": "774:6:27"
                  },
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "hexvalue": "54425443",
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "subdenomination": null,
                      "token": "string",
                      "type": "literal_string \"TBTC\"",
                      "value": "TBTC"
                    },
                    "id": 8472,
                    "name": "Literal",
                    "src": "782:6:27"
                  },
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "hexvalue": "3138",
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "subdenomination": null,
                      "token": "number",
                      "type": "int_const 18",
                      "value": "18"
                    },
                    "id": 8473,
                    "name": "Literal",
                    "src": "790:2:27"
                  }
                ],
                "id": 8474,
                "name": "ModifierInvocation",
                "src": "760:33:27"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 9150,
                      "type": "type(contract VendingMachineAuthority)",
                      "value": "VendingMachineAuthority"
                    },
                    "id": 8475,
                    "name": "Identifier",
                    "src": "802:23:27"
                  },
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 8468,
                      "type": "address",
                      "value": "_VendingMachine"
                    },
                    "id": 8476,
                    "name": "Identifier",
                    "src": "826:15:27"
                  }
                ],
                "id": 8477,
                "name": "ModifierInvocation",
                "src": "802:40:27"
              },
              {
                "attributes": {
                  "statements": [
                    null
                  ]
                },
                "children": [],
                "id": 8479,
                "name": "Block",
                "src": "847:63:27"
              }
            ],
            "id": 8480,
            "name": "FunctionDefinition",
            "src": "700:210:27"
          },
          {
            "attributes": {
              "documentation": "@dev             Mints an amount of the token and assigns it to an account.\n                  Uses the internal _mint function.\n @param _account  The account that will receive the created tokens.\n @param _amount   The amount of tokens that will be created.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "name": "mint",
              "scope": 8561,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_account",
                      "scope": 8499,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 8481,
                        "name": "ElementaryTypeName",
                        "src": "1216:7:27"
                      }
                    ],
                    "id": 8482,
                    "name": "VariableDeclaration",
                    "src": "1216:16:27"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_amount",
                      "scope": 8499,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 8483,
                        "name": "ElementaryTypeName",
                        "src": "1234:7:27"
                      }
                    ],
                    "id": 8484,
                    "name": "VariableDeclaration",
                    "src": "1234:15:27"
                  }
                ],
                "id": 8485,
                "name": "ParameterList",
                "src": "1215:35:27"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 8499,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bool",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bool",
                          "type": "bool"
                        },
                        "id": 8488,
                        "name": "ElementaryTypeName",
                        "src": "1312:4:27"
                      }
                    ],
                    "id": 8489,
                    "name": "VariableDeclaration",
                    "src": "1312:4:27"
                  }
                ],
                "id": 8490,
                "name": "ParameterList",
                "src": "1311:6:27"
              },
              {
                "attributes": {
                  "arguments": null
                },
                "children": [
                  {
                    "attributes": {
                      "argumentTypes": null,
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 9149,
                      "type": "modifier ()",
                      "value": "onlyVendingMachine"
                    },
                    "id": 8486,
                    "name": "Identifier",
                    "src": "1276:18:27"
                  }
                ],
                "id": 8487,
                "name": "ModifierInvocation",
                "src": "1276:18:27"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 17249,
                              "type": "function (address,uint256)",
                              "value": "_mint"
                            },
                            "id": 8491,
                            "name": "Identifier",
                            "src": "1523:5:27"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 8482,
                              "type": "address",
                              "value": "_account"
                            },
                            "id": 8492,
                            "name": "Identifier",
                            "src": "1529:8:27"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 8484,
                              "type": "uint256",
                              "value": "_amount"
                            },
                            "id": 8493,
                            "name": "Identifier",
                            "src": "1539:7:27"
                          }
                        ],
                        "id": 8494,
                        "name": "FunctionCall",
                        "src": "1523:24:27"
                      }
                    ],
                    "id": 8495,
                    "name": "ExpressionStatement",
                    "src": "1523:24:27"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 8490
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "hexvalue": "74727565",
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "subdenomination": null,
                          "token": "bool",
                          "type": "bool",
                          "value": "true"
                        },
                        "id": 8496,
                        "name": "Literal",
                        "src": "1564:4:27"
                      }
                    ],
                    "id": 8497,
                    "name": "Return",
                    "src": "1557:11:27"
                  }
                ],
                "id": 8498,
                "name": "Block",
                "src": "1322:253:27"
              }
            ],
            "id": 8499,
            "name": "FunctionDefinition",
            "src": "1202:373:27"
          },
          {
            "attributes": {
              "documentation": "@dev             Burns an amount of the token from the given account's balance.\n                  deducting from the sender's allowance for said account.\n                  Uses the internal _burn function.\n @param _account  The account whose tokens will be burnt.\n @param _amount   The amount of tokens that will be burnt.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "burnFrom",
              "scope": 8561,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_account",
                      "scope": 8512,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 8500,
                        "name": "ElementaryTypeName",
                        "src": "1958:7:27"
                      }
                    ],
                    "id": 8501,
                    "name": "VariableDeclaration",
                    "src": "1958:16:27"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_amount",
                      "scope": 8512,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 8502,
                        "name": "ElementaryTypeName",
                        "src": "1976:7:27"
                      }
                    ],
                    "id": 8503,
                    "name": "VariableDeclaration",
                    "src": "1976:15:27"
                  }
                ],
                "id": 8504,
                "name": "ParameterList",
                "src": "1957:35:27"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 8505,
                "name": "ParameterList",
                "src": "2002:0:27"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 17362,
                              "type": "function (address,uint256)",
                              "value": "_burnFrom"
                            },
                            "id": 8506,
                            "name": "Identifier",
                            "src": "2012:9:27"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 8501,
                              "type": "address",
                              "value": "_account"
                            },
                            "id": 8507,
                            "name": "Identifier",
                            "src": "2022:8:27"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 8503,
                              "type": "uint256",
                              "value": "_amount"
                            },
                            "id": 8508,
                            "name": "Identifier",
                            "src": "2032:7:27"
                          }
                        ],
                        "id": 8509,
                        "name": "FunctionCall",
                        "src": "2012:28:27"
                      }
                    ],
                    "id": 8510,
                    "name": "ExpressionStatement",
                    "src": "2012:28:27"
                  }
                ],
                "id": 8511,
                "name": "Block",
                "src": "2002:45:27"
              }
            ],
            "id": 8512,
            "name": "FunctionDefinition",
            "src": "1940:107:27"
          },
          {
            "attributes": {
              "documentation": "@dev Destroys `amount` tokens from `msg.sender`, reducing the\n total supply.\n @param _amount   The amount of tokens that will be burnt.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "burn",
              "scope": 8561,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "external"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_amount",
                      "scope": 8524,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 8513,
                        "name": "ElementaryTypeName",
                        "src": "2225:7:27"
                      }
                    ],
                    "id": 8514,
                    "name": "VariableDeclaration",
                    "src": "2225:15:27"
                  }
                ],
                "id": 8515,
                "name": "ParameterList",
                "src": "2224:17:27"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 8516,
                "name": "ParameterList",
                "src": "2251:0:27"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 17292,
                              "type": "function (address,uint256)",
                              "value": "_burn"
                            },
                            "id": 8517,
                            "name": "Identifier",
                            "src": "2261:5:27"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "sender",
                              "referencedDeclaration": null,
                              "type": "address payable"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 18360,
                                  "type": "msg",
                                  "value": "msg"
                                },
                                "id": 8518,
                                "name": "Identifier",
                                "src": "2267:3:27"
                              }
                            ],
                            "id": 8519,
                            "name": "MemberAccess",
                            "src": "2267:10:27"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 8514,
                              "type": "uint256",
                              "value": "_amount"
                            },
                            "id": 8520,
                            "name": "Identifier",
                            "src": "2279:7:27"
                          }
                        ],
                        "id": 8521,
                        "name": "FunctionCall",
                        "src": "2261:26:27"
                      }
                    ],
                    "id": 8522,
                    "name": "ExpressionStatement",
                    "src": "2261:26:27"
                  }
                ],
                "id": 8523,
                "name": "Block",
                "src": "2251:43:27"
              }
            ],
            "id": 8524,
            "name": "FunctionDefinition",
            "src": "2211:83:27"
          },
          {
            "attributes": {
              "documentation": "@notice           Set allowance for other address and notify.\n                   Allows `_spender` to spend no more than `_value`\n                   tokens on your behalf and then ping the contract about\n                   it.\n @dev              The `_spender` should implement the `ITokenRecipient`\n                   interface to receive approval notifications.\n @param _spender   Address of contract authorized to spend.\n @param _value     The max amount they can spend.\n @param _extraData Extra information to send to the approved contract.\n @return true if the `_spender` was successfully approved and acted on\n         the approval, false (or revert) otherwise.",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "approveAndCall",
              "scope": 8561,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_spender",
                      "scope": 8560,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract ITokenRecipient",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "contractScope": null,
                          "name": "ITokenRecipient",
                          "referencedDeclaration": 5525,
                          "type": "contract ITokenRecipient"
                        },
                        "id": 8525,
                        "name": "UserDefinedTypeName",
                        "src": "3079:15:27"
                      }
                    ],
                    "id": 8526,
                    "name": "VariableDeclaration",
                    "src": "3079:24:27"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_value",
                      "scope": 8560,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 8527,
                        "name": "ElementaryTypeName",
                        "src": "3113:7:27"
                      }
                    ],
                    "id": 8528,
                    "name": "VariableDeclaration",
                    "src": "3113:14:27"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "_extraData",
                      "scope": 8560,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "bytes",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes",
                          "type": "bytes"
                        },
                        "id": 8529,
                        "name": "ElementaryTypeName",
                        "src": "3137:5:27"
                      }
                    ],
                    "id": 8530,
                    "name": "VariableDeclaration",
                    "src": "3137:23:27"
                  }
                ],
                "id": 8531,
                "name": "ParameterList",
                "src": "3069:97:27"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "",
                      "scope": 8560,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bool",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bool",
                          "type": "bool"
                        },
                        "id": 8532,
                        "name": "ElementaryTypeName",
                        "src": "3183:4:27"
                      }
                    ],
                    "id": 8533,
                    "name": "VariableDeclaration",
                    "src": "3183:4:27"
                  }
                ],
                "id": 8534,
                "name": "ParameterList",
                "src": "3182:6:27"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "falseBody": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "bool",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 17061,
                              "type": "function (address,uint256) returns (bool)",
                              "value": "approve"
                            },
                            "id": 8535,
                            "name": "Identifier",
                            "src": "3260:7:27"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "type": "address",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_ITokenRecipient_$5525",
                                      "typeString": "contract ITokenRecipient"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(address)",
                                  "value": "address"
                                },
                                "id": 8536,
                                "name": "ElementaryTypeNameExpression",
                                "src": "3268:7:27"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 8526,
                                  "type": "contract ITokenRecipient",
                                  "value": "_spender"
                                },
                                "id": 8537,
                                "name": "Identifier",
                                "src": "3276:8:27"
                              }
                            ],
                            "id": 8538,
                            "name": "FunctionCall",
                            "src": "3268:17:27"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 8528,
                              "type": "uint256",
                              "value": "_value"
                            },
                            "id": 8539,
                            "name": "Identifier",
                            "src": "3287:6:27"
                          }
                        ],
                        "id": 8540,
                        "name": "FunctionCall",
                        "src": "3260:34:27"
                      },
                      {
                        "children": [
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "type": "tuple()",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        },
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "receiveApproval",
                                      "referencedDeclaration": 5524,
                                      "type": "function (address,uint256,address,bytes memory) external"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 8526,
                                          "type": "contract ITokenRecipient",
                                          "value": "_spender"
                                        },
                                        "id": 8541,
                                        "name": "Identifier",
                                        "src": "3310:8:27"
                                      }
                                    ],
                                    "id": 8543,
                                    "name": "MemberAccess",
                                    "src": "3310:24:27"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "sender",
                                      "referencedDeclaration": null,
                                      "type": "address payable"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 18360,
                                          "type": "msg",
                                          "value": "msg"
                                        },
                                        "id": 8544,
                                        "name": "Identifier",
                                        "src": "3352:3:27"
                                      }
                                    ],
                                    "id": 8545,
                                    "name": "MemberAccess",
                                    "src": "3352:10:27"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 8528,
                                      "type": "uint256",
                                      "value": "_value"
                                    },
                                    "id": 8546,
                                    "name": "Identifier",
                                    "src": "3380:6:27"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "type": "address",
                                      "type_conversion": true
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_TBTCToken_$8561",
                                              "typeString": "contract TBTCToken"
                                            }
                                          ],
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "type": "type(address)",
                                          "value": "address"
                                        },
                                        "id": 8547,
                                        "name": "ElementaryTypeNameExpression",
                                        "src": "3404:7:27"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 18426,
                                          "type": "contract TBTCToken",
                                          "value": "this"
                                        },
                                        "id": 8548,
                                        "name": "Identifier",
                                        "src": "3412:4:27"
                                      }
                                    ],
                                    "id": 8549,
                                    "name": "FunctionCall",
                                    "src": "3404:13:27"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 8530,
                                      "type": "bytes memory",
                                      "value": "_extraData"
                                    },
                                    "id": 8550,
                                    "name": "Identifier",
                                    "src": "3435:10:27"
                                  }
                                ],
                                "id": 8551,
                                "name": "FunctionCall",
                                "src": "3310:149:27"
                              }
                            ],
                            "id": 8552,
                            "name": "ExpressionStatement",
                            "src": "3310:149:27"
                          },
                          {
                            "attributes": {
                              "functionReturnParameters": 8534
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "hexvalue": "74727565",
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "subdenomination": null,
                                  "token": "bool",
                                  "type": "bool",
                                  "value": "true"
                                },
                                "id": 8553,
                                "name": "Literal",
                                "src": "3480:4:27"
                              }
                            ],
                            "id": 8554,
                            "name": "Return",
                            "src": "3473:11:27"
                          }
                        ],
                        "id": 8555,
                        "name": "Block",
                        "src": "3296:199:27"
                      }
                    ],
                    "id": 8556,
                    "name": "IfStatement",
                    "src": "3256:239:27"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 8534
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "hexvalue": "66616c7365",
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "subdenomination": null,
                          "token": "bool",
                          "type": "bool",
                          "value": "false"
                        },
                        "id": 8557,
                        "name": "Literal",
                        "src": "3511:5:27"
                      }
                    ],
                    "id": 8558,
                    "name": "Return",
                    "src": "3504:12:27"
                  }
                ],
                "id": 8559,
                "name": "Block",
                "src": "3189:334:27"
              }
            ],
            "id": 8560,
            "name": "FunctionDefinition",
            "src": "3046:477:27"
          }
        ],
        "id": 8561,
        "name": "ContractDefinition",
        "src": "481:3044:27"
      }
    ],
    "id": 8562,
    "name": "SourceUnit",
    "src": "0:3526:27"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.17+commit.d19bba13.Emscripten.clang"
  },
  "networks": {
    "3": {
      "events": {},
      "links": {},
      "address": "0xe6c5019b2Bf6cf006b9D510f1078349Eb4f20aC6",
      "transactionHash": "0x5c50cedfc5370959db28842688ce2bf11065acd3571d52beb23f0a6cbf68c975"
    }
  },
  "schemaVersion": "3.3.4",
  "updatedAt": "2021-11-23T12:02:26.792Z",
  "networkType": "ethereum",
  "devdoc": {
    "details": "Tokens can only be minted by the `VendingMachine` contract.",
    "methods": {
      "allowance(address,address)": {
        "details": "See `IERC20.allowance`."
      },
      "approve(address,uint256)": {
        "details": "See `IERC20.approve`.     * Requirements:     * - `spender` cannot be the zero address."
      },
      "approveAndCall(address,uint256,bytes)": {
        "details": "The `_spender` should implement the `ITokenRecipient`                   interface to receive approval notifications.",
        "params": {
          "_extraData": "Extra information to send to the approved contract.",
          "_spender": "Address of contract authorized to spend.",
          "_value": "The max amount they can spend."
        },
        "return": "true if the `_spender` was successfully approved and acted on         the approval, false (or revert) otherwise."
      },
      "balanceOf(address)": {
        "details": "See `IERC20.balanceOf`."
      },
      "burn(uint256)": {
        "details": "Destroys `amount` tokens from `msg.sender`, reducing the total supply.",
        "params": {
          "_amount": "The amount of tokens that will be burnt."
        }
      },
      "burnFrom(address,uint256)": {
        "details": "Burns an amount of the token from the given account's balance.                  deducting from the sender's allowance for said account.                  Uses the internal _burn function.",
        "params": {
          "_account": "The account whose tokens will be burnt.",
          "_amount": "The amount of tokens that will be burnt."
        }
      },
      "constructor": {
        "details": "Constructor, calls ERC20Detailed constructor to set Token info      ERC20Detailed(TokenName, TokenSymbol, NumberOfDecimals)"
      },
      "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.     * > Note that 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`."
      },
      "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."
      },
      "mint(address,uint256)": {
        "details": "Mints an amount of the token and assigns it to an account.                  Uses the internal _mint function.",
        "params": {
          "_account": "The account that will receive the created tokens.",
          "_amount": "The amount of tokens that will be created."
        }
      },
      "name()": {
        "details": "Returns the name of the token."
      },
      "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 `value`. - the caller must have allowance for `sender`'s tokens of at least `amount`."
      }
    },
    "title": "TBTC Token."
  },
  "userdoc": {
    "methods": {
      "approveAndCall(address,uint256,bytes)": {
        "notice": "Set allowance for other address and notify.                   Allows `_spender` to spend no more than `_value`                   tokens on your behalf and then ping the contract about                   it."
      }
    },
    "notice": "This is the TBTC ERC20 contract."
  }
}