{
    "contractName": "TestToken",
    "abi": [
        {
            "inputs": [],
            "stateMutability": "nonpayable",
            "type": "constructor"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "address",
                    "name": "owner",
                    "type": "address"
                },
                {
                    "indexed": true,
                    "internalType": "address",
                    "name": "spender",
                    "type": "address"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "value",
                    "type": "uint256"
                }
            ],
            "name": "Approval",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "address",
                    "name": "from",
                    "type": "address"
                },
                {
                    "indexed": true,
                    "internalType": "address",
                    "name": "to",
                    "type": "address"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "value",
                    "type": "uint256"
                }
            ],
            "name": "Transfer",
            "type": "event"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "owner",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "spender",
                    "type": "address"
                }
            ],
            "name": "allowance",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "spender",
                    "type": "address"
                },
                {
                    "internalType": "uint256",
                    "name": "amount",
                    "type": "uint256"
                }
            ],
            "name": "approve",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "account",
                    "type": "address"
                }
            ],
            "name": "balanceOf",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "decimals",
            "outputs": [
                {
                    "internalType": "uint8",
                    "name": "",
                    "type": "uint8"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "spender",
                    "type": "address"
                },
                {
                    "internalType": "uint256",
                    "name": "subtractedValue",
                    "type": "uint256"
                }
            ],
            "name": "decreaseAllowance",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "spender",
                    "type": "address"
                },
                {
                    "internalType": "uint256",
                    "name": "addedValue",
                    "type": "uint256"
                }
            ],
            "name": "increaseAllowance",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "name",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "symbol",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "totalSupply",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "to",
                    "type": "address"
                },
                {
                    "internalType": "uint256",
                    "name": "amount",
                    "type": "uint256"
                }
            ],
            "name": "transfer",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "from",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "to",
                    "type": "address"
                },
                {
                    "internalType": "uint256",
                    "name": "amount",
                    "type": "uint256"
                }
            ],
            "name": "transferFrom",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "uint256",
                    "name": "amount",
                    "type": "uint256"
                }
            ],
            "name": "mint",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ],
    "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"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: - `to` 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}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/alexf/gsn2/packages/contracts/solpp/test/TestToken.sol\":\"TestToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/alexf/gsn2/packages/contracts/solpp/test/TestToken.sol\":{\"keccak256\":\"0x12ccb4f93dce6acc062756f2dbf3a7347c4815563137d7b3b587f92faa028abe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4bf2bf80100c0aed91eff552bacae7012bcad18bd6571598d62387a2d68e4629\",\"dweb:/ipfs/QmR3AVizKVPPArRcuqUtWT31HgmKsirZxBwWaJYcxZETZx\"]},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://43e46da9d9f49741ecd876a269e71bc7494058d7a8e9478429998adb5bc3eaa0\",\"dweb:/ipfs/QmUtp4cqzf22C5rJ76AabKADquGWcjsc33yjYXxXC4sDvy\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]}},\"version\":1}",
    "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600a8152602001692a32b9ba102a37b5b2b760b11b81525060405180604001604052806003815260200162544f4b60e81b81525081600390805190602001906200006992919062000199565b5080516200007f90600490602084019062000199565b5050506200009c68056bc75e2d63100000620000a260201b60201c565b620002a3565b620000ae3382620000b1565b50565b6001600160a01b0382166200010c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200012091906200023f565b90915550506001600160a01b038216600090815260208190526040812080548392906200014f9084906200023f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620001a79062000266565b90600052602060002090601f016020900481019282620001cb576000855562000216565b82601f10620001e657805160ff191683800117855562000216565b8280016001018555821562000216579182015b8281111562000216578251825591602001919060010190620001f9565b506200022492915062000228565b5090565b5b8082111562000224576000815560010162000229565b600082198211156200026157634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200027b57607f821691505b602082108114156200029d57634e487b7160e01b600052602260045260246000fd5b50919050565b6109ac80620002b36000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806370a082311161007157806370a082311461014157806395d89b411461016a578063a0712d6814610172578063a457c2d714610187578063a9059cbb1461019a578063dd62ed3e146101ad57600080fd5b806306fdde03146100b9578063095ea7b3146100d757806318160ddd146100fa57806323b872dd1461010c578063313ce5671461011f578063395093511461012e575b600080fd5b6100c16101c0565b6040516100ce91906108c0565b60405180910390f35b6100ea6100e536600461087d565b610252565b60405190151581526020016100ce565b6002545b6040519081526020016100ce565b6100ea61011a366004610841565b61026a565b604051601281526020016100ce565b6100ea61013c36600461087d565b61028e565b6100fe61014f3660046107ec565b6001600160a01b031660009081526020819052604090205490565b6100c16102b0565b6101856101803660046108a7565b6102bf565b005b6100ea61019536600461087d565b6102cc565b6100ea6101a836600461087d565b61034c565b6100fe6101bb36600461080e565b61035a565b6060600380546101cf9061093b565b80601f01602080910402602001604051908101604052809291908181526020018280546101fb9061093b565b80156102485780601f1061021d57610100808354040283529160200191610248565b820191906000526020600020905b81548152906001019060200180831161022b57829003601f168201915b5050505050905090565b600033610260818585610385565b5060019392505050565b6000336102788582856104a9565b610283858585610523565b506001949350505050565b6000336102608185856102a1838361035a565b6102ab9190610915565b610385565b6060600480546101cf9061093b565b6102c933826106f1565b50565b600033816102da828661035a565b90508381101561033f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102838286868403610385565b600033610260818585610523565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103e75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610336565b6001600160a01b0382166104485760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610336565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006104b5848461035a565b9050600019811461051d57818110156105105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610336565b61051d8484848403610385565b50505050565b6001600160a01b0383166105875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610336565b6001600160a01b0382166105e95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610336565b6001600160a01b038316600090815260208190526040902054818110156106615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610336565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610698908490610915565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106e491815260200190565b60405180910390a361051d565b6001600160a01b0382166107475760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610336565b80600260008282546107599190610915565b90915550506001600160a01b03821660009081526020819052604081208054839290610786908490610915565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b03811681146107e757600080fd5b919050565b6000602082840312156107fe57600080fd5b610807826107d0565b9392505050565b6000806040838503121561082157600080fd5b61082a836107d0565b9150610838602084016107d0565b90509250929050565b60008060006060848603121561085657600080fd5b61085f846107d0565b925061086d602085016107d0565b9150604084013590509250925092565b6000806040838503121561089057600080fd5b610899836107d0565b946020939093013593505050565b6000602082840312156108b957600080fd5b5035919050565b600060208083528351808285015260005b818110156108ed578581018301518582016040015282016108d1565b818111156108ff576000604083870101525b50601f01601f1916929092016040019392505050565b6000821982111561093657634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168061094f57607f821691505b6020821081141561097057634e487b7160e01b600052602260045260246000fd5b5091905056fea2646970667358221220ae540ad4311a00430390195848892ca640e1288c5474e6f283724a55607c774564736f6c63430008070033",
    "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806370a082311161007157806370a082311461014157806395d89b411461016a578063a0712d6814610172578063a457c2d714610187578063a9059cbb1461019a578063dd62ed3e146101ad57600080fd5b806306fdde03146100b9578063095ea7b3146100d757806318160ddd146100fa57806323b872dd1461010c578063313ce5671461011f578063395093511461012e575b600080fd5b6100c16101c0565b6040516100ce91906108c0565b60405180910390f35b6100ea6100e536600461087d565b610252565b60405190151581526020016100ce565b6002545b6040519081526020016100ce565b6100ea61011a366004610841565b61026a565b604051601281526020016100ce565b6100ea61013c36600461087d565b61028e565b6100fe61014f3660046107ec565b6001600160a01b031660009081526020819052604090205490565b6100c16102b0565b6101856101803660046108a7565b6102bf565b005b6100ea61019536600461087d565b6102cc565b6100ea6101a836600461087d565b61034c565b6100fe6101bb36600461080e565b61035a565b6060600380546101cf9061093b565b80601f01602080910402602001604051908101604052809291908181526020018280546101fb9061093b565b80156102485780601f1061021d57610100808354040283529160200191610248565b820191906000526020600020905b81548152906001019060200180831161022b57829003601f168201915b5050505050905090565b600033610260818585610385565b5060019392505050565b6000336102788582856104a9565b610283858585610523565b506001949350505050565b6000336102608185856102a1838361035a565b6102ab9190610915565b610385565b6060600480546101cf9061093b565b6102c933826106f1565b50565b600033816102da828661035a565b90508381101561033f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102838286868403610385565b600033610260818585610523565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103e75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610336565b6001600160a01b0382166104485760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610336565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006104b5848461035a565b9050600019811461051d57818110156105105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610336565b61051d8484848403610385565b50505050565b6001600160a01b0383166105875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610336565b6001600160a01b0382166105e95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610336565b6001600160a01b038316600090815260208190526040902054818110156106615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610336565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610698908490610915565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106e491815260200190565b60405180910390a361051d565b6001600160a01b0382166107475760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610336565b80600260008282546107599190610915565b90915550506001600160a01b03821660009081526020819052604081208054839290610786908490610915565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b03811681146107e757600080fd5b919050565b6000602082840312156107fe57600080fd5b610807826107d0565b9392505050565b6000806040838503121561082157600080fd5b61082a836107d0565b9150610838602084016107d0565b90509250929050565b60008060006060848603121561085657600080fd5b61085f846107d0565b925061086d602085016107d0565b9150604084013590509250925092565b6000806040838503121561089057600080fd5b610899836107d0565b946020939093013593505050565b6000602082840312156108b957600080fd5b5035919050565b600060208083528351808285015260005b818110156108ed578581018301518582016040015282016108d1565b818111156108ff576000604083870101525b50601f01601f1916929092016040019392505050565b6000821982111561093657634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168061094f57607f821691505b6020821081141561097057634e487b7160e01b600052602260045260246000fd5b5091905056fea2646970667358221220ae540ad4311a00430390195848892ca640e1288c5474e6f283724a55607c774564736f6c63430008070033",
    "immutableReferences": {},
    "sourceMap": "114:195:35:-:0;;;149:73;;;;;;;;;;1978:113:49;;;;;;;;;;;;;-1:-1:-1;;;1978:113:49;;;;;;;;;;;;;;;;-1:-1:-1;;;1978:113:49;;;2052:5;2044;:13;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2067:17:49;;;;:7;;:17;;;;;:::i;:::-;;1978:113;;200:15:35::1;205:9;200:4;;;:15;;:::i;:::-;114:195:::0;;228:79;275:25;281:10;293:6;275:5;:25::i;:::-;228:79;:::o;8402:389:49:-;-1:-1:-1;;;;;8485:21:49;;8477:65;;;;-1:-1:-1;;;8477:65:49;;216:2:63;8477:65:49;;;198:21:63;255:2;235:18;;;228:30;294:33;274:18;;;267:61;345:18;;8477:65:49;;;;;;;;8629:6;8613:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;8645:18:49;;:9;:18;;;;;;;;;;:28;;8667:6;;8645:9;:28;;8667:6;;8645:28;:::i;:::-;;;;-1:-1:-1;;8688:37:49;;520:25:63;;;-1:-1:-1;;;;;8688:37:49;;;8705:1;;8688:37;;508:2:63;493:18;8688:37:49;;;;;;;8402:389;;:::o;114:195:35:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114:195:35;;;-1:-1:-1;114:195:35;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;556:225:63;596:3;627:1;623:6;620:1;617:13;614:136;;;672:10;667:3;663:20;660:1;653:31;707:4;704:1;697:15;735:4;732:1;725:15;614:136;-1:-1:-1;766:9:63;;556:225::o;786:380::-;865:1;861:12;;;;908;;;929:61;;983:4;975:6;971:17;961:27;;929:61;1036:2;1028:6;1025:14;1005:18;1002:38;999:161;;;1082:10;1077:3;1073:20;1070:1;1063:31;1117:4;1114:1;1107:15;1145:4;1142:1;1135:15;999:161;;786:380;;;:::o;:::-;114:195:35;;;;;;",
    "deployedSourceMap": "114:195:35:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4433:197;;;;;;:::i;:::-;;:::i;:::-;;;1590:14:63;;1583:22;1565:41;;1553:2;1538:18;4433:197:49;1425:187:63;3244:106:49;3331:12;;3244:106;;;5514:25:63;;;5502:2;5487:18;3244:106:49;5368:177:63;5192:286:49;;;;;;:::i;:::-;;:::i;3093:91::-;;;3175:2;5692:36:63;;5680:2;5665:18;3093:91:49;5550:184:63;5873:234:49;;;;;;:::i;:::-;;:::i;3408:125::-;;;;;;:::i;:::-;-1:-1:-1;;;;;3508:18:49;3482:7;3508:18;;;;;;;;;;;;3408:125;2367:102;;;:::i;228:79:35:-;;;;;;:::i;:::-;;:::i;:::-;;6594:427:49;;;;;;:::i;:::-;;:::i;3729:189::-;;;;;;:::i;:::-;;:::i;3976:149::-;;;;;;:::i;:::-;;:::i;2156:98::-;2210:13;2242:5;2235:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98;:::o;4433:197::-;4516:4;719:10:55;4570:32:49;719:10:55;4586:7:49;4595:6;4570:8;:32::i;:::-;-1:-1:-1;4619:4:49;;4433:197;-1:-1:-1;;;4433:197:49:o;5192:286::-;5319:4;719:10:55;5375:38:49;5391:4;719:10:55;5406:6:49;5375:15;:38::i;:::-;5423:27;5433:4;5439:2;5443:6;5423:9;:27::i;:::-;-1:-1:-1;5467:4:49;;5192:286;-1:-1:-1;;;;5192:286:49:o;5873:234::-;5961:4;719:10:55;6015:64:49;719:10:55;6031:7:49;6068:10;6040:25;719:10:55;6031:7:49;6040:9;:25::i;:::-;:38;;;;:::i;:::-;6015:8;:64::i;2367:102::-;2423:13;2455:7;2448:14;;;;;:::i;228:79:35:-;275:25;281:10;293:6;275:5;:25::i;:::-;228:79;:::o;6594:427:49:-;6687:4;719:10:55;6687:4:49;6768:25;719:10:55;6785:7:49;6768:9;:25::i;:::-;6741:52;;6831:15;6811:16;:35;;6803:85;;;;-1:-1:-1;;;6803:85:49;;4804:2:63;6803:85:49;;;4786:21:63;4843:2;4823:18;;;4816:30;4882:34;4862:18;;;4855:62;-1:-1:-1;;;4933:18:63;;;4926:35;4978:19;;6803:85:49;;;;;;;;;6922:60;6931:5;6938:7;6966:15;6947:16;:34;6922:8;:60::i;3729:189::-;3808:4;719:10:55;3862:28:49;719:10:55;3879:2:49;3883:6;3862:9;:28::i;3976:149::-;-1:-1:-1;;;;;4091:18:49;;;4065:7;4091:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3976:149::o;10110:370::-;-1:-1:-1;;;;;10241:19:49;;10233:68;;;;-1:-1:-1;;;10233:68:49;;4399:2:63;10233:68:49;;;4381:21:63;4438:2;4418:18;;;4411:30;4477:34;4457:18;;;4450:62;-1:-1:-1;;;4528:18:63;;;4521:34;4572:19;;10233:68:49;4197:400:63;10233:68:49;-1:-1:-1;;;;;10319:21:49;;10311:68;;;;-1:-1:-1;;;10311:68:49;;2825:2:63;10311:68:49;;;2807:21:63;2864:2;2844:18;;;2837:30;2903:34;2883:18;;;2876:62;-1:-1:-1;;;2954:18:63;;;2947:32;2996:19;;10311:68:49;2623:398:63;10311:68:49;-1:-1:-1;;;;;10390:18:49;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10441:32;;5514:25:63;;;10441:32:49;;5487:18:63;10441:32:49;;;;;;;10110:370;;;:::o;10761:441::-;10891:24;10918:25;10928:5;10935:7;10918:9;:25::i;:::-;10891:52;;-1:-1:-1;;10957:16:49;:37;10953:243;;11038:6;11018:16;:26;;11010:68;;;;-1:-1:-1;;;11010:68:49;;3228:2:63;11010:68:49;;;3210:21:63;3267:2;3247:18;;;3240:30;3306:31;3286:18;;;3279:59;3355:18;;11010:68:49;3026:353:63;11010:68:49;11120:51;11129:5;11136:7;11164:6;11145:16;:25;11120:8;:51::i;:::-;10881:321;10761:441;;;:::o;7475:651::-;-1:-1:-1;;;;;7601:18:49;;7593:68;;;;-1:-1:-1;;;7593:68:49;;3993:2:63;7593:68:49;;;3975:21:63;4032:2;4012:18;;;4005:30;4071:34;4051:18;;;4044:62;-1:-1:-1;;;4122:18:63;;;4115:35;4167:19;;7593:68:49;3791:401:63;7593:68:49;-1:-1:-1;;;;;7679:16:49;;7671:64;;;;-1:-1:-1;;;7671:64:49;;2421:2:63;7671:64:49;;;2403:21:63;2460:2;2440:18;;;2433:30;2499:34;2479:18;;;2472:62;-1:-1:-1;;;2550:18:63;;;2543:33;2593:19;;7671:64:49;2219:399:63;7671:64:49;-1:-1:-1;;;;;7817:15:49;;7795:19;7817:15;;;;;;;;;;;7850:21;;;;7842:72;;;;-1:-1:-1;;;7842:72:49;;3586:2:63;7842:72:49;;;3568:21:63;3625:2;3605:18;;;3598:30;3664:34;3644:18;;;3637:62;-1:-1:-1;;;3715:18:63;;;3708:36;3761:19;;7842:72:49;3384:402:63;7842:72:49;-1:-1:-1;;;;;7948:15:49;;;:9;:15;;;;;;;;;;;7966:20;;;7948:38;;8006:13;;;;;;;;:23;;7980:6;;7948:9;8006:23;;7980:6;;8006:23;:::i;:::-;;;;;;;;8060:2;-1:-1:-1;;;;;8045:26:49;8054:4;-1:-1:-1;;;;;8045:26:49;;8064:6;8045:26;;;;5514:25:63;;5502:2;5487:18;;5368:177;8045:26:49;;;;;;;;8082:37;11786:121;8402:389;-1:-1:-1;;;;;8485:21:49;;8477:65;;;;-1:-1:-1;;;8477:65:49;;5210:2:63;8477:65:49;;;5192:21:63;5249:2;5229:18;;;5222:30;5288:33;5268:18;;;5261:61;5339:18;;8477:65:49;5008:355:63;8477:65:49;8629:6;8613:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;8645:18:49;;:9;:18;;;;;;;;;;:28;;8667:6;;8645:9;:28;;8667:6;;8645:28;:::i;:::-;;;;-1:-1:-1;;8688:37:49;;5514:25:63;;;-1:-1:-1;;;;;8688:37:49;;;8705:1;;8688:37;;5502:2:63;5487:18;8688:37:49;;;;;;;8402:389;;:::o;14:173:63:-;82:20;;-1:-1:-1;;;;;131:31:63;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:63:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:254::-;1049:6;1057;1110:2;1098:9;1089:7;1085:23;1081:32;1078:52;;;1126:1;1123;1116:12;1078:52;1149:29;1168:9;1149:29;:::i;:::-;1139:39;1225:2;1210:18;;;;1197:32;;-1:-1:-1;;;981:254:63:o;1240:180::-;1299:6;1352:2;1340:9;1331:7;1327:23;1323:32;1320:52;;;1368:1;1365;1358:12;1320:52;-1:-1:-1;1391:23:63;;1240:180;-1:-1:-1;1240:180:63:o;1617:597::-;1729:4;1758:2;1787;1776:9;1769:21;1819:6;1813:13;1862:6;1857:2;1846:9;1842:18;1835:34;1887:1;1897:140;1911:6;1908:1;1905:13;1897:140;;;2006:14;;;2002:23;;1996:30;1972:17;;;1991:2;1968:26;1961:66;1926:10;;1897:140;;;2055:6;2052:1;2049:13;2046:91;;;2125:1;2120:2;2111:6;2100:9;2096:22;2092:31;2085:42;2046:91;-1:-1:-1;2198:2:63;2177:15;-1:-1:-1;;2173:29:63;2158:45;;;;2205:2;2154:54;;1617:597;-1:-1:-1;;;1617:597:63:o;5739:225::-;5779:3;5810:1;5806:6;5803:1;5800:13;5797:136;;;5855:10;5850:3;5846:20;5843:1;5836:31;5890:4;5887:1;5880:15;5918:4;5915:1;5908:15;5797:136;-1:-1:-1;5949:9:63;;5739:225::o;5969:380::-;6048:1;6044:12;;;;6091;;;6112:61;;6166:4;6158:6;6154:17;6144:27;;6112:61;6219:2;6211:6;6208:14;6188:18;6185:38;6182:161;;;6265:10;6260:3;6256:20;6253:1;6246:31;6300:4;6297:1;6290:15;6328:4;6325:1;6318:15;6182:161;;5969:380;;;:::o",
    "source": "pragma solidity ^0.8.0;\n\n// SPDX-License-Identifier:MIT\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract TestToken is ERC20 {\n\n    constructor() ERC20(\"Test Token\", \"TOK\") {\n        mint(100 ether);\n    }\n\n    function mint(uint256 amount) public {\n        _mint(msg.sender, amount);\n    }\n}",
    "sourcePath": "/Users/alexf/gsn2/packages/contracts/solpp/test/TestToken.sol",
    "ast": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/test/TestToken.sol",
        "exportedSymbols": {
            "Context": [
                11508
            ],
            "ERC20": [
                10771
            ],
            "IERC20": [
                10849
            ],
            "IERC20Metadata": [
                10874
            ],
            "TestToken": [
                7817
            ]
        },
        "id": 7818,
        "license": "MIT",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 7789,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:35"
            },
            {
                "absolutePath": "@openzeppelin/contracts/token/ERC20/ERC20.sol",
                "file": "@openzeppelin/contracts/token/ERC20/ERC20.sol",
                "id": 7790,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 7818,
                "sourceUnit": 10772,
                "src": "57:55:35",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 7791,
                            "name": "ERC20",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 10771,
                            "src": "136:5:35"
                        },
                        "id": 7792,
                        "nodeType": "InheritanceSpecifier",
                        "src": "136:5:35"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "fullyImplemented": true,
                "id": 7817,
                "linearizedBaseContracts": [
                    7817,
                    10771,
                    10874,
                    10849,
                    11508
                ],
                "name": "TestToken",
                "nameLocation": "123:9:35",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "body": {
                            "id": 7803,
                            "nodeType": "Block",
                            "src": "190:32:35",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "hexValue": "313030",
                                                "id": 7800,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "205:9:35",
                                                "subdenomination": "ether",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_rational_100000000000000000000_by_1",
                                                    "typeString": "int_const 100000000000000000000"
                                                },
                                                "value": "100"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_rational_100000000000000000000_by_1",
                                                    "typeString": "int_const 100000000000000000000"
                                                }
                                            ],
                                            "id": 7799,
                                            "name": "mint",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7816,
                                            "src": "200:4:35",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                                                "typeString": "function (uint256)"
                                            }
                                        },
                                        "id": 7801,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "200:15:35",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7802,
                                    "nodeType": "ExpressionStatement",
                                    "src": "200:15:35"
                                }
                            ]
                        },
                        "id": 7804,
                        "implemented": true,
                        "kind": "constructor",
                        "modifiers": [
                            {
                                "arguments": [
                                    {
                                        "hexValue": "5465737420546f6b656e",
                                        "id": 7795,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "string",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "169:12:35",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_stringliteral_81e8ad438398ab0d4a2a7ecb159490c091bb27c67ace5181f70084e30fadaea2",
                                            "typeString": "literal_string \"Test Token\""
                                        },
                                        "value": "Test Token"
                                    },
                                    {
                                        "hexValue": "544f4b",
                                        "id": 7796,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "string",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "183:5:35",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_stringliteral_92ec8c068e88c9c67ad1e93c5fb28a0afc1877fa1cdd216a8e4e432482417ddd",
                                            "typeString": "literal_string \"TOK\""
                                        },
                                        "value": "TOK"
                                    }
                                ],
                                "id": 7797,
                                "kind": "baseConstructorSpecifier",
                                "modifierName": {
                                    "id": 7794,
                                    "name": "ERC20",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 10771,
                                    "src": "163:5:35"
                                },
                                "nodeType": "ModifierInvocation",
                                "src": "163:26:35"
                            }
                        ],
                        "name": "",
                        "nameLocation": "-1:-1:-1",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7793,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "160:2:35"
                        },
                        "returnParameters": {
                            "id": 7798,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "190:0:35"
                        },
                        "scope": 7817,
                        "src": "149:73:35",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7815,
                            "nodeType": "Block",
                            "src": "265:42:35",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "expression": {
                                                    "id": 7810,
                                                    "name": "msg",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967281,
                                                    "src": "281:3:35",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_message",
                                                        "typeString": "msg"
                                                    }
                                                },
                                                "id": 7811,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "sender",
                                                "nodeType": "MemberAccess",
                                                "src": "281:10:35",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            {
                                                "id": 7812,
                                                "name": "amount",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7806,
                                                "src": "293:6:35",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "id": 7809,
                                            "name": "_mint",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 10588,
                                            "src": "275:5:35",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                                "typeString": "function (address,uint256)"
                                            }
                                        },
                                        "id": 7813,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "275:25:35",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7814,
                                    "nodeType": "ExpressionStatement",
                                    "src": "275:25:35"
                                }
                            ]
                        },
                        "functionSelector": "a0712d68",
                        "id": 7816,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "mint",
                        "nameLocation": "237:4:35",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7807,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7806,
                                    "mutability": "mutable",
                                    "name": "amount",
                                    "nameLocation": "250:6:35",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7816,
                                    "src": "242:14:35",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 7805,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "242:7:35",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "241:16:35"
                        },
                        "returnParameters": {
                            "id": 7808,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "265:0:35"
                        },
                        "scope": 7817,
                        "src": "228:79:35",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    }
                ],
                "scope": 7818,
                "src": "114:195:35",
                "usedErrors": []
            }
        ],
        "src": "0:309:35"
    },
    "legacyAST": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/test/TestToken.sol",
        "exportedSymbols": {
            "Context": [
                11508
            ],
            "ERC20": [
                10771
            ],
            "IERC20": [
                10849
            ],
            "IERC20Metadata": [
                10874
            ],
            "TestToken": [
                7817
            ]
        },
        "id": 7818,
        "license": "MIT",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 7789,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:35"
            },
            {
                "absolutePath": "@openzeppelin/contracts/token/ERC20/ERC20.sol",
                "file": "@openzeppelin/contracts/token/ERC20/ERC20.sol",
                "id": 7790,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 7818,
                "sourceUnit": 10772,
                "src": "57:55:35",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 7791,
                            "name": "ERC20",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 10771,
                            "src": "136:5:35"
                        },
                        "id": 7792,
                        "nodeType": "InheritanceSpecifier",
                        "src": "136:5:35"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "fullyImplemented": true,
                "id": 7817,
                "linearizedBaseContracts": [
                    7817,
                    10771,
                    10874,
                    10849,
                    11508
                ],
                "name": "TestToken",
                "nameLocation": "123:9:35",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "body": {
                            "id": 7803,
                            "nodeType": "Block",
                            "src": "190:32:35",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "hexValue": "313030",
                                                "id": 7800,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "205:9:35",
                                                "subdenomination": "ether",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_rational_100000000000000000000_by_1",
                                                    "typeString": "int_const 100000000000000000000"
                                                },
                                                "value": "100"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_rational_100000000000000000000_by_1",
                                                    "typeString": "int_const 100000000000000000000"
                                                }
                                            ],
                                            "id": 7799,
                                            "name": "mint",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7816,
                                            "src": "200:4:35",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                                                "typeString": "function (uint256)"
                                            }
                                        },
                                        "id": 7801,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "200:15:35",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7802,
                                    "nodeType": "ExpressionStatement",
                                    "src": "200:15:35"
                                }
                            ]
                        },
                        "id": 7804,
                        "implemented": true,
                        "kind": "constructor",
                        "modifiers": [
                            {
                                "arguments": [
                                    {
                                        "hexValue": "5465737420546f6b656e",
                                        "id": 7795,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "string",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "169:12:35",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_stringliteral_81e8ad438398ab0d4a2a7ecb159490c091bb27c67ace5181f70084e30fadaea2",
                                            "typeString": "literal_string \"Test Token\""
                                        },
                                        "value": "Test Token"
                                    },
                                    {
                                        "hexValue": "544f4b",
                                        "id": 7796,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "string",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "183:5:35",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_stringliteral_92ec8c068e88c9c67ad1e93c5fb28a0afc1877fa1cdd216a8e4e432482417ddd",
                                            "typeString": "literal_string \"TOK\""
                                        },
                                        "value": "TOK"
                                    }
                                ],
                                "id": 7797,
                                "kind": "baseConstructorSpecifier",
                                "modifierName": {
                                    "id": 7794,
                                    "name": "ERC20",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 10771,
                                    "src": "163:5:35"
                                },
                                "nodeType": "ModifierInvocation",
                                "src": "163:26:35"
                            }
                        ],
                        "name": "",
                        "nameLocation": "-1:-1:-1",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7793,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "160:2:35"
                        },
                        "returnParameters": {
                            "id": 7798,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "190:0:35"
                        },
                        "scope": 7817,
                        "src": "149:73:35",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7815,
                            "nodeType": "Block",
                            "src": "265:42:35",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "expression": {
                                                    "id": 7810,
                                                    "name": "msg",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967281,
                                                    "src": "281:3:35",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_message",
                                                        "typeString": "msg"
                                                    }
                                                },
                                                "id": 7811,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "sender",
                                                "nodeType": "MemberAccess",
                                                "src": "281:10:35",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            {
                                                "id": 7812,
                                                "name": "amount",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7806,
                                                "src": "293:6:35",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "id": 7809,
                                            "name": "_mint",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 10588,
                                            "src": "275:5:35",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                                "typeString": "function (address,uint256)"
                                            }
                                        },
                                        "id": 7813,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "275:25:35",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7814,
                                    "nodeType": "ExpressionStatement",
                                    "src": "275:25:35"
                                }
                            ]
                        },
                        "functionSelector": "a0712d68",
                        "id": 7816,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "mint",
                        "nameLocation": "237:4:35",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7807,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7806,
                                    "mutability": "mutable",
                                    "name": "amount",
                                    "nameLocation": "250:6:35",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7816,
                                    "src": "242:14:35",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 7805,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "242:7:35",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "241:16:35"
                        },
                        "returnParameters": {
                            "id": 7808,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "265:0:35"
                        },
                        "scope": 7817,
                        "src": "228:79:35",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    }
                ],
                "scope": 7818,
                "src": "114:195:35",
                "usedErrors": []
            }
        ],
        "src": "0:309:35"
    },
    "compiler": {
        "name": "solc",
        "version": "0.8.7+commit.e28d00a7.Emscripten.clang"
    },
    "networks": {},
    "schemaVersion": "3.1.0",
    "updatedAt": "2023-03-16T16:54:15.238Z",
    "devdoc": {
        "kind": "dev",
        "methods": {
            "allowance(address,address)": {
                "details": "See {IERC20-allowance}."
            },
            "approve(address,uint256)": {
                "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."
            },
            "balanceOf(address)": {
                "details": "See {IERC20-balanceOf}."
            },
            "decimals()": {
                "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
            },
            "decreaseAllowance(address,uint256)": {
                "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
            },
            "increaseAllowance(address,uint256)": {
                "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
            },
            "name()": {
                "details": "Returns the name of the token."
            },
            "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: - `to` 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}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`."
            }
        },
        "version": 1
    },
    "userdoc": {
        "kind": "user",
        "methods": {},
        "version": 1
    }
}
