{
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "tokenHolder",
          "type": "address"
        }
      ],
      "name": "AuthorizedOperator",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "operatorData",
          "type": "bytes"
        }
      ],
      "name": "Burned",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "amount",
          "type": "uint64"
        }
      ],
      "name": "DepositStake",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "operatorData",
          "type": "bytes"
        }
      ],
      "name": "Minted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "tokenHolder",
          "type": "address"
        }
      ],
      "name": "RevokedOperator",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "operatorData",
          "type": "bytes"
        }
      ],
      "name": "Sent",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "period",
          "type": "uint256"
        }
      ],
      "name": "SetPeriodInSeconds",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "withdrawPerPeriod",
          "type": "uint256"
        }
      ],
      "name": "SetStakeWithdrawPerPeriod",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "amount",
          "type": "uint64"
        }
      ],
      "name": "SlashStake",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "WithdawStake",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "holder",
          "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": "value",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "authorizeOperator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenHolder",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "burn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "defaultOperators",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "granularity",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "tokenHolder",
          "type": "address"
        }
      ],
      "name": "isOperatorFor",
      "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": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "operatorData",
          "type": "bytes"
        }
      ],
      "name": "operatorBurn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "operatorData",
          "type": "bytes"
        }
      ],
      "name": "operatorSend",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "periodInSeconds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "revokeOperator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "send",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "onBehalfOf",
          "type": "address"
        },
        {
          "internalType": "uint64",
          "name": "amount",
          "type": "uint64"
        }
      ],
      "name": "stake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "staker",
          "type": "address"
        }
      ],
      "name": "stakeOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakeWithdrawPerPeriod",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "userData",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "operatorData",
          "type": "bytes"
        }
      ],
      "name": "tokensReceived",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "holder",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "amount",
          "type": "uint64"
        }
      ],
      "name": "unstake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": {
    "object": "0x",
    "sourceMap": "",
    "linkReferences": {}
  },
  "deployedBytecode": {
    "object": "0x",
    "sourceMap": "",
    "linkReferences": {}
  },
  "userdoc": {
    "version": 1,
    "kind": "user"
  },
  "devdoc": {
    "version": 1,
    "kind": "dev",
    "details": "A staking token that only allows users to withdraw their      stake at a particular rate.",
    "methods": {
      "allowance(address,address)": {
        "details": "See {IERC20-allowance}. Note that operator and allowance concepts are orthogonal: operators may not have allowance, and accounts with allowance may not be operators themselves."
      },
      "approve(address,uint256)": {
        "details": "See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Note that accounts cannot have allowance issued by their operators."
      },
      "authorizeOperator(address)": {
        "details": "See {IERC777-authorizeOperator}."
      },
      "balanceOf(address)": {
        "details": "Returns the amount of tokens owned by an account (`tokenHolder`)."
      },
      "burn(uint256,bytes)": {
        "details": "See {IERC777-burn}. Also emits a {IERC20-Transfer} event for ERC20 compatibility."
      },
      "decimals()": {
        "details": "See {ERC20-decimals}. Always returns 18, as per the [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility)."
      },
      "defaultOperators()": {
        "details": "See {IERC777-defaultOperators}."
      },
      "granularity()": {
        "details": "See {IERC777-granularity}. This implementation always returns `1`."
      },
      "isOperatorFor(address,address)": {
        "details": "See {IERC777-isOperatorFor}."
      },
      "name()": {
        "details": "See {IERC777-name}."
      },
      "operatorBurn(address,uint256,bytes,bytes)": {
        "details": "See {IERC777-operatorBurn}. Emits {Burned} and {IERC20-Transfer} events."
      },
      "operatorSend(address,address,uint256,bytes,bytes)": {
        "details": "See {IERC777-operatorSend}. Emits {Sent} and {IERC20-Transfer} events."
      },
      "periodInSeconds()": {
        "details": "The length of the withdraw period"
      },
      "revokeOperator(address)": {
        "details": "See {IERC777-revokeOperator}."
      },
      "send(address,uint256,bytes)": {
        "details": "See {IERC777-send}. Also emits a {IERC20-Transfer} event for ERC20 compatibility."
      },
      "stake(address,uint64)": {
        "details": "Deposits tokens, as a stake, on behalf of a user."
      },
      "stakeOf(address)": {
        "details": "The stake amount of a user."
      },
      "stakeWithdrawPerPeriod()": {
        "details": "The amount of tokens that can be withdrawn per period."
      },
      "symbol()": {
        "details": "See {IERC777-symbol}."
      },
      "tokensReceived(address,address,address,uint256,bytes,bytes)": {
        "details": "Called by an {IERC777} token contract whenever tokens are being moved or created into a registered account (`to`). The type of operation is conveyed by `from` being the zero address or not. This call occurs _after_ the token contract's state is updated, so {IERC777-balanceOf}, etc., can be used to query the post-operation state. This function may revert to prevent the operation from being executed."
      },
      "totalSupply()": {
        "details": "See {IERC777-totalSupply}."
      },
      "transfer(address,uint256)": {
        "details": "See {IERC20-transfer}. Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient} interface if it is a contract. Also emits a {Sent} event."
      },
      "transferFrom(address,address,uint256)": {
        "details": "See {IERC20-transferFrom}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Note that operator and allowance concepts are orthogonal: operators cannot call `transferFrom` (unless they have allowance), and accounts with allowance cannot call `operatorSend` (unless they are operators). Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events."
      },
      "unstake(uint64)": {
        "details": "withdraws a stake, if enough time has passed since the last withdrawal"
      }
    },
    "title": "TimeDelayStakingToken"
  },
  "ast": {
    "absolutePath": "/Users/evanconrad/dev/src/strangemoodfoundation/strangemood-eth/src/contracts/lib/Stake.sol",
    "exportedSymbols": {
      "Address": [
        2382
      ],
      "Context": [
        2404
      ],
      "ERC20": [
        690
      ],
      "ERC777": [
        1884
      ],
      "IERC1820Registry": [
        2494
      ],
      "IERC20": [
        768
      ],
      "IERC20Metadata": [
        793
      ],
      "IERC777": [
        2047
      ],
      "IERC777Recipient": [
        2067
      ],
      "IERC777Sender": [
        2087
      ],
      "Math": [
        5394
      ],
      "Ownable": [
        104
      ],
      "TimeDelayStakingToken": [
        5769
      ]
    },
    "id": 5770,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5396,
        "literals": [
          "solidity",
          "0.8",
          ".13"
        ],
        "nodeType": "PragmaDirective",
        "src": "32:23:20"
      },
      {
        "absolutePath": "/Users/evanconrad/dev/src/strangemoodfoundation/strangemood-eth/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol",
        "file": "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol",
        "id": 5397,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 5770,
        "sourceUnit": 691,
        "src": "57:64:20",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/evanconrad/dev/src/strangemoodfoundation/strangemood-eth/lib/openzeppelin-contracts/contracts/token/ERC777/ERC777.sol",
        "file": "openzeppelin-contracts/contracts/token/ERC777/ERC777.sol",
        "id": 5398,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 5770,
        "sourceUnit": 1885,
        "src": "122:66:20",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/evanconrad/dev/src/strangemoodfoundation/strangemood-eth/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777Recipient.sol",
        "file": "openzeppelin-contracts/contracts/token/ERC777/IERC777Recipient.sol",
        "id": 5399,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 5770,
        "sourceUnit": 2068,
        "src": "189:76:20",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/evanconrad/dev/src/strangemoodfoundation/strangemood-eth/lib/openzeppelin-contracts/contracts/access/Ownable.sol",
        "file": "openzeppelin-contracts/contracts/access/Ownable.sol",
        "id": 5400,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 5770,
        "sourceUnit": 105,
        "src": "266:61:20",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/evanconrad/dev/src/strangemoodfoundation/strangemood-eth/src/contracts/lib/Math.sol",
        "file": "./Math.sol",
        "id": 5401,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 5770,
        "sourceUnit": 5395,
        "src": "328:20:20",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 5403,
              "name": "ERC777",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 1884,
              "src": "529:6:20"
            },
            "id": 5404,
            "nodeType": "InheritanceSpecifier",
            "src": "529:6:20"
          },
          {
            "baseName": {
              "id": 5405,
              "name": "IERC777Recipient",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 2067,
              "src": "537:16:20"
            },
            "id": 5406,
            "nodeType": "InheritanceSpecifier",
            "src": "537:16:20"
          },
          {
            "baseName": {
              "id": 5407,
              "name": "Math",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 5394,
              "src": "555:4:20"
            },
            "id": 5408,
            "nodeType": "InheritanceSpecifier",
            "src": "555:4:20"
          }
        ],
        "canonicalName": "TimeDelayStakingToken",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 5402,
          "nodeType": "StructuredDocumentation",
          "src": "350:136:20",
          "text": "@title TimeDelayStakingToken\n @dev A staking token that only allows users to withdraw their\n      stake at a particular rate."
        },
        "fullyImplemented": false,
        "id": 5769,
        "linearizedBaseContracts": [
          5769,
          5394,
          2067,
          1884,
          768,
          2047,
          2404
        ],
        "name": "TimeDelayStakingToken",
        "nameLocation": "504:21:20",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "documentation": {
              "id": 5409,
              "nodeType": "StructuredDocumentation",
              "src": "566:45:20",
              "text": "@dev How much you can withdraw per period"
            },
            "id": 5411,
            "mutability": "mutable",
            "name": "_stakeWithdrawPerPeriod",
            "nameLocation": "632:23:20",
            "nodeType": "VariableDeclaration",
            "scope": 5769,
            "src": "616:39:20",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 5410,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "616:7:20",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "private"
          },
          {
            "constant": false,
            "documentation": {
              "id": 5412,
              "nodeType": "StructuredDocumentation",
              "src": "662:41:20",
              "text": "@dev How many seconds a period lasts."
            },
            "id": 5414,
            "mutability": "mutable",
            "name": "_periodInSeconds",
            "nameLocation": "724:16:20",
            "nodeType": "VariableDeclaration",
            "scope": 5769,
            "src": "708:32:20",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 5413,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "708:7:20",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "private"
          },
          {
            "body": {
              "id": 5452,
              "nodeType": "Block",
              "src": "793:377:20",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5424,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 5422,
                          "name": "period",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5418,
                          "src": "824:6:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "hexValue": "30",
                          "id": 5423,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "833:1:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "824:10:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "54696d6544656c61795374616b696e67546f6b656e3a20706572696f64496e5365636f6e6473206d7573742062652067726561746572207468616e2030",
                        "id": 5425,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "848:63:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_eec9c26694b414bab99ff43b3d0b7768035598766b4ec50202f115e97ec4ca7c",
                          "typeString": "literal_string \"TimeDelayStakingToken: periodInSeconds must be greater than 0\""
                        },
                        "value": "TimeDelayStakingToken: periodInSeconds must be greater than 0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_eec9c26694b414bab99ff43b3d0b7768035598766b4ec50202f115e97ec4ca7c",
                          "typeString": "literal_string \"TimeDelayStakingToken: periodInSeconds must be greater than 0\""
                        }
                      ],
                      "id": 5421,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "803:7:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5426,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "803:118:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5427,
                  "nodeType": "ExpressionStatement",
                  "src": "803:118:20"
                },
                {
                  "expression": {
                    "id": 5430,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 5428,
                      "name": "_stakeWithdrawPerPeriod",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5411,
                      "src": "931:23:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 5429,
                      "name": "withdraw",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5416,
                      "src": "957:8:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "931:34:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5431,
                  "nodeType": "ExpressionStatement",
                  "src": "931:34:20"
                },
                {
                  "expression": {
                    "id": 5434,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 5432,
                      "name": "_periodInSeconds",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5414,
                      "src": "975:16:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 5433,
                      "name": "period",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5418,
                      "src": "994:6:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "975:25:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5435,
                  "nodeType": "ExpressionStatement",
                  "src": "975:25:20"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 5441,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "1073:4:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          ],
                          "id": 5440,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1065:7:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 5439,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "1065:7:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5442,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1065:13:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "455243373737546f6b656e73526563697069656e74",
                            "id": 5444,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1102:23:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_b281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b",
                              "typeString": "literal_string \"ERC777TokensRecipient\""
                            },
                            "value": "ERC777TokensRecipient"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_b281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b",
                              "typeString": "literal_string \"ERC777TokensRecipient\""
                            }
                          ],
                          "id": 5443,
                          "name": "keccak256",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -8,
                          "src": "1092:9:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                            "typeString": "function (bytes memory) pure returns (bytes32)"
                          }
                        },
                        "id": 5445,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1092:34:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 5448,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "1148:4:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          ],
                          "id": 5447,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1140:7:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 5446,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "1140:7:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5449,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1140:13:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 5436,
                        "name": "_ERC1820_REGISTRY",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 818,
                        "src": "1010:17:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC1820Registry_$2494",
                          "typeString": "contract IERC1820Registry"
                        }
                      },
                      "id": 5438,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "setInterfaceImplementer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2447,
                      "src": "1010:41:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (address,bytes32,address) external"
                      }
                    },
                    "id": 5450,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1010:153:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5451,
                  "nodeType": "ExpressionStatement",
                  "src": "1010:153:20"
                }
              ]
            },
            "id": 5453,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5419,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5416,
                  "mutability": "mutable",
                  "name": "withdraw",
                  "nameLocation": "767:8:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5453,
                  "src": "759:16:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5415,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "759:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5418,
                  "mutability": "mutable",
                  "name": "period",
                  "nameLocation": "785:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5453,
                  "src": "777:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5417,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "777:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "758:34:20"
            },
            "returnParameters": {
              "id": 5420,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "793:0:20"
            },
            "scope": 5769,
            "src": "747:423:20",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 5454,
              "nodeType": "StructuredDocumentation",
              "src": "1176:74:20",
              "text": " @dev Emitted when `_stakeWithdrawPerPeriod` is updated."
            },
            "eventSelector": "fbc4496ca6532747599b23a2368944516b905f7ac9c2c6cfc77d8952a1f0a22b",
            "id": 5458,
            "name": "SetStakeWithdrawPerPeriod",
            "nameLocation": "1261:25:20",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5457,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5456,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "withdrawPerPeriod",
                  "nameLocation": "1303:17:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5458,
                  "src": "1287:33:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5455,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1287:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1286:35:20"
            },
            "src": "1255:67:20"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 5459,
              "nodeType": "StructuredDocumentation",
              "src": "1328:67:20",
              "text": " @dev Emitted when `_periodInSeconds` is updated."
            },
            "eventSelector": "dfcdd39fe8245a262861d5362cbc8dcb2805b9c7a8e3d2e4dd24fd1f98835c3f",
            "id": 5463,
            "name": "SetPeriodInSeconds",
            "nameLocation": "1406:18:20",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5462,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5461,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "period",
                  "nameLocation": "1441:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5463,
                  "src": "1425:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5460,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1425:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1424:24:20"
            },
            "src": "1400:49:20"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 5464,
              "nodeType": "StructuredDocumentation",
              "src": "1455:76:20",
              "text": " @dev Emitted when `sender` stakes `amount` with `staker`."
            },
            "eventSelector": "b33072c506a67dc50f69d8b7e118912f66c80a3cfb306f174d7289adc3ac18b1",
            "id": 5472,
            "name": "DepositStake",
            "nameLocation": "1542:12:20",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5471,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5466,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "1580:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5472,
                  "src": "1564:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5465,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1564:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5468,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "staker",
                  "nameLocation": "1612:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5472,
                  "src": "1596:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5467,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1596:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5470,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "1643:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5472,
                  "src": "1628:21:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 5469,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "1628:6:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1554:101:20"
            },
            "src": "1536:120:20"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 5473,
              "nodeType": "StructuredDocumentation",
              "src": "1662:76:20",
              "text": " @dev Emitted when `sender` withdraws `amount` from stake."
            },
            "eventSelector": "84ebd516d047a386d279fa31aed3b1b821d8ffffebd13fadc56f9baee2e5501a",
            "id": 5479,
            "name": "WithdawStake",
            "nameLocation": "1749:12:20",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5478,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5475,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sender",
                  "nameLocation": "1778:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5479,
                  "src": "1762:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5474,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1762:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5477,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "1802:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5479,
                  "src": "1786:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5476,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1786:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1761:48:20"
            },
            "src": "1743:67:20"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 5480,
              "nodeType": "StructuredDocumentation",
              "src": "1816:70:20",
              "text": " @dev Emitted when `amount` is burned from `staker`."
            },
            "eventSelector": "cfd6a5fd61d8e12d0c5d1c1e5bd4ace166cec6b33e227c4af25be2cbe17dd21f",
            "id": 5486,
            "name": "SlashStake",
            "nameLocation": "1897:10:20",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5485,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5482,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "staker",
                  "nameLocation": "1924:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5486,
                  "src": "1908:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5481,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1908:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5484,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "1947:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5486,
                  "src": "1932:21:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 5483,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "1932:6:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1907:47:20"
            },
            "src": "1891:64:20"
          },
          {
            "baseFunctions": [
              2066
            ],
            "body": {
              "id": 5501,
              "nodeType": "Block",
              "src": "2160:2:20",
              "statements": []
            },
            "functionSelector": "0023de29",
            "id": 5502,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tokensReceived",
            "nameLocation": "1970:14:20",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5499,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5488,
                  "mutability": "mutable",
                  "name": "operator",
                  "nameLocation": "2002:8:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5502,
                  "src": "1994:16:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5487,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1994:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5490,
                  "mutability": "mutable",
                  "name": "from",
                  "nameLocation": "2028:4:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5502,
                  "src": "2020:12:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5489,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2020:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5492,
                  "mutability": "mutable",
                  "name": "to",
                  "nameLocation": "2050:2:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5502,
                  "src": "2042:10:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5491,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2042:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5494,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "2070:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5502,
                  "src": "2062:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5493,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2062:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5496,
                  "mutability": "mutable",
                  "name": "userData",
                  "nameLocation": "2101:8:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5502,
                  "src": "2086:23:20",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 5495,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2086:5:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5498,
                  "mutability": "mutable",
                  "name": "operatorData",
                  "nameLocation": "2134:12:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5502,
                  "src": "2119:27:20",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 5497,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2119:5:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1984:168:20"
            },
            "returnParameters": {
              "id": 5500,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2160:0:20"
            },
            "scope": 5769,
            "src": "1961:201:20",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "canonicalName": "TimeDelayStakingToken.Stake",
            "id": 5508,
            "members": [
              {
                "constant": false,
                "id": 5505,
                "mutability": "mutable",
                "name": "lastWithdrawAt",
                "nameLocation": "2233:14:20",
                "nodeType": "VariableDeclaration",
                "scope": 5508,
                "src": "2225:22:20",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 5504,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "2225:7:20",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 5507,
                "mutability": "mutable",
                "name": "amount",
                "nameLocation": "2265:6:20",
                "nodeType": "VariableDeclaration",
                "scope": 5508,
                "src": "2257:14:20",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 5506,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "2257:7:20",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "Stake",
            "nameLocation": "2175:5:20",
            "nodeType": "StructDefinition",
            "scope": 5769,
            "src": "2168:110:20",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 5513,
            "mutability": "mutable",
            "name": "_stakers",
            "nameLocation": "2318:8:20",
            "nodeType": "VariableDeclaration",
            "scope": 5769,
            "src": "2284:42:20",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
              "typeString": "mapping(address => struct TimeDelayStakingToken.Stake)"
            },
            "typeName": {
              "id": 5512,
              "keyType": {
                "id": 5509,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "2292:7:20",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "2284:25:20",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                "typeString": "mapping(address => struct TimeDelayStakingToken.Stake)"
              },
              "valueType": {
                "id": 5511,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 5510,
                  "name": "Stake",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 5508,
                  "src": "2303:5:20"
                },
                "referencedDeclaration": 5508,
                "src": "2303:5:20",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Stake_$5508_storage_ptr",
                  "typeString": "struct TimeDelayStakingToken.Stake"
                }
              }
            },
            "visibility": "private"
          },
          {
            "body": {
              "id": 5527,
              "nodeType": "Block",
              "src": "2475:119:20",
              "statements": [
                {
                  "expression": {
                    "id": 5521,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 5519,
                      "name": "_stakeWithdrawPerPeriod",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5411,
                      "src": "2485:23:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 5520,
                      "name": "withdrawPerPeriod",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5516,
                      "src": "2511:17:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2485:43:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5522,
                  "nodeType": "ExpressionStatement",
                  "src": "2485:43:20"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 5524,
                        "name": "withdrawPerPeriod",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5516,
                        "src": "2569:17:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 5523,
                      "name": "SetStakeWithdrawPerPeriod",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5458,
                      "src": "2543:25:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 5525,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2543:44:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5526,
                  "nodeType": "EmitStatement",
                  "src": "2538:49:20"
                }
              ]
            },
            "documentation": {
              "id": 5514,
              "nodeType": "StructuredDocumentation",
              "src": "2333:65:20",
              "text": "@dev Allows an implementer to modify the withdraw per period."
            },
            "id": 5528,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setStakeWithdrawPerPeriod",
            "nameLocation": "2412:26:20",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5517,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5516,
                  "mutability": "mutable",
                  "name": "withdrawPerPeriod",
                  "nameLocation": "2447:17:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5528,
                  "src": "2439:25:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5515,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2439:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2438:27:20"
            },
            "returnParameters": {
              "id": 5518,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2475:0:20"
            },
            "scope": 5769,
            "src": "2403:191:20",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5549,
              "nodeType": "Block",
              "src": "2722:211:20",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5537,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 5535,
                          "name": "period",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5531,
                          "src": "2753:6:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "hexValue": "30",
                          "id": 5536,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2762:1:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2753:10:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "54696d6544656c61795374616b696e67546f6b656e3a20706572696f64496e5365636f6e6473206d7573742062652067726561746572207468616e2030",
                        "id": 5538,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2777:63:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_eec9c26694b414bab99ff43b3d0b7768035598766b4ec50202f115e97ec4ca7c",
                          "typeString": "literal_string \"TimeDelayStakingToken: periodInSeconds must be greater than 0\""
                        },
                        "value": "TimeDelayStakingToken: periodInSeconds must be greater than 0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_eec9c26694b414bab99ff43b3d0b7768035598766b4ec50202f115e97ec4ca7c",
                          "typeString": "literal_string \"TimeDelayStakingToken: periodInSeconds must be greater than 0\""
                        }
                      ],
                      "id": 5534,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2732:7:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5539,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2732:118:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5540,
                  "nodeType": "ExpressionStatement",
                  "src": "2732:118:20"
                },
                {
                  "expression": {
                    "id": 5543,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 5541,
                      "name": "_periodInSeconds",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5414,
                      "src": "2860:16:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 5542,
                      "name": "period",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5531,
                      "src": "2879:6:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2860:25:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5544,
                  "nodeType": "ExpressionStatement",
                  "src": "2860:25:20"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 5546,
                        "name": "period",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5531,
                        "src": "2919:6:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 5545,
                      "name": "SetPeriodInSeconds",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5463,
                      "src": "2900:18:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 5547,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2900:26:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5548,
                  "nodeType": "EmitStatement",
                  "src": "2895:31:20"
                }
              ]
            },
            "documentation": {
              "id": 5529,
              "nodeType": "StructuredDocumentation",
              "src": "2600:63:20",
              "text": "@dev Allows an implementer to modify the period in seconds."
            },
            "id": 5550,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setPeriodInSeconds",
            "nameLocation": "2677:19:20",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5532,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5531,
                  "mutability": "mutable",
                  "name": "period",
                  "nameLocation": "2705:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5550,
                  "src": "2697:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5530,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2697:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2696:16:20"
            },
            "returnParameters": {
              "id": 5533,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2722:0:20"
            },
            "scope": 5769,
            "src": "2668:265:20",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5558,
              "nodeType": "Block",
              "src": "3043:40:20",
              "statements": [
                {
                  "expression": {
                    "id": 5556,
                    "name": "_periodInSeconds",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5414,
                    "src": "3060:16:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5555,
                  "id": 5557,
                  "nodeType": "Return",
                  "src": "3053:23:20"
                }
              ]
            },
            "documentation": {
              "id": 5551,
              "nodeType": "StructuredDocumentation",
              "src": "2939:42:20",
              "text": "@dev The length of the withdraw period"
            },
            "functionSelector": "c1dc0f07",
            "id": 5559,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "periodInSeconds",
            "nameLocation": "2995:15:20",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5552,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3010:2:20"
            },
            "returnParameters": {
              "id": 5555,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5554,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5559,
                  "src": "3034:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5553,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3034:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3033:9:20"
            },
            "scope": 5769,
            "src": "2986:97:20",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5567,
              "nodeType": "Block",
              "src": "3221:47:20",
              "statements": [
                {
                  "expression": {
                    "id": 5565,
                    "name": "_stakeWithdrawPerPeriod",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5411,
                    "src": "3238:23:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5564,
                  "id": 5566,
                  "nodeType": "Return",
                  "src": "3231:30:20"
                }
              ]
            },
            "documentation": {
              "id": 5560,
              "nodeType": "StructuredDocumentation",
              "src": "3089:63:20",
              "text": "@dev The amount of tokens that can be withdrawn per period."
            },
            "functionSelector": "f1082f14",
            "id": 5568,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "stakeWithdrawPerPeriod",
            "nameLocation": "3166:22:20",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5561,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3188:2:20"
            },
            "returnParameters": {
              "id": 5564,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5563,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5568,
                  "src": "3212:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5562,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3212:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3211:9:20"
            },
            "scope": 5769,
            "src": "3157:111:20",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5581,
              "nodeType": "Block",
              "src": "3378:47:20",
              "statements": [
                {
                  "expression": {
                    "expression": {
                      "baseExpression": {
                        "id": 5576,
                        "name": "_stakers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5513,
                        "src": "3395:8:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                          "typeString": "mapping(address => struct TimeDelayStakingToken.Stake storage ref)"
                        }
                      },
                      "id": 5578,
                      "indexExpression": {
                        "id": 5577,
                        "name": "staker",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5571,
                        "src": "3404:6:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "3395:16:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Stake_$5508_storage",
                        "typeString": "struct TimeDelayStakingToken.Stake storage ref"
                      }
                    },
                    "id": 5579,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "amount",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 5507,
                    "src": "3395:23:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5575,
                  "id": 5580,
                  "nodeType": "Return",
                  "src": "3388:30:20"
                }
              ]
            },
            "documentation": {
              "id": 5569,
              "nodeType": "StructuredDocumentation",
              "src": "3274:36:20",
              "text": "@dev The stake amount of a user."
            },
            "functionSelector": "42623360",
            "id": 5582,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "stakeOf",
            "nameLocation": "3324:7:20",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5572,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5571,
                  "mutability": "mutable",
                  "name": "staker",
                  "nameLocation": "3340:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5582,
                  "src": "3332:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5570,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3332:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3331:16:20"
            },
            "returnParameters": {
              "id": 5575,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5574,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5582,
                  "src": "3369:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5573,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3369:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3368:9:20"
            },
            "scope": 5769,
            "src": "3315:110:20",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5639,
              "nodeType": "Block",
              "src": "3551:300:20",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 5596,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 5591,
                          "name": "onBehalfOf",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5585,
                          "src": "3569:10:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "30",
                              "id": 5594,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3591:1:20",
                              "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": 5593,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3583:7:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 5592,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3583:7:20",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 5595,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3583:10:20",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "3569:24:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5590,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "3561:7:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 5597,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3561:33:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5598,
                  "nodeType": "ExpressionStatement",
                  "src": "3561:33:20"
                },
                {
                  "expression": {
                    "id": 5604,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 5599,
                          "name": "_stakers",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5513,
                          "src": "3605:8:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                            "typeString": "mapping(address => struct TimeDelayStakingToken.Stake storage ref)"
                          }
                        },
                        "id": 5601,
                        "indexExpression": {
                          "id": 5600,
                          "name": "onBehalfOf",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5585,
                          "src": "3614:10:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3605:20:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Stake_$5508_storage",
                          "typeString": "struct TimeDelayStakingToken.Stake storage ref"
                        }
                      },
                      "id": 5602,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "amount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5507,
                      "src": "3605:27:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 5603,
                      "name": "amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5587,
                      "src": "3636:6:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "src": "3605:37:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5605,
                  "nodeType": "ExpressionStatement",
                  "src": "3605:37:20"
                },
                {
                  "expression": {
                    "id": 5612,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 5606,
                          "name": "_stakers",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5513,
                          "src": "3652:8:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                            "typeString": "mapping(address => struct TimeDelayStakingToken.Stake storage ref)"
                          }
                        },
                        "id": 5608,
                        "indexExpression": {
                          "id": 5607,
                          "name": "onBehalfOf",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5585,
                          "src": "3661:10:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3652:20:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Stake_$5508_storage",
                          "typeString": "struct TimeDelayStakingToken.Stake storage ref"
                        }
                      },
                      "id": 5609,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "lastWithdrawAt",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5505,
                      "src": "3652:35:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "expression": {
                        "id": 5610,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "3690:5:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 5611,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "timestamp",
                      "nodeType": "MemberAccess",
                      "src": "3690:15:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3652:53:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5613,
                  "nodeType": "ExpressionStatement",
                  "src": "3652:53:20"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 5615,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "3729:3:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5616,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "3729:10:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 5619,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "3749:4:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          ],
                          "id": 5618,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3741:7:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 5617,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "3741:7:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5620,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3741:13:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 5621,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5587,
                        "src": "3756:6:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "",
                            "id": 5624,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3770:2:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            },
                            "value": ""
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            }
                          ],
                          "id": 5623,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3764:5:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                            "typeString": "type(bytes storage pointer)"
                          },
                          "typeName": {
                            "id": 5622,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "3764:5:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5625,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3764:9:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "",
                            "id": 5628,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3781:2:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            },
                            "value": ""
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            }
                          ],
                          "id": 5627,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3775:5:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                            "typeString": "type(bytes storage pointer)"
                          },
                          "typeName": {
                            "id": 5626,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "3775:5:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5629,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3775:9:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5614,
                      "name": "operatorSend",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1240,
                      "src": "3716:12:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$",
                        "typeString": "function (address,address,uint256,bytes memory,bytes memory)"
                      }
                    },
                    "id": 5630,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3716:69:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5631,
                  "nodeType": "ExpressionStatement",
                  "src": "3716:69:20"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 5633,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "3813:3:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5634,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "3813:10:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 5635,
                        "name": "onBehalfOf",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5585,
                        "src": "3825:10:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 5636,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5587,
                        "src": "3837:6:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      ],
                      "id": 5632,
                      "name": "DepositStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5472,
                      "src": "3800:12:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint64_$returns$__$",
                        "typeString": "function (address,address,uint64)"
                      }
                    },
                    "id": 5637,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3800:44:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5638,
                  "nodeType": "EmitStatement",
                  "src": "3795:49:20"
                }
              ]
            },
            "documentation": {
              "id": 5583,
              "nodeType": "StructuredDocumentation",
              "src": "3431:58:20",
              "text": "@dev Deposits tokens, as a stake, on behalf of a user."
            },
            "functionSelector": "81328538",
            "id": 5640,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "stake",
            "nameLocation": "3503:5:20",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5588,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5585,
                  "mutability": "mutable",
                  "name": "onBehalfOf",
                  "nameLocation": "3517:10:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5640,
                  "src": "3509:18:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5584,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3509:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5587,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "3536:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5640,
                  "src": "3529:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 5586,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "3529:6:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3508:35:20"
            },
            "returnParameters": {
              "id": 5589,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3551:0:20"
            },
            "scope": 5769,
            "src": "3494:357:20",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5720,
              "nodeType": "Block",
              "src": "3980:626:20",
              "statements": [
                {
                  "assignments": [
                    5647
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5647,
                      "mutability": "mutable",
                      "name": "lastWithdrawAt",
                      "nameLocation": "3998:14:20",
                      "nodeType": "VariableDeclaration",
                      "scope": 5720,
                      "src": "3990:22:20",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5646,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3990:7:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5653,
                  "initialValue": {
                    "expression": {
                      "baseExpression": {
                        "id": 5648,
                        "name": "_stakers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5513,
                        "src": "4015:8:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                          "typeString": "mapping(address => struct TimeDelayStakingToken.Stake storage ref)"
                        }
                      },
                      "id": 5651,
                      "indexExpression": {
                        "expression": {
                          "id": 5649,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "4024:3:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5650,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "4024:10:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "4015:20:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Stake_$5508_storage",
                        "typeString": "struct TimeDelayStakingToken.Stake storage ref"
                      }
                    },
                    "id": 5652,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "lastWithdrawAt",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 5505,
                    "src": "4015:35:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3990:60:20"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5660,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5658,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "expression": {
                              "id": 5655,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "4082:5:20",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 5656,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "timestamp",
                            "nodeType": "MemberAccess",
                            "src": "4082:15:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "id": 5657,
                            "name": "lastWithdrawAt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5647,
                            "src": "4100:14:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "4082:32:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "id": 5659,
                          "name": "_periodInSeconds",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5414,
                          "src": "4117:16:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "4082:51:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "54696d6544656c61795374616b696e67546f6b656e3a204e6f7420656e6f7567682074696d6520686173207061737365642073696e636520746865206c617374207769746864726177616c",
                        "id": 5661,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4147:77:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_b6c8c8d9533e7ad9ef00ea59bdb862524bfbd38d8b7f62975575ee7632f3feb0",
                          "typeString": "literal_string \"TimeDelayStakingToken: Not enough time has passed since the last withdrawal\""
                        },
                        "value": "TimeDelayStakingToken: Not enough time has passed since the last withdrawal"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_b6c8c8d9533e7ad9ef00ea59bdb862524bfbd38d8b7f62975575ee7632f3feb0",
                          "typeString": "literal_string \"TimeDelayStakingToken: Not enough time has passed since the last withdrawal\""
                        }
                      ],
                      "id": 5654,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4061:7:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5662,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4061:173:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5663,
                  "nodeType": "ExpressionStatement",
                  "src": "4061:173:20"
                },
                {
                  "assignments": [
                    5665
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5665,
                      "mutability": "mutable",
                      "name": "total",
                      "nameLocation": "4253:5:20",
                      "nodeType": "VariableDeclaration",
                      "scope": 5720,
                      "src": "4245:13:20",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5664,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4245:7:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5677,
                  "initialValue": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 5668,
                            "name": "_stakeWithdrawPerPeriod",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5411,
                            "src": "4282:23:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          {
                            "id": 5669,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5643,
                            "src": "4307:6:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          ],
                          "id": 5667,
                          "name": "min",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5393,
                          "src": "4278:3:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                          }
                        },
                        "id": 5670,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4278:36:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "expression": {
                          "baseExpression": {
                            "id": 5671,
                            "name": "_stakers",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5513,
                            "src": "4328:8:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                              "typeString": "mapping(address => struct TimeDelayStakingToken.Stake storage ref)"
                            }
                          },
                          "id": 5674,
                          "indexExpression": {
                            "expression": {
                              "id": 5672,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "4337:3:20",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 5673,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "4337:10:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4328:20:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Stake_$5508_storage",
                            "typeString": "struct TimeDelayStakingToken.Stake storage ref"
                          }
                        },
                        "id": 5675,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "amount",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5507,
                        "src": "4328:27:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 5666,
                      "name": "min",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5393,
                      "src": "4261:3:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 5676,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4261:104:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4245:120:20"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 5681,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "4389:4:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          ],
                          "id": 5680,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4381:7:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 5679,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "4381:7:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5682,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4381:13:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 5683,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "4396:3:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5684,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "4396:10:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 5685,
                        "name": "total",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5665,
                        "src": "4408:5:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "",
                            "id": 5688,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4421:2:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            },
                            "value": ""
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            }
                          ],
                          "id": 5687,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4415:5:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                            "typeString": "type(bytes storage pointer)"
                          },
                          "typeName": {
                            "id": 5686,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "4415:5:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5689,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4415:9:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "",
                            "id": 5692,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4432:2:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            },
                            "value": ""
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            }
                          ],
                          "id": 5691,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4426:5:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                            "typeString": "type(bytes storage pointer)"
                          },
                          "typeName": {
                            "id": 5690,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "4426:5:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5693,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4426:9:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "hexValue": "66616c7365",
                        "id": 5694,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "bool",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4437:5:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "value": "false"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 5678,
                      "name": "_send",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1520,
                      "src": "4375:5:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bool_$returns$__$",
                        "typeString": "function (address,address,uint256,bytes memory,bytes memory,bool)"
                      }
                    },
                    "id": 5695,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4375:68:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5696,
                  "nodeType": "ExpressionStatement",
                  "src": "4375:68:20"
                },
                {
                  "expression": {
                    "id": 5703,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 5697,
                          "name": "_stakers",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5513,
                          "src": "4454:8:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                            "typeString": "mapping(address => struct TimeDelayStakingToken.Stake storage ref)"
                          }
                        },
                        "id": 5700,
                        "indexExpression": {
                          "expression": {
                            "id": 5698,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "4463:3:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 5699,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "4463:10:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4454:20:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Stake_$5508_storage",
                          "typeString": "struct TimeDelayStakingToken.Stake storage ref"
                        }
                      },
                      "id": 5701,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "amount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5507,
                      "src": "4454:27:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 5702,
                      "name": "total",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5665,
                      "src": "4485:5:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4454:36:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5704,
                  "nodeType": "ExpressionStatement",
                  "src": "4454:36:20"
                },
                {
                  "expression": {
                    "id": 5712,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 5705,
                          "name": "_stakers",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5513,
                          "src": "4500:8:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                            "typeString": "mapping(address => struct TimeDelayStakingToken.Stake storage ref)"
                          }
                        },
                        "id": 5708,
                        "indexExpression": {
                          "expression": {
                            "id": 5706,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "4509:3:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 5707,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "4509:10:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4500:20:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Stake_$5508_storage",
                          "typeString": "struct TimeDelayStakingToken.Stake storage ref"
                        }
                      },
                      "id": 5709,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "lastWithdrawAt",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5505,
                      "src": "4500:35:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "expression": {
                        "id": 5710,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "4538:5:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 5711,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "timestamp",
                      "nodeType": "MemberAccess",
                      "src": "4538:15:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4500:53:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5713,
                  "nodeType": "ExpressionStatement",
                  "src": "4500:53:20"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 5715,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "4581:3:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5716,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "4581:10:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 5717,
                        "name": "total",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5665,
                        "src": "4593:5:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 5714,
                      "name": "WithdawStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5479,
                      "src": "4568:12:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 5718,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4568:31:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5719,
                  "nodeType": "EmitStatement",
                  "src": "4563:36:20"
                }
              ]
            },
            "documentation": {
              "id": 5641,
              "nodeType": "StructuredDocumentation",
              "src": "3857:79:20",
              "text": "@dev withdraws a stake, if enough time has passed since the last withdrawal"
            },
            "functionSelector": "d29ab87a",
            "id": 5721,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "unstake",
            "nameLocation": "3950:7:20",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5644,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5643,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "3965:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5721,
                  "src": "3958:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 5642,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "3958:6:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3957:15:20"
            },
            "returnParameters": {
              "id": 5645,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3980:0:20"
            },
            "scope": 5769,
            "src": "3941:665:20",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5767,
              "nodeType": "Block",
              "src": "4740:285:20",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5735,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "baseExpression": {
                              "id": 5730,
                              "name": "_stakers",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5513,
                              "src": "4771:8:20",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                                "typeString": "mapping(address => struct TimeDelayStakingToken.Stake storage ref)"
                              }
                            },
                            "id": 5732,
                            "indexExpression": {
                              "id": 5731,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5724,
                              "src": "4780:4:20",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "4771:14:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Stake_$5508_storage",
                              "typeString": "struct TimeDelayStakingToken.Stake storage ref"
                            }
                          },
                          "id": 5733,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "amount",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 5507,
                          "src": "4771:21:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "id": 5734,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5726,
                          "src": "4796:6:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "src": "4771:31:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "54696d6544656c61795374616b696e67546f6b656e3a204e6f7420656e6f75676820746f6b656e7320746f20736c617368",
                        "id": 5736,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4816:51:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ab262801bdee6b1ee20ea4d94d6e2fee936818a07f6778c83fb23aec092124c7",
                          "typeString": "literal_string \"TimeDelayStakingToken: Not enough tokens to slash\""
                        },
                        "value": "TimeDelayStakingToken: Not enough tokens to slash"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ab262801bdee6b1ee20ea4d94d6e2fee936818a07f6778c83fb23aec092124c7",
                          "typeString": "literal_string \"TimeDelayStakingToken: Not enough tokens to slash\""
                        }
                      ],
                      "id": 5729,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4750:7:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5737,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4750:127:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5738,
                  "nodeType": "ExpressionStatement",
                  "src": "4750:127:20"
                },
                {
                  "expression": {
                    "id": 5744,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 5739,
                          "name": "_stakers",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5513,
                          "src": "4888:8:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Stake_$5508_storage_$",
                            "typeString": "mapping(address => struct TimeDelayStakingToken.Stake storage ref)"
                          }
                        },
                        "id": 5741,
                        "indexExpression": {
                          "id": 5740,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5724,
                          "src": "4897:4:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4888:14:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Stake_$5508_storage",
                          "typeString": "struct TimeDelayStakingToken.Stake storage ref"
                        }
                      },
                      "id": 5742,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "amount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5507,
                      "src": "4888:21:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 5743,
                      "name": "amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5726,
                      "src": "4913:6:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "src": "4888:31:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5745,
                  "nodeType": "ExpressionStatement",
                  "src": "4888:31:20"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 5749,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "4943:4:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TimeDelayStakingToken_$5769",
                              "typeString": "contract TimeDelayStakingToken"
                            }
                          ],
                          "id": 5748,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4935:7:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 5747,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "4935:7:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5750,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4935:13:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 5751,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5726,
                        "src": "4950:6:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "",
                            "id": 5754,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4964:2:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            },
                            "value": ""
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            }
                          ],
                          "id": 5753,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4958:5:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                            "typeString": "type(bytes storage pointer)"
                          },
                          "typeName": {
                            "id": 5752,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "4958:5:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5755,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4958:9:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "",
                            "id": 5758,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4975:2:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            },
                            "value": ""
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                              "typeString": "literal_string \"\""
                            }
                          ],
                          "id": 5757,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4969:5:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                            "typeString": "type(bytes storage pointer)"
                          },
                          "typeName": {
                            "id": 5756,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "4969:5:20",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 5759,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4969:9:20",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5746,
                      "name": "_burn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1613,
                      "src": "4929:5:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$",
                        "typeString": "function (address,uint256,bytes memory,bytes memory)"
                      }
                    },
                    "id": 5760,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4929:50:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5761,
                  "nodeType": "ExpressionStatement",
                  "src": "4929:50:20"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 5763,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5724,
                        "src": "5005:4:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 5764,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5726,
                        "src": "5011:6:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      ],
                      "id": 5762,
                      "name": "SlashStake",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5486,
                      "src": "4994:10:20",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint64_$returns$__$",
                        "typeString": "function (address,uint64)"
                      }
                    },
                    "id": 5765,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4994:24:20",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5766,
                  "nodeType": "EmitStatement",
                  "src": "4989:29:20"
                }
              ]
            },
            "documentation": {
              "id": 5722,
              "nodeType": "StructuredDocumentation",
              "src": "4612:69:20",
              "text": "@dev allows the owner of the staking token to burn a user's stake"
            },
            "id": 5768,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_slash",
            "nameLocation": "4695:6:20",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5727,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5724,
                  "mutability": "mutable",
                  "name": "from",
                  "nameLocation": "4710:4:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5768,
                  "src": "4702:12:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5723,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4702:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5726,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "4723:6:20",
                  "nodeType": "VariableDeclaration",
                  "scope": 5768,
                  "src": "4716:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 5725,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "4716:6:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4701:29:20"
            },
            "returnParameters": {
              "id": 5728,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4740:0:20"
            },
            "scope": 5769,
            "src": "4686:339:20",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 5770,
        "src": "486:4541:20",
        "usedErrors": []
      }
    ],
    "src": "32:4996:20"
  }
}