{
  "abi": [
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AllowanceOverflow",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AllowanceUnderflow",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientAllowance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidPermit",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NewOwnerIsZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoHandoverRequest",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotMinter",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "PermitExpired",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TotalSupplyOverflow",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Unauthorized",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipHandoverCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipHandoverRequested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bool",
          "name": "enabled",
          "type": "bool"
        }
      ],
      "name": "Permit2AllowanceUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DOMAIN_SEPARATOR",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "result",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PERMIT2",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "result",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "burn",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "cancelOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "completeOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "minterRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "nonces",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "result",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "result",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "ownershipHandoverExpiresAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "result",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "deadline",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "permit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "permit2Enabled",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "recoverToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "requestOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "isMinter",
          "type": "bool"
        }
      ],
      "name": "setMinterRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "result",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "enabled",
          "type": "bool"
        }
      ],
      "name": "updatePermit2Allowance",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": {
    "object": "0x60806040523480156200001157600080fd5b506040516200160938038062001609833981016040819052620000349162000173565b6200003f3362000072565b60006200004d83826200026c565b5060016200005c82826200026c565b50506002805460ff191660011790555062000338565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000d657600080fd5b81516001600160401b0380821115620000f357620000f3620000ae565b604051601f8301601f19908116603f011681019082821181831017156200011e576200011e620000ae565b816040528381526020925086838588010111156200013b57600080fd5b600091505b838210156200015f578582018301518183018401529082019062000140565b600093810190920192909252949350505050565b600080604083850312156200018757600080fd5b82516001600160401b03808211156200019f57600080fd5b620001ad86838701620000c4565b93506020850151915080821115620001c457600080fd5b50620001d385828601620000c4565b9150509250929050565b600181811c90821680620001f257607f821691505b6020821081036200021357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026757600081815260208120601f850160051c81016020861015620002425750805b601f850160051c820191505b8181101562000263578281556001016200024e565b5050505b505050565b81516001600160401b03811115620002885762000288620000ae565b620002a081620002998454620001dd565b8462000219565b602080601f831160018114620002d85760008415620002bf5750858301515b600019600386901b1c1916600185901b17855562000263565b600085815260208120601f198616915b828110156200030957888601518255948401946001909101908401620002e8565b5085821015620003285787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6112c180620003486000396000f3fe6080604052600436106101ac5760003560e01c8063715018a6116100ec578063cb177b1e1161008a578063f04e283e11610064578063f04e283e146104bf578063f2fde38b146104d2578063feaea586146104e5578063fee81cf41461050557600080fd5b8063cb177b1e1461045f578063d505accf1461047f578063dd62ed3e1461049f57600080fd5b806395d89b41116100c657806395d89b41146103da5780639dc29fac146103ef578063a9059cbb1461040f578063ad0e7d8c1461042f57600080fd5b8063715018a61461036b5780637ecebe00146103735780638da5cb5b146103a657600080fd5b80633644e5151161015957806354d1f13d1161013357806354d1f13d146102c85780636afdd850146102d0578063705e6a5b1461031857806370a082311461033857600080fd5b80633644e51514610279578063407c48b41461028e57806340c10f19146102a857600080fd5b806323b872dd1161018a57806323b872dd146102335780632569296214610253578063313ce5671461025d57600080fd5b806306fdde03146101b1578063095ea7b3146101dc57806318160ddd1461020c575b600080fd5b3480156101bd57600080fd5b506101c6610538565b6040516101d39190611028565b60405180910390f35b3480156101e857600080fd5b506101fc6101f73660046110b6565b6105ca565b60405190151581526020016101d3565b34801561021857600080fd5b506805345cdf77eb68f44c545b6040519081526020016101d3565b34801561023f57600080fd5b506101fc61024e3660046110e2565b61061e565b61025b6106dc565b005b34801561026957600080fd5b50604051601281526020016101d3565b34801561028557600080fd5b5061022561072c565b34801561029a57600080fd5b506002546101fc9060ff1681565b3480156102b457600080fd5b506101fc6102c33660046110b6565b6107a9565b61025b610805565b3480156102dc57600080fd5b506102f36e22d473030f116ddee9f6b43ac78ba381565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b34801561032457600080fd5b5061025b610333366004611138565b610841565b34801561034457600080fd5b50610225610353366004611153565b6387a211a2600c908152600091909152602090205490565b61025b6108af565b34801561037f57600080fd5b5061022561038e366004611153565b6338377508600c908152600091909152602090205490565b3480156103b257600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927546102f3565b3480156103e657600080fd5b506101c66108c3565b3480156103fb57600080fd5b506101fc61040a3660046110b6565b6108d2565b34801561041b57600080fd5b506101fc61042a3660046110b6565b610906565b34801561043b57600080fd5b506101fc61044a366004611153565b60036020526000908152604090205460ff1681565b34801561046b57600080fd5b5061025b61047a366004611170565b61097d565b34801561048b57600080fd5b5061025b61049a3660046111a5565b6109db565b3480156104ab57600080fd5b506102256104ba36600461121c565b610b75565b61025b6104cd366004611153565b610bfa565b61025b6104e0366004611153565b610c3a565b3480156104f157600080fd5b5061025b61050036600461121c565b610c61565b34801561051157600080fd5b50610225610520366004611153565b63389a75e1600c908152600091909152602090205490565b60606000805461054790611255565b80601f016020809104026020016040519081016040528092919081815260200182805461057390611255565b80156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050905090565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a35060015b92915050565b60008360601b33602052637f5e9f208117600c526034600c208054600181011561065e5780851115610658576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156106875763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505060019392505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b600080610737610538565b8051906020012090506040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81528160208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015260a081209250505090565b3360009081526003602052604081205460ff166107f2576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107fc8383610df7565b50600192915050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b610849610e76565b60405181151581527f383d8f27281deff0ab982f76ad2feac76f0cb5d922008a4642d8765c748591329060200160405180910390a1600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6108b7610e76565b6108c16000610eac565b565b60606001805461054790611255565b600073ffffffffffffffffffffffffffffffffffffffff831633146108fc576108fc833384610f12565b6107fc8383610f55565b60006387a211a2600c52336000526020600c208054808411156109315763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a36107fc565b610985610e76565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60006109e5610538565b80519060200120905084421115610a0457631a15a3cc6000526004601cfd5b6040518860601b60601c98508760601b60601c975065383775081901600e52886000526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83528360208401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528a60208401528960408401528860608401528060808401528760a084015260c08320604e526042602c206000528660ff1660205285604052846060526020806080600060015afa8b3d5114610b105763ddafbaef6000526004601cfd5b019055777f5e9f20000000000000000000000000000000000000000088176040526034602c2087905587897f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608501a360405250506000606052505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82166e22d473030f116ddee9f6b43ac78ba3148015610bad575060025460ff165b15610bd957507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610618565b6020829052637f5e9f20600c908152600084905260349020545b9392505050565b610c02610e76565b63389a75e1600c52806000526020600c208054421115610c2a57636f5e88186000526004601cfd5b60009055610c3781610eac565b50565b610c42610e76565b8060601b610c5857637448fbae6000526004601cfd5b610c3781610eac565b610c69610e76565b73ffffffffffffffffffffffffffffffffffffffff821615610d24576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610d20908390839073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b91906112a8565b610fd9565b5050565b60008173ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114610d7e576040519150601f19603f3d011682016040523d82523d6000602084013e610d83565b606091505b5050905080610df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7769746864726177206661696c65640000000000000000000000000000000000604482015260640160405180910390fd5b505050565b6805345cdf77eb68f44c5481810181811015610e1b5763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275433146108c1576382b429006000526004601cfd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b81602052637f5e9f20600c52826000526034600c2080546001810115610f4e5780831115610f48576313be252b6000526004601cfd5b82810382555b5050505050565b6387a211a2600c52816000526020600c20805480831115610f7e5763f4d678b86000526004601cfd5b82900390556805345cdf77eb68f44c80548290039055600081815273ffffffffffffffffffffffffffffffffffffffff83167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a35050565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d15600160005114171661101e576390b8ec186000526004601cfd5b6000603452505050565b600060208083528351808285015260005b8181101561105557858101830151858201604001528201611039565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c3757600080fd5b600080604083850312156110c957600080fd5b82356110d481611094565b946020939093013593505050565b6000806000606084860312156110f757600080fd5b833561110281611094565b9250602084013561111281611094565b929592945050506040919091013590565b8035801515811461113357600080fd5b919050565b60006020828403121561114a57600080fd5b610bf382611123565b60006020828403121561116557600080fd5b8135610bf381611094565b6000806040838503121561118357600080fd5b823561118e81611094565b915061119c60208401611123565b90509250929050565b600080600080600080600060e0888a0312156111c057600080fd5b87356111cb81611094565b965060208801356111db81611094565b95506040880135945060608801359350608088013560ff811681146111ff57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561122f57600080fd5b823561123a81611094565b9150602083013561124a81611094565b809150509250929050565b600181811c9082168061126957607f821691505b6020821081036112a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156112ba57600080fd5b505191905056",
    "sourceMap": "376:3092:28:-:0;;;719:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;785:28;802:10;785:16;:28::i;:::-;823:5;:13;831:5;823;:13;:::i;:::-;-1:-1:-1;846:7:28;:17;856:7;846;:17;:::i;:::-;-1:-1:-1;;874:14:28;:21;;-1:-1:-1;;874:21:28;891:4;874:21;;;-1:-1:-1;376:3092:28;;4883:1190:22;-1:-1:-1;;;;;5793:26:22;-1:-1:-1;;5876:29:22;;;5793:26;6031:1;5991:38;6031:1;;5980:63;4883:1190;:::o;14:127:61:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:840;200:5;253:3;246:4;238:6;234:17;230:27;220:55;;271:1;268;261:12;220:55;294:13;;-1:-1:-1;;;;;356:10:61;;;353:36;;;369:18;;:::i;:::-;444:2;438:9;412:2;498:13;;-1:-1:-1;;494:22:61;;;518:2;490:31;486:40;474:53;;;542:18;;;562:22;;;539:46;536:72;;;588:18;;:::i;:::-;628:10;624:2;617:22;663:2;655:6;648:18;685:4;675:14;;730:3;725:2;720;712:6;708:15;704:24;701:33;698:53;;;747:1;744;737:12;698:53;769:1;760:10;;779:133;793:2;790:1;787:9;779:133;;;881:14;;;877:23;;871:30;850:14;;;846:23;;839:63;804:10;;;;779:133;;;954:1;932:15;;;928:24;;;921:35;;;;936:6;146:840;-1:-1:-1;;;;146:840:61:o;991:562::-;1090:6;1098;1151:2;1139:9;1130:7;1126:23;1122:32;1119:52;;;1167:1;1164;1157:12;1119:52;1194:16;;-1:-1:-1;;;;;1259:14:61;;;1256:34;;;1286:1;1283;1276:12;1256:34;1309:61;1362:7;1353:6;1342:9;1338:22;1309:61;:::i;:::-;1299:71;;1416:2;1405:9;1401:18;1395:25;1379:41;;1445:2;1435:8;1432:16;1429:36;;;1461:1;1458;1451:12;1429:36;;1484:63;1539:7;1528:8;1517:9;1513:24;1484:63;:::i;:::-;1474:73;;;991:562;;;;;:::o;1558:380::-;1637:1;1633:12;;;;1680;;;1701:61;;1755:4;1747:6;1743:17;1733:27;;1701:61;1808:2;1800:6;1797:14;1777:18;1774:38;1771:161;;1854:10;1849:3;1845:20;1842:1;1835:31;1889:4;1886:1;1879:15;1917:4;1914:1;1907:15;1771:161;;1558:380;;;:::o;2069:545::-;2171:2;2166:3;2163:11;2160:448;;;2207:1;2232:5;2228:2;2221:17;2277:4;2273:2;2263:19;2347:2;2335:10;2331:19;2328:1;2324:27;2318:4;2314:38;2383:4;2371:10;2368:20;2365:47;;;-1:-1:-1;2406:4:61;2365:47;2461:2;2456:3;2452:12;2449:1;2445:20;2439:4;2435:31;2425:41;;2516:82;2534:2;2527:5;2524:13;2516:82;;;2579:17;;;2560:1;2549:13;2516:82;;;2520:3;;;2160:448;2069:545;;;:::o;2790:1352::-;2910:10;;-1:-1:-1;;;;;2932:30:61;;2929:56;;;2965:18;;:::i;:::-;2994:97;3084:6;3044:38;3076:4;3070:11;3044:38;:::i;:::-;3038:4;2994:97;:::i;:::-;3146:4;;3210:2;3199:14;;3227:1;3222:663;;;;3929:1;3946:6;3943:89;;;-1:-1:-1;3998:19:61;;;3992:26;3943:89;-1:-1:-1;;2747:1:61;2743:11;;;2739:24;2735:29;2725:40;2771:1;2767:11;;;2722:57;4045:81;;3192:944;;3222:663;2016:1;2009:14;;;2053:4;2040:18;;-1:-1:-1;;3258:20:61;;;3376:236;3390:7;3387:1;3384:14;3376:236;;;3479:19;;;3473:26;3458:42;;3571:27;;;;3539:1;3527:14;;;;3406:19;;3376:236;;;3380:3;3640:6;3631:7;3628:19;3625:201;;;3701:19;;;3695:26;-1:-1:-1;;3784:1:61;3780:14;;;3796:3;3776:24;3772:37;3768:42;3753:58;3738:74;;3625:201;-1:-1:-1;;;;;3872:1:61;3856:14;;;3852:22;3839:36;;-1:-1:-1;2790:1352:61:o;:::-;376:3092:28;;;;;;",
    "linkReferences": {}
  },
  "deployedBytecode": {
    "object": "0x6080604052600436106101ac5760003560e01c8063715018a6116100ec578063cb177b1e1161008a578063f04e283e11610064578063f04e283e146104bf578063f2fde38b146104d2578063feaea586146104e5578063fee81cf41461050557600080fd5b8063cb177b1e1461045f578063d505accf1461047f578063dd62ed3e1461049f57600080fd5b806395d89b41116100c657806395d89b41146103da5780639dc29fac146103ef578063a9059cbb1461040f578063ad0e7d8c1461042f57600080fd5b8063715018a61461036b5780637ecebe00146103735780638da5cb5b146103a657600080fd5b80633644e5151161015957806354d1f13d1161013357806354d1f13d146102c85780636afdd850146102d0578063705e6a5b1461031857806370a082311461033857600080fd5b80633644e51514610279578063407c48b41461028e57806340c10f19146102a857600080fd5b806323b872dd1161018a57806323b872dd146102335780632569296214610253578063313ce5671461025d57600080fd5b806306fdde03146101b1578063095ea7b3146101dc57806318160ddd1461020c575b600080fd5b3480156101bd57600080fd5b506101c6610538565b6040516101d39190611028565b60405180910390f35b3480156101e857600080fd5b506101fc6101f73660046110b6565b6105ca565b60405190151581526020016101d3565b34801561021857600080fd5b506805345cdf77eb68f44c545b6040519081526020016101d3565b34801561023f57600080fd5b506101fc61024e3660046110e2565b61061e565b61025b6106dc565b005b34801561026957600080fd5b50604051601281526020016101d3565b34801561028557600080fd5b5061022561072c565b34801561029a57600080fd5b506002546101fc9060ff1681565b3480156102b457600080fd5b506101fc6102c33660046110b6565b6107a9565b61025b610805565b3480156102dc57600080fd5b506102f36e22d473030f116ddee9f6b43ac78ba381565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d3565b34801561032457600080fd5b5061025b610333366004611138565b610841565b34801561034457600080fd5b50610225610353366004611153565b6387a211a2600c908152600091909152602090205490565b61025b6108af565b34801561037f57600080fd5b5061022561038e366004611153565b6338377508600c908152600091909152602090205490565b3480156103b257600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927546102f3565b3480156103e657600080fd5b506101c66108c3565b3480156103fb57600080fd5b506101fc61040a3660046110b6565b6108d2565b34801561041b57600080fd5b506101fc61042a3660046110b6565b610906565b34801561043b57600080fd5b506101fc61044a366004611153565b60036020526000908152604090205460ff1681565b34801561046b57600080fd5b5061025b61047a366004611170565b61097d565b34801561048b57600080fd5b5061025b61049a3660046111a5565b6109db565b3480156104ab57600080fd5b506102256104ba36600461121c565b610b75565b61025b6104cd366004611153565b610bfa565b61025b6104e0366004611153565b610c3a565b3480156104f157600080fd5b5061025b61050036600461121c565b610c61565b34801561051157600080fd5b50610225610520366004611153565b63389a75e1600c908152600091909152602090205490565b60606000805461054790611255565b80601f016020809104026020016040519081016040528092919081815260200182805461057390611255565b80156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050905090565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a35060015b92915050565b60008360601b33602052637f5e9f208117600c526034600c208054600181011561065e5780851115610658576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156106875763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505060019392505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b600080610737610538565b8051906020012090506040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81528160208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015260a081209250505090565b3360009081526003602052604081205460ff166107f2576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107fc8383610df7565b50600192915050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b610849610e76565b60405181151581527f383d8f27281deff0ab982f76ad2feac76f0cb5d922008a4642d8765c748591329060200160405180910390a1600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6108b7610e76565b6108c16000610eac565b565b60606001805461054790611255565b600073ffffffffffffffffffffffffffffffffffffffff831633146108fc576108fc833384610f12565b6107fc8383610f55565b60006387a211a2600c52336000526020600c208054808411156109315763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a36107fc565b610985610e76565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60006109e5610538565b80519060200120905084421115610a0457631a15a3cc6000526004601cfd5b6040518860601b60601c98508760601b60601c975065383775081901600e52886000526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83528360208401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528a60208401528960408401528860608401528060808401528760a084015260c08320604e526042602c206000528660ff1660205285604052846060526020806080600060015afa8b3d5114610b105763ddafbaef6000526004601cfd5b019055777f5e9f20000000000000000000000000000000000000000088176040526034602c2087905587897f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608501a360405250506000606052505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82166e22d473030f116ddee9f6b43ac78ba3148015610bad575060025460ff165b15610bd957507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610618565b6020829052637f5e9f20600c908152600084905260349020545b9392505050565b610c02610e76565b63389a75e1600c52806000526020600c208054421115610c2a57636f5e88186000526004601cfd5b60009055610c3781610eac565b50565b610c42610e76565b8060601b610c5857637448fbae6000526004601cfd5b610c3781610eac565b610c69610e76565b73ffffffffffffffffffffffffffffffffffffffff821615610d24576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610d20908390839073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b91906112a8565b610fd9565b5050565b60008173ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114610d7e576040519150601f19603f3d011682016040523d82523d6000602084013e610d83565b606091505b5050905080610df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7769746864726177206661696c65640000000000000000000000000000000000604482015260640160405180910390fd5b505050565b6805345cdf77eb68f44c5481810181811015610e1b5763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275433146108c1576382b429006000526004601cfd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b81602052637f5e9f20600c52826000526034600c2080546001810115610f4e5780831115610f48576313be252b6000526004601cfd5b82810382555b5050505050565b6387a211a2600c52816000526020600c20805480831115610f7e5763f4d678b86000526004601cfd5b82900390556805345cdf77eb68f44c80548290039055600081815273ffffffffffffffffffffffffffffffffffffffff83167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a35050565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d15600160005114171661101e576390b8ec186000526004601cfd5b6000603452505050565b600060208083528351808285015260005b8181101561105557858101830151858201604001528201611039565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c3757600080fd5b600080604083850312156110c957600080fd5b82356110d481611094565b946020939093013593505050565b6000806000606084860312156110f757600080fd5b833561110281611094565b9250602084013561111281611094565b929592945050506040919091013590565b8035801515811461113357600080fd5b919050565b60006020828403121561114a57600080fd5b610bf382611123565b60006020828403121561116557600080fd5b8135610bf381611094565b6000806040838503121561118357600080fd5b823561118e81611094565b915061119c60208401611123565b90509250929050565b600080600080600080600060e0888a0312156111c057600080fd5b87356111cb81611094565b965060208801356111db81611094565b95506040880135945060608801359350608088013560ff811681146111ff57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561122f57600080fd5b823561123a81611094565b9150602083013561124a81611094565b809150509250929050565b600181811c9082168061126957607f821691505b6020821081036112a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156112ba57600080fd5b505191905056",
    "sourceMap": "376:3092:28:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;997:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7435:573:23;;;;;;;;;;-1:-1:-1;7435:573:23;;;;;:::i;:::-;;:::i;:::-;;;1270:14:61;;1263:22;1245:41;;1233:2;1218:18;7435:573:23;1105:187:61;6287:195:23;;;;;;;;;;-1:-1:-1;6447:18:23;6441:25;6287:195;;;1443:25:61;;;1431:2;1416:18;6287:195:23;1297:177:61;9969:2191:23;;;;;;;;;;-1:-1:-1;9969:2191:23;;;;;:::i;:::-;;:::i;9021:617:22:-;;;:::i;:::-;;908:83:28;;;;;;;;;;-1:-1:-1;908:83:28;;982:2;2082:36:61;;2070:2;2055:18;908:83:28;1940:184:61;16620:693:23;;;;;;;;;;;;;:::i;594:26:28:-;;;;;;;;;;-1:-1:-1;594:26:28;;;;;;;;1671:142;;;;;;;;;;-1:-1:-1;1671:142:28;;;;;:::i;:::-;;:::i;9720:456:22:-;;;:::i;453:76:28:-;;;;;;;;;;;;487:42;453:76;;;;;2487:42:61;2475:55;;;2457:74;;2445:2;2430:18;453:76:28;2311:226:61;2367:153:28;;;;;;;;;;-1:-1:-1;2367:153:28;;;;;:::i;:::-;;:::i;6548:286:23:-;;;;;;;;;;-1:-1:-1;6548:286:23;;;;;:::i;:::-;6716:18;6710:4;6703:32;;;6611:14;6748:19;;;;6812:4;6796:21;;6790:28;;6548:286;8762:100:22;;;:::i;12800:340:23:-;;;;;;;;;;-1:-1:-1;12800:340:23;;;;;:::i;:::-;13023:17;13017:4;13010:31;;;12860:14;13054:19;;;;13118:4;13102:21;;13096:28;;12800:340;11408:182:22;;;;;;;;;;-1:-1:-1;11562:11:22;11556:18;11408:182;;1093:94:28;;;;;;;;;;;;;:::i;1958:236::-;;;;;;;;;;-1:-1:-1;1958:236:28;;;;;:::i;:::-;;:::i;8195:1406:23:-;;;;;;;;;;-1:-1:-1;8195:1406:23;;;;;:::i;:::-;;:::i;670:42:28:-;;;;;;;;;;-1:-1:-1;670:42:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;1393:121;;;;;;;;;;-1:-1:-1;1393:121:28;;;;;:::i;:::-;;:::i;13324:3215:23:-;;;;;;;;;;-1:-1:-1;13324:3215:23;;;;;:::i;:::-;;:::i;2653:223:28:-;;;;;;;;;;-1:-1:-1;2653:223:28;;;;;:::i;:::-;;:::i;10363:708:22:-;;;;;;:::i;:::-;;:::i;8348:349::-;;;;;;:::i;:::-;;:::i;3094:372:28:-;;;;;;;;;;-1:-1:-1;3094:372:28;;;;;:::i;:::-;;:::i;11693:435:22:-;;;;;;;;;;-1:-1:-1;11693:435:22;;;;;:::i;:::-;11963:19;11957:4;11950:33;;;11812:14;11996:26;;;;12106:4;12090:21;;12084:28;;11693:435;997:90:28;1043:13;1075:5;1068:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;997:90;:::o;7435:573:23:-;7509:4;7668:7;7662:4;7655:21;7702:20;7696:4;7689:34;7749:8;7743:4;7736:22;7801:6;7794:4;7788;7778:21;7771:37;7876:6;7870:4;7863:20;7964:4;7958:11;7954:2;7950:20;7940:8;7913:25;7907:4;7901;7896:75;-1:-1:-1;7997:4:23;7435:573;;;;;:::o;9969:2191::-;10057:4;10208;10204:2;10200:13;10301:8;10295:4;10288:22;10346:20;10339:5;10336:31;10330:4;10323:45;10418:4;10412;10402:21;10460:13;10454:20;10572:1;10560:10;10556:18;10553:418;;;10688:10;10680:6;10677:22;10674:159;;;10735:10;10729:4;10722:24;10810:4;10804;10797:18;10674:159;10949:6;10937:10;10933:23;10918:13;10911:46;10553:418;;;11067:18;11060:5;11057:29;11051:4;11044:43;11139:4;11133;11123:21;11182:15;11176:22;11272:11;11264:6;11261:23;11258:146;;;11316:10;11310:4;11303:24;11385:4;11379;11372:18;11258:146;11513:6;11500:11;11496:24;11479:15;11472:49;;;11596:2;11590:4;11583:16;11649:4;11643;11633:21;11899:6;11883:13;11877:20;11873:33;11858:13;11851:56;;11975:6;11969:4;11962:20;12069:4;12063:11;12059:2;12055:20;12047:5;12043:2;12039:14;12012:25;12006:4;12000;11995:81;;-1:-1:-1;12149:4:23;9969:2191;;;;;:::o;9021:617:22:-;9114:15;7972:9;9132:46;;:15;:46;9114:64;;9346:19;9340:4;9333:33;9396:8;9390:4;9383:22;9452:7;9445:4;9439;9429:21;9422:38;9599:8;9552:45;9549:1;9546;9541:67;9248:374;9021:617::o;16620:693:23:-;16677:14;;16900:6;:4;:6::i;:::-;16884:24;;;;;;16873:35;;16999:4;16993:11;17060:16;17057:1;17050:27;17111:8;17104:4;17101:1;17097:12;17090:30;17154:13;17147:4;17144:1;17140:12;17133:35;17202:9;17195:4;17192:1;17188:12;17181:31;17246:9;17239:4;17236:1;17232:12;17225:31;17292:4;17289:1;17279:18;17269:28;;;16970:337;16620:693;:::o;1671:142:28:-;1241:10;1747:4;1230:22;;;:10;:22;;;;;;;;1225:47;;1261:11;;;;;;;;;;;;;;1225:47;1763:22:::1;1769:7;1778:6;1763:5;:22::i;:::-;-1:-1:-1::0;1802:4:28::1;1671:142:::0;;;;:::o;9720:456:22:-;9922:19;9916:4;9909:33;9968:8;9962:4;9955:22;10020:1;10013:4;10007;9997:21;9990:32;10151:8;10105:44;10102:1;10099;10094:66;9720:456::o;2367:153:28:-;12517:13:22;:11;:13::i;:::-;2447:32:28::1;::::0;1270:14:61;;1263:22;1245:41;;2447:32:28::1;::::0;1233:2:61;1218:18;2447:32:28::1;;;;;;;2489:14;:24:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;2367:153::o;8762:100:22:-;12517:13;:11;:13::i;:::-;8834:21:::1;8852:1;8834:9;:21::i;:::-;8762:100::o:0;1093:94:28:-;1141:13;1173:7;1166:14;;;;;:::i;1958:236::-;2023:4;2043:21;;;2054:10;2043:21;2039:96;;2080:44;2096:7;2105:10;2117:6;2080:15;:44::i;:::-;2144:22;2150:7;2159:6;2144:5;:22::i;8195:1406:23:-;8265:4;8474:18;8468:4;8461:32;8519:8;8513:4;8506:22;8580:4;8574;8564:21;8623:15;8617:22;8713:11;8705:6;8702:23;8699:146;;;8757:10;8751:4;8744:24;8826:4;8820;8813:18;8699:146;8954:6;8941:11;8937:24;8920:15;8913:49;;;9037:2;9031:4;9024:16;9090:4;9084;9074:21;9340:6;9324:13;9318:20;9314:33;9299:13;9292:56;;9416:6;9410:4;9403:20;9504:4;9498:11;9494:2;9490:20;9480:8;9453:25;9447:4;9441;9436:75;9530:43;3094:372:28;1393:121;12517:13:22;:11;:13::i;:::-;1477:19:28::1;::::0;;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:30;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;1393:121::o;13324:3215:23:-;13523:16;13720:6;:4;:6::i;:::-;13704:24;;;;;;13693:35;;13896:8;13883:11;13880:25;13877:142;;;13937:10;13931:4;13924:24;14000:4;13994;13987:18;13877:142;14047:4;14041:11;14163:5;14159:2;14155:14;14151:2;14147:23;14138:32;;14210:7;14206:2;14202:16;14198:2;14194:25;14183:36;;14303:39;14297:4;14290:53;14369:5;14363:4;14356:19;14421:4;14415;14405:21;14463:9;14457:16;14541;14538:1;14531:27;14592:8;14585:4;14582:1;14578:12;14571:30;14635:13;14628:4;14625:1;14621:12;14614:35;14683:9;14676:4;14673:1;14669:12;14662:31;14727:9;14720:4;14717:1;14713:12;14706:31;14776:4;14773:1;14763:18;14757:4;14750:32;14845:16;14842:1;14835:27;14896:5;14889:4;14886:1;14882:12;14875:27;14936:7;14929:4;14926:1;14922:12;14915:29;14978:5;14971:4;14968:1;14964:12;14957:27;15018:10;15011:4;15008:1;15004:12;14997:32;15063:8;15056:4;15053:1;15049:12;15042:30;15111:4;15108:1;15098:18;15092:4;15085:32;15206:4;15200;15190:21;15184:4;15177:35;15248:1;15242:4;15238:12;15232:4;15225:26;15277:1;15271:4;15264:15;15305:1;15299:4;15292:15;15365:4;15359;15353;15350:1;15347;15340:5;15329:41;15786:5;15767:16;15761:23;15758:34;15748:159;;15825:10;15819:4;15812:24;15888:4;15882;15875:18;15748:159;15992:18;15974:37;;16190:30;16187:43;;16181:4;16174:57;16267:4;16261;16251:21;16244:36;;;16222:7;16387:5;16360:25;-1:-1:-1;16347:4:23;16340:12;;16335:67;16422:4;16415:15;-1:-1:-1;;16492:1:23;16486:4;16479:15;-1:-1:-1;;;;;;13324:3215:23:o;2653:223:28:-;2735:7;2758:18;;;487:42;2758:18;:36;;;;-1:-1:-1;2780:14:28;;;;2758:36;2754:66;;;-1:-1:-1;2803:17:28;2796:24;;2754:66;7144:4:23;7137:21;;;7184:20;7178:4;7171:34;;;7041:14;7218:19;;;7282:4;7266:21;;7260:28;2837:32:28;2830:39;2653:223;-1:-1:-1;;;2653:223:28:o;10363:708:22:-;12517:13;:11;:13::i;:::-;10597:19:::1;10591:4;10584:33;10643:12;10637:4;10630:26;10705:4;10699;10689:21;10811:12;10805:19;10792:11;10789:36;10786:157;;;10857:10;10851:4;10844:24;10924:4;10918;10911:18;10786:157;11020:1;10999:23:::0;;11041::::1;11051:12:::0;11041:9:::1;:23::i;:::-;10363:708:::0;:::o;8348:349::-;12517:13;:11;:13::i;:::-;8520:8:::1;8516:2;8512:17;8502:150;;8562:10;8556:4;8549:24;8633:4;8627;8620:18;8502:150;8671:19;8681:8;8671:9;:19::i;3094:372:28:-:0;12517:13:22;:11;:13::i;:::-;3177:28:28::1;::::0;::::1;::::0;3173:287:::1;;3270:30;::::0;;;;3294:4:::1;3270:30;::::0;::::1;2457:74:61::0;3221:80:28::1;::::0;3258:5;;3266:2;;3270:15:::1;::::0;::::1;::::0;::::1;::::0;2430:18:61;;3270:30:28::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3221:28;:80::i;:::-;3094:372:::0;;:::o;3173:287::-:1;3333:12;3358:2;3350:16;;3374:21;3350:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3332:68;;;3422:7;3414:35;;;::::0;::::1;::::0;;6147:2:61;3414:35:28::1;::::0;::::1;6129:21:61::0;6186:2;6166:18;;;6159:30;6225:17;6205:18;;;6198:45;6260:18;;3414:35:28::1;;;;;;;;3318:142;3094:372:::0;;:::o;17717:1172:23:-;17938:18;17932:25;18017:6;17998:17;17994:30;18114:17;18096:16;18093:39;18090:162;;;18164:10;18158:4;18151:24;18233:4;18227;18220:18;18090:162;18339:16;18319:18;18312:44;;;18442:18;18436:4;18429:32;18487:2;18481:4;18474:16;18540:4;18534;18524:21;18656:6;18640:13;18634:20;18630:33;18615:13;18608:56;;18732:6;18726:4;18719:20;18813:4;18807:11;18803:2;18799:20;18796:1;18769:25;18763:4;18757;18752:68;3094:372:28;;:::o;7292:355:22:-;7504:11;7498:18;7488:8;7485:32;7475:156;;7550:10;7544:4;7537:24;7612:4;7606;7599:18;6145:1089;6857:11;7093:16;;6941:26;;;;;;;7053:38;7050:1;;7042:78;7177:27;6145:1089::o;22532:947:23:-;22773:7;22767:4;22760:21;22807:20;22801:4;22794:34;22854:5;22848:4;22841:19;22910:4;22904;22894:21;22952:13;22946:20;23064:1;23052:10;23048:18;23045:418;;;23180:10;23172:6;23169:22;23166:159;;;23227:10;23221:4;23214:24;23302:4;23296;23289:18;23166:159;23441:6;23429:10;23425:23;23410:13;23403:46;23045:418;;;22532:947;;;:::o;19295:1119::-;19562:18;19556:4;19549:32;19607:4;19601;19594:18;19664:4;19658;19648:21;19707:15;19701:22;19797:11;19789:6;19786:23;19783:146;;;19841:10;19835:4;19828:24;19910:4;19904;19897:18;19783:146;20021:24;;;19997:49;;20156:18;20150:25;;20146:38;;;20119:66;;-1:-1:-1;20240:20:23;;;20317:22;;;20290:25;20284:4;-1:-1:-1;20273:70:23;3094:372:28;;:::o;11375:939:24:-;11538:2;11532:4;11525:16;11595:6;11589:4;11582:20;11660:34;11654:4;11647:48;12049:4;12043;12037;12031;12028:1;12021:5;12014;12009:45;11943:16;11936:24;11932:1;11925:4;11919:11;11916:18;11913:48;11828:244;11801:400;;12118:10;12112:4;12105:24;12182:4;12176;12169:18;11801:400;12227:1;12221:4;12214:15;11375:939;;;:::o;14:607:61:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;612:2;542:66;537:2;529:6;525:15;521:88;510:9;506:104;502:113;494:121;;;;14:607;;;;:::o;626:154::-;712:42;705:5;701:54;694:5;691:65;681:93;;770:1;767;760:12;785:315;853:6;861;914:2;902:9;893:7;889:23;885:32;882:52;;;930:1;927;920:12;882:52;969:9;956:23;988:31;1013:5;988:31;:::i;:::-;1038:5;1090:2;1075:18;;;;1062:32;;-1:-1:-1;;;785:315:61:o;1479:456::-;1556:6;1564;1572;1625:2;1613:9;1604:7;1600:23;1596:32;1593:52;;;1641:1;1638;1631:12;1593:52;1680:9;1667:23;1699:31;1724:5;1699:31;:::i;:::-;1749:5;-1:-1:-1;1806:2:61;1791:18;;1778:32;1819:33;1778:32;1819:33;:::i;:::-;1479:456;;1871:7;;-1:-1:-1;;;1925:2:61;1910:18;;;;1897:32;;1479:456::o;2542:160::-;2607:20;;2663:13;;2656:21;2646:32;;2636:60;;2692:1;2689;2682:12;2636:60;2542:160;;;:::o;2707:180::-;2763:6;2816:2;2804:9;2795:7;2791:23;2787:32;2784:52;;;2832:1;2829;2822:12;2784:52;2855:26;2871:9;2855:26;:::i;2892:247::-;2951:6;3004:2;2992:9;2983:7;2979:23;2975:32;2972:52;;;3020:1;3017;3010:12;2972:52;3059:9;3046:23;3078:31;3103:5;3078:31;:::i;3144:315::-;3209:6;3217;3270:2;3258:9;3249:7;3245:23;3241:32;3238:52;;;3286:1;3283;3276:12;3238:52;3325:9;3312:23;3344:31;3369:5;3344:31;:::i;:::-;3394:5;-1:-1:-1;3418:35:61;3449:2;3434:18;;3418:35;:::i;:::-;3408:45;;3144:315;;;;;:::o;3464:829::-;3575:6;3583;3591;3599;3607;3615;3623;3676:3;3664:9;3655:7;3651:23;3647:33;3644:53;;;3693:1;3690;3683:12;3644:53;3732:9;3719:23;3751:31;3776:5;3751:31;:::i;:::-;3801:5;-1:-1:-1;3858:2:61;3843:18;;3830:32;3871:33;3830:32;3871:33;:::i;:::-;3923:7;-1:-1:-1;3977:2:61;3962:18;;3949:32;;-1:-1:-1;4028:2:61;4013:18;;4000:32;;-1:-1:-1;4084:3:61;4069:19;;4056:33;4133:4;4120:18;;4108:31;;4098:59;;4153:1;4150;4143:12;4098:59;3464:829;;;;-1:-1:-1;3464:829:61;;;;4176:7;4230:3;4215:19;;4202:33;;-1:-1:-1;4282:3:61;4267:19;;;4254:33;;3464:829;-1:-1:-1;;3464:829:61:o;4298:388::-;4366:6;4374;4427:2;4415:9;4406:7;4402:23;4398:32;4395:52;;;4443:1;4440;4433:12;4395:52;4482:9;4469:23;4501:31;4526:5;4501:31;:::i;:::-;4551:5;-1:-1:-1;4608:2:61;4593:18;;4580:32;4621:33;4580:32;4621:33;:::i;:::-;4673:7;4663:17;;;4298:388;;;;;:::o;5104:437::-;5183:1;5179:12;;;;5226;;;5247:61;;5301:4;5293:6;5289:17;5279:27;;5247:61;5354:2;5346:6;5343:14;5323:18;5320:38;5317:218;;5391:77;5388:1;5381:88;5492:4;5489:1;5482:15;5520:4;5517:1;5510:15;5317:218;;5104:437;;;:::o;5546:184::-;5616:6;5669:2;5657:9;5648:7;5644:23;5640:32;5637:52;;;5685:1;5682;5675:12;5637:52;-1:-1:-1;5708:16:61;;5546:184;-1:-1:-1;5546:184:61:o",
    "linkReferences": {}
  },
  "methodIdentifiers": {
    "DOMAIN_SEPARATOR()": "3644e515",
    "PERMIT2()": "6afdd850",
    "allowance(address,address)": "dd62ed3e",
    "approve(address,uint256)": "095ea7b3",
    "balanceOf(address)": "70a08231",
    "burn(address,uint256)": "9dc29fac",
    "cancelOwnershipHandover()": "54d1f13d",
    "completeOwnershipHandover(address)": "f04e283e",
    "decimals()": "313ce567",
    "mint(address,uint256)": "40c10f19",
    "minterRole(address)": "ad0e7d8c",
    "name()": "06fdde03",
    "nonces(address)": "7ecebe00",
    "owner()": "8da5cb5b",
    "ownershipHandoverExpiresAt(address)": "fee81cf4",
    "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf",
    "permit2Enabled()": "407c48b4",
    "recoverToken(address,address)": "feaea586",
    "renounceOwnership()": "715018a6",
    "requestOwnershipHandover()": "25692962",
    "setMinterRole(address,bool)": "cb177b1e",
    "symbol()": "95d89b41",
    "totalSupply()": "18160ddd",
    "transfer(address,uint256)": "a9059cbb",
    "transferFrom(address,address,uint256)": "23b872dd",
    "transferOwnership(address)": "f2fde38b",
    "updatePermit2Allowance(bool)": "705e6a5b"
  },
  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.21+commit.d9974bed\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowanceUnderflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPermit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewOwnerIsZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoHandoverRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotMinter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"OwnershipHandoverCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"OwnershipHandoverRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"Permit2AllowanceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"result\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PERMIT2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelOwnershipHandover\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"completeOwnershipHandover\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"minterRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"result\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"ownershipHandoverExpiresAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"permit2Enabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestOwnershipHandover\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isMinter\",\"type\":\"bool\"}],\"name\":\"setMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"updatePermit2Allowance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AllowanceOverflow()\":[{\"details\":\"The allowance has overflowed.\"}],\"AllowanceUnderflow()\":[{\"details\":\"The allowance has underflowed.\"}],\"AlreadyInitialized()\":[{\"details\":\"Cannot double-initialize.\"}],\"InsufficientAllowance()\":[{\"details\":\"Insufficient allowance.\"}],\"InsufficientBalance()\":[{\"details\":\"Insufficient balance.\"}],\"InvalidPermit()\":[{\"details\":\"The permit is invalid.\"}],\"NewOwnerIsZeroAddress()\":[{\"details\":\"The `newOwner` cannot be the zero address.\"}],\"NoHandoverRequest()\":[{\"details\":\"The `pendingOwner` does not have a valid handover request.\"}],\"PermitExpired()\":[{\"details\":\"The permit has expired.\"}],\"TotalSupplyOverflow()\":[{\"details\":\"The total supply has overflowed.\"}],\"Unauthorized()\":[{\"details\":\"The caller is not authorized to call the function.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `amount` tokens is approved by `owner` to be used by `spender`.\"},\"OwnershipHandoverCanceled(address)\":{\"details\":\"The ownership handover to `pendingOwner` has been canceled.\"},\"OwnershipHandoverRequested(address)\":{\"details\":\"An ownership handover to `pendingOwner` has been requested.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"The ownership is transferred from `oldOwner` to `newOwner`. This event is intentionally kept the same as OpenZeppelin's Ownable to be compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173), despite it not being as lightweight as a single argument event.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `amount` tokens is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"Returns the EIP-712 domain separator for the EIP-2612 permit.\"},\"allowance(address,address)\":{\"details\":\"The permit2 contract has full approval by default. If the approval is revoked, it can still be manually approved.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Emits a {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `owner`.\"},\"burn(address,uint256)\":{\"details\":\"Burns a  token\",\"params\":{\"account\":\"address to burn tokens from\",\"amount\":\"amount of tokens to burn\"}},\"cancelOwnershipHandover()\":{\"details\":\"Cancels the two-step ownership handover to the caller, if any.\"},\"completeOwnershipHandover(address)\":{\"details\":\"Allows the owner to complete the two-step ownership handover to `pendingOwner`. Reverts if there is no existing ownership handover requested by `pendingOwner`.\"},\"decimals()\":{\"details\":\"Returns the decimals places of the token.\"},\"mint(address,uint256)\":{\"details\":\"Mints a new token\",\"params\":{\"account\":\"address to send the minted tokens to\",\"amount\":\"amount of tokens to mint\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"Returns the current nonce for `owner`. This value is used to compute the signature for EIP-2612 permit.\"},\"owner()\":{\"details\":\"Returns the owner of the contract.\"},\"ownershipHandoverExpiresAt(address)\":{\"details\":\"Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Sets `value` as the allowance of `spender` over the tokens of `owner`, authorized by a signed approval by `owner`. Emits a {Approval} event.\"},\"recoverToken(address,address)\":{\"details\":\"withdraw token. For cases where people mistakenly send other tokens to this address\",\"params\":{\"to\":\"account to withdraw tokens to\",\"token\":\"address of the token to withdraw\"}},\"renounceOwnership()\":{\"details\":\"Allows the owner to renounce their ownership.\"},\"requestOwnershipHandover()\":{\"details\":\"Request a two-step ownership handover to the caller. The request will automatically expire in 48 hours (172800 seconds) by default.\"},\"setMinterRole(address,bool)\":{\"details\":\"sets a minter role\",\"params\":{\"account\":\"address for the minter role\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Transfer `amount` tokens from the caller to `to`. Requirements: - `from` must at least have `amount`. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `amount` tokens from `from` to `to`. Note: Does not update the allowance if it is the maximum uint256 value. Requirements: - `from` must at least have `amount`. - The caller must have at least `amount` of allowance to transfer the tokens of `from`. Emits a {Transfer} event.\"},\"transferOwnership(address)\":{\"details\":\"Allows the owner to transfer the ownership to `newOwner`.\"},\"updatePermit2Allowance(bool)\":{\"details\":\"used to update if to default approve permit2 address for all addresses\",\"params\":{\"enabled\":\"if the default approval should be done or not\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/currency.sol\":\"Currency\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":descent-collective/oracle-module/=lib/oracle-module/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":oracle-module/=lib/oracle-module/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"lib/solady/src/auth/Ownable.sol\":{\"keccak256\":\"0xc208cdd9de02bbf4b5edad18b88e23a2be7ff56d2287d5649329dc7cda64b9a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e8fba079cc7230c617f7493a2e97873f88e59a53a5018fcb2e2b6ac42d8aa5a3\",\"dweb:/ipfs/QmTXg8GSt8hsK2cZhbPFrund1mrwVdkLQmEPoQaFy4fhjs\"]},\"lib/solady/src/tokens/ERC20.sol\":{\"keccak256\":\"0xb4a3f9ba8a05107f7370de42cff57f3ad26dafd438712c11531a5892de2f59e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f0a9ca06e3cf6dea1f9a4c5599581573b7d81cd64dc3afb582f325ccf5fdd6dc\",\"dweb:/ipfs/Qmb9r5dDceNF4W8S5u6i85RsNTgE5XG9HbTXkyS25ad3C6\"]},\"lib/solady/src/utils/SafeTransferLib.sol\":{\"keccak256\":\"0xf98506fade18a92e3d8d0a0ca0bdaeaa099d7620aac2a9d76b5f3d0bcd10691c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a3495c9d108bc69951a12c5ce9f05851cc921f0bb69e2505756e79f3ddab4e1a\",\"dweb:/ipfs/QmT3XwbmdbQCxw7iNcF7DoiypDd5vs2ETFWirXqmJ86Meg\"]},\"src/currency.sol\":{\"keccak256\":\"0xc266e97010a71e6ac755dce3e51a5a5844663b355e20ab40bf2020fd9308369b\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2660220b8a14c6d06351765dd7accec03e350e7fa9ae960c1505bea1e5d8d2d\",\"dweb:/ipfs/QmdYdPSnQC2nym38Fca4vRLKU4A78AQkgYasdg3TaRLGNY\"]},\"src/interfaces/ICurrency.sol\":{\"keccak256\":\"0x3b7adace3df08c34906612358d435ffff3b90b5eec0eae34b6335cc8dcd0e7ed\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://370c80ec5636bd95342256d4116f703e633e6b0467ee530397e9b5cada37f998\",\"dweb:/ipfs/QmPQ5KY37JpfuSAXpJ16kBXAQVJcE253cfjYGcBEcMLERz\"]},\"src/mocks/ERC20Token.sol\":{\"keccak256\":\"0x62b878fb4dde1f455866e0c1290cc50714805d02c2848a4a9bb33c5dfbc8464d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7af3f5638d366abfbca3186813449259a33ed43e7c13ec983d389d73df1ad204\",\"dweb:/ipfs/QmeMdoEVTGqdcgSicTTcmycSQjToT7Sn5ZTgZdVFH9E6HA\"]}},\"version\":1}",
  "metadata": {
    "compiler": {
      "version": "0.8.21+commit.d9974bed"
    },
    "language": "Solidity",
    "output": {
      "abi": [
        {
          "inputs": [
            {
              "internalType": "string",
              "name": "name_",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "symbol_",
              "type": "string"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "constructor"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "AllowanceOverflow"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "AllowanceUnderflow"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "AlreadyInitialized"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "InsufficientAllowance"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "InsufficientBalance"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "InvalidPermit"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "NewOwnerIsZeroAddress"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "NoHandoverRequest"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "NotMinter"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "PermitExpired"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "TotalSupplyOverflow"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "Unauthorized"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "spender",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "Approval",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pendingOwner",
              "type": "address",
              "indexed": true
            }
          ],
          "type": "event",
          "name": "OwnershipHandoverCanceled",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pendingOwner",
              "type": "address",
              "indexed": true
            }
          ],
          "type": "event",
          "name": "OwnershipHandoverRequested",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "oldOwner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "newOwner",
              "type": "address",
              "indexed": true
            }
          ],
          "type": "event",
          "name": "OwnershipTransferred",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "bool",
              "name": "enabled",
              "type": "bool",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "Permit2AllowanceUpdated",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "from",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "to",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "Transfer",
          "anonymous": false
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "DOMAIN_SEPARATOR",
          "outputs": [
            {
              "internalType": "bytes32",
              "name": "result",
              "type": "bytes32"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "PERMIT2",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "spender",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "allowance",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "spender",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "approve",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "balanceOf",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "result",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "account",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "burn",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "payable",
          "type": "function",
          "name": "cancelOwnershipHandover"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pendingOwner",
              "type": "address"
            }
          ],
          "stateMutability": "payable",
          "type": "function",
          "name": "completeOwnershipHandover"
        },
        {
          "inputs": [],
          "stateMutability": "pure",
          "type": "function",
          "name": "decimals",
          "outputs": [
            {
              "internalType": "uint8",
              "name": "",
              "type": "uint8"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "account",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "mint",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "minterRole",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "name",
          "outputs": [
            {
              "internalType": "string",
              "name": "",
              "type": "string"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "nonces",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "result",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "owner",
          "outputs": [
            {
              "internalType": "address",
              "name": "result",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pendingOwner",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "ownershipHandoverExpiresAt",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "result",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "spender",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "deadline",
              "type": "uint256"
            },
            {
              "internalType": "uint8",
              "name": "v",
              "type": "uint8"
            },
            {
              "internalType": "bytes32",
              "name": "r",
              "type": "bytes32"
            },
            {
              "internalType": "bytes32",
              "name": "s",
              "type": "bytes32"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "permit"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "permit2Enabled",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "to",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "recoverToken"
        },
        {
          "inputs": [],
          "stateMutability": "payable",
          "type": "function",
          "name": "renounceOwnership"
        },
        {
          "inputs": [],
          "stateMutability": "payable",
          "type": "function",
          "name": "requestOwnershipHandover"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "account",
              "type": "address"
            },
            {
              "internalType": "bool",
              "name": "isMinter",
              "type": "bool"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "setMinterRole"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "symbol",
          "outputs": [
            {
              "internalType": "string",
              "name": "",
              "type": "string"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "totalSupply",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "result",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "to",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "transfer",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "from",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "to",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "transferFrom",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "newOwner",
              "type": "address"
            }
          ],
          "stateMutability": "payable",
          "type": "function",
          "name": "transferOwnership"
        },
        {
          "inputs": [
            {
              "internalType": "bool",
              "name": "enabled",
              "type": "bool"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "updatePermit2Allowance"
        }
      ],
      "devdoc": {
        "kind": "dev",
        "methods": {
          "DOMAIN_SEPARATOR()": {
            "details": "Returns the EIP-712 domain separator for the EIP-2612 permit."
          },
          "allowance(address,address)": {
            "details": "The permit2 contract has full approval by default. If the approval is revoked, it can still be manually approved."
          },
          "approve(address,uint256)": {
            "details": "Sets `amount` as the allowance of `spender` over the caller's tokens. Emits a {Approval} event."
          },
          "balanceOf(address)": {
            "details": "Returns the amount of tokens owned by `owner`."
          },
          "burn(address,uint256)": {
            "details": "Burns a  token",
            "params": {
              "account": "address to burn tokens from",
              "amount": "amount of tokens to burn"
            }
          },
          "cancelOwnershipHandover()": {
            "details": "Cancels the two-step ownership handover to the caller, if any."
          },
          "completeOwnershipHandover(address)": {
            "details": "Allows the owner to complete the two-step ownership handover to `pendingOwner`. Reverts if there is no existing ownership handover requested by `pendingOwner`."
          },
          "decimals()": {
            "details": "Returns the decimals places of the token."
          },
          "mint(address,uint256)": {
            "details": "Mints a new token",
            "params": {
              "account": "address to send the minted tokens to",
              "amount": "amount of tokens to mint"
            }
          },
          "name()": {
            "details": "Returns the name of the token."
          },
          "nonces(address)": {
            "details": "Returns the current nonce for `owner`. This value is used to compute the signature for EIP-2612 permit."
          },
          "owner()": {
            "details": "Returns the owner of the contract."
          },
          "ownershipHandoverExpiresAt(address)": {
            "details": "Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`."
          },
          "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
            "details": "Sets `value` as the allowance of `spender` over the tokens of `owner`, authorized by a signed approval by `owner`. Emits a {Approval} event."
          },
          "recoverToken(address,address)": {
            "details": "withdraw token. For cases where people mistakenly send other tokens to this address",
            "params": {
              "to": "account to withdraw tokens to",
              "token": "address of the token to withdraw"
            }
          },
          "renounceOwnership()": {
            "details": "Allows the owner to renounce their ownership."
          },
          "requestOwnershipHandover()": {
            "details": "Request a two-step ownership handover to the caller. The request will automatically expire in 48 hours (172800 seconds) by default."
          },
          "setMinterRole(address,bool)": {
            "details": "sets a minter role",
            "params": {
              "account": "address for the minter role"
            }
          },
          "symbol()": {
            "details": "Returns the symbol of the token."
          },
          "totalSupply()": {
            "details": "Returns the amount of tokens in existence."
          },
          "transfer(address,uint256)": {
            "details": "Transfer `amount` tokens from the caller to `to`. Requirements: - `from` must at least have `amount`. Emits a {Transfer} event."
          },
          "transferFrom(address,address,uint256)": {
            "details": "Transfers `amount` tokens from `from` to `to`. Note: Does not update the allowance if it is the maximum uint256 value. Requirements: - `from` must at least have `amount`. - The caller must have at least `amount` of allowance to transfer the tokens of `from`. Emits a {Transfer} event."
          },
          "transferOwnership(address)": {
            "details": "Allows the owner to transfer the ownership to `newOwner`."
          },
          "updatePermit2Allowance(bool)": {
            "details": "used to update if to default approve permit2 address for all addresses",
            "params": {
              "enabled": "if the default approval should be done or not"
            }
          }
        },
        "version": 1
      },
      "userdoc": {
        "kind": "user",
        "methods": {},
        "version": 1
      }
    },
    "settings": {
      "remappings": [
        "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
        "descent-collective/oracle-module/=lib/oracle-module/src/",
        "ds-test/=lib/forge-std/lib/ds-test/src/",
        "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
        "forge-std/=lib/forge-std/src/",
        "openzeppelin-contracts/=lib/openzeppelin-contracts/",
        "oracle-module/=lib/oracle-module/",
        "solady/=lib/solady/src/"
      ],
      "optimizer": {
        "enabled": true,
        "runs": 1000000
      },
      "metadata": {
        "bytecodeHash": "none",
        "appendCBOR": false
      },
      "compilationTarget": {
        "src/currency.sol": "Currency"
      },
      "libraries": {}
    },
    "sources": {
      "lib/solady/src/auth/Ownable.sol": {
        "keccak256": "0xc208cdd9de02bbf4b5edad18b88e23a2be7ff56d2287d5649329dc7cda64b9a3",
        "urls": [
          "bzz-raw://e8fba079cc7230c617f7493a2e97873f88e59a53a5018fcb2e2b6ac42d8aa5a3",
          "dweb:/ipfs/QmTXg8GSt8hsK2cZhbPFrund1mrwVdkLQmEPoQaFy4fhjs"
        ],
        "license": "MIT"
      },
      "lib/solady/src/tokens/ERC20.sol": {
        "keccak256": "0xb4a3f9ba8a05107f7370de42cff57f3ad26dafd438712c11531a5892de2f59e0",
        "urls": [
          "bzz-raw://f0a9ca06e3cf6dea1f9a4c5599581573b7d81cd64dc3afb582f325ccf5fdd6dc",
          "dweb:/ipfs/Qmb9r5dDceNF4W8S5u6i85RsNTgE5XG9HbTXkyS25ad3C6"
        ],
        "license": "MIT"
      },
      "lib/solady/src/utils/SafeTransferLib.sol": {
        "keccak256": "0xf98506fade18a92e3d8d0a0ca0bdaeaa099d7620aac2a9d76b5f3d0bcd10691c",
        "urls": [
          "bzz-raw://a3495c9d108bc69951a12c5ce9f05851cc921f0bb69e2505756e79f3ddab4e1a",
          "dweb:/ipfs/QmT3XwbmdbQCxw7iNcF7DoiypDd5vs2ETFWirXqmJ86Meg"
        ],
        "license": "MIT"
      },
      "src/currency.sol": {
        "keccak256": "0xc266e97010a71e6ac755dce3e51a5a5844663b355e20ab40bf2020fd9308369b",
        "urls": [
          "bzz-raw://d2660220b8a14c6d06351765dd7accec03e350e7fa9ae960c1505bea1e5d8d2d",
          "dweb:/ipfs/QmdYdPSnQC2nym38Fca4vRLKU4A78AQkgYasdg3TaRLGNY"
        ],
        "license": "GPL-3.0"
      },
      "src/interfaces/ICurrency.sol": {
        "keccak256": "0x3b7adace3df08c34906612358d435ffff3b90b5eec0eae34b6335cc8dcd0e7ed",
        "urls": [
          "bzz-raw://370c80ec5636bd95342256d4116f703e633e6b0467ee530397e9b5cada37f998",
          "dweb:/ipfs/QmPQ5KY37JpfuSAXpJ16kBXAQVJcE253cfjYGcBEcMLERz"
        ],
        "license": "GPL-3.0"
      },
      "src/mocks/ERC20Token.sol": {
        "keccak256": "0x62b878fb4dde1f455866e0c1290cc50714805d02c2848a4a9bb33c5dfbc8464d",
        "urls": [
          "bzz-raw://7af3f5638d366abfbca3186813449259a33ed43e7c13ec983d389d73df1ad204",
          "dweb:/ipfs/QmeMdoEVTGqdcgSicTTcmycSQjToT7Sn5ZTgZdVFH9E6HA"
        ],
        "license": "GPL-3.0"
      }
    },
    "version": 1
  },
  "ast": {
    "absolutePath": "src/currency.sol",
    "id": 46011,
    "exportedSymbols": {
      "Currency": [46010],
      "ERC20": [44800],
      "ERC20Token": [46406],
      "ICurrency": [46096],
      "Ownable": [44381],
      "SafeTransferLib": [44996]
    },
    "nodeType": "SourceUnit",
    "src": "36:3433:28",
    "nodes": [
      {
        "id": 45736,
        "nodeType": "PragmaDirective",
        "src": "36:23:28",
        "nodes": [],
        "literals": ["solidity", "0.8", ".21"]
      },
      {
        "id": 45738,
        "nodeType": "ImportDirective",
        "src": "108:53:28",
        "nodes": [],
        "absolutePath": "src/interfaces/ICurrency.sol",
        "file": "./interfaces/ICurrency.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 46011,
        "sourceUnit": 46097,
        "symbolAliases": [
          {
            "foreign": {
              "id": 45737,
              "name": "ICurrency",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 46096,
              "src": "116:9:28",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 45740,
        "nodeType": "ImportDirective",
        "src": "162:48:28",
        "nodes": [],
        "absolutePath": "lib/solady/src/auth/Ownable.sol",
        "file": "solady/auth/Ownable.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 46011,
        "sourceUnit": 44382,
        "symbolAliases": [
          {
            "foreign": {
              "id": 45739,
              "name": "Ownable",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 44381,
              "src": "170:7:28",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 45742,
        "nodeType": "ImportDirective",
        "src": "211:50:28",
        "nodes": [],
        "absolutePath": "src/mocks/ERC20Token.sol",
        "file": "./mocks/ERC20Token.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 46011,
        "sourceUnit": 46407,
        "symbolAliases": [
          {
            "foreign": {
              "id": 45741,
              "name": "ERC20Token",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 46406,
              "src": "219:10:28",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 45744,
        "nodeType": "ImportDirective",
        "src": "262:65:28",
        "nodes": [],
        "absolutePath": "lib/solady/src/utils/SafeTransferLib.sol",
        "file": "solady/utils/SafeTransferLib.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 46011,
        "sourceUnit": 44997,
        "symbolAliases": [
          {
            "foreign": {
              "id": 45743,
              "name": "SafeTransferLib",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 44996,
              "src": "270:15:28",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 45746,
        "nodeType": "ImportDirective",
        "src": "328:46:28",
        "nodes": [],
        "absolutePath": "lib/solady/src/tokens/ERC20.sol",
        "file": "solady/tokens/ERC20.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 46011,
        "sourceUnit": 44801,
        "symbolAliases": [
          {
            "foreign": {
              "id": 45745,
              "name": "ERC20",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 44800,
              "src": "336:5:28",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 46010,
        "nodeType": "ContractDefinition",
        "src": "376:3092:28",
        "nodes": [
          {
            "id": 45754,
            "nodeType": "ErrorDefinition",
            "src": "429:18:28",
            "nodes": [],
            "errorSelector": "f8d2906c",
            "name": "NotMinter",
            "nameLocation": "435:9:28",
            "parameters": {
              "id": 45753,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "444:2:28"
            }
          },
          {
            "id": 45757,
            "nodeType": "VariableDeclaration",
            "src": "453:76:28",
            "nodes": [],
            "constant": true,
            "functionSelector": "6afdd850",
            "mutability": "constant",
            "name": "PERMIT2",
            "nameLocation": "477:7:28",
            "scope": 46010,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 45755,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "453:7:28",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": {
              "hexValue": "307830303030303030303030323244343733303330463131366444454539463642343361433738424133",
              "id": 45756,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "487:42:28",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              },
              "value": "0x000000000022D473030F116dDEE9F6B43aC78BA3"
            },
            "visibility": "public"
          },
          {
            "id": 45759,
            "nodeType": "VariableDeclaration",
            "src": "555:12:28",
            "nodes": [],
            "constant": false,
            "mutability": "mutable",
            "name": "_name",
            "nameLocation": "562:5:28",
            "scope": 46010,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_storage",
              "typeString": "string"
            },
            "typeName": {
              "id": 45758,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "555:6:28",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "visibility": "internal"
          },
          {
            "id": 45761,
            "nodeType": "VariableDeclaration",
            "src": "573:14:28",
            "nodes": [],
            "constant": false,
            "mutability": "mutable",
            "name": "_symbol",
            "nameLocation": "580:7:28",
            "scope": 46010,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_storage",
              "typeString": "string"
            },
            "typeName": {
              "id": 45760,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "573:6:28",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "visibility": "internal"
          },
          {
            "id": 45763,
            "nodeType": "VariableDeclaration",
            "src": "594:26:28",
            "nodes": [],
            "constant": false,
            "functionSelector": "407c48b4",
            "mutability": "mutable",
            "name": "permit2Enabled",
            "nameLocation": "606:14:28",
            "scope": 46010,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bool",
              "typeString": "bool"
            },
            "typeName": {
              "id": 45762,
              "name": "bool",
              "nodeType": "ElementaryTypeName",
              "src": "594:4:28",
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              }
            },
            "visibility": "public"
          },
          {
            "id": 45767,
            "nodeType": "VariableDeclaration",
            "src": "670:42:28",
            "nodes": [],
            "constant": false,
            "functionSelector": "ad0e7d8c",
            "mutability": "mutable",
            "name": "minterRole",
            "nameLocation": "702:10:28",
            "scope": 46010,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 45766,
              "keyName": "",
              "keyNameLocation": "-1:-1:-1",
              "keyType": {
                "id": 45764,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "678:7:28",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "670:24:28",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueName": "",
              "valueNameLocation": "-1:-1:-1",
              "valueType": {
                "id": 45765,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "689:4:28",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "visibility": "public"
          },
          {
            "id": 45792,
            "nodeType": "FunctionDefinition",
            "src": "719:183:28",
            "nodes": [],
            "body": {
              "id": 45791,
              "nodeType": "Block",
              "src": "775:127:28",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 45775,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "802:3:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 45776,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "806:6:28",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "802:10:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 45774,
                      "name": "_initializeOwner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 44260,
                      "src": "785:16:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 45777,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "785:28:28",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 45778,
                  "nodeType": "ExpressionStatement",
                  "src": "785:28:28"
                },
                {
                  "expression": {
                    "id": 45781,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 45779,
                      "name": "_name",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45759,
                      "src": "823:5:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage",
                        "typeString": "string storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 45780,
                      "name": "name_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45769,
                      "src": "831:5:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "src": "823:13:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "id": 45782,
                  "nodeType": "ExpressionStatement",
                  "src": "823:13:28"
                },
                {
                  "expression": {
                    "id": 45785,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 45783,
                      "name": "_symbol",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45761,
                      "src": "846:7:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage",
                        "typeString": "string storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 45784,
                      "name": "symbol_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45771,
                      "src": "856:7:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "src": "846:17:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "id": 45786,
                  "nodeType": "ExpressionStatement",
                  "src": "846:17:28"
                },
                {
                  "expression": {
                    "id": 45789,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 45787,
                      "name": "permit2Enabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45763,
                      "src": "874:14:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "74727565",
                      "id": 45788,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "891:4:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "874:21:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 45790,
                  "nodeType": "ExpressionStatement",
                  "src": "874:21:28"
                }
              ]
            },
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "parameters": {
              "id": 45772,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45769,
                  "mutability": "mutable",
                  "name": "name_",
                  "nameLocation": "745:5:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45792,
                  "src": "731:19:28",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 45768,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "731:6:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 45771,
                  "mutability": "mutable",
                  "name": "symbol_",
                  "nameLocation": "766:7:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45792,
                  "src": "752:21:28",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 45770,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "752:6:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "730:44:28"
            },
            "returnParameters": {
              "id": 45773,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "775:0:28"
            },
            "scope": 46010,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 45801,
            "nodeType": "FunctionDefinition",
            "src": "908:83:28",
            "nodes": [],
            "body": {
              "id": 45800,
              "nodeType": "Block",
              "src": "965:26:28",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "hexValue": "3138",
                    "id": 45798,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "982:2:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_18_by_1",
                      "typeString": "int_const 18"
                    },
                    "value": "18"
                  },
                  "functionReturnParameters": 45797,
                  "id": 45799,
                  "nodeType": "Return",
                  "src": "975:9:28"
                }
              ]
            },
            "baseFunctions": [44484],
            "functionSelector": "313ce567",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "decimals",
            "nameLocation": "917:8:28",
            "overrides": {
              "id": 45794,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "940:8:28"
            },
            "parameters": {
              "id": 45793,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "925:2:28"
            },
            "returnParameters": {
              "id": 45797,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45796,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 45801,
                  "src": "958:5:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 45795,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "958:5:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "957:7:28"
            },
            "scope": 46010,
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 45810,
            "nodeType": "FunctionDefinition",
            "src": "997:90:28",
            "nodes": [],
            "body": {
              "id": 45809,
              "nodeType": "Block",
              "src": "1058:29:28",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 45807,
                    "name": "_name",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 45759,
                    "src": "1075:5:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "functionReturnParameters": 45806,
                  "id": 45808,
                  "nodeType": "Return",
                  "src": "1068:12:28"
                }
              ]
            },
            "baseFunctions": [44469],
            "functionSelector": "06fdde03",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "name",
            "nameLocation": "1006:4:28",
            "overrides": {
              "id": 45803,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1025:8:28"
            },
            "parameters": {
              "id": 45802,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1010:2:28"
            },
            "returnParameters": {
              "id": 45806,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45805,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 45810,
                  "src": "1043:13:28",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 45804,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1043:6:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1042:15:28"
            },
            "scope": 46010,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 45819,
            "nodeType": "FunctionDefinition",
            "src": "1093:94:28",
            "nodes": [],
            "body": {
              "id": 45818,
              "nodeType": "Block",
              "src": "1156:31:28",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 45816,
                    "name": "_symbol",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 45761,
                    "src": "1173:7:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "functionReturnParameters": 45815,
                  "id": 45817,
                  "nodeType": "Return",
                  "src": "1166:14:28"
                }
              ]
            },
            "baseFunctions": [44475],
            "functionSelector": "95d89b41",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "symbol",
            "nameLocation": "1102:6:28",
            "overrides": {
              "id": 45812,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1123:8:28"
            },
            "parameters": {
              "id": 45811,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1108:2:28"
            },
            "returnParameters": {
              "id": 45815,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45814,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 45819,
                  "src": "1141:13:28",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 45813,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1141:6:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1140:15:28"
            },
            "scope": 46010,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 45832,
            "nodeType": "ModifierDefinition",
            "src": "1193:97:28",
            "nodes": [],
            "body": {
              "id": 45831,
              "nodeType": "Block",
              "src": "1215:75:28",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "id": 45825,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "1229:23:28",
                    "subExpression": {
                      "baseExpression": {
                        "id": 45821,
                        "name": "minterRole",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45767,
                        "src": "1230:10:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 45824,
                      "indexExpression": {
                        "expression": {
                          "id": 45822,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "1241:3:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 45823,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "1245:6:28",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "1241:10:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "1230:22:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 45829,
                  "nodeType": "IfStatement",
                  "src": "1225:47:28",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 45826,
                        "name": "NotMinter",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45754,
                        "src": "1261:9:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 45827,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1261:11:28",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 45828,
                    "nodeType": "RevertStatement",
                    "src": "1254:18:28"
                  }
                },
                {
                  "id": 45830,
                  "nodeType": "PlaceholderStatement",
                  "src": "1282:1:28"
                }
              ]
            },
            "name": "onlyMinter",
            "nameLocation": "1202:10:28",
            "parameters": {
              "id": 45820,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1212:2:28"
            },
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 45849,
            "nodeType": "FunctionDefinition",
            "src": "1393:121:28",
            "nodes": [],
            "body": {
              "id": 45848,
              "nodeType": "Block",
              "src": "1467:47:28",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 45846,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 45842,
                        "name": "minterRole",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45767,
                        "src": "1477:10:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 45844,
                      "indexExpression": {
                        "id": 45843,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45835,
                        "src": "1488:7:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1477:19:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 45845,
                      "name": "isMinter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45837,
                      "src": "1499:8:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "1477:30:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 45847,
                  "nodeType": "ExpressionStatement",
                  "src": "1477:30:28"
                }
              ]
            },
            "documentation": {
              "id": 45833,
              "nodeType": "StructuredDocumentation",
              "src": "1296:92:28",
              "text": " @dev sets a minter role\n @param account address for the minter role"
            },
            "functionSelector": "cb177b1e",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 45840,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 45839,
                  "name": "onlyOwner",
                  "nameLocations": ["1457:9:28"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "1457:9:28"
                },
                "nodeType": "ModifierInvocation",
                "src": "1457:9:28"
              }
            ],
            "name": "setMinterRole",
            "nameLocation": "1402:13:28",
            "parameters": {
              "id": 45838,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45835,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "1424:7:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45849,
                  "src": "1416:15:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 45834,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1416:7:28",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 45837,
                  "mutability": "mutable",
                  "name": "isMinter",
                  "nameLocation": "1438:8:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45849,
                  "src": "1433:13:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 45836,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1433:4:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1415:32:28"
            },
            "returnParameters": {
              "id": 45841,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1467:0:28"
            },
            "scope": 46010,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 45869,
            "nodeType": "FunctionDefinition",
            "src": "1671:142:28",
            "nodes": [],
            "body": {
              "id": 45868,
              "nodeType": "Block",
              "src": "1753:60:28",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 45862,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45852,
                        "src": "1769:7:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 45863,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45854,
                        "src": "1778:6:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 45861,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 44701,
                      "src": "1763:5:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 45864,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1763:22:28",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 45865,
                  "nodeType": "ExpressionStatement",
                  "src": "1763:22:28"
                },
                {
                  "expression": {
                    "hexValue": "74727565",
                    "id": 45866,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1802:4:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 45860,
                  "id": 45867,
                  "nodeType": "Return",
                  "src": "1795:11:28"
                }
              ]
            },
            "baseFunctions": [46086],
            "documentation": {
              "id": 45850,
              "nodeType": "StructuredDocumentation",
              "src": "1520:146:28",
              "text": " @dev Mints a new token\n @param account address to send the minted tokens to\n @param amount amount of tokens to mint"
            },
            "functionSelector": "40c10f19",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 45857,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 45856,
                  "name": "onlyMinter",
                  "nameLocations": ["1727:10:28"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 45832,
                  "src": "1727:10:28"
                },
                "nodeType": "ModifierInvocation",
                "src": "1727:10:28"
              }
            ],
            "name": "mint",
            "nameLocation": "1680:4:28",
            "parameters": {
              "id": 45855,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45852,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "1693:7:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45869,
                  "src": "1685:15:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 45851,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1685:7:28",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 45854,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "1710:6:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45869,
                  "src": "1702:14:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 45853,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1702:7:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1684:33:28"
            },
            "returnParameters": {
              "id": 45860,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45859,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 45869,
                  "src": "1747:4:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 45858,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1747:4:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1746:6:28"
            },
            "scope": 46010,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 45900,
            "nodeType": "FunctionDefinition",
            "src": "1958:236:28",
            "nodes": [],
            "body": {
              "id": 45899,
              "nodeType": "Block",
              "src": "2029:165:28",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 45882,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 45879,
                      "name": "account",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45872,
                      "src": "2043:7:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "expression": {
                        "id": 45880,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "2054:3:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 45881,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "2058:6:28",
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "src": "2054:10:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "2043:21:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 45891,
                  "nodeType": "IfStatement",
                  "src": "2039:96:28",
                  "trueBody": {
                    "id": 45890,
                    "nodeType": "Block",
                    "src": "2066:69:28",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 45884,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 45872,
                              "src": "2096:7:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "expression": {
                                "id": 45885,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "2105:3:28",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 45886,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "2109:6:28",
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "src": "2105:10:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 45887,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 45874,
                              "src": "2117:6:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 45883,
                            "name": "_spendAllowance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 44765,
                            "src": "2080:15:28",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 45888,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2080:44:28",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 45889,
                        "nodeType": "ExpressionStatement",
                        "src": "2080:44:28"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 45893,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45872,
                        "src": "2150:7:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 45894,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45874,
                        "src": "2159:6:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 45892,
                      "name": "_burn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 44729,
                      "src": "2144:5:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 45895,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2144:22:28",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 45896,
                  "nodeType": "ExpressionStatement",
                  "src": "2144:22:28"
                },
                {
                  "expression": {
                    "hexValue": "74727565",
                    "id": 45897,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "2183:4:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 45878,
                  "id": 45898,
                  "nodeType": "Return",
                  "src": "2176:11:28"
                }
              ]
            },
            "baseFunctions": [46095],
            "documentation": {
              "id": 45870,
              "nodeType": "StructuredDocumentation",
              "src": "1819:134:28",
              "text": " @dev Burns a  token\n @param account address to burn tokens from\n @param amount amount of tokens to burn"
            },
            "functionSelector": "9dc29fac",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "burn",
            "nameLocation": "1967:4:28",
            "parameters": {
              "id": 45875,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45872,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "1980:7:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45900,
                  "src": "1972:15:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 45871,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1972:7:28",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 45874,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "1997:6:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45900,
                  "src": "1989:14:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 45873,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1989:7:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1971:33:28"
            },
            "returnParameters": {
              "id": 45878,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45877,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 45900,
                  "src": "2023:4:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 45876,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2023:4:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2022:6:28"
            },
            "scope": 46010,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 45917,
            "nodeType": "FunctionDefinition",
            "src": "2367:153:28",
            "nodes": [],
            "body": {
              "id": 45916,
              "nodeType": "Block",
              "src": "2432:88:28",
              "nodes": [],
              "statements": [
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 45909,
                        "name": "enabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45903,
                        "src": "2471:7:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 45908,
                      "name": "Permit2AllowanceUpdated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46077,
                      "src": "2447:23:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_bool_$returns$__$",
                        "typeString": "function (bool)"
                      }
                    },
                    "id": 45910,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2447:32:28",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 45911,
                  "nodeType": "EmitStatement",
                  "src": "2442:37:28"
                },
                {
                  "expression": {
                    "id": 45914,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 45912,
                      "name": "permit2Enabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45763,
                      "src": "2489:14:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 45913,
                      "name": "enabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45903,
                      "src": "2506:7:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "2489:24:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 45915,
                  "nodeType": "ExpressionStatement",
                  "src": "2489:24:28"
                }
              ]
            },
            "documentation": {
              "id": 45901,
              "nodeType": "StructuredDocumentation",
              "src": "2200:162:28",
              "text": " @dev used to update if to default approve permit2 address for all addresses\n @param enabled if the default approval should be done or not"
            },
            "functionSelector": "705e6a5b",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 45906,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 45905,
                  "name": "onlyOwner",
                  "nameLocations": ["2422:9:28"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "2422:9:28"
                },
                "nodeType": "ModifierInvocation",
                "src": "2422:9:28"
              }
            ],
            "name": "updatePermit2Allowance",
            "nameLocation": "2376:22:28",
            "parameters": {
              "id": 45904,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45903,
                  "mutability": "mutable",
                  "name": "enabled",
                  "nameLocation": "2404:7:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45917,
                  "src": "2399:12:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 45902,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2399:4:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2398:14:28"
            },
            "returnParameters": {
              "id": 45907,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2432:0:28"
            },
            "scope": 46010,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 45947,
            "nodeType": "FunctionDefinition",
            "src": "2653:223:28",
            "nodes": [],
            "body": {
              "id": 45946,
              "nodeType": "Block",
              "src": "2744:132:28",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 45932,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "id": 45930,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 45928,
                        "name": "spender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45922,
                        "src": "2758:7:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "id": 45929,
                        "name": "PERMIT2",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45757,
                        "src": "2769:7:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "src": "2758:18:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "id": 45931,
                      "name": "permit2Enabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 45763,
                      "src": "2780:14:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "2758:36:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 45939,
                  "nodeType": "IfStatement",
                  "src": "2754:66:28",
                  "trueBody": {
                    "expression": {
                      "expression": {
                        "arguments": [
                          {
                            "id": 45935,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2808:7:28",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 45934,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2808:7:28",
                              "typeDescriptions": {}
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            }
                          ],
                          "id": 45933,
                          "name": "type",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -27,
                          "src": "2803:4:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                            "typeString": "function () pure"
                          }
                        },
                        "id": 45936,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2803:13:28",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_meta_type_t_uint256",
                          "typeString": "type(uint256)"
                        }
                      },
                      "id": 45937,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberLocation": "2817:3:28",
                      "memberName": "max",
                      "nodeType": "MemberAccess",
                      "src": "2803:17:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "functionReturnParameters": 45927,
                    "id": 45938,
                    "nodeType": "Return",
                    "src": "2796:24:28"
                  }
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 45942,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45920,
                        "src": "2853:6:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 45943,
                        "name": "spender",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 45922,
                        "src": "2861:7:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 45940,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "2837:5:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_super$_Currency_$46010_$",
                          "typeString": "type(contract super Currency)"
                        }
                      },
                      "id": 45941,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "2843:9:28",
                      "memberName": "allowance",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 44514,
                      "src": "2837:15:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address,address) view returns (uint256)"
                      }
                    },
                    "id": 45944,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2837:32:28",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 45927,
                  "id": 45945,
                  "nodeType": "Return",
                  "src": "2830:39:28"
                }
              ]
            },
            "baseFunctions": [44514],
            "documentation": {
              "id": 45918,
              "nodeType": "StructuredDocumentation",
              "src": "2526:122:28",
              "text": "@dev The permit2 contract has full approval by default. If the approval is revoked, it can still be manually approved."
            },
            "functionSelector": "dd62ed3e",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "allowance",
            "nameLocation": "2662:9:28",
            "overrides": {
              "id": 45924,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2717:8:28"
            },
            "parameters": {
              "id": 45923,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45920,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "2680:6:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45947,
                  "src": "2672:14:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 45919,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2672:7:28",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 45922,
                  "mutability": "mutable",
                  "name": "spender",
                  "nameLocation": "2696:7:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 45947,
                  "src": "2688:15:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 45921,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2688:7:28",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2671:33:28"
            },
            "returnParameters": {
              "id": 45927,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45926,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 45947,
                  "src": "2735:7:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 45925,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2735:7:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2734:9:28"
            },
            "scope": 46010,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 46009,
            "nodeType": "FunctionDefinition",
            "src": "3094:372:28",
            "nodes": [],
            "body": {
              "id": 46008,
              "nodeType": "Block",
              "src": "3163:303:28",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 45966,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 45960,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 45951,
                          "src": "3185:5:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20Token_$46406",
                            "typeString": "contract ERC20Token"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_ERC20Token_$46406",
                            "typeString": "contract ERC20Token"
                          }
                        ],
                        "id": 45959,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3177:7:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 45958,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3177:7:28",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 45961,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3177:14:28",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 45964,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3203:1:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 45963,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3195:7:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 45962,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3195:7:28",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 45965,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3195:10:28",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "3177:28:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 46006,
                    "nodeType": "Block",
                    "src": "3318:142:28",
                    "statements": [
                      {
                        "assignments": [45986, null],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 45986,
                            "mutability": "mutable",
                            "name": "success",
                            "nameLocation": "3338:7:28",
                            "nodeType": "VariableDeclaration",
                            "scope": 46006,
                            "src": "3333:12:28",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 45985,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "3333:4:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "visibility": "internal"
                          },
                          null
                        ],
                        "id": 46000,
                        "initialValue": {
                          "arguments": [
                            {
                              "hexValue": "",
                              "id": 45998,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3397:2:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              },
                              "value": ""
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                  "typeString": "literal_string \"\""
                                }
                              ],
                              "expression": {
                                "arguments": [
                                  {
                                    "id": 45989,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 45953,
                                    "src": "3358:2:28",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 45988,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "3350:8:28",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_payable_$",
                                    "typeString": "type(address payable)"
                                  },
                                  "typeName": {
                                    "id": 45987,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3350:8:28",
                                    "stateMutability": "payable",
                                    "typeDescriptions": {}
                                  }
                                },
                                "id": 45990,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3350:11:28",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "id": 45991,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "3362:4:28",
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "src": "3350:16:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 45997,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": ["value"],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "expression": {
                                  "arguments": [
                                    {
                                      "id": 45994,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "3382:4:28",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_Currency_$46010",
                                        "typeString": "contract Currency"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_Currency_$46010",
                                        "typeString": "contract Currency"
                                      }
                                    ],
                                    "id": 45993,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "3374:7:28",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 45992,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "3374:7:28",
                                      "typeDescriptions": {}
                                    }
                                  },
                                  "id": 45995,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "nameLocations": [],
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3374:13:28",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 45996,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "3388:7:28",
                                "memberName": "balance",
                                "nodeType": "MemberAccess",
                                "src": "3374:21:28",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "3350:46:28",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 45999,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3350:50:28",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3332:68:28"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 46002,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 45986,
                              "src": "3422:7:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "hexValue": "7769746864726177206661696c6564",
                              "id": 46003,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3431:17:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f788322002b8424ed68b8abd50be064ad13f3c130a8b07f2a88c6b5024ee35fe",
                                "typeString": "literal_string \"withdraw failed\""
                              },
                              "value": "withdraw failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f788322002b8424ed68b8abd50be064ad13f3c130a8b07f2a88c6b5024ee35fe",
                                "typeString": "literal_string \"withdraw failed\""
                              }
                            ],
                            "id": 46001,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [-18, -18],
                            "referencedDeclaration": -18,
                            "src": "3414:7:28",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 46004,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3414:35:28",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 46005,
                        "nodeType": "ExpressionStatement",
                        "src": "3414:35:28"
                      }
                    ]
                  },
                  "id": 46007,
                  "nodeType": "IfStatement",
                  "src": "3173:287:28",
                  "trueBody": {
                    "id": 45984,
                    "nodeType": "Block",
                    "src": "3207:105:28",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "id": 45972,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 45951,
                                  "src": "3258:5:28",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ERC20Token_$46406",
                                    "typeString": "contract ERC20Token"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ERC20Token_$46406",
                                    "typeString": "contract ERC20Token"
                                  }
                                ],
                                "id": 45971,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3250:7:28",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 45970,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3250:7:28",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 45973,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "nameLocations": [],
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3250:14:28",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 45974,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 45953,
                              "src": "3266:2:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "arguments": [
                                {
                                  "arguments": [
                                    {
                                      "id": 45979,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "3294:4:28",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_Currency_$46010",
                                        "typeString": "contract Currency"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_Currency_$46010",
                                        "typeString": "contract Currency"
                                      }
                                    ],
                                    "id": 45978,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "3286:7:28",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 45977,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "3286:7:28",
                                      "typeDescriptions": {}
                                    }
                                  },
                                  "id": 45980,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "nameLocations": [],
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3286:13:28",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "id": 45975,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 45951,
                                  "src": "3270:5:28",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ERC20Token_$46406",
                                    "typeString": "contract ERC20Token"
                                  }
                                },
                                "id": 45976,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "3276:9:28",
                                "memberName": "balanceOf",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 44502,
                                "src": "3270:15:28",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address) view external returns (uint256)"
                                }
                              },
                              "id": 45981,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "nameLocations": [],
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3270:30:28",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "id": 45967,
                              "name": "SafeTransferLib",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 44996,
                              "src": "3221:15:28",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_SafeTransferLib_$44996_$",
                                "typeString": "type(library SafeTransferLib)"
                              }
                            },
                            "id": 45969,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "3237:12:28",
                            "memberName": "safeTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 44947,
                            "src": "3221:28:28",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 45982,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3221:80:28",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 45983,
                        "nodeType": "ExpressionStatement",
                        "src": "3221:80:28"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 45948,
              "nodeType": "StructuredDocumentation",
              "src": "2882:207:28",
              "text": " @dev withdraw token. For cases where people mistakenly send other tokens to this address\n @param token address of the token to withdraw\n @param to account to withdraw tokens to"
            },
            "functionSelector": "feaea586",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 45956,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 45955,
                  "name": "onlyOwner",
                  "nameLocations": ["3153:9:28"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "3153:9:28"
                },
                "nodeType": "ModifierInvocation",
                "src": "3153:9:28"
              }
            ],
            "name": "recoverToken",
            "nameLocation": "3103:12:28",
            "parameters": {
              "id": 45954,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 45951,
                  "mutability": "mutable",
                  "name": "token",
                  "nameLocation": "3127:5:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 46009,
                  "src": "3116:16:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46406",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 45950,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 45949,
                      "name": "ERC20Token",
                      "nameLocations": ["3116:10:28"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46406,
                      "src": "3116:10:28"
                    },
                    "referencedDeclaration": 46406,
                    "src": "3116:10:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46406",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 45953,
                  "mutability": "mutable",
                  "name": "to",
                  "nameLocation": "3142:2:28",
                  "nodeType": "VariableDeclaration",
                  "scope": 46009,
                  "src": "3134:10:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 45952,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3134:7:28",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3115:30:28"
            },
            "returnParameters": {
              "id": 45957,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3163:0:28"
            },
            "scope": 46010,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 45747,
              "name": "Ownable",
              "nameLocations": ["397:7:28"],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 44381,
              "src": "397:7:28"
            },
            "id": 45748,
            "nodeType": "InheritanceSpecifier",
            "src": "397:7:28"
          },
          {
            "baseName": {
              "id": 45749,
              "name": "ERC20",
              "nameLocations": ["406:5:28"],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 44800,
              "src": "406:5:28"
            },
            "id": 45750,
            "nodeType": "InheritanceSpecifier",
            "src": "406:5:28"
          },
          {
            "baseName": {
              "id": 45751,
              "name": "ICurrency",
              "nameLocations": ["413:9:28"],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 46096,
              "src": "413:9:28"
            },
            "id": 45752,
            "nodeType": "InheritanceSpecifier",
            "src": "413:9:28"
          }
        ],
        "canonicalName": "Currency",
        "contractDependencies": [],
        "contractKind": "contract",
        "fullyImplemented": true,
        "linearizedBaseContracts": [46010, 46096, 44800, 44381],
        "name": "Currency",
        "nameLocation": "385:8:28",
        "scope": 46011,
        "usedErrors": [
          44193, 44196, 44199, 44202, 44387, 44390, 44393, 44396, 44399, 44402, 44405, 45754
        ],
        "usedEvents": [44209, 44214, 44219, 44414, 44423, 46077]
      }
    ],
    "license": "GPL-3.0"
  },
  "id": 28
}
