{
  "fileName": "GSNRecipientERC20Fee.sol",
  "contractName": "GSNRecipientERC20FeeUpgradeSafe",
  "source": "pragma solidity ^0.6.0;\n\nimport \"./GSNRecipient.sol\";\nimport \"../math/SafeMath.sol\";\nimport \"../access/Ownable.sol\";\nimport \"../token/ERC20/SafeERC20.sol\";\nimport \"../token/ERC20/ERC20.sol\";\nimport \"../Initializable.sol\";\n\n/**\n * @dev A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that charges transaction fees in a special purpose ERC20\n * token, which we refer to as the gas payment token. The amount charged is exactly the amount of Ether charged to the\n * recipient. This means that the token is essentially pegged to the value of Ether.\n *\n * The distribution strategy of the gas payment token to users is not defined by this contract. It's a mintable token\n * whose only minter is the recipient, so the strategy must be implemented in a derived contract, making use of the\n * internal {_mint} function.\n */\ncontract GSNRecipientERC20FeeUpgradeSafe is Initializable, GSNRecipientUpgradeSafe {\n    using SafeERC20 for __unstable__ERC20Owned;\n    using SafeMath for uint256;\n\n    enum GSNRecipientERC20FeeErrorCodes {\n        INSUFFICIENT_BALANCE\n    }\n\n    __unstable__ERC20Owned private _token;\n\n    /**\n     * @dev The arguments to the constructor are the details that the gas payment token will have: `name` and `symbol`. `decimals` is hard-coded to 18.\n     */\n\n    function __GSNRecipientERC20Fee_init(string memory name, string memory symbol) internal initializer {\n        __Context_init_unchained();\n        __GSNRecipient_init_unchained();\n        __GSNRecipientERC20Fee_init_unchained(name, symbol);\n    }\n\n    function __GSNRecipientERC20Fee_init_unchained(string memory name, string memory symbol) internal initializer {\n\n\n        _token = new __unstable__ERC20Owned(name, symbol);\n\n    }\n\n\n    /**\n     * @dev Returns the gas payment token.\n     */\n    function token() public view returns (IERC20) {\n        return IERC20(_token);\n    }\n\n    /**\n     * @dev Internal function that mints the gas payment token. Derived contracts should expose this function in their public API, with proper access control mechanisms.\n     */\n    function _mint(address account, uint256 amount) internal virtual {\n        _token.mint(account, amount);\n    }\n\n    /**\n     * @dev Ensures that only users with enough gas payment token balance can have transactions relayed through the GSN.\n     */\n    function acceptRelayedCall(\n        address,\n        address from,\n        bytes memory,\n        uint256 transactionFee,\n        uint256 gasPrice,\n        uint256,\n        uint256,\n        bytes memory,\n        uint256 maxPossibleCharge\n    )\n        public\n        view\n        virtual\n        override\n        returns (uint256, bytes memory)\n    {\n        if (_token.balanceOf(from) < maxPossibleCharge) {\n            return _rejectRelayedCall(uint256(GSNRecipientERC20FeeErrorCodes.INSUFFICIENT_BALANCE));\n        }\n\n        return _approveRelayedCall(abi.encode(from, maxPossibleCharge, transactionFee, gasPrice));\n    }\n\n    /**\n     * @dev Implements the precharge to the user. The maximum possible charge (depending on gas limit, gas price, and\n     * fee) will be deducted from the user balance of gas payment token. Note that this is an overestimation of the\n     * actual charge, necessary because we cannot predict how much gas the execution will actually need. The remainder\n     * is returned to the user in {_postRelayedCall}.\n     */\n    function _preRelayedCall(bytes memory context) internal virtual override returns (bytes32) {\n        (address from, uint256 maxPossibleCharge) = abi.decode(context, (address, uint256));\n\n        // The maximum token charge is pre-charged from the user\n        _token.safeTransferFrom(from, address(this), maxPossibleCharge);\n    }\n\n    /**\n     * @dev Returns to the user the extra amount that was previously charged, once the actual execution cost is known.\n     */\n    function _postRelayedCall(bytes memory context, bool, uint256 actualCharge, bytes32) internal virtual override {\n        (address from, uint256 maxPossibleCharge, uint256 transactionFee, uint256 gasPrice) =\n            abi.decode(context, (address, uint256, uint256, uint256));\n\n        // actualCharge is an _estimated_ charge, which assumes postRelayedCall will use all available gas.\n        // This implementation's gas cost can be roughly estimated as 10k gas, for the two SSTORE operations in an\n        // ERC20 transfer.\n        uint256 overestimation = _computeCharge(_POST_RELAYED_CALL_MAX_GAS.sub(10000), gasPrice, transactionFee);\n        actualCharge = actualCharge.sub(overestimation);\n\n        // After the relayed call has been executed and the actual charge estimated, the excess pre-charge is returned\n        _token.safeTransfer(from, maxPossibleCharge.sub(actualCharge));\n    }\n\n    uint256[49] private __gap;\n}\n\n/**\n * @title __unstable__ERC20Owned\n * @dev An ERC20 token owned by another contract, which has minting permissions and can use transferFrom to receive\n * anyone's tokens. This contract is an internal helper for GSNRecipientERC20Fee, and should not be used\n * outside of this context.\n */\n// solhint-disable-next-line contract-name-camelcase\ncontract __unstable__ERC20Owned is Initializable, ERC20UpgradeSafe, OwnableUpgradeSafe {\n    uint256 private constant _UINT256_MAX = 2**256 - 1;\n\n\n    constructor(string memory name, string memory symbol) public  {\n        ____unstable__ERC20Owned_init(name, symbol);\n    }\n\n    function ____unstable__ERC20Owned_init(string memory name, string memory symbol) internal initializer {\n        __Context_init_unchained();\n        __ERC20_init_unchained(name, symbol);\n        __Ownable_init_unchained();\n        ____unstable__ERC20Owned_init_unchained(name, symbol);\n    }\n\n    function ____unstable__ERC20Owned_init_unchained(string memory name, string memory symbol) internal initializer {\n\n\n    }\n\n\n    // The owner (GSNRecipientERC20Fee) can mint tokens\n    function mint(address account, uint256 amount) public onlyOwner {\n        _mint(account, amount);\n    }\n\n    // The owner has 'infinite' allowance for all token holders\n    function allowance(address tokenOwner, address spender) public view override returns (uint256) {\n        if (spender == owner()) {\n            return _UINT256_MAX;\n        } else {\n            return super.allowance(tokenOwner, spender);\n        }\n    }\n\n    // Allowance for the owner cannot be changed (it is always 'infinite')\n    function _approve(address tokenOwner, address spender, uint256 value) internal override {\n        if (spender == owner()) {\n            return;\n        } else {\n            super._approve(tokenOwner, spender, value);\n        }\n    }\n\n    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {\n        if (recipient == owner()) {\n            _transfer(sender, recipient, amount);\n            return true;\n        } else {\n            return super.transferFrom(sender, recipient, amount);\n        }\n    }\n\n    uint256[50] private __gap;\n}\n",
  "sourcePath": "contracts/GSN/GSNRecipientERC20Fee.sol",
  "sourceMap": "828:3941:2:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;828:3941:2;;;;;;;",
  "deployedSourceMap": "828:3941:2:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;828:3941:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;1725:94:1;;;:::i;:::-;;;;-1:-1:-1;;;;;1725:94:1;;;;;;;;;;;;;;5361:221;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;5361:221:1;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;5361:221:1;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;5361:221:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5361:221:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;5361:221:1;;-1:-1:-1;5361:221:1;;-1:-1:-1;;;;;5361:221:1:i;:::-;;;;;;;;;;;;;;;;2314:624:2;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;2314:624:2;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;2314:624:2;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;2314:624:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;2314:624:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2314:624:2;;;;;;;;;;;;;;;-1:-1:-1;2314:624:2;;;;;-1:-1:-1;2314:624:2;;-1:-1:-1;2314:624:2;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;2314:624:2;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;2314:624:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;2314:624:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2314:624:2;;-1:-1:-1;;2314:624:2;;;-1:-1:-1;2314:624:2;;-1:-1:-1;;2314:624:2:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;2314:624:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2973:227:1;;;:::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;2973:227:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6219:287;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;6219:287:1;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;6219:287:1;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;6219:287:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;6219:287:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;6219:287:1;;-1:-1:-1;;;;6219:287:1;;;;;-1:-1:-1;6219:287:1;;;;;;;;;:::i;:::-;;1785:84:2;;;:::i;1725:94:1:-;1803:9;;-1:-1:-1;;;;;1803:9:1;1725:94;:::o;5361:221::-;5440:7;5481:12;:10;:12::i;:::-;-1:-1:-1;;;;;5467:26:1;:10;-1:-1:-1;;;;;5467:26:1;;5459:75;;;;-1:-1:-1;;;5459:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5551:24;5567:7;5551:15;:24::i;:::-;5544:31;5361:221;-1:-1:-1;;5361:221:1:o;2314:624:2:-;2676:6;;:22;;;-1:-1:-1;;;2676:22:2;;-1:-1:-1;;;;;2676:22:2;;;;;;;;;2635:7;;2644:12;;2701:17;;2676:6;;;:16;;:22;;;;;;;;;;;;;;;:6;:22;;;2:2:-1;;;;27:1;24;17:12;2:2;2676:22:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2676:22:2;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2676:22:2;:42;2672:160;;;2741:80;2768:51;2741:18;:80::i;:::-;2734:87;;;;;;2672:160;2869:61;;;-1:-1:-1;;;;;2869:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;2869:61:2;;;;;;;2849:82;;:19;:82::i;:::-;2842:89;;;;2314:624;;;;;;;;;;;;;:::o;2973:227:1:-;3179:14;;;;;;;;;;;;-1:-1:-1;;;3179:14:1;;;;2973:227;:::o;6219:287::-;6377:12;:10;:12::i;:::-;-1:-1:-1;;;;;6363:26:1;:10;-1:-1:-1;;;;;6363:26:1;;6355:75;;;;-1:-1:-1;;;6355:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6440:59;6457:7;6466;6475:12;6489:9;6440:16;:59::i;:::-;6219:287;;;;:::o;1785:84:2:-;1855:6;;-1:-1:-1;;;;;1855:6:2;1785:84;:::o;3367:330::-;3449:7;3469:12;3483:25;3523:7;3512:39;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3512:39:2;;;;;;;3627:6;;3512:39;;-1:-1:-1;3512:39:2;-1:-1:-1;3627:63:2;;-1:-1:-1;;;;;3627:6:2;3512:39;3665:4;3512:39;3627:63;:23;:63;:::i;:::-;3367:330;;;;;:::o;7679:157:1:-;7782:47;;;;;;;;;-1:-1:-1;7782:47:1;;1315:2;7790:34;;;;;7679:157::o;7394:154::-;7468:7;;7394:154::o;3838:897:2:-;3960:12;3974:25;4001:22;4025:16;4068:7;4057:57;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;4057:57:2;;;;;;;;;;;;;;;;;-1:-1:-1;4057:57:2;-1:-1:-1;4057:57:2;;-1:-1:-1;4057:57:2;-1:-1:-1;4375:22:2;4400:79;4415:37;1431:6:1;4446:5:2;4415:37;:30;:37;:::i;:::-;4454:8;4464:14;4400;:79::i;:::-;4375:104;-1:-1:-1;4504:32:2;:12;4375:104;4504:32;:16;:32;:::i;:::-;4489:47;-1:-1:-1;4666:62:2;4686:4;4692:35;:17;4489:47;4692:35;:21;:35;:::i;:::-;4666:6;;-1:-1:-1;;;;;4666:6:2;;:62;;:19;:62;:::i;:::-;3838:897;;;;;;;;;:::o;843:203:84:-;970:68;;;-1:-1:-1;;;;;970:68:84;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;970:68:84;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;943:96:84;;963:5;;943:19;:96::i;1274:134:19:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1351:50;1274:134;-1:-1:-1;;;1274:134:19:o;7994:340:1:-;8324:3;8303:16;;;8285:14;;;;:35;8284:43;;7994:340::o;662:175:84:-;771:58;;;-1:-1:-1;;;;;771:58:84;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;771:58:84;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;744:86:84;;764:5;;744:19;:86::i;:::-;662:175;;;:::o;2671:1096::-;3267:27;3275:5;-1:-1:-1;;;;;3267:25:84;;:27::i;:::-;3259:71;;;;;-1:-1:-1;;;3259:71:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;3401:12;3415:23;3450:5;-1:-1:-1;;;;;3442:19:84;3462:4;3442:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3442:25:84;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;3400:67:84;;;;3485:7;3477:52;;;;;-1:-1:-1;;;3477:52:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3544:17;;:21;3540:221;;3684:10;3673:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3673:30:84;3665:85;;;;-1:-1:-1;;;3665:85:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1692:187:19;1778:7;1813:12;1805:6;;;;1797:29;;;;-1:-1:-1;;;1797:29:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;1797:29:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1848:5:19;;;1692:187::o;685:610:98:-;745:4;1206:20;;1051:66;1245:23;;;;;;:42;;-1:-1:-1;1272:15:98;;;1245:42;1237:51;685:610;-1:-1:-1;;;;685:610:98:o",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldRelayHub",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newRelayHub",
          "type": "address"
        }
      ],
      "name": "RelayHubChanged",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "transactionFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "gasPrice",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "maxPossibleCharge",
          "type": "uint256"
        }
      ],
      "name": "acceptRelayedCall",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getHubAddr",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "context",
          "type": "bytes"
        },
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "actualCharge",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "preRetVal",
          "type": "bytes32"
        }
      ],
      "name": "postRelayedCall",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "context",
          "type": "bytes"
        }
      ],
      "name": "preRelayedCall",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "relayHubVersion",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "ast": {
    "absolutePath": "contracts/GSN/GSNRecipientERC20Fee.sol",
    "exportedSymbols": {
      "GSNRecipientERC20FeeUpgradeSafe": [
        673
      ],
      "__unstable__ERC20Owned": [
        844
      ]
    },
    "id": 845,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 427,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:2"
      },
      {
        "absolutePath": "contracts/GSN/GSNRecipient.sol",
        "file": "./GSNRecipient.sol",
        "id": 428,
        "nodeType": "ImportDirective",
        "scope": 845,
        "sourceUnit": 426,
        "src": "25:28:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/math/SafeMath.sol",
        "file": "../math/SafeMath.sol",
        "id": 429,
        "nodeType": "ImportDirective",
        "scope": 845,
        "sourceUnit": 3153,
        "src": "54:30:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/access/Ownable.sol",
        "file": "../access/Ownable.sol",
        "id": 430,
        "nodeType": "ImportDirective",
        "scope": 845,
        "sourceUnit": 1828,
        "src": "85:31:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/token/ERC20/SafeERC20.sol",
        "file": "../token/ERC20/SafeERC20.sol",
        "id": 431,
        "nodeType": "ImportDirective",
        "scope": 845,
        "sourceUnit": 11091,
        "src": "117:38:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/token/ERC20/ERC20.sol",
        "file": "../token/ERC20/ERC20.sol",
        "id": 432,
        "nodeType": "ImportDirective",
        "scope": 845,
        "sourceUnit": 10182,
        "src": "156:34:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/Initializable.sol",
        "file": "../Initializable.sol",
        "id": 433,
        "nodeType": "ImportDirective",
        "scope": 845,
        "sourceUnit": 1408,
        "src": "191:30:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 435,
              "name": "Initializable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1407,
              "src": "872:13:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Initializable_$1407",
                "typeString": "contract Initializable"
              }
            },
            "id": 436,
            "nodeType": "InheritanceSpecifier",
            "src": "872:13:2"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 437,
              "name": "GSNRecipientUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 425,
              "src": "887:23:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_GSNRecipientUpgradeSafe_$425",
                "typeString": "contract GSNRecipientUpgradeSafe"
              }
            },
            "id": 438,
            "nodeType": "InheritanceSpecifier",
            "src": "887:23:2"
          }
        ],
        "contractDependencies": [
          44,
          425,
          844,
          1334,
          1407
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 434,
          "nodeType": "StructuredDocumentation",
          "src": "223:604:2",
          "text": "@dev A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that charges transaction fees in a special purpose ERC20\ntoken, which we refer to as the gas payment token. The amount charged is exactly the amount of Ether charged to the\nrecipient. This means that the token is essentially pegged to the value of Ether.\n * The distribution strategy of the gas payment token to users is not defined by this contract. It's a mintable token\nwhose only minter is the recipient, so the strategy must be implemented in a derived contract, making use of the\ninternal {_mint} function."
        },
        "fullyImplemented": true,
        "id": 673,
        "linearizedBaseContracts": [
          673,
          425,
          44,
          1334,
          1407
        ],
        "name": "GSNRecipientERC20FeeUpgradeSafe",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 441,
            "libraryName": {
              "contractScope": null,
              "id": 439,
              "name": "SafeERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 11090,
              "src": "923:9:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeERC20_$11090",
                "typeString": "library SafeERC20"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "917:43:2",
            "typeName": {
              "contractScope": null,
              "id": 440,
              "name": "__unstable__ERC20Owned",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 844,
              "src": "937:22:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                "typeString": "contract __unstable__ERC20Owned"
              }
            }
          },
          {
            "id": 444,
            "libraryName": {
              "contractScope": null,
              "id": 442,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3152,
              "src": "971:8:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$3152",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "965:27:2",
            "typeName": {
              "id": 443,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "984:7:2",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "canonicalName": "GSNRecipientERC20FeeUpgradeSafe.GSNRecipientERC20FeeErrorCodes",
            "id": 446,
            "members": [
              {
                "id": 445,
                "name": "INSUFFICIENT_BALANCE",
                "nodeType": "EnumValue",
                "src": "1044:20:2"
              }
            ],
            "name": "GSNRecipientERC20FeeErrorCodes",
            "nodeType": "EnumDefinition",
            "src": "998:72:2"
          },
          {
            "constant": false,
            "id": 448,
            "mutability": "mutable",
            "name": "_token",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 673,
            "src": "1076:37:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
              "typeString": "contract __unstable__ERC20Owned"
            },
            "typeName": {
              "contractScope": null,
              "id": 447,
              "name": "__unstable__ERC20Owned",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 844,
              "src": "1076:22:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                "typeString": "contract __unstable__ERC20Owned"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 469,
              "nodeType": "Block",
              "src": "1389:145:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 458,
                      "name": "__Context_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19,
                      "src": "1399:24:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 459,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1399:26:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 460,
                  "nodeType": "ExpressionStatement",
                  "src": "1399:26:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 461,
                      "name": "__GSNRecipient_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 79,
                      "src": "1435:29:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 462,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1435:31:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 463,
                  "nodeType": "ExpressionStatement",
                  "src": "1435:31:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 465,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 451,
                        "src": "1514:4:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 466,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 453,
                        "src": "1520:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 464,
                      "name": "__GSNRecipientERC20Fee_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 488,
                      "src": "1476:37:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 467,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1476:51:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 468,
                  "nodeType": "ExpressionStatement",
                  "src": "1476:51:2"
                }
              ]
            },
            "documentation": {
              "id": 449,
              "nodeType": "StructuredDocumentation",
              "src": "1120:163:2",
              "text": "@dev The arguments to the constructor are the details that the gas payment token will have: `name` and `symbol`. `decimals` is hard-coded to 18."
            },
            "id": 470,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 456,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 455,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "1377:11:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1377:11:2"
              }
            ],
            "name": "__GSNRecipientERC20Fee_init",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 454,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 451,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 470,
                  "src": "1326:18:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 450,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1326:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 453,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 470,
                  "src": "1346:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 452,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1346:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1325:42:2"
            },
            "returnParameters": {
              "id": 457,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1389:0:2"
            },
            "scope": 673,
            "src": "1289:245:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 487,
              "nodeType": "Block",
              "src": "1650:69:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 485,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 479,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 448,
                      "src": "1662:6:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                        "typeString": "contract __unstable__ERC20Owned"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 482,
                          "name": "name",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 472,
                          "src": "1698:4:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 483,
                          "name": "symbol",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 474,
                          "src": "1704:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          },
                          {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        ],
                        "id": 481,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "NewExpression",
                        "src": "1671:26:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_creation_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_contract$___unstable__ERC20Owned_$844_$",
                          "typeString": "function (string memory,string memory) returns (contract __unstable__ERC20Owned)"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 480,
                          "name": "__unstable__ERC20Owned",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 844,
                          "src": "1675:22:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                            "typeString": "contract __unstable__ERC20Owned"
                          }
                        }
                      },
                      "id": 484,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1671:40:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                        "typeString": "contract __unstable__ERC20Owned"
                      }
                    },
                    "src": "1662:49:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                      "typeString": "contract __unstable__ERC20Owned"
                    }
                  },
                  "id": 486,
                  "nodeType": "ExpressionStatement",
                  "src": "1662:49:2"
                }
              ]
            },
            "documentation": null,
            "id": 488,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 477,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 476,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "1638:11:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1638:11:2"
              }
            ],
            "name": "__GSNRecipientERC20Fee_init_unchained",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 475,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 472,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 488,
                  "src": "1587:18:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 471,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1587:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 474,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 488,
                  "src": "1607:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 473,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1607:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1586:42:2"
            },
            "returnParameters": {
              "id": 478,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1650:0:2"
            },
            "scope": 673,
            "src": "1540:179:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 498,
              "nodeType": "Block",
              "src": "1831:38:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 495,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 448,
                        "src": "1855:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      ],
                      "id": 494,
                      "name": "IERC20",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10862,
                      "src": "1848:6:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_IERC20_$10862_$",
                        "typeString": "type(contract IERC20)"
                      }
                    },
                    "id": 496,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1848:14:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$10862",
                      "typeString": "contract IERC20"
                    }
                  },
                  "functionReturnParameters": 493,
                  "id": 497,
                  "nodeType": "Return",
                  "src": "1841:21:2"
                }
              ]
            },
            "documentation": {
              "id": 489,
              "nodeType": "StructuredDocumentation",
              "src": "1726:54:2",
              "text": "@dev Returns the gas payment token."
            },
            "functionSelector": "fc0c546a",
            "id": 499,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "token",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 490,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1799:2:2"
            },
            "returnParameters": {
              "id": 493,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 492,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 499,
                  "src": "1823:6:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$10862",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 491,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 10862,
                    "src": "1823:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$10862",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1822:8:2"
            },
            "scope": 673,
            "src": "1785:84:2",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 514,
              "nodeType": "Block",
              "src": "2126:45:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 510,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 502,
                        "src": "2148:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 511,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 504,
                        "src": "2157:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 507,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 448,
                        "src": "2136:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      },
                      "id": 509,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "mint",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 751,
                      "src": "2136:11:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256) external"
                      }
                    },
                    "id": 512,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2136:28:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 513,
                  "nodeType": "ExpressionStatement",
                  "src": "2136:28:2"
                }
              ]
            },
            "documentation": {
              "id": 500,
              "nodeType": "StructuredDocumentation",
              "src": "1875:181:2",
              "text": "@dev Internal function that mints the gas payment token. Derived contracts should expose this function in their public API, with proper access control mechanisms."
            },
            "id": 515,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 505,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 502,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 515,
                  "src": "2076:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 501,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2076:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 504,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 515,
                  "src": "2093:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 503,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2093:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2075:33:2"
            },
            "returnParameters": {
              "id": 506,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2126:0:2"
            },
            "scope": 673,
            "src": "2061:110:2",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              1313
            ],
            "body": {
              "id": 568,
              "nodeType": "Block",
              "src": "2662:276:2",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 547,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 544,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 520,
                          "src": "2693:4:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 542,
                          "name": "_token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 448,
                          "src": "2676:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                            "typeString": "contract __unstable__ERC20Owned"
                          }
                        },
                        "id": 543,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 9777,
                        "src": "2676:16:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 545,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2676:22:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 546,
                      "name": "maxPossibleCharge",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 534,
                      "src": "2701:17:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2676:42:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 557,
                  "nodeType": "IfStatement",
                  "src": "2672:160:2",
                  "trueBody": {
                    "id": 556,
                    "nodeType": "Block",
                    "src": "2720:112:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 551,
                                    "name": "GSNRecipientERC20FeeErrorCodes",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 446,
                                    "src": "2768:30:2",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_enum$_GSNRecipientERC20FeeErrorCodes_$446_$",
                                      "typeString": "type(enum GSNRecipientERC20FeeUpgradeSafe.GSNRecipientERC20FeeErrorCodes)"
                                    }
                                  },
                                  "id": 552,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "memberName": "INSUFFICIENT_BALANCE",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2768:51:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_enum$_GSNRecipientERC20FeeErrorCodes_$446",
                                    "typeString": "enum GSNRecipientERC20FeeUpgradeSafe.GSNRecipientERC20FeeErrorCodes"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_enum$_GSNRecipientERC20FeeErrorCodes_$446",
                                    "typeString": "enum GSNRecipientERC20FeeUpgradeSafe.GSNRecipientERC20FeeErrorCodes"
                                  }
                                ],
                                "id": 550,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2760:7:2",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 549,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2760:7:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 553,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2760:60:2",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 548,
                            "name": "_rejectRelayedCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 332,
                            "src": "2741:18:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_bytes_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (uint256,bytes memory)"
                            }
                          },
                          "id": 554,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2741:80:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(uint256,bytes memory)"
                          }
                        },
                        "functionReturnParameters": 541,
                        "id": 555,
                        "nodeType": "Return",
                        "src": "2734:87:2"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 561,
                            "name": "from",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 520,
                            "src": "2880:4:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 562,
                            "name": "maxPossibleCharge",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 534,
                            "src": "2886:17:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 563,
                            "name": "transactionFee",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 524,
                            "src": "2905:14:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 564,
                            "name": "gasPrice",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 526,
                            "src": "2921:8:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 559,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -1,
                            "src": "2869:3:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 560,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encode",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "2869:10:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 565,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2869:61:2",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 558,
                      "name": "_approveRelayedCall",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        300,
                        315
                      ],
                      "referencedDeclaration": 315,
                      "src": "2849:19:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_uint256_$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes memory) pure returns (uint256,bytes memory)"
                      }
                    },
                    "id": 566,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2849:82:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                      "typeString": "tuple(uint256,bytes memory)"
                    }
                  },
                  "functionReturnParameters": 541,
                  "id": 567,
                  "nodeType": "Return",
                  "src": "2842:89:2"
                }
              ]
            },
            "documentation": {
              "id": 516,
              "nodeType": "StructuredDocumentation",
              "src": "2177:132:2",
              "text": "@dev Ensures that only users with enough gas payment token balance can have transactions relayed through the GSN."
            },
            "functionSelector": "83947ea0",
            "id": 569,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "acceptRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 536,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2609:8:2"
            },
            "parameters": {
              "id": 535,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 518,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2350:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 517,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2350:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 520,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2367:12:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 519,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2367:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 522,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2389:12:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 521,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2389:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 524,
                  "mutability": "mutable",
                  "name": "transactionFee",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2411:22:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 523,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2411:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 526,
                  "mutability": "mutable",
                  "name": "gasPrice",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2443:16:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 525,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2443:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 528,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2469:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 527,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2469:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 530,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2486:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 529,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2486:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 532,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2503:12:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 531,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2503:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 534,
                  "mutability": "mutable",
                  "name": "maxPossibleCharge",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2525:25:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 533,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2525:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2340:216:2"
            },
            "returnParameters": {
              "id": 541,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 538,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2635:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 537,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2635:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 540,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 569,
                  "src": "2644:12:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 539,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2644:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2634:23:2"
            },
            "scope": 673,
            "src": "2314:624:2",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              245
            ],
            "body": {
              "id": 603,
              "nodeType": "Block",
              "src": "3458:239:2",
              "statements": [
                {
                  "assignments": [
                    579,
                    581
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 579,
                      "mutability": "mutable",
                      "name": "from",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 603,
                      "src": "3469:12:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 578,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "3469:7:2",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 581,
                      "mutability": "mutable",
                      "name": "maxPossibleCharge",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 603,
                      "src": "3483:25:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 580,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3483:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 591,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 584,
                        "name": "context",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 572,
                        "src": "3523:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "id": 586,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3533:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 585,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3533:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 588,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3542:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 587,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3542:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          }
                        ],
                        "id": 589,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "3532:18:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$",
                          "typeString": "tuple(type(address),type(uint256))"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$",
                          "typeString": "tuple(type(address),type(uint256))"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 582,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -1,
                        "src": "3512:3:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 583,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "decode",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3512:10:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                        "typeString": "function () pure"
                      }
                    },
                    "id": 590,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3512:39:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_payable_$_t_uint256_$",
                      "typeString": "tuple(address payable,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3468:83:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 595,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 579,
                        "src": "3651:4:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 598,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "3665:4:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_GSNRecipientERC20FeeUpgradeSafe_$673",
                              "typeString": "contract GSNRecipientERC20FeeUpgradeSafe"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_GSNRecipientERC20FeeUpgradeSafe_$673",
                              "typeString": "contract GSNRecipientERC20FeeUpgradeSafe"
                            }
                          ],
                          "id": 597,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3657:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 596,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "3657:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 599,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3657:13:2",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 600,
                        "name": "maxPossibleCharge",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 581,
                        "src": "3672:17:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 592,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 448,
                        "src": "3627:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      },
                      "id": 594,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 10921,
                      "src": "3627:23:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$10862_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$10862_$",
                        "typeString": "function (contract IERC20,address,address,uint256)"
                      }
                    },
                    "id": 601,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3627:63:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 602,
                  "nodeType": "ExpressionStatement",
                  "src": "3627:63:2"
                }
              ]
            },
            "documentation": {
              "id": 570,
              "nodeType": "StructuredDocumentation",
              "src": "2944:418:2",
              "text": "@dev Implements the precharge to the user. The maximum possible charge (depending on gas limit, gas price, and\nfee) will be deducted from the user balance of gas payment token. Note that this is an overestimation of the\nactual charge, necessary because we cannot predict how much gas the execution will actually need. The remainder\nis returned to the user in {_postRelayedCall}."
            },
            "id": 604,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_preRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 574,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3431:8:2"
            },
            "parameters": {
              "id": 573,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 572,
                  "mutability": "mutable",
                  "name": "context",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 604,
                  "src": "3392:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 571,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3392:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3391:22:2"
            },
            "returnParameters": {
              "id": 577,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 576,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 604,
                  "src": "3449:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 575,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3449:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3448:9:2"
            },
            "scope": 673,
            "src": "3367:330:2",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              287
            ],
            "body": {
              "id": 667,
              "nodeType": "Block",
              "src": "3949:786:2",
              "statements": [
                {
                  "assignments": [
                    618,
                    620,
                    622,
                    624
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 618,
                      "mutability": "mutable",
                      "name": "from",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 667,
                      "src": "3960:12:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 617,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "3960:7:2",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 620,
                      "mutability": "mutable",
                      "name": "maxPossibleCharge",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 667,
                      "src": "3974:25:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 619,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3974:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 622,
                      "mutability": "mutable",
                      "name": "transactionFee",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 667,
                      "src": "4001:22:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 621,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4001:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 624,
                      "mutability": "mutable",
                      "name": "gasPrice",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 667,
                      "src": "4025:16:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 623,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4025:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 638,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 627,
                        "name": "context",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 607,
                        "src": "4068:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "id": 629,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4078:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 628,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "4078:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 631,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4087:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 630,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4087:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 633,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4096:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 632,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4096:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 635,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4105:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 634,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4105:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          }
                        ],
                        "id": 636,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "4077:36:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$",
                          "typeString": "tuple(type(address),type(uint256),type(uint256),type(uint256))"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$",
                          "typeString": "tuple(type(address),type(uint256),type(uint256),type(uint256))"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 625,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -1,
                        "src": "4057:3:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 626,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "decode",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4057:10:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                        "typeString": "function () pure"
                      }
                    },
                    "id": 637,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4057:57:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_payable_$_t_uint256_$_t_uint256_$_t_uint256_$",
                      "typeString": "tuple(address payable,uint256,uint256,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3959:155:2"
                },
                {
                  "assignments": [
                    640
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 640,
                      "mutability": "mutable",
                      "name": "overestimation",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 667,
                      "src": "4375:22:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 639,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4375:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 649,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "3130303030",
                            "id": 644,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4446:5:2",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_10000_by_1",
                              "typeString": "int_const 10000"
                            },
                            "value": "10000"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_10000_by_1",
                              "typeString": "int_const 10000"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 642,
                            "name": "_POST_RELAYED_CALL_MAX_GAS",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 90,
                            "src": "4415:26:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 643,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sub",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3002,
                          "src": "4415:30:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                          }
                        },
                        "id": 645,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4415:37:2",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 646,
                        "name": "gasPrice",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 624,
                        "src": "4454:8:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 647,
                        "name": "transactionFee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 622,
                        "src": "4464:14:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 641,
                      "name": "_computeCharge",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 356,
                      "src": "4400:14:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 648,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4400:79:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4375:104:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 655,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 650,
                      "name": "actualCharge",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 611,
                      "src": "4489:12:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 653,
                          "name": "overestimation",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 640,
                          "src": "4521:14:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 651,
                          "name": "actualCharge",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 611,
                          "src": "4504:12:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 652,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 3002,
                        "src": "4504:16:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 654,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4504:32:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4489:47:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 656,
                  "nodeType": "ExpressionStatement",
                  "src": "4489:47:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 660,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 618,
                        "src": "4686:4:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 663,
                            "name": "actualCharge",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 611,
                            "src": "4714:12:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 661,
                            "name": "maxPossibleCharge",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 620,
                            "src": "4692:17:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 662,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sub",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3002,
                          "src": "4692:21:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                          }
                        },
                        "id": 664,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4692:35:2",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 657,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 448,
                        "src": "4666:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$844",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      },
                      "id": 659,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 10896,
                      "src": "4666:19:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$10862_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$10862_$",
                        "typeString": "function (contract IERC20,address,uint256)"
                      }
                    },
                    "id": 665,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4666:62:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 666,
                  "nodeType": "ExpressionStatement",
                  "src": "4666:62:2"
                }
              ]
            },
            "documentation": {
              "id": 605,
              "nodeType": "StructuredDocumentation",
              "src": "3703:130:2",
              "text": "@dev Returns to the user the extra amount that was previously charged, once the actual execution cost is known."
            },
            "id": 668,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_postRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 615,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3940:8:2"
            },
            "parameters": {
              "id": 614,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 607,
                  "mutability": "mutable",
                  "name": "context",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 668,
                  "src": "3864:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 606,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3864:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 609,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 668,
                  "src": "3886:4:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 608,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3886:4:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 611,
                  "mutability": "mutable",
                  "name": "actualCharge",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 668,
                  "src": "3892:20:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 610,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3892:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 613,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 668,
                  "src": "3914:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 612,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3914:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3863:59:2"
            },
            "returnParameters": {
              "id": 616,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3949:0:2"
            },
            "scope": 673,
            "src": "3838:897:2",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 672,
            "mutability": "mutable",
            "name": "__gap",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 673,
            "src": "4741:25:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$49_storage",
              "typeString": "uint256[49]"
            },
            "typeName": {
              "baseType": {
                "id": 669,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "4741:7:2",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 671,
              "length": {
                "argumentTypes": null,
                "hexValue": "3439",
                "id": 670,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "4749:2:2",
                "subdenomination": null,
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_49_by_1",
                  "typeString": "int_const 49"
                },
                "value": "49"
              },
              "nodeType": "ArrayTypeName",
              "src": "4741:11:2",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                "typeString": "uint256[49]"
              }
            },
            "value": null,
            "visibility": "private"
          }
        ],
        "scope": 845,
        "src": "828:3941:2"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 675,
              "name": "Initializable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1407,
              "src": "5149:13:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Initializable_$1407",
                "typeString": "contract Initializable"
              }
            },
            "id": 676,
            "nodeType": "InheritanceSpecifier",
            "src": "5149:13:2"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 677,
              "name": "ERC20UpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 10181,
              "src": "5164:16:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$10181",
                "typeString": "contract ERC20UpgradeSafe"
              }
            },
            "id": 678,
            "nodeType": "InheritanceSpecifier",
            "src": "5164:16:2"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 679,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1827,
              "src": "5182:18:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$1827",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 680,
            "nodeType": "InheritanceSpecifier",
            "src": "5182:18:2"
          }
        ],
        "contractDependencies": [
          44,
          1407,
          1827,
          10181,
          10862
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 674,
          "nodeType": "StructuredDocumentation",
          "src": "4771:289:2",
          "text": "@title __unstable__ERC20Owned\n@dev An ERC20 token owned by another contract, which has minting permissions and can use transferFrom to receive\nanyone's tokens. This contract is an internal helper for GSNRecipientERC20Fee, and should not be used\noutside of this context."
        },
        "fullyImplemented": true,
        "id": 844,
        "linearizedBaseContracts": [
          844,
          1827,
          10181,
          10862,
          44,
          1407
        ],
        "name": "__unstable__ERC20Owned",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": true,
            "id": 687,
            "mutability": "constant",
            "name": "_UINT256_MAX",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 844,
            "src": "5207:50:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 681,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "5207:7:2",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "commonType": {
                "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
                "typeString": "int_const 1157...(70 digits omitted)...9935"
              },
              "id": 686,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "lValueRequested": false,
              "leftExpression": {
                "argumentTypes": null,
                "commonType": {
                  "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
                  "typeString": "int_const 1157...(70 digits omitted)...9936"
                },
                "id": 684,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "lValueRequested": false,
                "leftExpression": {
                  "argumentTypes": null,
                  "hexValue": "32",
                  "id": 682,
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "kind": "number",
                  "lValueRequested": false,
                  "nodeType": "Literal",
                  "src": "5247:1:2",
                  "subdenomination": null,
                  "typeDescriptions": {
                    "typeIdentifier": "t_rational_2_by_1",
                    "typeString": "int_const 2"
                  },
                  "value": "2"
                },
                "nodeType": "BinaryOperation",
                "operator": "**",
                "rightExpression": {
                  "argumentTypes": null,
                  "hexValue": "323536",
                  "id": 683,
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "kind": "number",
                  "lValueRequested": false,
                  "nodeType": "Literal",
                  "src": "5250:3:2",
                  "subdenomination": null,
                  "typeDescriptions": {
                    "typeIdentifier": "t_rational_256_by_1",
                    "typeString": "int_const 256"
                  },
                  "value": "256"
                },
                "src": "5247:6:2",
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
                  "typeString": "int_const 1157...(70 digits omitted)...9936"
                }
              },
              "nodeType": "BinaryOperation",
              "operator": "-",
              "rightExpression": {
                "argumentTypes": null,
                "hexValue": "31",
                "id": 685,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "5256:1:2",
                "subdenomination": null,
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_1_by_1",
                  "typeString": "int_const 1"
                },
                "value": "1"
              },
              "src": "5247:10:2",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
                "typeString": "int_const 1157...(70 digits omitted)...9935"
              }
            },
            "visibility": "private"
          },
          {
            "body": {
              "id": 699,
              "nodeType": "Block",
              "src": "5327:60:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 695,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 689,
                        "src": "5367:4:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 696,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 691,
                        "src": "5373:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 694,
                      "name": "____unstable__ERC20Owned_init",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 726,
                      "src": "5337:29:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 697,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5337:43:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 698,
                  "nodeType": "ExpressionStatement",
                  "src": "5337:43:2"
                }
              ]
            },
            "documentation": null,
            "id": 700,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 692,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 689,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 700,
                  "src": "5277:18:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 688,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5277:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 691,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 700,
                  "src": "5297:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 690,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5297:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5276:42:2"
            },
            "returnParameters": {
              "id": 693,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5327:0:2"
            },
            "scope": 844,
            "src": "5265:122:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 725,
              "nodeType": "Block",
              "src": "5495:188:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 709,
                      "name": "__Context_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19,
                      "src": "5505:24:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 710,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5505:26:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 711,
                  "nodeType": "ExpressionStatement",
                  "src": "5505:26:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 713,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 702,
                        "src": "5564:4:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 714,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 704,
                        "src": "5570:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 712,
                      "name": "__ERC20_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 9726,
                      "src": "5541:22:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 715,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5541:36:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 716,
                  "nodeType": "ExpressionStatement",
                  "src": "5541:36:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 717,
                      "name": "__Ownable_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1750,
                      "src": "5587:24:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 718,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5587:26:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 719,
                  "nodeType": "ExpressionStatement",
                  "src": "5587:26:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 721,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 702,
                        "src": "5663:4:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 722,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 704,
                        "src": "5669:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 720,
                      "name": "____unstable__ERC20Owned_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 736,
                      "src": "5623:39:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 723,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5623:53:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 724,
                  "nodeType": "ExpressionStatement",
                  "src": "5623:53:2"
                }
              ]
            },
            "documentation": null,
            "id": 726,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 707,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 706,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "5483:11:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "5483:11:2"
              }
            ],
            "name": "____unstable__ERC20Owned_init",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 705,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 702,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 726,
                  "src": "5432:18:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 701,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5432:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 704,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 726,
                  "src": "5452:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 703,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5452:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5431:42:2"
            },
            "returnParameters": {
              "id": 708,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5495:0:2"
            },
            "scope": 844,
            "src": "5393:290:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 735,
              "nodeType": "Block",
              "src": "5801:9:2",
              "statements": []
            },
            "documentation": null,
            "id": 736,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 733,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 732,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "5789:11:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "5789:11:2"
              }
            ],
            "name": "____unstable__ERC20Owned_init_unchained",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 731,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 728,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 736,
                  "src": "5738:18:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 727,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5738:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 730,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 736,
                  "src": "5758:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 729,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5758:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5737:42:2"
            },
            "returnParameters": {
              "id": 734,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5801:0:2"
            },
            "scope": 844,
            "src": "5689:121:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 750,
              "nodeType": "Block",
              "src": "5937:39:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 746,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 738,
                        "src": "5953:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 747,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 740,
                        "src": "5962:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 745,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10053,
                      "src": "5947:5:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 748,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5947:22:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 749,
                  "nodeType": "ExpressionStatement",
                  "src": "5947:22:2"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "40c10f19",
            "id": 751,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 743,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 742,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1772,
                  "src": "5927:9:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "5927:9:2"
              }
            ],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 741,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 738,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 751,
                  "src": "5887:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 737,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5887:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 740,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 751,
                  "src": "5904:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 739,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5904:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5886:33:2"
            },
            "returnParameters": {
              "id": 744,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5937:0:2"
            },
            "scope": 844,
            "src": "5873:103:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              9816
            ],
            "body": {
              "id": 776,
              "nodeType": "Block",
              "src": "6141:158:2",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 764,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 761,
                      "name": "spender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 755,
                      "src": "6155:7:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 762,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1759,
                        "src": "6166:5:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 763,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6166:7:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "6155:18:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 774,
                    "nodeType": "Block",
                    "src": "6225:68:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 770,
                              "name": "tokenOwner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 753,
                              "src": "6262:10:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 771,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 755,
                              "src": "6274:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 768,
                              "name": "super",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -25,
                              "src": "6246:5:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_super$___unstable__ERC20Owned_$844",
                                "typeString": "contract super __unstable__ERC20Owned"
                              }
                            },
                            "id": 769,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "allowance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9816,
                            "src": "6246:15:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address,address) view returns (uint256)"
                            }
                          },
                          "id": 772,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6246:36:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 760,
                        "id": 773,
                        "nodeType": "Return",
                        "src": "6239:43:2"
                      }
                    ]
                  },
                  "id": 775,
                  "nodeType": "IfStatement",
                  "src": "6151:142:2",
                  "trueBody": {
                    "id": 767,
                    "nodeType": "Block",
                    "src": "6175:44:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 765,
                          "name": "_UINT256_MAX",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 687,
                          "src": "6196:12:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 760,
                        "id": 766,
                        "nodeType": "Return",
                        "src": "6189:19:2"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "functionSelector": "dd62ed3e",
            "id": 777,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "allowance",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 757,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "6114:8:2"
            },
            "parameters": {
              "id": 756,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 753,
                  "mutability": "mutable",
                  "name": "tokenOwner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 777,
                  "src": "6065:18:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 752,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6065:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 755,
                  "mutability": "mutable",
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 777,
                  "src": "6085:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 754,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6085:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6064:37:2"
            },
            "returnParameters": {
              "id": 760,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 759,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 777,
                  "src": "6132:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 758,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6132:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6131:9:2"
            },
            "scope": 844,
            "src": "6046:253:2",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              10154
            ],
            "body": {
              "id": 803,
              "nodeType": "Block",
              "src": "6468:144:2",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 790,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 787,
                      "name": "spender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 781,
                      "src": "6482:7:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 788,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1759,
                        "src": "6493:5:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 789,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6493:7:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "6482:18:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 801,
                    "nodeType": "Block",
                    "src": "6539:67:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 796,
                              "name": "tokenOwner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 779,
                              "src": "6568:10:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 797,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 781,
                              "src": "6580:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 798,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 783,
                              "src": "6589:5:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 793,
                              "name": "super",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -25,
                              "src": "6553:5:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_super$___unstable__ERC20Owned_$844",
                                "typeString": "contract super __unstable__ERC20Owned"
                              }
                            },
                            "id": 795,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_approve",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 10154,
                            "src": "6553:14:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 799,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6553:42:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 800,
                        "nodeType": "ExpressionStatement",
                        "src": "6553:42:2"
                      }
                    ]
                  },
                  "id": 802,
                  "nodeType": "IfStatement",
                  "src": "6478:128:2",
                  "trueBody": {
                    "id": 792,
                    "nodeType": "Block",
                    "src": "6502:31:2",
                    "statements": [
                      {
                        "expression": null,
                        "functionReturnParameters": 786,
                        "id": 791,
                        "nodeType": "Return",
                        "src": "6516:7:2"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 804,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_approve",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 785,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "6459:8:2"
            },
            "parameters": {
              "id": 784,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 779,
                  "mutability": "mutable",
                  "name": "tokenOwner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 804,
                  "src": "6398:18:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 778,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6398:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 781,
                  "mutability": "mutable",
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 804,
                  "src": "6418:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 780,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6418:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 783,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 804,
                  "src": "6435:13:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 782,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6435:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6397:52:2"
            },
            "returnParameters": {
              "id": 786,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6468:0:2"
            },
            "scope": 844,
            "src": "6380:232:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              9875
            ],
            "body": {
              "id": 838,
              "nodeType": "Block",
              "src": "6722:211:2",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 819,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 816,
                      "name": "recipient",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 808,
                      "src": "6736:9:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 817,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1759,
                        "src": "6749:5:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 818,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6749:7:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "6736:20:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 836,
                    "nodeType": "Block",
                    "src": "6850:77:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 831,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 806,
                              "src": "6890:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 832,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 808,
                              "src": "6898:9:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 833,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 810,
                              "src": "6909:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 829,
                              "name": "super",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -25,
                              "src": "6871:5:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_super$___unstable__ERC20Owned_$844",
                                "typeString": "contract super __unstable__ERC20Owned"
                              }
                            },
                            "id": 830,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9875,
                            "src": "6871:18:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,address,uint256) returns (bool)"
                            }
                          },
                          "id": 834,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6871:45:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 815,
                        "id": 835,
                        "nodeType": "Return",
                        "src": "6864:52:2"
                      }
                    ]
                  },
                  "id": 837,
                  "nodeType": "IfStatement",
                  "src": "6732:195:2",
                  "trueBody": {
                    "id": 828,
                    "nodeType": "Block",
                    "src": "6758:86:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 821,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 806,
                              "src": "6782:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 822,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 808,
                              "src": "6790:9:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 823,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 810,
                              "src": "6801:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 820,
                            "name": "_transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9998,
                            "src": "6772:9:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 824,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6772:36:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 825,
                        "nodeType": "ExpressionStatement",
                        "src": "6772:36:2"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 826,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "6829:4:2",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 815,
                        "id": 827,
                        "nodeType": "Return",
                        "src": "6822:11:2"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "functionSelector": "23b872dd",
            "id": 839,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "transferFrom",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 812,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "6698:8:2"
            },
            "parameters": {
              "id": 811,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 806,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 839,
                  "src": "6640:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 805,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6640:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 808,
                  "mutability": "mutable",
                  "name": "recipient",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 839,
                  "src": "6656:17:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 807,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6656:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 810,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 839,
                  "src": "6675:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 809,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6675:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6639:51:2"
            },
            "returnParameters": {
              "id": 815,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 814,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 839,
                  "src": "6716:4:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 813,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6716:4:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6715:6:2"
            },
            "scope": 844,
            "src": "6618:315:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 843,
            "mutability": "mutable",
            "name": "__gap",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 844,
            "src": "6939:25:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$50_storage",
              "typeString": "uint256[50]"
            },
            "typeName": {
              "baseType": {
                "id": 840,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "6939:7:2",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 842,
              "length": {
                "argumentTypes": null,
                "hexValue": "3530",
                "id": 841,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "6947:2:2",
                "subdenomination": null,
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_50_by_1",
                  "typeString": "int_const 50"
                },
                "value": "50"
              },
              "nodeType": "ArrayTypeName",
              "src": "6939:11:2",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$50_storage_ptr",
                "typeString": "uint256[50]"
              }
            },
            "value": null,
            "visibility": "private"
          }
        ],
        "scope": 845,
        "src": "5114:1853:2"
      }
    ],
    "src": "0:6968:2"
  },
  "bytecode": "0x608060405234801561001057600080fd5b50610b78806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806374e861d61461006757806380274db71461008b57806383947ea014610141578063ad61ccd51461031d578063e06e0e221461039a578063fc0c546a1461044d575b600080fd5b61006f610455565b604080516001600160a01b039092168252519081900360200190f35b61012f600480360360208110156100a157600080fd5b810190602081018135600160201b8111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111600160201b831117156100ee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610464945050505050565b60408051918252519081900360200190f35b61029e600480360361012081101561015857600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561018b57600080fd5b82018360208201111561019d57600080fd5b803590602001918460018302840111600160201b831117156101be57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929584359560208601359560408101359550606081013594509192509060a081019060800135600160201b81111561022857600080fd5b82018360208201111561023a57600080fd5b803590602001918460018302840111600160201b8311171561025b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506104cc915050565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156102e15781810151838201526020016102c9565b50505050905090810190601f16801561030e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6103256105bb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561035f578181015183820152602001610347565b50505050905090810190601f16801561038c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61044b600480360360808110156103b057600080fd5b810190602081018135600160201b8111156103ca57600080fd5b8201836020820111156103dc57600080fd5b803590602001918460018302840111600160201b831117156103fd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505050803515159150602081013590604001356105da565b005b61006f610643565b6065546001600160a01b031690565b600061046e610455565b6001600160a01b0316336001600160a01b0316146104bd5760405162461bcd60e51b8152600401808060200182810382526024815260200180610af56024913960400191505060405180910390fd5b6104c682610652565b92915050565b609754604080516370a0823160e01b81526001600160a01b038b81166004830152915160009360609386939116916370a0823191602480820192602092909190829003018186803b15801561052057600080fd5b505afa158015610534573d6000803e3d6000fd5b505050506040513d602081101561054a57600080fd5b505110156105655761055c600061069f565b915091506105ad565b604080516001600160a01b038c166020820152808201859052606081018a905260808082018a90528251808303909101815260a09091019091526105a8906106b7565b915091505b995099975050505050505050565b6040805180820190915260058152640312e302e360dc1b602082015290565b6105e2610455565b6001600160a01b0316336001600160a01b0316146106315760405162461bcd60e51b8152600401808060200182810382526024815260200180610af56024913960400191505060405180910390fd5b61063d848484846106bc565b50505050565b6097546001600160a01b031690565b600080600083806020019051604081101561066c57600080fd5b5080516020909101516097549193509150610698906001600160a01b031683308463ffffffff61076116565b5050919050565b604080516020810190915260008152600b9190910191565b600091565b6000806000808780602001905160808110156106d757600080fd5b5080516020820151604083015160609093015191965094509092509050600061071561070e620186a061271063ffffffff6107bb16565b8385610804565b9050610727878263ffffffff6107bb16565b96506107568561073d868a63ffffffff6107bb16565b6097546001600160a01b0316919063ffffffff61081216565b505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261063d908590610869565b60006107fd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610a21565b9392505050565b606490810191909202020490565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610864908490610869565b505050565b61087b826001600160a01b0316610ab8565b6108cc576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061090a5780518252601f1990920191602091820191016108eb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461096c576040519150601f19603f3d011682016040523d82523d6000602084013e610971565b606091505b5091509150816109c8576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561063d578080602001905160208110156109e457600080fd5b505161063d5760405162461bcd60e51b815260040180806020018281038252602a815260200180610b19602a913960400191505060405180910390fd5b60008184841115610ab05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610a75578181015183820152602001610a5d565b50505050905090810190601f168015610aa25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610aec57508115155b94935050505056fe47534e526563697069656e743a2063616c6c6572206973206e6f742052656c61794875625361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122011392fe7ed1e366fcdf61bb8829d9d40dfa65e7b1a3e8677cbcecba160944e3164736f6c63430006070033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c806374e861d61461006757806380274db71461008b57806383947ea014610141578063ad61ccd51461031d578063e06e0e221461039a578063fc0c546a1461044d575b600080fd5b61006f610455565b604080516001600160a01b039092168252519081900360200190f35b61012f600480360360208110156100a157600080fd5b810190602081018135600160201b8111156100bb57600080fd5b8201836020820111156100cd57600080fd5b803590602001918460018302840111600160201b831117156100ee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610464945050505050565b60408051918252519081900360200190f35b61029e600480360361012081101561015857600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561018b57600080fd5b82018360208201111561019d57600080fd5b803590602001918460018302840111600160201b831117156101be57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929584359560208601359560408101359550606081013594509192509060a081019060800135600160201b81111561022857600080fd5b82018360208201111561023a57600080fd5b803590602001918460018302840111600160201b8311171561025b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506104cc915050565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156102e15781810151838201526020016102c9565b50505050905090810190601f16801561030e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6103256105bb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561035f578181015183820152602001610347565b50505050905090810190601f16801561038c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61044b600480360360808110156103b057600080fd5b810190602081018135600160201b8111156103ca57600080fd5b8201836020820111156103dc57600080fd5b803590602001918460018302840111600160201b831117156103fd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505050803515159150602081013590604001356105da565b005b61006f610643565b6065546001600160a01b031690565b600061046e610455565b6001600160a01b0316336001600160a01b0316146104bd5760405162461bcd60e51b8152600401808060200182810382526024815260200180610af56024913960400191505060405180910390fd5b6104c682610652565b92915050565b609754604080516370a0823160e01b81526001600160a01b038b81166004830152915160009360609386939116916370a0823191602480820192602092909190829003018186803b15801561052057600080fd5b505afa158015610534573d6000803e3d6000fd5b505050506040513d602081101561054a57600080fd5b505110156105655761055c600061069f565b915091506105ad565b604080516001600160a01b038c166020820152808201859052606081018a905260808082018a90528251808303909101815260a09091019091526105a8906106b7565b915091505b995099975050505050505050565b6040805180820190915260058152640312e302e360dc1b602082015290565b6105e2610455565b6001600160a01b0316336001600160a01b0316146106315760405162461bcd60e51b8152600401808060200182810382526024815260200180610af56024913960400191505060405180910390fd5b61063d848484846106bc565b50505050565b6097546001600160a01b031690565b600080600083806020019051604081101561066c57600080fd5b5080516020909101516097549193509150610698906001600160a01b031683308463ffffffff61076116565b5050919050565b604080516020810190915260008152600b9190910191565b600091565b6000806000808780602001905160808110156106d757600080fd5b5080516020820151604083015160609093015191965094509092509050600061071561070e620186a061271063ffffffff6107bb16565b8385610804565b9050610727878263ffffffff6107bb16565b96506107568561073d868a63ffffffff6107bb16565b6097546001600160a01b0316919063ffffffff61081216565b505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261063d908590610869565b60006107fd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610a21565b9392505050565b606490810191909202020490565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610864908490610869565b505050565b61087b826001600160a01b0316610ab8565b6108cc576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061090a5780518252601f1990920191602091820191016108eb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461096c576040519150601f19603f3d011682016040523d82523d6000602084013e610971565b606091505b5091509150816109c8576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561063d578080602001905160208110156109e457600080fd5b505161063d5760405162461bcd60e51b815260040180806020018281038252602a815260200180610b19602a913960400191505060405180910390fd5b60008184841115610ab05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610a75578181015183820152602001610a5d565b50505050905090810190601f168015610aa25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610aec57508115155b94935050505056fe47534e526563697069656e743a2063616c6c6572206973206e6f742052656c61794875625361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122011392fe7ed1e366fcdf61bb8829d9d40dfa65e7b1a3e8677cbcecba160944e3164736f6c63430006070033",
  "compiler": {
    "name": "solc",
    "version": "0.6.7+commit.b8d736ae.Emscripten.clang",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
