{
  "contractName": "StorageAccessibleWrapper",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "SIMULATE_DELEGATECALL_INTERNAL_SELECTOR",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOT_BAM",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOT_BAR",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOT_BAZ",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOT_FOO",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOT_FOOBAR",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOT_QUX",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "offset",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "length",
          "type": "uint256"
        }
      ],
      "name": "getStorageAt",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "response",
          "type": "bytes"
        }
      ],
      "name": "revertWith",
      "outputs": [],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "buffer",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "length",
          "type": "uint256"
        }
      ],
      "name": "setLength",
      "outputs": [],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "targetContract",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "calldataPayload",
          "type": "bytes"
        }
      ],
      "name": "simulateDelegatecall",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "response",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "targetContract",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "calldataPayload",
          "type": "bytes"
        }
      ],
      "name": "simulateDelegatecallInternal",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "response",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "foo_",
          "type": "uint256"
        }
      ],
      "name": "setFoo",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint128",
          "name": "bar_",
          "type": "uint128"
        }
      ],
      "name": "setBar",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "bam_",
          "type": "uint64"
        }
      ],
      "name": "setBam",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "baz_",
          "type": "uint256[]"
        }
      ],
      "name": "setBaz",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "key",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "setQuxKeyValue",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "foo_",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "bar_",
          "type": "uint256"
        }
      ],
      "name": "setFoobar",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.7.5+commit.eb77ed08\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"SIMULATE_DELEGATECALL_INTERNAL_SELECTOR\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SLOT_BAM\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SLOT_BAR\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SLOT_BAZ\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SLOT_FOO\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SLOT_FOOBAR\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SLOT_QUX\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"getStorageAt\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"}],\"name\":\"revertWith\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"bam_\",\"type\":\"uint64\"}],\"name\":\"setBam\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"bar_\",\"type\":\"uint128\"}],\"name\":\"setBar\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"baz_\",\"type\":\"uint256[]\"}],\"name\":\"setBaz\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"foo_\",\"type\":\"uint256\"}],\"name\":\"setFoo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"foo_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bar_\",\"type\":\"uint256\"}],\"name\":\"setFoobar\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"buffer\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"setLength\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"key\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"setQuxKeyValue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"calldataPayload\",\"type\":\"bytes\"}],\"name\":\"simulateDelegatecall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"calldataPayload\",\"type\":\"bytes\"}],\"name\":\"simulateDelegatecallInternal\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getStorageAt(uint256,uint256)\":{\"details\":\"Reads `length` bytes of storage in the currents contract\",\"params\":{\"length\":\"- the number of words (32 bytes) of data to read\",\"offset\":\"- the offset in the current contract's storage in words to start reading from\"},\"returns\":{\"_0\":\"the bytes that were read.\"}},\"simulateDelegatecall(address,bytes)\":{\"details\":\"Performs a delegetecall on a targetContract in the context of self. Internally reverts execution to avoid side effects (making it static). Catches revert and returns encoded result as bytes.\",\"params\":{\"calldataPayload\":\"Calldata that should be sent to the target contract (encoded method name and arguments).\",\"targetContract\":\"Address of the contract containing the code to execute.\"}},\"simulateDelegatecallInternal(address,bytes)\":{\"details\":\"Performs a delegetecall on a targetContract in the context of self. Internally reverts execution to avoid side effects (making it static). Returns encoded result as revert message concatenated with the success flag of the inner call as a last byte.\",\"params\":{\"calldataPayload\":\"Calldata that should be sent to the target contract (encoded method name and arguments).\",\"targetContract\":\"Address of the contract containing the code to execute.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/bensniff/Projects/gnosis/util-contracts/contracts/test/StorageAccessibleWrapper.sol\":\"StorageAccessibleWrapper\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/bensniff/Projects/gnosis/util-contracts/contracts/StorageAccessible.sol\":{\"keccak256\":\"0xc8b52a0614f7537b65d6db188ffc5b16fd23b71d9174cb29f8020c9bf3ccb333\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://3445810f14c830c1a10f21df9f67014c0a8c110334431f3ac5d9f296234be505\",\"dweb:/ipfs/QmZefwGQd6A1quZZk78e4eTVRjQSwMwFCXTFNkxAvKDFmw\"]},\"/Users/bensniff/Projects/gnosis/util-contracts/contracts/test/StorageAccessibleWrapper.sol\":{\"keccak256\":\"0x3efce0b9c27dbab9e83a61b0c4dd46052473861c85b984c7f96dd1ea946f84ac\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://bfe540d250671147f58993a55af3f129150db108e4be07cd6be0045e448e7391\",\"dweb:/ipfs/QmWrUeXvb4Xbuh12nrmicHdbdqvbPq3br4JmGEeqwYuFQs\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b50610b16806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80637a5d379b116100a2578063bd0276fc11610071578063bd0276fc146104f8578063dc0f34901461051f578063dc80035d14610527578063eeb21aaf14610544578063f84436bd1461056757610116565b80637a5d379b146104a75780638e9c68f2146104af57806399cf6449146104d55780639fde4466146103fb57610116565b80634e78b547116100e95780634e78b5471461032a57806352b8dfc5146103325780635624b25b146103d85780636334bd13146103fb57806365906ca31461040357610116565b80630697a74f1461011b57806338cccf07146101395780633a1b407a146101dc57806343218e1914610201575b600080fd5b61012361061b565b6040805160ff9092168252519081900360200190f35b6101da6004803603602081101561014f57600080fd5b810190602081018135600160201b81111561016957600080fd5b82018360208201111561017b57600080fd5b803590602001918460208302840111600160201b8311171561019c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610620945050505050565b005b6101e4610637565b604080516001600160e01b03199092168252519081900360200190f35b6102b56004803603604081101561021757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561024157600080fd5b82018360208201111561025357600080fd5b803590602001918460018302840111600160201b8311171561027457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061065b945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ef5781810151838201526020016102d7565b50505050905090810190601f16801561031c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61012361078a565b6101da6004803603604081101561034857600080fd5b810190602081018135600160201b81111561036257600080fd5b82018360208201111561037457600080fd5b803590602001918460018302840111600160201b8311171561039557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925061078f915050565b6102b5600480360360408110156103ee57600080fd5b5080359060200135610793565b610123610808565b6101da6004803603602081101561041957600080fd5b810190602081018135600160201b81111561043357600080fd5b82018360208201111561044557600080fd5b803590602001918460018302840111600160201b8311171561046657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061080d945050505050565b610123610815565b6101da600480360360208110156104c557600080fd5b50356001600160801b031661081a565b6101da600480360360408110156104eb57600080fd5b5080359060200135610845565b6101da6004803603602081101561050e57600080fd5b503567ffffffffffffffff16610857565b610123610885565b6101da6004803603602081101561053d57600080fd5b503561088a565b6101da6004803603604081101561055a57600080fd5b508035906020013561088f565b6102b56004803603604081101561057d57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105a757600080fd5b8201836020820111156105b957600080fd5b803590602001918460018302840111600160201b831117156105da57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506108ad945050505050565b600281565b8051610633906002906020840190610a80565b5050565b7f43218e198a5f5c70ca65adf1973b6285a79c4d29a39cc2a8bb67b912f447dc6481565b60606000836001600160a01b0316836040518082805190602001908083835b602083106106995780518252601f19909201916020918201910161067a565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146106f9576040519150601f19603f3d011682016040523d82523d6000602084013e6106fe565b606091505b50809350819250505061078382826040516020018083805190602001908083835b6020831061073e5780518252601f19909201916020918201910161071f565b6001836020036101000a03801982511681845116808217855250505050505090500182151560f81b81526001019250505060405160208183030381529060405261080d565b5092915050565b600081565b9052565b6060808260200267ffffffffffffffff811180156107b057600080fd5b506040519080825280601f01601f1916602001820160405280156107db576020820181803683370190505b50905060005b838110156107fe57848101546020808302840101526001016107e1565b5090505b92915050565b600181565b805160208201fd5b600381565b600180546fffffffffffffffffffffffffffffffff19166001600160801b0392909216919091179055565b60009182526003602052604090912055565b6001805467ffffffffffffffff909216600160801b0267ffffffffffffffff60801b19909216919091179055565b600481565b600055565b60408051808201909152828152602001819052600491909155600555565b6060807f43218e198a5f5c70ca65adf1973b6285a79c4d29a39cc2a8bb67b912f447dc64848460405160240180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561092257818101518382015260200161090a565b50505050905090810190601f16801561094f5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909816979097178752518151919750309688965090945084935091508083835b602083106109b75780518252601f199092019160209182019101610998565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610a19576040519150601f19603f3d011682016040523d82523d6000602084013e610a1e565b606091505b50905080925050600082600184510381518110610a3757fe5b602001015160f81c60f81b6001600160f81b031916600160f81b149050610a6283600185510361078f565b8015610a6f575050610802565b610a788361080d565b505092915050565b828054828255906000526020600020908101928215610abb579160200282015b82811115610abb578251825591602001919060010190610aa0565b50610ac7929150610acb565b5090565b5b80821115610ac75760008155600101610acc56fea26469706673582212203f731b77c8f811929f054f70c652be765a2221680d0c79626e0e35bc0243b47664736f6c63430007050033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101165760003560e01c80637a5d379b116100a2578063bd0276fc11610071578063bd0276fc146104f8578063dc0f34901461051f578063dc80035d14610527578063eeb21aaf14610544578063f84436bd1461056757610116565b80637a5d379b146104a75780638e9c68f2146104af57806399cf6449146104d55780639fde4466146103fb57610116565b80634e78b547116100e95780634e78b5471461032a57806352b8dfc5146103325780635624b25b146103d85780636334bd13146103fb57806365906ca31461040357610116565b80630697a74f1461011b57806338cccf07146101395780633a1b407a146101dc57806343218e1914610201575b600080fd5b61012361061b565b6040805160ff9092168252519081900360200190f35b6101da6004803603602081101561014f57600080fd5b810190602081018135600160201b81111561016957600080fd5b82018360208201111561017b57600080fd5b803590602001918460208302840111600160201b8311171561019c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610620945050505050565b005b6101e4610637565b604080516001600160e01b03199092168252519081900360200190f35b6102b56004803603604081101561021757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561024157600080fd5b82018360208201111561025357600080fd5b803590602001918460018302840111600160201b8311171561027457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061065b945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ef5781810151838201526020016102d7565b50505050905090810190601f16801561031c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61012361078a565b6101da6004803603604081101561034857600080fd5b810190602081018135600160201b81111561036257600080fd5b82018360208201111561037457600080fd5b803590602001918460018302840111600160201b8311171561039557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925061078f915050565b6102b5600480360360408110156103ee57600080fd5b5080359060200135610793565b610123610808565b6101da6004803603602081101561041957600080fd5b810190602081018135600160201b81111561043357600080fd5b82018360208201111561044557600080fd5b803590602001918460018302840111600160201b8311171561046657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061080d945050505050565b610123610815565b6101da600480360360208110156104c557600080fd5b50356001600160801b031661081a565b6101da600480360360408110156104eb57600080fd5b5080359060200135610845565b6101da6004803603602081101561050e57600080fd5b503567ffffffffffffffff16610857565b610123610885565b6101da6004803603602081101561053d57600080fd5b503561088a565b6101da6004803603604081101561055a57600080fd5b508035906020013561088f565b6102b56004803603604081101561057d57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105a757600080fd5b8201836020820111156105b957600080fd5b803590602001918460018302840111600160201b831117156105da57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506108ad945050505050565b600281565b8051610633906002906020840190610a80565b5050565b7f43218e198a5f5c70ca65adf1973b6285a79c4d29a39cc2a8bb67b912f447dc6481565b60606000836001600160a01b0316836040518082805190602001908083835b602083106106995780518252601f19909201916020918201910161067a565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146106f9576040519150601f19603f3d011682016040523d82523d6000602084013e6106fe565b606091505b50809350819250505061078382826040516020018083805190602001908083835b6020831061073e5780518252601f19909201916020918201910161071f565b6001836020036101000a03801982511681845116808217855250505050505090500182151560f81b81526001019250505060405160208183030381529060405261080d565b5092915050565b600081565b9052565b6060808260200267ffffffffffffffff811180156107b057600080fd5b506040519080825280601f01601f1916602001820160405280156107db576020820181803683370190505b50905060005b838110156107fe57848101546020808302840101526001016107e1565b5090505b92915050565b600181565b805160208201fd5b600381565b600180546fffffffffffffffffffffffffffffffff19166001600160801b0392909216919091179055565b60009182526003602052604090912055565b6001805467ffffffffffffffff909216600160801b0267ffffffffffffffff60801b19909216919091179055565b600481565b600055565b60408051808201909152828152602001819052600491909155600555565b6060807f43218e198a5f5c70ca65adf1973b6285a79c4d29a39cc2a8bb67b912f447dc64848460405160240180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561092257818101518382015260200161090a565b50505050905090810190601f16801561094f5780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909816979097178752518151919750309688965090945084935091508083835b602083106109b75780518252601f199092019160209182019101610998565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610a19576040519150601f19603f3d011682016040523d82523d6000602084013e610a1e565b606091505b50905080925050600082600184510381518110610a3757fe5b602001015160f81c60f81b6001600160f81b031916600160f81b149050610a6283600185510361078f565b8015610a6f575050610802565b610a788361080d565b505092915050565b828054828255906000526020600020908101928215610abb579160200282015b82811115610abb578251825591602001919060010190610aa0565b50610ac7929150610acb565b5090565b5b80821115610ac75760008155600101610acc56fea26469706673582212203f731b77c8f811929f054f70c652be765a2221680d0c79626e0e35bc0243b47664736f6c63430007050033",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "102:1020:8:-:0;;;602:16;;;;;;;;;;102:1020;;;;;;",
  "deployedSourceMap": "102:1020:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;352:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;833:73;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;833:73:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;833:73:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;833:73:8;;-1:-1:-1;833:73:8;;-1:-1:-1;;;;;833:73:8:i;:::-;;788:143:6;;;:::i;:::-;;;;-1:-1:-1;;;;;;788:143:6;;;;;;;;;;;;;;3220:337;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3220:337:6;;;;;;;;;;;;;;;-1:-1:-1;;;3220:337:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3220:337:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3220:337:6;;-1:-1:-1;3220:337:6;;-1:-1:-1;;;;;3220:337:6:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;232:34:8;;;:::i;3717:139:6:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3717:139:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3717:139:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3717:139:6;;-1:-1:-1;;3717:139:6;;;-1:-1:-1;3717:139:6;;-1:-1:-1;;3717:139:6:i;1233:432::-;;;;;;;;;;;;;;;;-1:-1:-1;1233:432:6;;;;;;;:::i;272:34:8:-;;;:::i;3563:148:6:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3563:148:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3563:148:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3563:148:6;;-1:-1:-1;3563:148:6;;-1:-1:-1;;;;;3563:148:6:i;392:34:8:-;;;:::i;694:64::-;;;;;;;;;;;;;;;;-1:-1:-1;694:64:8;-1:-1:-1;;;;;694:64:8;;:::i;912:92::-;;;;;;;;;;;;;;;;-1:-1:-1;912:92:8;;;;;;;:::i;764:63::-;;;;;;;;;;;;;;;;-1:-1:-1;764:63:8;;;;:::i;432:37::-;;;:::i;624:64::-;;;;;;;;;;;;;;;;-1:-1:-1;624:64:8;;:::i;1010:110::-;;;;;;;;;;;;;;;;-1:-1:-1;1010:110:8;;;;;;;:::i;2101:618:6:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2101:618:6;;;;;;;;;;;;;;;-1:-1:-1;;;2101:618:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2101:618:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2101:618:6;;-1:-1:-1;2101:618:6;;-1:-1:-1;;;;;2101:618:6:i;352:34:8:-;385:1;352:34;:::o;833:73::-;889:10;;;;:3;;:10;;;;;:::i;:::-;;833:73;:::o;788:143:6:-;869:56;788:143;:::o;3220:337::-;3350:21;3383:12;3427:14;-1:-1:-1;;;;;3427:27:6;3468:15;3427:66;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3427:66:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3405:88;;;;;;;;3503:47;3531:8;3541:7;3514:35;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3514:35:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3503:10;:47::i;:::-;3220:337;;;;;:::o;232:34:8:-;265:1;232:34;:::o;3717:139:6:-;3818:22;;3804:46::o;1233:432::-;1332:12;1360:19;1392:6;1401:2;1392:11;1382:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1382:22:6;;1360:44;;1419:13;1414:222;1446:6;1438:5;:14;1414:222;;;1522:18;;;1516:25;1599:4;1588:16;;;1565:40;;;1558:54;1454:7;;1414:222;;;-1:-1:-1;1652:6:6;-1:-1:-1;1233:432:6;;;;;:::o;272:34:8:-;305:1;272:34;:::o;3563:148:6:-;3685:8;3679:15;3672:4;3662:8;3658:19;3651:44;392:34:8;425:1;392:34;:::o;694:64::-;741:3;:10;;-1:-1:-1;;741:10:8;-1:-1:-1;;;;;741:10:8;;;;;;;;;;694:64::o;912:92::-;981:8;;;;:3;:8;;;;;;:16;912:92::o;764:63::-;810:3;:10;;;;;;-1:-1:-1;;;810:10:8;-1:-1:-1;;;;810:10:8;;;;;;;;;764:63::o;432:37::-;468:1;432:37;:::o;624:64::-;671:3;:10;624:64::o;1010:110::-;1083:30;;;;;;;;;;;;;;;;;1074:6;:39;;;;;;1010:110::o;2101:618:6:-;2223:21;2256:22;869:56;2370:14;2398:15;2281:142;;;;;;-1:-1:-1;;;;;2281:142:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2281:142:6;;;-1:-1:-1;;2281:142:6;;;;;;;;;;;;;;-1:-1:-1;;;;;2281:142:6;-1:-1:-1;;;;;;2281:142:6;;;;;;;;;2448:29;;;2281:142;;-1:-1:-1;2456:4:6;;2281:142;;-1:-1:-1;2448:29:6;;-1:-1:-1;2448:29:6;;-1:-1:-1;2281:142:6;-1:-1:-1;2448:29:6;;2281:142;2448:29;;;;;;;;;;-1:-1:-1;;2448:29:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2433:44;;;;;;2487:17;2507:8;2534:1;2516:8;:15;:19;2507:29;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2507:37:6;;2540:4;2507:37;;;2487:57;;2554:40;2564:8;2592:1;2574:8;:15;:19;2554:9;:40::i;:::-;2608:12;2604:109;;;2636:15;;;;2604:109;2682:20;2693:8;2682:10;:20::i;:::-;2101:618;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;",
  "source": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.7.0;\nimport \"../StorageAccessible.sol\";\n\ncontract StorageAccessibleWrapper is StorageAccessible {\n    struct FooBar {\n        uint256 foo;\n        uint256 bar;\n    }\n\n    uint8 public constant SLOT_FOO = 0;\n    uint8 public constant SLOT_BAR = 1;\n    uint8 public constant SLOT_BAM = 1;\n    uint8 public constant SLOT_BAZ = 2;\n    uint8 public constant SLOT_QUX = 3;\n    uint8 public constant SLOT_FOOBAR = 4;\n\n    uint256 foo;\n    uint128 bar;\n    uint64 bam;\n    uint256[] baz;\n    mapping(uint256 => uint256) qux;\n    FooBar foobar;\n\n    constructor() {}\n\n    function setFoo(uint256 foo_) public {\n        foo = foo_;\n    }\n\n    function setBar(uint128 bar_) public {\n        bar = bar_;\n    }\n\n    function setBam(uint64 bam_) public {\n        bam = bam_;\n    }\n\n    function setBaz(uint256[] memory baz_) public {\n        baz = baz_;\n    }\n\n    function setQuxKeyValue(uint256 key, uint256 value) public {\n        qux[key] = value;\n    }\n\n    function setFoobar(uint256 foo_, uint256 bar_) public {\n        foobar = FooBar({foo: foo_, bar: bar_});\n    }\n}\n\n/**\n * Defines reader methods on StorageAccessibleWrapper that can be later executed\n * in the context of a previously deployed instance\n */\ncontract ExternalStorageReader {\n    // Needs same storage layout as the contract it is reading from\n    uint256 foo;\n\n    function getFoo() public view returns (uint256) {\n        return foo;\n    }\n\n    function setAndGetFoo(uint256 foo_) public returns (uint256) {\n        foo = foo_;\n        return foo;\n    }\n\n    function doRevert() public pure {\n        revert();\n    }\n\n    function invokeDoRevertViaStorageAccessible(StorageAccessible target)\n        public\n    {\n        target.simulateDelegatecall(\n            address(this),\n            abi.encodeWithSignature(\"doRevert()\")\n        );\n    }\n\n    function invokeStaticDelegatecall(\n        ViewStorageAccessible target,\n        bytes calldata encodedCall\n    ) public view returns (uint256) {\n        uint256 result = abi.decode(\n            target.simulateDelegatecall(address(this), encodedCall),\n            (uint256)\n        );\n        return result;\n    }\n}\n",
  "sourcePath": "/Users/bensniff/Projects/gnosis/util-contracts/contracts/test/StorageAccessibleWrapper.sol",
  "ast": {
    "absolutePath": "/Users/bensniff/Projects/gnosis/util-contracts/contracts/test/StorageAccessibleWrapper.sol",
    "exportedSymbols": {
      "ExternalStorageReader": [
        2102
      ],
      "StorageAccessible": [
        1833
      ],
      "StorageAccessibleWrapper": [
        2021
      ],
      "ViewStorageAccessible": [
        1681
      ]
    },
    "id": 2103,
    "license": "LGPL-3.0-only",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1905,
        "literals": [
          "solidity",
          "^",
          "0.7",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "42:23:8"
      },
      {
        "absolutePath": "/Users/bensniff/Projects/gnosis/util-contracts/contracts/StorageAccessible.sol",
        "file": "../StorageAccessible.sol",
        "id": 1906,
        "nodeType": "ImportDirective",
        "scope": 2103,
        "sourceUnit": 1834,
        "src": "66:34:8",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 1907,
              "name": "StorageAccessible",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1833,
              "src": "139:17:8",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_StorageAccessible_$1833",
                "typeString": "contract StorageAccessible"
              }
            },
            "id": 1908,
            "nodeType": "InheritanceSpecifier",
            "src": "139:17:8"
          }
        ],
        "contractDependencies": [
          1833
        ],
        "contractKind": "contract",
        "fullyImplemented": true,
        "id": 2021,
        "linearizedBaseContracts": [
          2021,
          1833
        ],
        "name": "StorageAccessibleWrapper",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "StorageAccessibleWrapper.FooBar",
            "id": 1913,
            "members": [
              {
                "constant": false,
                "id": 1910,
                "mutability": "mutable",
                "name": "foo",
                "nodeType": "VariableDeclaration",
                "scope": 1913,
                "src": "187:11:8",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 1909,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "187:7:8",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 1912,
                "mutability": "mutable",
                "name": "bar",
                "nodeType": "VariableDeclaration",
                "scope": 1913,
                "src": "208:11:8",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 1911,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "208:7:8",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "FooBar",
            "nodeType": "StructDefinition",
            "scope": 2021,
            "src": "163:63:8",
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "4e78b547",
            "id": 1916,
            "mutability": "constant",
            "name": "SLOT_FOO",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "232:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1914,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "232:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "30",
              "id": 1915,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "265:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "6334bd13",
            "id": 1919,
            "mutability": "constant",
            "name": "SLOT_BAR",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "272:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1917,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "272:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "31",
              "id": 1918,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "305:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1_by_1",
                "typeString": "int_const 1"
              },
              "value": "1"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "9fde4466",
            "id": 1922,
            "mutability": "constant",
            "name": "SLOT_BAM",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "312:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1920,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "312:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "31",
              "id": 1921,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "345:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1_by_1",
                "typeString": "int_const 1"
              },
              "value": "1"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "0697a74f",
            "id": 1925,
            "mutability": "constant",
            "name": "SLOT_BAZ",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "352:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1923,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "352:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "32",
              "id": 1924,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "385:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_2_by_1",
                "typeString": "int_const 2"
              },
              "value": "2"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "7a5d379b",
            "id": 1928,
            "mutability": "constant",
            "name": "SLOT_QUX",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "392:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1926,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "392:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "33",
              "id": 1927,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "425:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_3_by_1",
                "typeString": "int_const 3"
              },
              "value": "3"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "dc0f3490",
            "id": 1931,
            "mutability": "constant",
            "name": "SLOT_FOOBAR",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "432:37:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1929,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "432:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "34",
              "id": 1930,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "468:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_4_by_1",
                "typeString": "int_const 4"
              },
              "value": "4"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 1933,
            "mutability": "mutable",
            "name": "foo",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "476:11:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 1932,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "476:7:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1935,
            "mutability": "mutable",
            "name": "bar",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "493:11:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint128",
              "typeString": "uint128"
            },
            "typeName": {
              "id": 1934,
              "name": "uint128",
              "nodeType": "ElementaryTypeName",
              "src": "493:7:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint128",
                "typeString": "uint128"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1937,
            "mutability": "mutable",
            "name": "bam",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "510:10:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint64",
              "typeString": "uint64"
            },
            "typeName": {
              "id": 1936,
              "name": "uint64",
              "nodeType": "ElementaryTypeName",
              "src": "510:6:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint64",
                "typeString": "uint64"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1940,
            "mutability": "mutable",
            "name": "baz",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "526:13:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
              "typeString": "uint256[]"
            },
            "typeName": {
              "baseType": {
                "id": 1938,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "526:7:8",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 1939,
              "nodeType": "ArrayTypeName",
              "src": "526:9:8",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                "typeString": "uint256[]"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1944,
            "mutability": "mutable",
            "name": "qux",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "545:31:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$",
              "typeString": "mapping(uint256 => uint256)"
            },
            "typeName": {
              "id": 1943,
              "keyType": {
                "id": 1941,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "553:7:8",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "nodeType": "Mapping",
              "src": "545:27:8",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$",
                "typeString": "mapping(uint256 => uint256)"
              },
              "valueType": {
                "id": 1942,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "564:7:8",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1946,
            "mutability": "mutable",
            "name": "foobar",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "582:13:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_struct$_FooBar_$1913_storage",
              "typeString": "struct StorageAccessibleWrapper.FooBar"
            },
            "typeName": {
              "id": 1945,
              "name": "FooBar",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1913,
              "src": "582:6:8",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_FooBar_$1913_storage_ptr",
                "typeString": "struct StorageAccessibleWrapper.FooBar"
              }
            },
            "visibility": "internal"
          },
          {
            "body": {
              "id": 1949,
              "nodeType": "Block",
              "src": "616:2:8",
              "statements": []
            },
            "id": 1950,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1947,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "613:2:8"
            },
            "returnParameters": {
              "id": 1948,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "616:0:8"
            },
            "scope": 2021,
            "src": "602:16:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1959,
              "nodeType": "Block",
              "src": "661:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 1957,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1955,
                      "name": "foo",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1933,
                      "src": "671:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1956,
                      "name": "foo_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1952,
                      "src": "677:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "671:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1958,
                  "nodeType": "ExpressionStatement",
                  "src": "671:10:8"
                }
              ]
            },
            "functionSelector": "dc80035d",
            "id": 1960,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setFoo",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1953,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1952,
                  "mutability": "mutable",
                  "name": "foo_",
                  "nodeType": "VariableDeclaration",
                  "scope": 1960,
                  "src": "640:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1951,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "640:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "639:14:8"
            },
            "returnParameters": {
              "id": 1954,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "661:0:8"
            },
            "scope": 2021,
            "src": "624:64:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1969,
              "nodeType": "Block",
              "src": "731:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 1967,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1965,
                      "name": "bar",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1935,
                      "src": "741:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1966,
                      "name": "bar_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1962,
                      "src": "747:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      }
                    },
                    "src": "741:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "id": 1968,
                  "nodeType": "ExpressionStatement",
                  "src": "741:10:8"
                }
              ]
            },
            "functionSelector": "8e9c68f2",
            "id": 1970,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setBar",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1963,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1962,
                  "mutability": "mutable",
                  "name": "bar_",
                  "nodeType": "VariableDeclaration",
                  "scope": 1970,
                  "src": "710:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 1961,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "710:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "709:14:8"
            },
            "returnParameters": {
              "id": 1964,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "731:0:8"
            },
            "scope": 2021,
            "src": "694:64:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1979,
              "nodeType": "Block",
              "src": "800:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 1977,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1975,
                      "name": "bam",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1937,
                      "src": "810:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1976,
                      "name": "bam_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1972,
                      "src": "816:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "src": "810:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "id": 1978,
                  "nodeType": "ExpressionStatement",
                  "src": "810:10:8"
                }
              ]
            },
            "functionSelector": "bd0276fc",
            "id": 1980,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setBam",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1973,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1972,
                  "mutability": "mutable",
                  "name": "bam_",
                  "nodeType": "VariableDeclaration",
                  "scope": 1980,
                  "src": "780:11:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 1971,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "780:6:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "779:13:8"
            },
            "returnParameters": {
              "id": 1974,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "800:0:8"
            },
            "scope": 2021,
            "src": "764:63:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1990,
              "nodeType": "Block",
              "src": "879:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 1988,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1986,
                      "name": "baz",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1940,
                      "src": "889:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                        "typeString": "uint256[] storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1987,
                      "name": "baz_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1983,
                      "src": "895:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                        "typeString": "uint256[] memory"
                      }
                    },
                    "src": "889:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                      "typeString": "uint256[] storage ref"
                    }
                  },
                  "id": 1989,
                  "nodeType": "ExpressionStatement",
                  "src": "889:10:8"
                }
              ]
            },
            "functionSelector": "38cccf07",
            "id": 1991,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setBaz",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1984,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1983,
                  "mutability": "mutable",
                  "name": "baz_",
                  "nodeType": "VariableDeclaration",
                  "scope": 1991,
                  "src": "849:21:8",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 1981,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "849:7:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 1982,
                    "nodeType": "ArrayTypeName",
                    "src": "849:9:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "848:23:8"
            },
            "returnParameters": {
              "id": 1985,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "879:0:8"
            },
            "scope": 2021,
            "src": "833:73:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2004,
              "nodeType": "Block",
              "src": "971:33:8",
              "statements": [
                {
                  "expression": {
                    "id": 2002,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 1998,
                        "name": "qux",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1944,
                        "src": "981:3:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$",
                          "typeString": "mapping(uint256 => uint256)"
                        }
                      },
                      "id": 2000,
                      "indexExpression": {
                        "id": 1999,
                        "name": "key",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1993,
                        "src": "985:3:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "981:8:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 2001,
                      "name": "value",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1995,
                      "src": "992:5:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "981:16:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2003,
                  "nodeType": "ExpressionStatement",
                  "src": "981:16:8"
                }
              ]
            },
            "functionSelector": "99cf6449",
            "id": 2005,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setQuxKeyValue",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1996,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1993,
                  "mutability": "mutable",
                  "name": "key",
                  "nodeType": "VariableDeclaration",
                  "scope": 2005,
                  "src": "936:11:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1992,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "936:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1995,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 2005,
                  "src": "949:13:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1994,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "949:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "935:28:8"
            },
            "returnParameters": {
              "id": 1997,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "971:0:8"
            },
            "scope": 2021,
            "src": "912:92:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2019,
              "nodeType": "Block",
              "src": "1064:56:8",
              "statements": [
                {
                  "expression": {
                    "id": 2017,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 2012,
                      "name": "foobar",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1946,
                      "src": "1074:6:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_FooBar_$1913_storage",
                        "typeString": "struct StorageAccessibleWrapper.FooBar storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 2014,
                          "name": "foo_",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2007,
                          "src": "1096:4:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "id": 2015,
                          "name": "bar_",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2009,
                          "src": "1107:4:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 2013,
                        "name": "FooBar",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1913,
                        "src": "1083:6:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_FooBar_$1913_storage_ptr_$",
                          "typeString": "type(struct StorageAccessibleWrapper.FooBar storage pointer)"
                        }
                      },
                      "id": 2016,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [
                        "foo",
                        "bar"
                      ],
                      "nodeType": "FunctionCall",
                      "src": "1083:30:8",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_FooBar_$1913_memory_ptr",
                        "typeString": "struct StorageAccessibleWrapper.FooBar memory"
                      }
                    },
                    "src": "1074:39:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_FooBar_$1913_storage",
                      "typeString": "struct StorageAccessibleWrapper.FooBar storage ref"
                    }
                  },
                  "id": 2018,
                  "nodeType": "ExpressionStatement",
                  "src": "1074:39:8"
                }
              ]
            },
            "functionSelector": "eeb21aaf",
            "id": 2020,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setFoobar",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2010,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2007,
                  "mutability": "mutable",
                  "name": "foo_",
                  "nodeType": "VariableDeclaration",
                  "scope": 2020,
                  "src": "1029:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2006,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1029:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2009,
                  "mutability": "mutable",
                  "name": "bar_",
                  "nodeType": "VariableDeclaration",
                  "scope": 2020,
                  "src": "1043:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2008,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1043:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1028:28:8"
            },
            "returnParameters": {
              "id": 2011,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1064:0:8"
            },
            "scope": 2021,
            "src": "1010:110:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 2103,
        "src": "102:1020:8"
      },
      {
        "abstract": false,
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 2022,
          "nodeType": "StructuredDocumentation",
          "src": "1124:140:8",
          "text": " Defines reader methods on StorageAccessibleWrapper that can be later executed\n in the context of a previously deployed instance"
        },
        "fullyImplemented": true,
        "id": 2102,
        "linearizedBaseContracts": [
          2102
        ],
        "name": "ExternalStorageReader",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 2024,
            "mutability": "mutable",
            "name": "foo",
            "nodeType": "VariableDeclaration",
            "scope": 2102,
            "src": "1370:11:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 2023,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1370:7:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2031,
              "nodeType": "Block",
              "src": "1436:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 2029,
                    "name": "foo",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2024,
                    "src": "1453:3:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2028,
                  "id": 2030,
                  "nodeType": "Return",
                  "src": "1446:10:8"
                }
              ]
            },
            "functionSelector": "243dc8da",
            "id": 2032,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getFoo",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2025,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1403:2:8"
            },
            "returnParameters": {
              "id": 2028,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2027,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2032,
                  "src": "1427:7:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2026,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1427:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1426:9:8"
            },
            "scope": 2102,
            "src": "1388:75:8",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2045,
              "nodeType": "Block",
              "src": "1530:47:8",
              "statements": [
                {
                  "expression": {
                    "id": 2041,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 2039,
                      "name": "foo",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2024,
                      "src": "1540:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 2040,
                      "name": "foo_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2034,
                      "src": "1546:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "1540:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2042,
                  "nodeType": "ExpressionStatement",
                  "src": "1540:10:8"
                },
                {
                  "expression": {
                    "id": 2043,
                    "name": "foo",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2024,
                    "src": "1567:3:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2038,
                  "id": 2044,
                  "nodeType": "Return",
                  "src": "1560:10:8"
                }
              ]
            },
            "functionSelector": "0557ebe4",
            "id": 2046,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setAndGetFoo",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2035,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2034,
                  "mutability": "mutable",
                  "name": "foo_",
                  "nodeType": "VariableDeclaration",
                  "scope": 2046,
                  "src": "1491:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2033,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1491:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1490:14:8"
            },
            "returnParameters": {
              "id": 2038,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2037,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2046,
                  "src": "1521:7:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2036,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1521:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1520:9:8"
            },
            "scope": 2102,
            "src": "1469:108:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2052,
              "nodeType": "Block",
              "src": "1615:25:8",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 2049,
                      "name": "revert",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -19,
                        -19
                      ],
                      "referencedDeclaration": -19,
                      "src": "1625:6:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_revert_pure$__$returns$__$",
                        "typeString": "function () pure"
                      }
                    },
                    "id": 2050,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1625:8:8",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2051,
                  "nodeType": "ExpressionStatement",
                  "src": "1625:8:8"
                }
              ]
            },
            "functionSelector": "afc874d2",
            "id": 2053,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "doRevert",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2047,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1600:2:8"
            },
            "returnParameters": {
              "id": 2048,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1615:0:8"
            },
            "scope": 2102,
            "src": "1583:57:8",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2071,
              "nodeType": "Block",
              "src": "1735:132:8",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 2063,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "1794:4:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ExternalStorageReader_$2102",
                              "typeString": "contract ExternalStorageReader"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_ExternalStorageReader_$2102",
                              "typeString": "contract ExternalStorageReader"
                            }
                          ],
                          "id": 2062,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1786:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2061,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "1786:7:8",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 2064,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1786:13:8",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "646f5265766572742829",
                            "id": 2067,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1837:12:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_afc874d2f0ac92a796ce7c22a118a6be0a4af3f618b5a45701bb0159ded1f2e7",
                              "typeString": "literal_string \"doRevert()\""
                            },
                            "value": "doRevert()"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_afc874d2f0ac92a796ce7c22a118a6be0a4af3f618b5a45701bb0159ded1f2e7",
                              "typeString": "literal_string \"doRevert()\""
                            }
                          ],
                          "expression": {
                            "id": 2065,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -1,
                            "src": "1813:3:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 2066,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodeWithSignature",
                          "nodeType": "MemberAccess",
                          "src": "1813:23:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (string memory) pure returns (bytes memory)"
                          }
                        },
                        "id": 2068,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1813:37:8",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "id": 2058,
                        "name": "target",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2055,
                        "src": "1745:6:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_StorageAccessible_$1833",
                          "typeString": "contract StorageAccessible"
                        }
                      },
                      "id": 2060,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "simulateDelegatecall",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1785,
                      "src": "1745:27:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (address,bytes memory) external returns (bytes memory)"
                      }
                    },
                    "id": 2069,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1745:115:8",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "id": 2070,
                  "nodeType": "ExpressionStatement",
                  "src": "1745:115:8"
                }
              ]
            },
            "functionSelector": "00e4b256",
            "id": 2072,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "invokeDoRevertViaStorageAccessible",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2056,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2055,
                  "mutability": "mutable",
                  "name": "target",
                  "nodeType": "VariableDeclaration",
                  "scope": 2072,
                  "src": "1690:24:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_StorageAccessible_$1833",
                    "typeString": "contract StorageAccessible"
                  },
                  "typeName": {
                    "id": 2054,
                    "name": "StorageAccessible",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1833,
                    "src": "1690:17:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_StorageAccessible_$1833",
                      "typeString": "contract StorageAccessible"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1689:26:8"
            },
            "returnParameters": {
              "id": 2057,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1735:0:8"
            },
            "scope": 2102,
            "src": "1646:221:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2100,
              "nodeType": "Block",
              "src": "2017:169:8",
              "statements": [
                {
                  "assignments": [
                    2082
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2082,
                      "mutability": "mutable",
                      "name": "result",
                      "nodeType": "VariableDeclaration",
                      "scope": 2100,
                      "src": "2027:14:8",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2081,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "2027:7:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2097,
                  "initialValue": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "id": 2089,
                                "name": "this",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -28,
                                "src": "2104:4:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ExternalStorageReader_$2102",
                                  "typeString": "contract ExternalStorageReader"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_ExternalStorageReader_$2102",
                                  "typeString": "contract ExternalStorageReader"
                                }
                              ],
                              "id": 2088,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "2096:7:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 2087,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "2096:7:8",
                                "typeDescriptions": {}
                              }
                            },
                            "id": 2090,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2096:13:8",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "id": 2091,
                            "name": "encodedCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2076,
                            "src": "2111:11:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_calldata_ptr",
                              "typeString": "bytes calldata"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_bytes_calldata_ptr",
                              "typeString": "bytes calldata"
                            }
                          ],
                          "expression": {
                            "id": 2085,
                            "name": "target",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2074,
                            "src": "2068:6:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ViewStorageAccessible_$1681",
                              "typeString": "contract ViewStorageAccessible"
                            }
                          },
                          "id": 2086,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "simulateDelegatecall",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1680,
                          "src": "2068:27:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (address,bytes memory) view external returns (bytes memory)"
                          }
                        },
                        "id": 2092,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2068:55:8",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "components": [
                          {
                            "id": 2094,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2138:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 2093,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2138:7:8",
                              "typeDescriptions": {}
                            }
                          }
                        ],
                        "id": 2095,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "2137:9:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_uint256_$",
                          "typeString": "type(uint256)"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_type$_t_uint256_$",
                          "typeString": "type(uint256)"
                        }
                      ],
                      "expression": {
                        "id": 2083,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -1,
                        "src": "2044:3:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 2084,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "decode",
                      "nodeType": "MemberAccess",
                      "src": "2044:10:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                        "typeString": "function () pure"
                      }
                    },
                    "id": 2096,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2044:112:8",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2027:129:8"
                },
                {
                  "expression": {
                    "id": 2098,
                    "name": "result",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2082,
                    "src": "2173:6:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2080,
                  "id": 2099,
                  "nodeType": "Return",
                  "src": "2166:13:8"
                }
              ]
            },
            "functionSelector": "6e76e8aa",
            "id": 2101,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "invokeStaticDelegatecall",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2077,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2074,
                  "mutability": "mutable",
                  "name": "target",
                  "nodeType": "VariableDeclaration",
                  "scope": 2101,
                  "src": "1916:28:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ViewStorageAccessible_$1681",
                    "typeString": "contract ViewStorageAccessible"
                  },
                  "typeName": {
                    "id": 2073,
                    "name": "ViewStorageAccessible",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1681,
                    "src": "1916:21:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ViewStorageAccessible_$1681",
                      "typeString": "contract ViewStorageAccessible"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2076,
                  "mutability": "mutable",
                  "name": "encodedCall",
                  "nodeType": "VariableDeclaration",
                  "scope": 2101,
                  "src": "1954:26:8",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 2075,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1954:5:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1906:80:8"
            },
            "returnParameters": {
              "id": 2080,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2079,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2101,
                  "src": "2008:7:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2078,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2008:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2007:9:8"
            },
            "scope": 2102,
            "src": "1873:313:8",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 2103,
        "src": "1265:923:8"
      }
    ],
    "src": "42:2147:8"
  },
  "legacyAST": {
    "absolutePath": "/Users/bensniff/Projects/gnosis/util-contracts/contracts/test/StorageAccessibleWrapper.sol",
    "exportedSymbols": {
      "ExternalStorageReader": [
        2102
      ],
      "StorageAccessible": [
        1833
      ],
      "StorageAccessibleWrapper": [
        2021
      ],
      "ViewStorageAccessible": [
        1681
      ]
    },
    "id": 2103,
    "license": "LGPL-3.0-only",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1905,
        "literals": [
          "solidity",
          "^",
          "0.7",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "42:23:8"
      },
      {
        "absolutePath": "/Users/bensniff/Projects/gnosis/util-contracts/contracts/StorageAccessible.sol",
        "file": "../StorageAccessible.sol",
        "id": 1906,
        "nodeType": "ImportDirective",
        "scope": 2103,
        "sourceUnit": 1834,
        "src": "66:34:8",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 1907,
              "name": "StorageAccessible",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1833,
              "src": "139:17:8",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_StorageAccessible_$1833",
                "typeString": "contract StorageAccessible"
              }
            },
            "id": 1908,
            "nodeType": "InheritanceSpecifier",
            "src": "139:17:8"
          }
        ],
        "contractDependencies": [
          1833
        ],
        "contractKind": "contract",
        "fullyImplemented": true,
        "id": 2021,
        "linearizedBaseContracts": [
          2021,
          1833
        ],
        "name": "StorageAccessibleWrapper",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "StorageAccessibleWrapper.FooBar",
            "id": 1913,
            "members": [
              {
                "constant": false,
                "id": 1910,
                "mutability": "mutable",
                "name": "foo",
                "nodeType": "VariableDeclaration",
                "scope": 1913,
                "src": "187:11:8",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 1909,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "187:7:8",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 1912,
                "mutability": "mutable",
                "name": "bar",
                "nodeType": "VariableDeclaration",
                "scope": 1913,
                "src": "208:11:8",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 1911,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "208:7:8",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "FooBar",
            "nodeType": "StructDefinition",
            "scope": 2021,
            "src": "163:63:8",
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "4e78b547",
            "id": 1916,
            "mutability": "constant",
            "name": "SLOT_FOO",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "232:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1914,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "232:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "30",
              "id": 1915,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "265:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "6334bd13",
            "id": 1919,
            "mutability": "constant",
            "name": "SLOT_BAR",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "272:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1917,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "272:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "31",
              "id": 1918,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "305:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1_by_1",
                "typeString": "int_const 1"
              },
              "value": "1"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "9fde4466",
            "id": 1922,
            "mutability": "constant",
            "name": "SLOT_BAM",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "312:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1920,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "312:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "31",
              "id": 1921,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "345:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1_by_1",
                "typeString": "int_const 1"
              },
              "value": "1"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "0697a74f",
            "id": 1925,
            "mutability": "constant",
            "name": "SLOT_BAZ",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "352:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1923,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "352:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "32",
              "id": 1924,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "385:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_2_by_1",
                "typeString": "int_const 2"
              },
              "value": "2"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "7a5d379b",
            "id": 1928,
            "mutability": "constant",
            "name": "SLOT_QUX",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "392:34:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1926,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "392:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "33",
              "id": 1927,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "425:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_3_by_1",
                "typeString": "int_const 3"
              },
              "value": "3"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "dc0f3490",
            "id": 1931,
            "mutability": "constant",
            "name": "SLOT_FOOBAR",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "432:37:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 1929,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "432:5:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "hexValue": "34",
              "id": 1930,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "468:1:8",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_4_by_1",
                "typeString": "int_const 4"
              },
              "value": "4"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 1933,
            "mutability": "mutable",
            "name": "foo",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "476:11:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 1932,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "476:7:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1935,
            "mutability": "mutable",
            "name": "bar",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "493:11:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint128",
              "typeString": "uint128"
            },
            "typeName": {
              "id": 1934,
              "name": "uint128",
              "nodeType": "ElementaryTypeName",
              "src": "493:7:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint128",
                "typeString": "uint128"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1937,
            "mutability": "mutable",
            "name": "bam",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "510:10:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint64",
              "typeString": "uint64"
            },
            "typeName": {
              "id": 1936,
              "name": "uint64",
              "nodeType": "ElementaryTypeName",
              "src": "510:6:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint64",
                "typeString": "uint64"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1940,
            "mutability": "mutable",
            "name": "baz",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "526:13:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
              "typeString": "uint256[]"
            },
            "typeName": {
              "baseType": {
                "id": 1938,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "526:7:8",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 1939,
              "nodeType": "ArrayTypeName",
              "src": "526:9:8",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                "typeString": "uint256[]"
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1944,
            "mutability": "mutable",
            "name": "qux",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "545:31:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$",
              "typeString": "mapping(uint256 => uint256)"
            },
            "typeName": {
              "id": 1943,
              "keyType": {
                "id": 1941,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "553:7:8",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "nodeType": "Mapping",
              "src": "545:27:8",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$",
                "typeString": "mapping(uint256 => uint256)"
              },
              "valueType": {
                "id": 1942,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "564:7:8",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 1946,
            "mutability": "mutable",
            "name": "foobar",
            "nodeType": "VariableDeclaration",
            "scope": 2021,
            "src": "582:13:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_struct$_FooBar_$1913_storage",
              "typeString": "struct StorageAccessibleWrapper.FooBar"
            },
            "typeName": {
              "id": 1945,
              "name": "FooBar",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1913,
              "src": "582:6:8",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_FooBar_$1913_storage_ptr",
                "typeString": "struct StorageAccessibleWrapper.FooBar"
              }
            },
            "visibility": "internal"
          },
          {
            "body": {
              "id": 1949,
              "nodeType": "Block",
              "src": "616:2:8",
              "statements": []
            },
            "id": 1950,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1947,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "613:2:8"
            },
            "returnParameters": {
              "id": 1948,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "616:0:8"
            },
            "scope": 2021,
            "src": "602:16:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1959,
              "nodeType": "Block",
              "src": "661:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 1957,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1955,
                      "name": "foo",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1933,
                      "src": "671:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1956,
                      "name": "foo_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1952,
                      "src": "677:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "671:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 1958,
                  "nodeType": "ExpressionStatement",
                  "src": "671:10:8"
                }
              ]
            },
            "functionSelector": "dc80035d",
            "id": 1960,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setFoo",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1953,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1952,
                  "mutability": "mutable",
                  "name": "foo_",
                  "nodeType": "VariableDeclaration",
                  "scope": 1960,
                  "src": "640:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1951,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "640:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "639:14:8"
            },
            "returnParameters": {
              "id": 1954,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "661:0:8"
            },
            "scope": 2021,
            "src": "624:64:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1969,
              "nodeType": "Block",
              "src": "731:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 1967,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1965,
                      "name": "bar",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1935,
                      "src": "741:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1966,
                      "name": "bar_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1962,
                      "src": "747:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      }
                    },
                    "src": "741:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "id": 1968,
                  "nodeType": "ExpressionStatement",
                  "src": "741:10:8"
                }
              ]
            },
            "functionSelector": "8e9c68f2",
            "id": 1970,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setBar",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1963,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1962,
                  "mutability": "mutable",
                  "name": "bar_",
                  "nodeType": "VariableDeclaration",
                  "scope": 1970,
                  "src": "710:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 1961,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "710:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "709:14:8"
            },
            "returnParameters": {
              "id": 1964,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "731:0:8"
            },
            "scope": 2021,
            "src": "694:64:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1979,
              "nodeType": "Block",
              "src": "800:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 1977,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1975,
                      "name": "bam",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1937,
                      "src": "810:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1976,
                      "name": "bam_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1972,
                      "src": "816:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "src": "810:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "id": 1978,
                  "nodeType": "ExpressionStatement",
                  "src": "810:10:8"
                }
              ]
            },
            "functionSelector": "bd0276fc",
            "id": 1980,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setBam",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1973,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1972,
                  "mutability": "mutable",
                  "name": "bam_",
                  "nodeType": "VariableDeclaration",
                  "scope": 1980,
                  "src": "780:11:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 1971,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "780:6:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "779:13:8"
            },
            "returnParameters": {
              "id": 1974,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "800:0:8"
            },
            "scope": 2021,
            "src": "764:63:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1990,
              "nodeType": "Block",
              "src": "879:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 1988,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 1986,
                      "name": "baz",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1940,
                      "src": "889:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                        "typeString": "uint256[] storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 1987,
                      "name": "baz_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1983,
                      "src": "895:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                        "typeString": "uint256[] memory"
                      }
                    },
                    "src": "889:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                      "typeString": "uint256[] storage ref"
                    }
                  },
                  "id": 1989,
                  "nodeType": "ExpressionStatement",
                  "src": "889:10:8"
                }
              ]
            },
            "functionSelector": "38cccf07",
            "id": 1991,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setBaz",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1984,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1983,
                  "mutability": "mutable",
                  "name": "baz_",
                  "nodeType": "VariableDeclaration",
                  "scope": 1991,
                  "src": "849:21:8",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 1981,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "849:7:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 1982,
                    "nodeType": "ArrayTypeName",
                    "src": "849:9:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "848:23:8"
            },
            "returnParameters": {
              "id": 1985,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "879:0:8"
            },
            "scope": 2021,
            "src": "833:73:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2004,
              "nodeType": "Block",
              "src": "971:33:8",
              "statements": [
                {
                  "expression": {
                    "id": 2002,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 1998,
                        "name": "qux",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1944,
                        "src": "981:3:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint256_$_t_uint256_$",
                          "typeString": "mapping(uint256 => uint256)"
                        }
                      },
                      "id": 2000,
                      "indexExpression": {
                        "id": 1999,
                        "name": "key",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1993,
                        "src": "985:3:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "981:8:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 2001,
                      "name": "value",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1995,
                      "src": "992:5:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "981:16:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2003,
                  "nodeType": "ExpressionStatement",
                  "src": "981:16:8"
                }
              ]
            },
            "functionSelector": "99cf6449",
            "id": 2005,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setQuxKeyValue",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 1996,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1993,
                  "mutability": "mutable",
                  "name": "key",
                  "nodeType": "VariableDeclaration",
                  "scope": 2005,
                  "src": "936:11:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1992,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "936:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1995,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 2005,
                  "src": "949:13:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1994,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "949:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "935:28:8"
            },
            "returnParameters": {
              "id": 1997,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "971:0:8"
            },
            "scope": 2021,
            "src": "912:92:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2019,
              "nodeType": "Block",
              "src": "1064:56:8",
              "statements": [
                {
                  "expression": {
                    "id": 2017,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 2012,
                      "name": "foobar",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1946,
                      "src": "1074:6:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_FooBar_$1913_storage",
                        "typeString": "struct StorageAccessibleWrapper.FooBar storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 2014,
                          "name": "foo_",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2007,
                          "src": "1096:4:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "id": 2015,
                          "name": "bar_",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2009,
                          "src": "1107:4:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 2013,
                        "name": "FooBar",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1913,
                        "src": "1083:6:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_FooBar_$1913_storage_ptr_$",
                          "typeString": "type(struct StorageAccessibleWrapper.FooBar storage pointer)"
                        }
                      },
                      "id": 2016,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [
                        "foo",
                        "bar"
                      ],
                      "nodeType": "FunctionCall",
                      "src": "1083:30:8",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_FooBar_$1913_memory_ptr",
                        "typeString": "struct StorageAccessibleWrapper.FooBar memory"
                      }
                    },
                    "src": "1074:39:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_FooBar_$1913_storage",
                      "typeString": "struct StorageAccessibleWrapper.FooBar storage ref"
                    }
                  },
                  "id": 2018,
                  "nodeType": "ExpressionStatement",
                  "src": "1074:39:8"
                }
              ]
            },
            "functionSelector": "eeb21aaf",
            "id": 2020,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setFoobar",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2010,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2007,
                  "mutability": "mutable",
                  "name": "foo_",
                  "nodeType": "VariableDeclaration",
                  "scope": 2020,
                  "src": "1029:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2006,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1029:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2009,
                  "mutability": "mutable",
                  "name": "bar_",
                  "nodeType": "VariableDeclaration",
                  "scope": 2020,
                  "src": "1043:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2008,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1043:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1028:28:8"
            },
            "returnParameters": {
              "id": 2011,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1064:0:8"
            },
            "scope": 2021,
            "src": "1010:110:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 2103,
        "src": "102:1020:8"
      },
      {
        "abstract": false,
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 2022,
          "nodeType": "StructuredDocumentation",
          "src": "1124:140:8",
          "text": " Defines reader methods on StorageAccessibleWrapper that can be later executed\n in the context of a previously deployed instance"
        },
        "fullyImplemented": true,
        "id": 2102,
        "linearizedBaseContracts": [
          2102
        ],
        "name": "ExternalStorageReader",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 2024,
            "mutability": "mutable",
            "name": "foo",
            "nodeType": "VariableDeclaration",
            "scope": 2102,
            "src": "1370:11:8",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 2023,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1370:7:8",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2031,
              "nodeType": "Block",
              "src": "1436:27:8",
              "statements": [
                {
                  "expression": {
                    "id": 2029,
                    "name": "foo",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2024,
                    "src": "1453:3:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2028,
                  "id": 2030,
                  "nodeType": "Return",
                  "src": "1446:10:8"
                }
              ]
            },
            "functionSelector": "243dc8da",
            "id": 2032,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getFoo",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2025,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1403:2:8"
            },
            "returnParameters": {
              "id": 2028,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2027,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2032,
                  "src": "1427:7:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2026,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1427:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1426:9:8"
            },
            "scope": 2102,
            "src": "1388:75:8",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2045,
              "nodeType": "Block",
              "src": "1530:47:8",
              "statements": [
                {
                  "expression": {
                    "id": 2041,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 2039,
                      "name": "foo",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2024,
                      "src": "1540:3:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 2040,
                      "name": "foo_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2034,
                      "src": "1546:4:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "1540:10:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2042,
                  "nodeType": "ExpressionStatement",
                  "src": "1540:10:8"
                },
                {
                  "expression": {
                    "id": 2043,
                    "name": "foo",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2024,
                    "src": "1567:3:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2038,
                  "id": 2044,
                  "nodeType": "Return",
                  "src": "1560:10:8"
                }
              ]
            },
            "functionSelector": "0557ebe4",
            "id": 2046,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setAndGetFoo",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2035,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2034,
                  "mutability": "mutable",
                  "name": "foo_",
                  "nodeType": "VariableDeclaration",
                  "scope": 2046,
                  "src": "1491:12:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2033,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1491:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1490:14:8"
            },
            "returnParameters": {
              "id": 2038,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2037,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2046,
                  "src": "1521:7:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2036,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1521:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1520:9:8"
            },
            "scope": 2102,
            "src": "1469:108:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2052,
              "nodeType": "Block",
              "src": "1615:25:8",
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 2049,
                      "name": "revert",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -19,
                        -19
                      ],
                      "referencedDeclaration": -19,
                      "src": "1625:6:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_revert_pure$__$returns$__$",
                        "typeString": "function () pure"
                      }
                    },
                    "id": 2050,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1625:8:8",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2051,
                  "nodeType": "ExpressionStatement",
                  "src": "1625:8:8"
                }
              ]
            },
            "functionSelector": "afc874d2",
            "id": 2053,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "doRevert",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2047,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1600:2:8"
            },
            "returnParameters": {
              "id": 2048,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1615:0:8"
            },
            "scope": 2102,
            "src": "1583:57:8",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2071,
              "nodeType": "Block",
              "src": "1735:132:8",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 2063,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "1794:4:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ExternalStorageReader_$2102",
                              "typeString": "contract ExternalStorageReader"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_ExternalStorageReader_$2102",
                              "typeString": "contract ExternalStorageReader"
                            }
                          ],
                          "id": 2062,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1786:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2061,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "1786:7:8",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 2064,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1786:13:8",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "646f5265766572742829",
                            "id": 2067,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1837:12:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_afc874d2f0ac92a796ce7c22a118a6be0a4af3f618b5a45701bb0159ded1f2e7",
                              "typeString": "literal_string \"doRevert()\""
                            },
                            "value": "doRevert()"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_afc874d2f0ac92a796ce7c22a118a6be0a4af3f618b5a45701bb0159ded1f2e7",
                              "typeString": "literal_string \"doRevert()\""
                            }
                          ],
                          "expression": {
                            "id": 2065,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -1,
                            "src": "1813:3:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 2066,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodeWithSignature",
                          "nodeType": "MemberAccess",
                          "src": "1813:23:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (string memory) pure returns (bytes memory)"
                          }
                        },
                        "id": 2068,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1813:37:8",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "id": 2058,
                        "name": "target",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2055,
                        "src": "1745:6:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_StorageAccessible_$1833",
                          "typeString": "contract StorageAccessible"
                        }
                      },
                      "id": 2060,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "simulateDelegatecall",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1785,
                      "src": "1745:27:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (address,bytes memory) external returns (bytes memory)"
                      }
                    },
                    "id": 2069,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1745:115:8",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "id": 2070,
                  "nodeType": "ExpressionStatement",
                  "src": "1745:115:8"
                }
              ]
            },
            "functionSelector": "00e4b256",
            "id": 2072,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "invokeDoRevertViaStorageAccessible",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2056,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2055,
                  "mutability": "mutable",
                  "name": "target",
                  "nodeType": "VariableDeclaration",
                  "scope": 2072,
                  "src": "1690:24:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_StorageAccessible_$1833",
                    "typeString": "contract StorageAccessible"
                  },
                  "typeName": {
                    "id": 2054,
                    "name": "StorageAccessible",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1833,
                    "src": "1690:17:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_StorageAccessible_$1833",
                      "typeString": "contract StorageAccessible"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1689:26:8"
            },
            "returnParameters": {
              "id": 2057,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1735:0:8"
            },
            "scope": 2102,
            "src": "1646:221:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2100,
              "nodeType": "Block",
              "src": "2017:169:8",
              "statements": [
                {
                  "assignments": [
                    2082
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2082,
                      "mutability": "mutable",
                      "name": "result",
                      "nodeType": "VariableDeclaration",
                      "scope": 2100,
                      "src": "2027:14:8",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2081,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "2027:7:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 2097,
                  "initialValue": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "id": 2089,
                                "name": "this",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -28,
                                "src": "2104:4:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ExternalStorageReader_$2102",
                                  "typeString": "contract ExternalStorageReader"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_ExternalStorageReader_$2102",
                                  "typeString": "contract ExternalStorageReader"
                                }
                              ],
                              "id": 2088,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "2096:7:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 2087,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "2096:7:8",
                                "typeDescriptions": {}
                              }
                            },
                            "id": 2090,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2096:13:8",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "id": 2091,
                            "name": "encodedCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2076,
                            "src": "2111:11:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_calldata_ptr",
                              "typeString": "bytes calldata"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_bytes_calldata_ptr",
                              "typeString": "bytes calldata"
                            }
                          ],
                          "expression": {
                            "id": 2085,
                            "name": "target",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2074,
                            "src": "2068:6:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ViewStorageAccessible_$1681",
                              "typeString": "contract ViewStorageAccessible"
                            }
                          },
                          "id": 2086,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "simulateDelegatecall",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1680,
                          "src": "2068:27:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (address,bytes memory) view external returns (bytes memory)"
                          }
                        },
                        "id": 2092,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2068:55:8",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "components": [
                          {
                            "id": 2094,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2138:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 2093,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2138:7:8",
                              "typeDescriptions": {}
                            }
                          }
                        ],
                        "id": 2095,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "2137:9:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_uint256_$",
                          "typeString": "type(uint256)"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_type$_t_uint256_$",
                          "typeString": "type(uint256)"
                        }
                      ],
                      "expression": {
                        "id": 2083,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -1,
                        "src": "2044:3:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 2084,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "decode",
                      "nodeType": "MemberAccess",
                      "src": "2044:10:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                        "typeString": "function () pure"
                      }
                    },
                    "id": 2096,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2044:112:8",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2027:129:8"
                },
                {
                  "expression": {
                    "id": 2098,
                    "name": "result",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2082,
                    "src": "2173:6:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2080,
                  "id": 2099,
                  "nodeType": "Return",
                  "src": "2166:13:8"
                }
              ]
            },
            "functionSelector": "6e76e8aa",
            "id": 2101,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "invokeStaticDelegatecall",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2077,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2074,
                  "mutability": "mutable",
                  "name": "target",
                  "nodeType": "VariableDeclaration",
                  "scope": 2101,
                  "src": "1916:28:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ViewStorageAccessible_$1681",
                    "typeString": "contract ViewStorageAccessible"
                  },
                  "typeName": {
                    "id": 2073,
                    "name": "ViewStorageAccessible",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1681,
                    "src": "1916:21:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ViewStorageAccessible_$1681",
                      "typeString": "contract ViewStorageAccessible"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2076,
                  "mutability": "mutable",
                  "name": "encodedCall",
                  "nodeType": "VariableDeclaration",
                  "scope": 2101,
                  "src": "1954:26:8",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 2075,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1954:5:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1906:80:8"
            },
            "returnParameters": {
              "id": 2080,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2079,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2101,
                  "src": "2008:7:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2078,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2008:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2007:9:8"
            },
            "scope": 2102,
            "src": "1873:313:8",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 2103,
        "src": "1265:923:8"
      }
    ],
    "src": "42:2147:8"
  },
  "compiler": {
    "name": "solc",
    "version": "0.7.5+commit.eb77ed08.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.3.1",
  "updatedAt": "2020-12-08T09:43:37.095Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "getStorageAt(uint256,uint256)": {
        "details": "Reads `length` bytes of storage in the currents contract",
        "params": {
          "length": "- the number of words (32 bytes) of data to read",
          "offset": "- the offset in the current contract's storage in words to start reading from"
        },
        "returns": {
          "_0": "the bytes that were read."
        }
      },
      "simulateDelegatecall(address,bytes)": {
        "details": "Performs a delegetecall on a targetContract in the context of self. Internally reverts execution to avoid side effects (making it static). Catches revert and returns encoded result as bytes.",
        "params": {
          "calldataPayload": "Calldata that should be sent to the target contract (encoded method name and arguments).",
          "targetContract": "Address of the contract containing the code to execute."
        }
      },
      "simulateDelegatecallInternal(address,bytes)": {
        "details": "Performs a delegetecall on a targetContract in the context of self. Internally reverts execution to avoid side effects (making it static). Returns encoded result as revert message concatenated with the success flag of the inner call as a last byte.",
        "params": {
          "calldataPayload": "Calldata that should be sent to the target contract (encoded method name and arguments).",
          "targetContract": "Address of the contract containing the code to execute."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}