{
  "address": "0xD48AF8e64Cb5848e53F7A0583727a5E5e75dbEbB",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_memberToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_controllerRegistry",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_proxyFactoryAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_gnosisMasterAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_podEnsRegistrar",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "podId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "safe",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "admin",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "ensName",
          "type": "string"
        }
      ],
      "name": "CreatePod",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "podId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "admin",
          "type": "address"
        }
      ],
      "name": "UpdatePodAdmin",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "FUNCTION_SIG_ENABLE",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FUNCTION_SIG_EXEC",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FUNCTION_SIG_SETUP",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256[]",
          "name": "ids",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "beforeTokenTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "controllerRegistry",
      "outputs": [
        {
          "internalType": "contract IControllerRegistry",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_members",
          "type": "address[]"
        },
        {
          "internalType": "uint256",
          "name": "threshold",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_admin",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "_label",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "_ensString",
          "type": "string"
        }
      ],
      "name": "createPod",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_admin",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_safe",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "_label",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "_ensString",
          "type": "string"
        }
      ],
      "name": "createPodWithSafe",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_context",
          "type": "address"
        }
      ],
      "name": "delegateSetup",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "module",
          "type": "address"
        }
      ],
      "name": "enableModule",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "safe",
          "type": "address"
        }
      ],
      "name": "getSafeMembers",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gnosisMasterAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "safe",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "member",
          "type": "address"
        }
      ],
      "name": "isSafeMember",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "safe",
          "type": "address"
        }
      ],
      "name": "isSafeModuleEnabled",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "memberToken",
      "outputs": [
        {
          "internalType": "contract IMemberToken",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_podId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_newController",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_prevModule",
          "type": "address"
        }
      ],
      "name": "migratePodController",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "podAdmin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "podEnsRegistrar",
      "outputs": [
        {
          "internalType": "contract IPodEnsRegistrar",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "podIdToSafe",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxyFactoryAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "safeToPodId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_podId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_newAdmin",
          "type": "address"
        }
      ],
      "name": "updatePodAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_podEnsRegistrar",
          "type": "address"
        }
      ],
      "name": "updatePodEnsRegistrar",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_podId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_podAdmin",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_safeAddress",
          "type": "address"
        }
      ],
      "name": "updatePodState",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x678ceec3fdf4a1fa1db15689f08f250760accc2c1f206ab353d2584cdb8e1184",
  "receipt": {
    "to": null,
    "from": "0x2149A222feD42fefc3A120B3DdA34482190fC666",
    "contractAddress": "0xD48AF8e64Cb5848e53F7A0583727a5E5e75dbEbB",
    "transactionIndex": 13,
    "gasUsed": "2596295",
    "logsBloom": "0x00000000000000000000000000002000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400800000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000020000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x2067452ffb5b6ef1799dc7b6d6255f59b0156aac246b0a4148988af2501db7a1",
    "transactionHash": "0x678ceec3fdf4a1fa1db15689f08f250760accc2c1f206ab353d2584cdb8e1184",
    "logs": [
      {
        "transactionIndex": 13,
        "blockNumber": 13640492,
        "transactionHash": "0x678ceec3fdf4a1fa1db15689f08f250760accc2c1f206ab353d2584cdb8e1184",
        "address": "0xD48AF8e64Cb5848e53F7A0583727a5E5e75dbEbB",
        "topics": [
          "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x0000000000000000000000002149a222fed42fefc3a120b3dda34482190fc666"
        ],
        "data": "0x",
        "logIndex": 73,
        "blockHash": "0x2067452ffb5b6ef1799dc7b6d6255f59b0156aac246b0a4148988af2501db7a1"
      }
    ],
    "blockNumber": 13640492,
    "cumulativeGasUsed": "4795122",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x0762aA185b6ed2dCA77945Ebe92De705e0C37AE3",
    "0x0d97643EE1051B523E4e3b66Df3640bBA6C0F79f",
    "0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2",
    "0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552",
    "0x5ceC7FeC214e7366304D82CdEBF755004C969E05"
  ],
  "solcInputHash": "ad4e5f37a674081d15ff85090ee8a137",
  "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_memberToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_controllerRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_proxyFactoryAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_gnosisMasterAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_podEnsRegistrar\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"podId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"safe\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ensName\",\"type\":\"string\"}],\"name\":\"CreatePod\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"podId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpdatePodAdmin\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FUNCTION_SIG_ENABLE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FUNCTION_SIG_EXEC\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FUNCTION_SIG_SETUP\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"controllerRegistry\",\"outputs\":[{\"internalType\":\"contract IControllerRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_members\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_label\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_ensString\",\"type\":\"string\"}],\"name\":\"createPod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_safe\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_label\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_ensString\",\"type\":\"string\"}],\"name\":\"createPodWithSafe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_context\",\"type\":\"address\"}],\"name\":\"delegateSetup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"enableModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"safe\",\"type\":\"address\"}],\"name\":\"getSafeMembers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gnosisMasterAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"safe\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"member\",\"type\":\"address\"}],\"name\":\"isSafeMember\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"safe\",\"type\":\"address\"}],\"name\":\"isSafeModuleEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"memberToken\",\"outputs\":[{\"internalType\":\"contract IMemberToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_podId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_newController\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_prevModule\",\"type\":\"address\"}],\"name\":\"migratePodController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"podAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"podEnsRegistrar\",\"outputs\":[{\"internalType\":\"contract IPodEnsRegistrar\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"podIdToSafe\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyFactoryAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"safeToPodId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_podId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_newAdmin\",\"type\":\"address\"}],\"name\":\"updatePodAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_podEnsRegistrar\",\"type\":\"address\"}],\"name\":\"updatePodEnsRegistrar\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_podId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_podAdmin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_safeAddress\",\"type\":\"address\"}],\"name\":\"updatePodState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"beforeTokenTransfer(address,address,address,uint256[],uint256[],bytes)\":{\"params\":{\"data\":\"Passes a flag for an initial creation event\",\"from\":\"The address sending the membership token\",\"ids\":\"An array of membership token ids to be transfered\",\"operator\":\"The address that initiated the action\",\"to\":\"The address recieveing the membership token\"}},\"constructor\":{\"details\":\"Will instantiate safe teller with gnosis master and proxy addresses\",\"params\":{\"_controllerRegistry\":\"The address of the ControllerRegistry contract\",\"_gnosisMasterAddress\":\"The gnosis master address\",\"_memberToken\":\"The address of the MemberToken contract\",\"_proxyFactoryAddress\":\"The proxy factory address\"}},\"createPod(address[],uint256,address,bytes32,string)\":{\"params\":{\"_admin\":\"The address of the pod admin\",\"_ensString\":\"string of pod ens name (i.e.'mypod.pod.xyz')\",\"_label\":\"label hash of pod name (i.e labelhash('mypod'))\",\"_members\":\"The addresses of the members of the pod\",\"threshold\":\"The number of members that are required to sign a transaction\"}},\"createPodWithSafe(address,address,bytes32,string)\":{\"details\":\"Used to create a pod with an existing safeWill automatically distribute membership NFTs to current safe members\",\"params\":{\"_admin\":\"The address of the pod admin\",\"_ensString\":\"string of pod ens name (i.e.'mypod.pod.xyz')\",\"_label\":\"label hash of pod name (i.e labelhash('mypod'))\",\"_safe\":\"The address of existing safe\"}},\"migratePodController(uint256,address,address)\":{\"details\":\"This will nullify all pod state on this controllerUpdate state on _newControllerUpdate controller to _newController in Safe and MemberToken\",\"params\":{\"_newController\":\"The address of the new pod controller\",\"_podId\":\"The id number of the pod\",\"_prevModule\":\"The module that points to the orca module in the safe's ModuleManager linked list\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updatePodAdmin(uint256,address)\":{\"params\":{\"_newAdmin\":\"The address of the new pod admin\",\"_podId\":\"The id number of the pod\"}},\"updatePodState(uint256,address,address)\":{\"details\":\"This is called by another version of controller to migrate a pod to this versionWill only accept calls from registered controllersCan only be called once.\",\"params\":{\"_podAdmin\":\"The address of the pod admin\",\"_podId\":\"The id number of the pod\",\"_safeAddress\":\"The address of the safe\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Controller.sol\":\"Controller\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor() {\\n        _setOwner(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _setOwner(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _setOwner(newOwner);\\n    }\\n\\n    function _setOwner(address newOwner) private {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n *\\n * _Available since v3.1._\\n */\\ninterface IERC1155 is IERC165 {\\n    /**\\n     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\\n     */\\n    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n    /**\\n     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n     * transfers.\\n     */\\n    event TransferBatch(\\n        address indexed operator,\\n        address indexed from,\\n        address indexed to,\\n        uint256[] ids,\\n        uint256[] values\\n    );\\n\\n    /**\\n     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n     * `approved`.\\n     */\\n    event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n     *\\n     * If an {URI} event was emitted for `id`, the standard\\n     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n     * returned by {IERC1155MetadataURI-uri}.\\n     */\\n    event URI(string value, uint256 indexed id);\\n\\n    /**\\n     * @dev Returns the amount of tokens of token type `id` owned by `account`.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     */\\n    function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n    /**\\n     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n     *\\n     * Requirements:\\n     *\\n     * - `accounts` and `ids` must have the same length.\\n     */\\n    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)\\n        external\\n        view\\n        returns (uint256[] memory);\\n\\n    /**\\n     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `operator` cannot be the caller.\\n     */\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /**\\n     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n     *\\n     * See {setApprovalForAll}.\\n     */\\n    function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n    /**\\n     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\\n     *\\n     * Emits a {TransferSingle} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n     * - `from` must have a balance of tokens of type `id` of at least `amount`.\\n     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n     * acceptance magic value.\\n     */\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 id,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    /**\\n     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n     *\\n     * Emits a {TransferBatch} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `ids` and `amounts` must have the same length.\\n     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n     * acceptance magic value.\\n     */\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n}\\n\",\"keccak256\":\"0xfce1eb6398eae0e2b50251140866a70a3106193f101972c878bba1dbf44929ec\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(account)\\n        }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x3336baae5cf23e94274d75336e2d412193be508504aee185e61dc7d58cd05c8a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xa28007762d9da9db878dd421960c8cb9a10471f47ab5c1b3309bfe48e9e79ff4\",\"license\":\"MIT\"},\"contracts/Controller.sol\":{\"content\":\"pragma solidity 0.8.7;\\n\\n/* solhint-disable indent */\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"./interfaces/IController.sol\\\";\\nimport \\\"./interfaces/IMemberToken.sol\\\";\\nimport \\\"./interfaces/IControllerRegistry.sol\\\";\\nimport \\\"./SafeTeller.sol\\\";\\nimport \\\"./ens/IPodEnsRegistrar.sol\\\";\\n\\ncontract Controller is IController, SafeTeller, Ownable {\\n    event CreatePod(uint256 podId, address safe, address admin, string ensName);\\n    event UpdatePodAdmin(uint256 podId, address admin);\\n\\n    IMemberToken public immutable memberToken;\\n    IControllerRegistry public immutable controllerRegistry;\\n    IPodEnsRegistrar public podEnsRegistrar;\\n\\n    mapping(address => uint256) public safeToPodId;\\n    mapping(uint256 => address) public podIdToSafe;\\n    mapping(uint256 => address) public podAdmin;\\n\\n    uint8 internal constant CREATE_EVENT = 0x01;\\n\\n    /**\\n     * @dev Will instantiate safe teller with gnosis master and proxy addresses\\n     * @param _memberToken The address of the MemberToken contract\\n     * @param _controllerRegistry The address of the ControllerRegistry contract\\n     * @param _proxyFactoryAddress The proxy factory address\\n     * @param _gnosisMasterAddress The gnosis master address\\n     */\\n    constructor(\\n        address _memberToken,\\n        address _controllerRegistry,\\n        address _proxyFactoryAddress,\\n        address _gnosisMasterAddress,\\n        address _podEnsRegistrar\\n    ) SafeTeller(_proxyFactoryAddress, _gnosisMasterAddress) {\\n        require(_memberToken != address(0), \\\"Invalid address\\\");\\n        require(_controllerRegistry != address(0), \\\"Invalid address\\\");\\n        require(_proxyFactoryAddress != address(0), \\\"Invalid address\\\");\\n        require(_gnosisMasterAddress != address(0), \\\"Invalid address\\\");\\n        require(_podEnsRegistrar != address(0), \\\"Invalid address\\\");\\n\\n        memberToken = IMemberToken(_memberToken);\\n        controllerRegistry = IControllerRegistry(_controllerRegistry);\\n        podEnsRegistrar = IPodEnsRegistrar(_podEnsRegistrar);\\n    }\\n\\n    function updatePodEnsRegistrar(address _podEnsRegistrar)\\n        external\\n        onlyOwner\\n    {\\n        require(_podEnsRegistrar != address(0), \\\"Invalid address\\\");\\n        podEnsRegistrar = IPodEnsRegistrar(_podEnsRegistrar);\\n    }\\n\\n    /**\\n     * @param _members The addresses of the members of the pod\\n     * @param threshold The number of members that are required to sign a transaction\\n     * @param _admin The address of the pod admin\\n     * @param _label label hash of pod name (i.e labelhash('mypod'))\\n     * @param _ensString string of pod ens name (i.e.'mypod.pod.xyz')\\n     */\\n    function createPod(\\n        address[] memory _members,\\n        uint256 threshold,\\n        address _admin,\\n        bytes32 _label,\\n        string memory _ensString\\n    ) external {\\n        address safe = createSafe(_members, threshold);\\n\\n        _createPod(_members, safe, _admin, _label, _ensString);\\n    }\\n\\n    /**\\n     * @dev Used to create a pod with an existing safe\\n     * @dev Will automatically distribute membership NFTs to current safe members\\n     * @param _admin The address of the pod admin\\n     * @param _safe The address of existing safe\\n     * @param _label label hash of pod name (i.e labelhash('mypod'))\\n     * @param _ensString string of pod ens name (i.e.'mypod.pod.xyz')\\n     */\\n    function createPodWithSafe(\\n        address _admin,\\n        address _safe,\\n        bytes32 _label,\\n        string memory _ensString\\n    ) external {\\n        require(_safe != address(0), \\\"invalid safe address\\\");\\n        require(safeToPodId[_safe] == 0, \\\"safe already in use\\\");\\n        require(isSafeModuleEnabled(_safe), \\\"safe module must be enabled\\\");\\n        require(\\n            isSafeMember(_safe, msg.sender) || msg.sender == _safe,\\n            \\\"caller must be safe or member\\\"\\n        );\\n\\n        address[] memory members = getSafeMembers(_safe);\\n\\n        _createPod(members, _safe, _admin, _label, _ensString);\\n    }\\n\\n    /**\\n     * @param _members The addresses of the members of the pod\\n     * @param _admin The address of the pod admin\\n     * @param _safe The address of existing safe\\n     * @param _label label hash of pod name (i.e labelhash('mypod'))\\n     * @param _ensString string of pod ens name (i.e.'mypod.pod.xyz')\\n     */\\n    function _createPod(\\n        address[] memory _members,\\n        address _safe,\\n        address _admin,\\n        bytes32 _label,\\n        string memory _ensString\\n    ) private {\\n        // add create event flag to token data\\n        bytes memory data = new bytes(1);\\n        data[0] = bytes1(uint8(CREATE_EVENT));\\n\\n        uint256 podId = memberToken.createPod(_members, data);\\n\\n        emit CreatePod(podId, _safe, _admin, _ensString);\\n        emit UpdatePodAdmin(podId, _admin);\\n\\n        if (_admin != address(0)) podAdmin[podId] = _admin;\\n        podIdToSafe[podId] = _safe;\\n        safeToPodId[_safe] = podId;\\n\\n        // setup pod ENS\\n        address reverseRegistrar = podEnsRegistrar.registerPod(\\n            _label,\\n            _safe,\\n            msg.sender\\n        );\\n        setupSafeReverseResolver(_safe, reverseRegistrar, _ensString);\\n    }\\n\\n    /**\\n     * @param _podId The id number of the pod\\n     * @param _newAdmin The address of the new pod admin\\n     */\\n    function updatePodAdmin(uint256 _podId, address _newAdmin) external {\\n        address admin = podAdmin[_podId];\\n        address safe = podIdToSafe[_podId];\\n\\n        require(safe != address(0), \\\"Pod doesn't exist\\\");\\n\\n        // if there is no admin it can only be added by safe\\n        if (admin == address(0)) {\\n            require(msg.sender == safe, \\\"Only safe can add new admin\\\");\\n        } else {\\n            require(msg.sender == admin, \\\"Only admin can update admin\\\");\\n        }\\n        podAdmin[_podId] = _newAdmin;\\n\\n        emit UpdatePodAdmin(_podId, _newAdmin);\\n    }\\n\\n    /**\\n     * @dev This will nullify all pod state on this controller\\n     * @dev Update state on _newController\\n     * @dev Update controller to _newController in Safe and MemberToken\\n     * @param _podId The id number of the pod\\n     * @param _newController The address of the new pod controller\\n     * @param _prevModule The module that points to the orca module in the safe's ModuleManager linked list\\n     */\\n    function migratePodController(\\n        uint256 _podId,\\n        address _newController,\\n        address _prevModule\\n    ) external {\\n        require(_newController != address(0), \\\"Invalid address\\\");\\n        require(\\n            controllerRegistry.isRegistered(_newController),\\n            \\\"Controller not registered\\\"\\n        );\\n\\n        address admin = podAdmin[_podId];\\n        address safe = podIdToSafe[_podId];\\n\\n        require(\\n            msg.sender == admin || msg.sender == safe,\\n            \\\"User not authorized\\\"\\n        );\\n\\n        Controller newController = Controller(_newController);\\n\\n        // nullify current pod state\\n        podAdmin[_podId] = address(0);\\n        podIdToSafe[_podId] = address(0);\\n        safeToPodId[safe] = 0;\\n        // update controller in MemberToken\\n        memberToken.migrateMemberController(_podId, _newController);\\n        // update safe module to _newController\\n        migrateSafeTeller(safe, _newController, _prevModule);\\n        // update pod state in _newController\\n        newController.updatePodState(_podId, admin, safe);\\n    }\\n\\n    /**\\n     * @dev This is called by another version of controller to migrate a pod to this version\\n     * @dev Will only accept calls from registered controllers\\n     * @dev Can only be called once.\\n     * @param _podId The id number of the pod\\n     * @param _podAdmin The address of the pod admin\\n     * @param _safeAddress The address of the safe\\n     */\\n    function updatePodState(\\n        uint256 _podId,\\n        address _podAdmin,\\n        address _safeAddress\\n    ) external {\\n        require(_safeAddress != address(0), \\\"Invalid address\\\");\\n        require(\\n            controllerRegistry.isRegistered(msg.sender),\\n            \\\"Controller not registered\\\"\\n        );\\n        require(\\n            podAdmin[_podId] == address(0) &&\\n                podIdToSafe[_podId] == address(0) &&\\n                safeToPodId[_safeAddress] == 0,\\n            \\\"Pod already exists\\\"\\n        );\\n        podAdmin[_podId] = _podAdmin;\\n        podIdToSafe[_podId] = _safeAddress;\\n        safeToPodId[_safeAddress] = _podId;\\n\\n        emit UpdatePodAdmin(_podId, _podAdmin);\\n    }\\n\\n    /**\\n     * @param operator The address that initiated the action\\n     * @param from The address sending the membership token\\n     * @param to The address recieveing the membership token\\n     * @param ids An array of membership token ids to be transfered\\n     * @param data Passes a flag for an initial creation event\\n     */\\n    function beforeTokenTransfer(\\n        address operator,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory,\\n        bytes memory data\\n    ) external override {\\n        require(msg.sender == address(memberToken), \\\"Not Authorized\\\");\\n\\n        // if create event than side effects have been pre-handled\\n        // only recognise data flags from this controller\\n        if (operator == address(this) && uint8(data[0]) == CREATE_EVENT) return;\\n\\n        for (uint256 i = 0; i < ids.length; i += 1) {\\n            uint256 podId = ids[i];\\n            address safe = podIdToSafe[podId];\\n            address admin = podAdmin[podId];\\n\\n            if (from == address(0)) {\\n                // mint event\\n\\n                // there are no rules operator must be admin, safe or controller\\n                require(\\n                    operator == safe ||\\n                        operator == admin ||\\n                        operator == address(this),\\n                    \\\"No Rules Set\\\"\\n                );\\n\\n                onMint(to, safe);\\n            } else if (to == address(0)) {\\n                // burn event\\n\\n                // there are no rules  operator must be admin, safe or controller\\n                require(\\n                    operator == safe ||\\n                        operator == admin ||\\n                        operator == address(this),\\n                    \\\"No Rules Set\\\"\\n                );\\n\\n                onBurn(from, safe);\\n            } else {\\n                // transfer event\\n                onTransfer(from, to, safe);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xb4cdcbbbe1c95ce884c41fce033f2b008bc934f3b114b54dc0104be3ba168329\"},\"contracts/SafeTeller.sol\":{\"content\":\"pragma solidity 0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport \\\"./interfaces/IGnosisSafe.sol\\\";\\nimport \\\"./interfaces/IGnosisSafeProxyFactory.sol\\\";\\n\\ncontract SafeTeller {\\n    using Address for address;\\n\\n    // mainnet: 0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B;\\n    address public immutable proxyFactoryAddress;\\n\\n    // mainnet: 0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F;\\n    address public immutable gnosisMasterAddress;\\n\\n    string public constant FUNCTION_SIG_SETUP =\\n        \\\"setup(address[],uint256,address,bytes,address,address,uint256,address)\\\";\\n    string public constant FUNCTION_SIG_EXEC =\\n        \\\"execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)\\\";\\n\\n    string public constant FUNCTION_SIG_ENABLE = \\\"delegateSetup(address)\\\";\\n\\n    address internal constant SENTINEL = address(0x1);\\n\\n    /**\\n     * @param _proxyFactoryAddress The proxy factory address\\n     * @param _gnosisMasterAddress The gnosis master address\\n     */\\n    constructor(address _proxyFactoryAddress, address _gnosisMasterAddress) {\\n        proxyFactoryAddress = _proxyFactoryAddress;\\n        gnosisMasterAddress = _gnosisMasterAddress;\\n    }\\n\\n    /**\\n     * @param _safe The address of the safe\\n     * @param _newSafeTeller The address of the new safe teller contract\\n     */\\n    function migrateSafeTeller(\\n        address _safe,\\n        address _newSafeTeller,\\n        address _prevModule\\n    ) internal {\\n        // add new safeTeller\\n        bytes memory enableData = abi.encodeWithSignature(\\n            \\\"enableModule(address)\\\",\\n            _newSafeTeller\\n        );\\n\\n        bool enableSuccess = IGnosisSafe(_safe).execTransactionFromModule(\\n            _safe,\\n            0,\\n            enableData,\\n            IGnosisSafe.Operation.Call\\n        );\\n        require(enableSuccess, \\\"Migration failed on enable\\\");\\n\\n        // validate prevModule of current safe teller\\n        (address[] memory moduleBuffer, ) = IGnosisSafe(_safe)\\n            .getModulesPaginated(_prevModule, 1);\\n        require(moduleBuffer[0] == address(this), \\\"incorrect prevModule\\\");\\n\\n        // disable current safeTeller\\n        bytes memory disableData = abi.encodeWithSignature(\\n            \\\"disableModule(address,address)\\\",\\n            _prevModule,\\n            address(this)\\n        );\\n\\n        bool disableSuccess = IGnosisSafe(_safe).execTransactionFromModule(\\n            _safe,\\n            0,\\n            disableData,\\n            IGnosisSafe.Operation.Call\\n        );\\n        require(disableSuccess, \\\"Migration failed on disable\\\");\\n    }\\n\\n    function getSafeMembers(address safe)\\n        public\\n        view\\n        returns (address[] memory)\\n    {\\n        return IGnosisSafe(safe).getOwners();\\n    }\\n\\n    function isSafeModuleEnabled(address safe) public view returns (bool) {\\n        return IGnosisSafe(safe).isModuleEnabled(address(this));\\n    }\\n\\n    function isSafeMember(address safe, address member)\\n        public\\n        view\\n        returns (bool)\\n    {\\n        return IGnosisSafe(safe).isOwner(member);\\n    }\\n\\n    /**\\n     * @param _owners The  addresses to be owners of the safe\\n     * @param _threshold The number of owners that are required to sign a transaciton\\n     * @return safeAddress The address of the new safe\\n     */\\n    function createSafe(address[] memory _owners, uint256 _threshold)\\n        internal\\n        returns (address safeAddress)\\n    {\\n        bytes memory data = abi.encodeWithSignature(\\n            FUNCTION_SIG_ENABLE,\\n            address(this)\\n        );\\n\\n        // encode the setup call that will be called on the new proxy safe\\n        // from the proxy factory\\n        bytes memory setupData = abi.encodeWithSignature(\\n            FUNCTION_SIG_SETUP,\\n            _owners,\\n            _threshold,\\n            this,\\n            data,\\n            address(0),\\n            address(0),\\n            uint256(0),\\n            address(0)\\n        );\\n\\n        try\\n            IGnosisSafeProxyFactory(proxyFactoryAddress).createProxy(\\n                gnosisMasterAddress,\\n                setupData\\n            )\\n        returns (address newSafeAddress) {\\n            return newSafeAddress;\\n        } catch (bytes memory) {\\n            revert(\\\"Create Proxy With Data Failed\\\");\\n        }\\n    }\\n\\n    /**\\n     * @param to The account address to add as an owner\\n     * @param safe The address of the safe\\n     */\\n    function onMint(address to, address safe) internal {\\n        uint256 threshold = IGnosisSafe(safe).getThreshold();\\n\\n        bytes memory data = abi.encodeWithSignature(\\n            \\\"addOwnerWithThreshold(address,uint256)\\\",\\n            to,\\n            threshold\\n        );\\n\\n        bool success = IGnosisSafe(safe).execTransactionFromModule(\\n            safe,\\n            0,\\n            data,\\n            IGnosisSafe.Operation.Call\\n        );\\n\\n        require(success, \\\"Module Transaction Failed\\\");\\n    }\\n\\n    /**\\n     * @param from The address to be removed as an owner\\n     * @param safe The address of the safe\\n     */\\n    function onBurn(address from, address safe) internal {\\n        uint256 threshold = IGnosisSafe(safe).getThreshold();\\n        address[] memory owners = IGnosisSafe(safe).getOwners();\\n\\n        //look for the address pointing to address from\\n        address prevFrom = address(0);\\n        for (uint256 i = 0; i < owners.length; i++) {\\n            if (owners[i] == from) {\\n                if (i == 0) {\\n                    prevFrom = SENTINEL;\\n                } else {\\n                    prevFrom = owners[i - 1];\\n                }\\n            }\\n        }\\n        if (owners.length - 1 < threshold) threshold -= 1;\\n        bytes memory data = abi.encodeWithSignature(\\n            \\\"removeOwner(address,address,uint256)\\\",\\n            prevFrom,\\n            from,\\n            threshold\\n        );\\n\\n        bool success = IGnosisSafe(safe).execTransactionFromModule(\\n            safe,\\n            0,\\n            data,\\n            IGnosisSafe.Operation.Call\\n        );\\n        require(success, \\\"Module Transaction Failed\\\");\\n    }\\n\\n    /**\\n     * @param from The address being removed as an owner\\n     * @param to The address being added as an owner\\n     * @param safe The address of the safe\\n     */\\n    function onTransfer(\\n        address from,\\n        address to,\\n        address safe\\n    ) internal {\\n        address[] memory owners = IGnosisSafe(safe).getOwners();\\n\\n        //look for the address pointing to address from\\n        address prevFrom;\\n        for (uint256 i = 0; i < owners.length; i++) {\\n            if (owners[i] == from) {\\n                if (i == 0) {\\n                    prevFrom = SENTINEL;\\n                } else {\\n                    prevFrom = owners[i - 1];\\n                }\\n            }\\n        }\\n\\n        bytes memory data = abi.encodeWithSignature(\\n            \\\"swapOwner(address,address,address)\\\",\\n            prevFrom,\\n            from,\\n            to\\n        );\\n\\n        bool success = IGnosisSafe(safe).execTransactionFromModule(\\n            safe,\\n            0,\\n            data,\\n            IGnosisSafe.Operation.Call\\n        );\\n        require(success, \\\"Module Transaction Failed\\\");\\n    }\\n\\n    /**\\n     * @dev This will execute a tx from the safe that will update the safe's ENS in the reverse resolver\\n     * @param safe safe address\\n     * @param reverseRegistrar The ENS default reverseRegistar\\n     * @param _ensString string of pod ens name (i.e.'mypod.pod.xyz')\\n     */\\n    function setupSafeReverseResolver(\\n        address safe,\\n        address reverseRegistrar,\\n        string memory _ensString\\n    ) internal {\\n        bytes memory data = abi.encodeWithSignature(\\n            \\\"setName(string)\\\",\\n            _ensString\\n        );\\n\\n        bool success = IGnosisSafe(safe).execTransactionFromModule(\\n            reverseRegistrar,\\n            0,\\n            data,\\n            IGnosisSafe.Operation.Call\\n        );\\n        require(success, \\\"Module Transaction Failed\\\");\\n    }\\n\\n    // TODO: move to library\\n    // Used in a delegate call to enable module add on setup\\n    function enableModule(address module) external {\\n        require(module == address(0));\\n    }\\n\\n    function delegateSetup(address _context) external {\\n        this.enableModule(_context);\\n    }\\n}\\n\",\"keccak256\":\"0x8a6e2cd7149abc4b713f54ba662e7912005f49f1176d31ea5c27a2e9b55fd5b5\"},\"contracts/ens/IPodEnsRegistrar.sol\":{\"content\":\"pragma solidity 0.8.7;\\n\\ninterface IPodEnsRegistrar { \\n\\n    function registerPod(bytes32 label, address podSafe, address podCreator) external returns (address);\\n\\n    function register(bytes32 label, address owner) external;\\n}\\n\",\"keccak256\":\"0x5b88aa1d3d062773256f9cd57ba03b212e87e61017b4ce1964492937320aebf4\"},\"contracts/interfaces/IController.sol\":{\"content\":\"pragma solidity 0.8.7;\\n\\ninterface IController{\\n\\n    /**\\n     * @param operator The account address that initiated the action\\n     * @param from The account address sending the membership token\\n     * @param to The account address recieving the membership token\\n     * @param ids An array of membership token ids to be transfered\\n     * @param amounts The amount of each membership token type to transfer\\n     * @param data Arbitrary data\\n     */\\n    function beforeTokenTransfer(\\n        address operator,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory amounts,\\n        bytes memory data\\n    ) external;\\n\\n}\\n\",\"keccak256\":\"0x49c623fd7b83f04db221bf69af147566ecfba5a7d76d5241d4e453b86449e478\"},\"contracts/interfaces/IControllerRegistry.sol\":{\"content\":\"pragma solidity 0.8.7;\\n\\n\\ninterface IControllerRegistry{\\n\\n    /**\\n     * @param _controller Address to check if registered as a controller\\n     * @return Boolean representing if the address is a registered as a controller\\n     */\\n    function isRegistered(address _controller) external view returns (bool);\\n\\n}\\n\",\"keccak256\":\"0x02e7853f4677cafd67f4a486cea842929067ca7b764b468e54922180998d5c4c\"},\"contracts/interfaces/IGnosisSafe.sol\":{\"content\":\"pragma solidity 0.8.7;\\n\\ninterface IGnosisSafe {\\n\\n    enum Operation {Call, DelegateCall}\\n\\n    /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\\n    /// @param to Destination address of module transaction.\\n    /// @param value Ether value of module transaction.\\n    /// @param data Data payload of module transaction.\\n    /// @param operation Operation type of module transaction.\\n    function execTransactionFromModule(\\n        address to,\\n        uint256 value,\\n        bytes calldata data,\\n        Operation operation\\n    ) external returns (bool success);\\n\\n    /// @dev Returns array of owners.\\n    /// @return Array of Safe owners.\\n    function getOwners() external view returns (address[] memory);\\n\\n    function isOwner(address owner) external view returns (bool);\\n\\n    function getThreshold() external returns (uint256);\\n\\n    /// @dev Returns array of modules.\\n    /// @param start Start of the page.\\n    /// @param pageSize Maximum number of modules that should be returned.\\n    /// @return array Array of modules.\\n    /// @return next Start of the next page.\\n    function getModulesPaginated(address start, uint256 pageSize)\\n        external \\n        view\\n        returns (address[] memory array, address next);\\n\\n    /// @dev Returns if an module is enabled\\n    /// @return True if the module is enabled\\n    function isModuleEnabled(address module) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x337ab03fe75425112f380a2a6d4a150da49b5fcf5eb7aa1808e5f24429f37ed5\"},\"contracts/interfaces/IGnosisSafeProxyFactory.sol\":{\"content\":\"pragma solidity 0.8.7;\\n\\ninterface IGnosisSafeProxyFactory {\\n    /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction.\\n    /// @param singleton Address of singleton contract.\\n    /// @param data Payload for message call sent to new proxy contract.\\n    function createProxy(address singleton, bytes memory data)\\n        external\\n        returns (address);\\n}\\n\",\"keccak256\":\"0x1bddd6110ad627fda30e8735f689e46496069633f27bc0c29ecab5043fb33b20\"},\"contracts/interfaces/IMemberToken.sol\":{\"content\":\"pragma solidity 0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\n\\ninterface IMemberToken is IERC1155 {\\n    /**\\n     * @dev Total amount of tokens in with a given id.\\n     */\\n    function totalSupply(uint256 id) external view returns (uint256);\\n\\n    /**\\n     * @dev Indicates weither any token exist with a given id, or not.\\n     */\\n    function exists(uint256 id) external view returns (bool);\\n\\n    function getNextAvailablePodId() external view returns (uint256);\\n\\n    /**\\n     * @param _podId The pod id number \\n     * @param _newController The address of the new controller\\n     */\\n    function migrateMemberController(uint256 _podId, address _newController)\\n        external;\\n\\n    /**\\n     * @param _account The account address to transfer the membership token to\\n     * @param _id The membership token id to mint\\n     * @param data Arbitrary data\\n     */\\n    function mint(\\n        address _account,\\n        uint256 _id,\\n        bytes memory data\\n    ) external;\\n\\n    /**\\n     * @param _accounts The account addresses to transfer the membership tokens to\\n     * @param _id The membership token id to mint\\n     * @param data Arbitrary data\\n     */\\n    function mintSingleBatch(\\n        address[] memory _accounts,\\n        uint256 _id,\\n        bytes memory data\\n    ) external;\\n\\n    function createPod(address[] memory _accounts, bytes memory data) external returns (uint256);\\n}\\n\",\"keccak256\":\"0xc597ff76776d203c80fcd6b90440f617858bdd3103f9ad33500919781e9404a0\"}},\"version\":1}",
  "bytecode": "0x6101006040523480156200001257600080fd5b506040516200308538038062003085833981016040819052620000359162000289565b6001600160601b0319606084811b821660805283901b1660a052620000616200005b3390565b6200021c565b6001600160a01b038516620000af5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b6001600160a01b038416620000f95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401620000a6565b6001600160a01b038316620001435760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401620000a6565b6001600160a01b0382166200018d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401620000a6565b6001600160a01b038116620001d75760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401620000a6565b606094851b6001600160601b031990811660c0529390941b90921660e0525050600180546001600160a01b0319166001600160a01b03909216919091179055620002f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200028457600080fd5b919050565b600080600080600060a08688031215620002a257600080fd5b620002ad866200026c565b9450620002bd602087016200026c565b9350620002cd604087016200026c565b9250620002dd606087016200026c565b9150620002ed608087016200026c565b90509295509295909350565b60805160601c60a05160601c60c05160601c60e05160601c612d1562000370600039600081816103a00152818161087e0152610d930152600081816102bc01528181610f6301528181611060015261174d01526000818161037901526115b80152600081816103c7015261158b0152612d156000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638d092f5d116100ee578063c7e2a4fc11610097578063e1fc2cc111610071578063e1fc2cc11461043f578063f0f39f5d14610452578063f2fde38b14610465578063fe258da71461047857600080fd5b8063c7e2a4fc146103e9578063cf00cec91461040c578063d5a844911461042c57600080fd5b8063b06a4120116100c8578063b06a412014610374578063bbc4541b1461039b578063be5405d2146103c257600080fd5b80638d092f5d146103275780638da5cb5b14610350578063afe5c8ff1461036157600080fd5b8063514648bb1161015b57806362067cd11161013557806362067cd1146102f1578063715018a61461030457806374d4f6d01461030c578063827be3cc1461031f57600080fd5b8063514648bb146102a45780635cb54384146102b7578063610b5925146102de57600080fd5b806337c591fa1161018c57806337c591fa1461022d578063436f8d031461025b5780634a9b5db71461029c57600080fd5b806326a13d30146101b35780632c8cde8214610205578063346e5c481461021a575b600080fd5b6101ef6040518060400160405280601681526020017f64656c656761746553657475702861646472657373290000000000000000000081525081565b6040516101fc9190612aca565b60405180910390f35b610218610213366004612772565b61048b565b005b6102186102283660046128b4565b6104ae565b61024d61023b366004612550565b60026020526000908152604090205481565b6040519081526020016101fc565b610284610269366004612882565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101fc565b6101ef610653565b6102186102b2366004612682565b61066f565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6102186102ec366004612550565b61080a565b6102186102ff3660046128d9565b610821565b610218610a81565b61021861031a366004612550565b610ae7565b6101ef610b3c565b610284610335366004612882565b6003602052600090815260409020546001600160a01b031681565b6000546001600160a01b0316610284565b600154610284906001600160a01b031681565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6103fc6103f7366004612550565b610b58565b60405190151581526020016101fc565b61041f61041a366004612550565b610bf1565b6040516101fc9190612a20565b61021861043a366004612550565b610c68565b61021861044d3660046128d9565b610d2c565b6102186104603660046125c3565b611055565b610218610473366004612550565b6112b8565b6103fc61048636600461258a565b611397565b60006104978686611434565b90506104a686828686866116b2565b505050505050565b6000828152600460209081526040808320546003909252909120546001600160a01b039182169116806105285760405162461bcd60e51b815260206004820152601160248201527f506f6420646f65736e277420657869737400000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b03821661059357336001600160a01b0382161461058e5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920736166652063616e20616464206e65772061646d696e0000000000604482015260640161051f565b6105eb565b336001600160a01b038316146105eb5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792061646d696e2063616e207570646174652061646d696e0000000000604482015260640161051f565b60008481526004602090815260409182902080546001600160a01b0319166001600160a01b0387169081179091558251878152918201527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a150505050565b6040518060800160405280605a8152602001612c40605a913981565b6001600160a01b0383166106c55760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420736166652061646472657373000000000000000000000000604482015260640161051f565b6001600160a01b0383166000908152600260205260409020541561072b5760405162461bcd60e51b815260206004820152601360248201527f7361666520616c726561647920696e2075736500000000000000000000000000604482015260640161051f565b61073483610b58565b6107805760405162461bcd60e51b815260206004820152601b60248201527f73616665206d6f64756c65206d75737420626520656e61626c65640000000000604482015260640161051f565b61078a8333611397565b8061079d5750336001600160a01b038416145b6107e95760405162461bcd60e51b815260206004820152601d60248201527f63616c6c6572206d7573742062652073616665206f72206d656d626572000000604482015260640161051f565b60006107f484610bf1565b905061080381858786866116b2565b5050505050565b6001600160a01b0381161561081e57600080fd5b50565b6001600160a01b0381166108695760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b60405163c3c5a54760e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c3c5a5479060240160206040518083038186803b1580156108c857600080fd5b505afa1580156108dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190612860565b61094c5760405162461bcd60e51b815260206004820152601960248201527f436f6e74726f6c6c6572206e6f74207265676973746572656400000000000000604482015260640161051f565b6000838152600460205260409020546001600160a01b031615801561098657506000838152600360205260409020546001600160a01b0316155b80156109a857506001600160a01b038116600090815260026020526040902054155b6109f45760405162461bcd60e51b815260206004820152601260248201527f506f6420616c7265616479206578697374730000000000000000000000000000604482015260640161051f565b600083815260046020908152604080832080546001600160a01b038781166001600160a01b03199283168117909355600385528386208054918816919092168117909155845260028352928190208690558051868152918201929092527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a1505050565b6000546001600160a01b03163314610adb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b610ae5600061197a565b565b60405163610b592560e01b81526001600160a01b0382166004820152309063610b592590602401600060405180830381600087803b158015610b2857600080fd5b505af1158015610803573d6000803e3d6000fd5b604051806080016040528060468152602001612c9a6046913981565b6040517f2d9ad53d0000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b03831690632d9ad53d9060240160206040518083038186803b158015610bb357600080fd5b505afa158015610bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610beb9190612860565b92915050565b6060816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c2c57600080fd5b505afa158015610c40573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610beb91908101906126ee565b6000546001600160a01b03163314610cc25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b6001600160a01b038116610d0a5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216610d745760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b60405163c3c5a54760e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c3c5a5479060240160206040518083038186803b158015610dd557600080fd5b505afa158015610de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0d9190612860565b610e595760405162461bcd60e51b815260206004820152601960248201527f436f6e74726f6c6c6572206e6f74207265676973746572656400000000000000604482015260640161051f565b6000838152600460209081526040808320546003909252909120546001600160a01b03918216911633821480610e975750336001600160a01b038216145b610ee35760405162461bcd60e51b815260206004820152601360248201527f55736572206e6f7420617574686f72697a656400000000000000000000000000604482015260640161051f565b600085815260046020818152604080842080546001600160a01b031990811690915560038352818520805490911690556001600160a01b03858116855260029092528084209390935591517f82786654000000000000000000000000000000000000000000000000000000008152908101879052858216602482015285917f00000000000000000000000000000000000000000000000000000000000000001690638278665490604401600060405180830381600087803b158015610fa757600080fd5b505af1158015610fbb573d6000803e3d6000fd5b50505050610fca8286866119ca565b6040517f62067cd1000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b03848116602483015283811660448301528216906362067cd190606401600060405180830381600087803b15801561103557600080fd5b505af1158015611049573d6000803e3d6000fd5b50505050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110cd5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420417574686f72697a6564000000000000000000000000000000000000604482015260640161051f565b6001600160a01b038616301480156111025750600160ff16816000815181106110f8576110f8612bfe565b016020015160f81c145b1561110c576104a6565b60005b83518110156112af57600084828151811061112c5761112c612bfe565b60209081029190910181015160008181526003835260408082205460049094529020549092506001600160a01b03918216919081169089166111f657816001600160a01b03168a6001600160a01b031614806111995750806001600160a01b03168a6001600160a01b0316145b806111ac57506001600160a01b038a1630145b6111e75760405162461bcd60e51b815260206004820152600c60248201526b139bc8149d5b195cc814d95d60a21b604482015260640161051f565b6111f18883611d3a565b611298565b6001600160a01b03881661128d57816001600160a01b03168a6001600160a01b031614806112355750806001600160a01b03168a6001600160a01b0316145b8061124857506001600160a01b038a1630145b6112835760405162461bcd60e51b815260206004820152600c60248201526b139bc8149d5b195cc814d95d60a21b604482015260640161051f565b6111f18983611eeb565b6112988989846121c7565b5050506001816112a89190612b6e565b905061110f565b50505050505050565b6000546001600160a01b031633146113125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b6001600160a01b03811661138e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051f565b61081e8161197a565b6040517f2f54bf6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009190841690632f54bf6e9060240160206040518083038186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142d9190612860565b9392505050565b604080518082018252601681527f64656c656761746553657475702861646472657373290000000000000000000060208201529051306024820152600091829160440160408051601f1981840301815290829052916114929161298b565b60405180910390206001600160e01b0319166020820180516001600160e01b03838183161783525050505090506000604051806080016040528060468152602001612c9a60469139858530856000806000806040516024016114fb989796959493929190612a61565b60408051601f1981840301815290829052916115169161298b565b60408051918290039091206020830180516001600160e01b03167fffffffff00000000000000000000000000000000000000000000000000000000909216919091179052517f61b69abd0000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906361b69abd906115e2907f00000000000000000000000000000000000000000000000000000000000000009085906004016129a7565b602060405180830381600087803b1580156115fc57600080fd5b505af192505050801561162c575060408051601f3d908101601f191682019092526116299181019061256d565b60015b6116a8573d80801561165a576040519150601f19603f3d011682016040523d82523d6000602084013e61165f565b606091505b5060405162461bcd60e51b815260206004820152601d60248201527f4372656174652050726f787920576974682044617461204661696c6564000000604482015260640161051f565b9250610beb915050565b604080516001808252818301909252600091602082018180368337019050509050600160f81b816000815181106116eb576116eb612bfe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506040517f9aa0055e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639aa0055e90611784908a908690600401612a33565b602060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d6919061289b565b90507fb298a97e1ae845f4ac62f176cde255ccfe5ac42197eae12459c99761bad66a488187878660405161180d9493929190612add565b60405180910390a1604080518281526001600160a01b03871660208201527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a16001600160a01b0385161561188d57600081815260046020526040902080546001600160a01b0319166001600160a01b0387161790555b600081815260036020908152604080832080546001600160a01b0319166001600160a01b038b8116918217909255808552600290935281842085905560015491517f98eed3e900000000000000000000000000000000000000000000000000000000815260048101899052602481019390935233604484015216906398eed3e990606401602060405180830381600087803b15801561192b57600080fd5b505af115801561193f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611963919061256d565b9050611970878286612369565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260009060440160408051601f198184030181529181526020820180516001600160e01b031663610b592560e01b1790525163468721a760e01b81529091506000906001600160a01b0386169063468721a790611a429088908590879082906004016129c9565b602060405180830381600087803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a949190612860565b905080611ae35760405162461bcd60e51b815260206004820152601a60248201527f4d6967726174696f6e206661696c6564206f6e20656e61626c65000000000000604482015260640161051f565b6040517fcc2f84520000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301526000919087169063cc2f84529060440160006040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b84919081019061272b565b509050306001600160a01b031681600081518110611ba457611ba4612bfe565b60200260200101516001600160a01b031614611c025760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420707265764d6f64756c65000000000000000000000000604482015260640161051f565b6040516001600160a01b038516602482015230604482015260009060640160408051601f198184030181529181526020820180516001600160e01b03167fe009cfde000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0389169063468721a790611c99908b908590879082906004016129c9565b602060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ceb9190612860565b9050806119705760405162461bcd60e51b815260206004820152601b60248201527f4d6967726174696f6e206661696c6564206f6e2064697361626c650000000000604482015260640161051f565b6000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611daf919061289b565b6040516001600160a01b03851660248201526044810182905290915060009060640160408051601f198184030181529181526020820180516001600160e01b03167f0d582f13000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0385169063468721a790611e4a9087908590879082906004016129c9565b602060405180830381600087803b158015611e6457600080fd5b505af1158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c9190612860565b9050806108035760405162461bcd60e51b815260206004820152601960248201527f4d6f64756c65205472616e73616374696f6e204661696c656400000000000000604482015260640161051f565b6000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611f2857600080fd5b505af1158015611f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f60919061289b565b90506000826001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b158015611f9d57600080fd5b505afa158015611fb1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fd991908101906126ee565b90506000805b825181101561206257856001600160a01b031683828151811061200457612004612bfe565b60200260200101516001600160a01b0316141561205057806120295760019150612050565b82612035600183612b86565b8151811061204557612045612bfe565b602002602001015191505b8061205a81612bcd565b915050611fdf565b5082600183516120729190612b86565b101561208657612083600184612b86565b92505b6040516001600160a01b038083166024830152861660448201526064810184905260009060840160408051601f198184030181529181526020820180516001600160e01b03167ff8dc5dd9000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0387169063468721a7906121269089908590879082906004016129c9565b602060405180830381600087803b15801561214057600080fd5b505af1158015612154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121789190612860565b9050806112af5760405162461bcd60e51b815260206004820152601960248201527f4d6f64756c65205472616e73616374696f6e204661696c656400000000000000604482015260640161051f565b6000816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561220257600080fd5b505afa158015612216573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261223e91908101906126ee565b90506000805b82518110156122c757856001600160a01b031683828151811061226957612269612bfe565b60200260200101516001600160a01b031614156122b5578061228e57600191506122b5565b8261229a600183612b86565b815181106122aa576122aa612bfe565b602002602001015191505b806122bf81612bcd565b915050612244565b506040516001600160a01b03808316602483015280871660448301528516606482015260009060840160408051601f198184030181529181526020820180516001600160e01b03167fe318b52b000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0386169063468721a7906121269088908590879082906004016129c9565b60008160405160240161237c9190612aca565b60408051601f198184030181529181526020820180516001600160e01b03167fc47f0027000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0386169063468721a790611e4a9087908590879082906004016129c9565b803561240081612c2a565b919050565b600082601f83011261241657600080fd5b8151602061242b61242683612b4a565b612b19565b80838252828201915082860187848660051b890101111561244b57600080fd5b60005b8581101561247357815161246181612c2a565b8452928401929084019060010161244e565b5090979650505050505050565b600082601f83011261249157600080fd5b813560206124a161242683612b4a565b80838252828201915082860187848660051b89010111156124c157600080fd5b60005b85811015612473578135845292840192908401906001016124c4565b600082601f8301126124f157600080fd5b813567ffffffffffffffff81111561250b5761250b612c14565b61251e601f8201601f1916602001612b19565b81815284602083860101111561253357600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561256257600080fd5b813561142d81612c2a565b60006020828403121561257f57600080fd5b815161142d81612c2a565b6000806040838503121561259d57600080fd5b82356125a881612c2a565b915060208301356125b881612c2a565b809150509250929050565b60008060008060008060c087890312156125dc57600080fd5b86356125e781612c2a565b955060208701356125f781612c2a565b9450604087013561260781612c2a565b9350606087013567ffffffffffffffff8082111561262457600080fd5b6126308a838b01612480565b9450608089013591508082111561264657600080fd5b6126528a838b01612480565b935060a089013591508082111561266857600080fd5b5061267589828a016124e0565b9150509295509295509295565b6000806000806080858703121561269857600080fd5b84356126a381612c2a565b935060208501356126b381612c2a565b925060408501359150606085013567ffffffffffffffff8111156126d657600080fd5b6126e2878288016124e0565b91505092959194509250565b60006020828403121561270057600080fd5b815167ffffffffffffffff81111561271757600080fd5b61272384828501612405565b949350505050565b6000806040838503121561273e57600080fd5b825167ffffffffffffffff81111561275557600080fd5b61276185828601612405565b92505060208301516125b881612c2a565b600080600080600060a0868803121561278a57600080fd5b853567ffffffffffffffff808211156127a257600080fd5b818801915088601f8301126127b657600080fd5b813560206127c661242683612b4a565b8083825282820191508286018d848660051b89010111156127e657600080fd5b600096505b848710156128125780356127fe81612c2a565b8352600196909601959183019183016127eb565b5099505089013596506128299050604089016123f5565b945060608801359350608088013591508082111561284657600080fd5b50612853888289016124e0565b9150509295509295909350565b60006020828403121561287257600080fd5b8151801515811461142d57600080fd5b60006020828403121561289457600080fd5b5035919050565b6000602082840312156128ad57600080fd5b5051919050565b600080604083850312156128c757600080fd5b8235915060208301356125b881612c2a565b6000806000606084860312156128ee57600080fd5b83359250602084013561290081612c2a565b9150604084013561291081612c2a565b809150509250925092565b600081518084526020808501945080840160005b838110156129545781516001600160a01b03168752958201959082019060010161292f565b509495945050505050565b60008151808452612977816020860160208601612b9d565b601f01601f19169290920160200192915050565b6000825161299d818460208701612b9d565b9190910192915050565b6001600160a01b0383168152604060208201526000612723604083018461295f565b6001600160a01b03851681528360208201526080604082015260006129f1608083018561295f565b905060028310612a1157634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b60208152600061142d602083018461291b565b604081526000612a46604083018561291b565b8281036020840152612a58818561295f565b95945050505050565b6000610100808352612a758184018c61291b565b90508960208401526001600160a01b03808a1660408501528382036060850152612a9f828a61295f565b978116608085015295861660a0840152505060c081019290925290911660e090910152949350505050565b60208152600061142d602083018461295f565b84815260006001600160a01b03808616602084015280851660408401525060806060830152612b0f608083018461295f565b9695505050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b4257612b42612c14565b604052919050565b600067ffffffffffffffff821115612b6457612b64612c14565b5060051b60200190565b60008219821115612b8157612b81612be8565b500190565b600082821015612b9857612b98612be8565b500390565b60005b83811015612bb8578181015183820152602001612ba0565b83811115612bc7576000848401525b50505050565b6000600019821415612be157612be1612be8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461081e57600080fdfe657865635472616e73616374696f6e28616464726573732c75696e743235362c62797465732c75696e74382c75696e743235362c75696e743235362c75696e743235362c616464726573732c616464726573732c627974657329736574757028616464726573735b5d2c75696e743235362c616464726573732c62797465732c616464726573732c616464726573732c75696e743235362c6164647265737329a264697066735822122058befbc87262d571b2abbe14e0c814db466a05fd13d281d0d304977114fe8ce964736f6c63430008070033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638d092f5d116100ee578063c7e2a4fc11610097578063e1fc2cc111610071578063e1fc2cc11461043f578063f0f39f5d14610452578063f2fde38b14610465578063fe258da71461047857600080fd5b8063c7e2a4fc146103e9578063cf00cec91461040c578063d5a844911461042c57600080fd5b8063b06a4120116100c8578063b06a412014610374578063bbc4541b1461039b578063be5405d2146103c257600080fd5b80638d092f5d146103275780638da5cb5b14610350578063afe5c8ff1461036157600080fd5b8063514648bb1161015b57806362067cd11161013557806362067cd1146102f1578063715018a61461030457806374d4f6d01461030c578063827be3cc1461031f57600080fd5b8063514648bb146102a45780635cb54384146102b7578063610b5925146102de57600080fd5b806337c591fa1161018c57806337c591fa1461022d578063436f8d031461025b5780634a9b5db71461029c57600080fd5b806326a13d30146101b35780632c8cde8214610205578063346e5c481461021a575b600080fd5b6101ef6040518060400160405280601681526020017f64656c656761746553657475702861646472657373290000000000000000000081525081565b6040516101fc9190612aca565b60405180910390f35b610218610213366004612772565b61048b565b005b6102186102283660046128b4565b6104ae565b61024d61023b366004612550565b60026020526000908152604090205481565b6040519081526020016101fc565b610284610269366004612882565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101fc565b6101ef610653565b6102186102b2366004612682565b61066f565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6102186102ec366004612550565b61080a565b6102186102ff3660046128d9565b610821565b610218610a81565b61021861031a366004612550565b610ae7565b6101ef610b3c565b610284610335366004612882565b6003602052600090815260409020546001600160a01b031681565b6000546001600160a01b0316610284565b600154610284906001600160a01b031681565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6103fc6103f7366004612550565b610b58565b60405190151581526020016101fc565b61041f61041a366004612550565b610bf1565b6040516101fc9190612a20565b61021861043a366004612550565b610c68565b61021861044d3660046128d9565b610d2c565b6102186104603660046125c3565b611055565b610218610473366004612550565b6112b8565b6103fc61048636600461258a565b611397565b60006104978686611434565b90506104a686828686866116b2565b505050505050565b6000828152600460209081526040808320546003909252909120546001600160a01b039182169116806105285760405162461bcd60e51b815260206004820152601160248201527f506f6420646f65736e277420657869737400000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b03821661059357336001600160a01b0382161461058e5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920736166652063616e20616464206e65772061646d696e0000000000604482015260640161051f565b6105eb565b336001600160a01b038316146105eb5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792061646d696e2063616e207570646174652061646d696e0000000000604482015260640161051f565b60008481526004602090815260409182902080546001600160a01b0319166001600160a01b0387169081179091558251878152918201527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a150505050565b6040518060800160405280605a8152602001612c40605a913981565b6001600160a01b0383166106c55760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420736166652061646472657373000000000000000000000000604482015260640161051f565b6001600160a01b0383166000908152600260205260409020541561072b5760405162461bcd60e51b815260206004820152601360248201527f7361666520616c726561647920696e2075736500000000000000000000000000604482015260640161051f565b61073483610b58565b6107805760405162461bcd60e51b815260206004820152601b60248201527f73616665206d6f64756c65206d75737420626520656e61626c65640000000000604482015260640161051f565b61078a8333611397565b8061079d5750336001600160a01b038416145b6107e95760405162461bcd60e51b815260206004820152601d60248201527f63616c6c6572206d7573742062652073616665206f72206d656d626572000000604482015260640161051f565b60006107f484610bf1565b905061080381858786866116b2565b5050505050565b6001600160a01b0381161561081e57600080fd5b50565b6001600160a01b0381166108695760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b60405163c3c5a54760e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c3c5a5479060240160206040518083038186803b1580156108c857600080fd5b505afa1580156108dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190612860565b61094c5760405162461bcd60e51b815260206004820152601960248201527f436f6e74726f6c6c6572206e6f74207265676973746572656400000000000000604482015260640161051f565b6000838152600460205260409020546001600160a01b031615801561098657506000838152600360205260409020546001600160a01b0316155b80156109a857506001600160a01b038116600090815260026020526040902054155b6109f45760405162461bcd60e51b815260206004820152601260248201527f506f6420616c7265616479206578697374730000000000000000000000000000604482015260640161051f565b600083815260046020908152604080832080546001600160a01b038781166001600160a01b03199283168117909355600385528386208054918816919092168117909155845260028352928190208690558051868152918201929092527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a1505050565b6000546001600160a01b03163314610adb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b610ae5600061197a565b565b60405163610b592560e01b81526001600160a01b0382166004820152309063610b592590602401600060405180830381600087803b158015610b2857600080fd5b505af1158015610803573d6000803e3d6000fd5b604051806080016040528060468152602001612c9a6046913981565b6040517f2d9ad53d0000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b03831690632d9ad53d9060240160206040518083038186803b158015610bb357600080fd5b505afa158015610bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610beb9190612860565b92915050565b6060816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c2c57600080fd5b505afa158015610c40573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610beb91908101906126ee565b6000546001600160a01b03163314610cc25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b6001600160a01b038116610d0a5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216610d745760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b60405163c3c5a54760e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c3c5a5479060240160206040518083038186803b158015610dd557600080fd5b505afa158015610de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0d9190612860565b610e595760405162461bcd60e51b815260206004820152601960248201527f436f6e74726f6c6c6572206e6f74207265676973746572656400000000000000604482015260640161051f565b6000838152600460209081526040808320546003909252909120546001600160a01b03918216911633821480610e975750336001600160a01b038216145b610ee35760405162461bcd60e51b815260206004820152601360248201527f55736572206e6f7420617574686f72697a656400000000000000000000000000604482015260640161051f565b600085815260046020818152604080842080546001600160a01b031990811690915560038352818520805490911690556001600160a01b03858116855260029092528084209390935591517f82786654000000000000000000000000000000000000000000000000000000008152908101879052858216602482015285917f00000000000000000000000000000000000000000000000000000000000000001690638278665490604401600060405180830381600087803b158015610fa757600080fd5b505af1158015610fbb573d6000803e3d6000fd5b50505050610fca8286866119ca565b6040517f62067cd1000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b03848116602483015283811660448301528216906362067cd190606401600060405180830381600087803b15801561103557600080fd5b505af1158015611049573d6000803e3d6000fd5b50505050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110cd5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420417574686f72697a6564000000000000000000000000000000000000604482015260640161051f565b6001600160a01b038616301480156111025750600160ff16816000815181106110f8576110f8612bfe565b016020015160f81c145b1561110c576104a6565b60005b83518110156112af57600084828151811061112c5761112c612bfe565b60209081029190910181015160008181526003835260408082205460049094529020549092506001600160a01b03918216919081169089166111f657816001600160a01b03168a6001600160a01b031614806111995750806001600160a01b03168a6001600160a01b0316145b806111ac57506001600160a01b038a1630145b6111e75760405162461bcd60e51b815260206004820152600c60248201526b139bc8149d5b195cc814d95d60a21b604482015260640161051f565b6111f18883611d3a565b611298565b6001600160a01b03881661128d57816001600160a01b03168a6001600160a01b031614806112355750806001600160a01b03168a6001600160a01b0316145b8061124857506001600160a01b038a1630145b6112835760405162461bcd60e51b815260206004820152600c60248201526b139bc8149d5b195cc814d95d60a21b604482015260640161051f565b6111f18983611eeb565b6112988989846121c7565b5050506001816112a89190612b6e565b905061110f565b50505050505050565b6000546001600160a01b031633146113125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b6001600160a01b03811661138e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051f565b61081e8161197a565b6040517f2f54bf6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009190841690632f54bf6e9060240160206040518083038186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142d9190612860565b9392505050565b604080518082018252601681527f64656c656761746553657475702861646472657373290000000000000000000060208201529051306024820152600091829160440160408051601f1981840301815290829052916114929161298b565b60405180910390206001600160e01b0319166020820180516001600160e01b03838183161783525050505090506000604051806080016040528060468152602001612c9a60469139858530856000806000806040516024016114fb989796959493929190612a61565b60408051601f1981840301815290829052916115169161298b565b60408051918290039091206020830180516001600160e01b03167fffffffff00000000000000000000000000000000000000000000000000000000909216919091179052517f61b69abd0000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906361b69abd906115e2907f00000000000000000000000000000000000000000000000000000000000000009085906004016129a7565b602060405180830381600087803b1580156115fc57600080fd5b505af192505050801561162c575060408051601f3d908101601f191682019092526116299181019061256d565b60015b6116a8573d80801561165a576040519150601f19603f3d011682016040523d82523d6000602084013e61165f565b606091505b5060405162461bcd60e51b815260206004820152601d60248201527f4372656174652050726f787920576974682044617461204661696c6564000000604482015260640161051f565b9250610beb915050565b604080516001808252818301909252600091602082018180368337019050509050600160f81b816000815181106116eb576116eb612bfe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506040517f9aa0055e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639aa0055e90611784908a908690600401612a33565b602060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d6919061289b565b90507fb298a97e1ae845f4ac62f176cde255ccfe5ac42197eae12459c99761bad66a488187878660405161180d9493929190612add565b60405180910390a1604080518281526001600160a01b03871660208201527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a16001600160a01b0385161561188d57600081815260046020526040902080546001600160a01b0319166001600160a01b0387161790555b600081815260036020908152604080832080546001600160a01b0319166001600160a01b038b8116918217909255808552600290935281842085905560015491517f98eed3e900000000000000000000000000000000000000000000000000000000815260048101899052602481019390935233604484015216906398eed3e990606401602060405180830381600087803b15801561192b57600080fd5b505af115801561193f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611963919061256d565b9050611970878286612369565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260009060440160408051601f198184030181529181526020820180516001600160e01b031663610b592560e01b1790525163468721a760e01b81529091506000906001600160a01b0386169063468721a790611a429088908590879082906004016129c9565b602060405180830381600087803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a949190612860565b905080611ae35760405162461bcd60e51b815260206004820152601a60248201527f4d6967726174696f6e206661696c6564206f6e20656e61626c65000000000000604482015260640161051f565b6040517fcc2f84520000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301526000919087169063cc2f84529060440160006040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b84919081019061272b565b509050306001600160a01b031681600081518110611ba457611ba4612bfe565b60200260200101516001600160a01b031614611c025760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420707265764d6f64756c65000000000000000000000000604482015260640161051f565b6040516001600160a01b038516602482015230604482015260009060640160408051601f198184030181529181526020820180516001600160e01b03167fe009cfde000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0389169063468721a790611c99908b908590879082906004016129c9565b602060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ceb9190612860565b9050806119705760405162461bcd60e51b815260206004820152601b60248201527f4d6967726174696f6e206661696c6564206f6e2064697361626c650000000000604482015260640161051f565b6000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611daf919061289b565b6040516001600160a01b03851660248201526044810182905290915060009060640160408051601f198184030181529181526020820180516001600160e01b03167f0d582f13000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0385169063468721a790611e4a9087908590879082906004016129c9565b602060405180830381600087803b158015611e6457600080fd5b505af1158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c9190612860565b9050806108035760405162461bcd60e51b815260206004820152601960248201527f4d6f64756c65205472616e73616374696f6e204661696c656400000000000000604482015260640161051f565b6000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611f2857600080fd5b505af1158015611f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f60919061289b565b90506000826001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b158015611f9d57600080fd5b505afa158015611fb1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fd991908101906126ee565b90506000805b825181101561206257856001600160a01b031683828151811061200457612004612bfe565b60200260200101516001600160a01b0316141561205057806120295760019150612050565b82612035600183612b86565b8151811061204557612045612bfe565b602002602001015191505b8061205a81612bcd565b915050611fdf565b5082600183516120729190612b86565b101561208657612083600184612b86565b92505b6040516001600160a01b038083166024830152861660448201526064810184905260009060840160408051601f198184030181529181526020820180516001600160e01b03167ff8dc5dd9000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0387169063468721a7906121269089908590879082906004016129c9565b602060405180830381600087803b15801561214057600080fd5b505af1158015612154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121789190612860565b9050806112af5760405162461bcd60e51b815260206004820152601960248201527f4d6f64756c65205472616e73616374696f6e204661696c656400000000000000604482015260640161051f565b6000816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561220257600080fd5b505afa158015612216573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261223e91908101906126ee565b90506000805b82518110156122c757856001600160a01b031683828151811061226957612269612bfe565b60200260200101516001600160a01b031614156122b5578061228e57600191506122b5565b8261229a600183612b86565b815181106122aa576122aa612bfe565b602002602001015191505b806122bf81612bcd565b915050612244565b506040516001600160a01b03808316602483015280871660448301528516606482015260009060840160408051601f198184030181529181526020820180516001600160e01b03167fe318b52b000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0386169063468721a7906121269088908590879082906004016129c9565b60008160405160240161237c9190612aca565b60408051601f198184030181529181526020820180516001600160e01b03167fc47f0027000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0386169063468721a790611e4a9087908590879082906004016129c9565b803561240081612c2a565b919050565b600082601f83011261241657600080fd5b8151602061242b61242683612b4a565b612b19565b80838252828201915082860187848660051b890101111561244b57600080fd5b60005b8581101561247357815161246181612c2a565b8452928401929084019060010161244e565b5090979650505050505050565b600082601f83011261249157600080fd5b813560206124a161242683612b4a565b80838252828201915082860187848660051b89010111156124c157600080fd5b60005b85811015612473578135845292840192908401906001016124c4565b600082601f8301126124f157600080fd5b813567ffffffffffffffff81111561250b5761250b612c14565b61251e601f8201601f1916602001612b19565b81815284602083860101111561253357600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561256257600080fd5b813561142d81612c2a565b60006020828403121561257f57600080fd5b815161142d81612c2a565b6000806040838503121561259d57600080fd5b82356125a881612c2a565b915060208301356125b881612c2a565b809150509250929050565b60008060008060008060c087890312156125dc57600080fd5b86356125e781612c2a565b955060208701356125f781612c2a565b9450604087013561260781612c2a565b9350606087013567ffffffffffffffff8082111561262457600080fd5b6126308a838b01612480565b9450608089013591508082111561264657600080fd5b6126528a838b01612480565b935060a089013591508082111561266857600080fd5b5061267589828a016124e0565b9150509295509295509295565b6000806000806080858703121561269857600080fd5b84356126a381612c2a565b935060208501356126b381612c2a565b925060408501359150606085013567ffffffffffffffff8111156126d657600080fd5b6126e2878288016124e0565b91505092959194509250565b60006020828403121561270057600080fd5b815167ffffffffffffffff81111561271757600080fd5b61272384828501612405565b949350505050565b6000806040838503121561273e57600080fd5b825167ffffffffffffffff81111561275557600080fd5b61276185828601612405565b92505060208301516125b881612c2a565b600080600080600060a0868803121561278a57600080fd5b853567ffffffffffffffff808211156127a257600080fd5b818801915088601f8301126127b657600080fd5b813560206127c661242683612b4a565b8083825282820191508286018d848660051b89010111156127e657600080fd5b600096505b848710156128125780356127fe81612c2a565b8352600196909601959183019183016127eb565b5099505089013596506128299050604089016123f5565b945060608801359350608088013591508082111561284657600080fd5b50612853888289016124e0565b9150509295509295909350565b60006020828403121561287257600080fd5b8151801515811461142d57600080fd5b60006020828403121561289457600080fd5b5035919050565b6000602082840312156128ad57600080fd5b5051919050565b600080604083850312156128c757600080fd5b8235915060208301356125b881612c2a565b6000806000606084860312156128ee57600080fd5b83359250602084013561290081612c2a565b9150604084013561291081612c2a565b809150509250925092565b600081518084526020808501945080840160005b838110156129545781516001600160a01b03168752958201959082019060010161292f565b509495945050505050565b60008151808452612977816020860160208601612b9d565b601f01601f19169290920160200192915050565b6000825161299d818460208701612b9d565b9190910192915050565b6001600160a01b0383168152604060208201526000612723604083018461295f565b6001600160a01b03851681528360208201526080604082015260006129f1608083018561295f565b905060028310612a1157634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b60208152600061142d602083018461291b565b604081526000612a46604083018561291b565b8281036020840152612a58818561295f565b95945050505050565b6000610100808352612a758184018c61291b565b90508960208401526001600160a01b03808a1660408501528382036060850152612a9f828a61295f565b978116608085015295861660a0840152505060c081019290925290911660e090910152949350505050565b60208152600061142d602083018461295f565b84815260006001600160a01b03808616602084015280851660408401525060806060830152612b0f608083018461295f565b9695505050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b4257612b42612c14565b604052919050565b600067ffffffffffffffff821115612b6457612b64612c14565b5060051b60200190565b60008219821115612b8157612b81612be8565b500190565b600082821015612b9857612b98612be8565b500390565b60005b83811015612bb8578181015183820152602001612ba0565b83811115612bc7576000848401525b50505050565b6000600019821415612be157612be1612be8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461081e57600080fdfe657865635472616e73616374696f6e28616464726573732c75696e743235362c62797465732c75696e74382c75696e743235362c75696e743235362c75696e743235362c616464726573732c616464726573732c627974657329736574757028616464726573735b5d2c75696e743235362c616464726573732c62797465732c616464726573732c616464726573732c75696e743235362c6164647265737329a264697066735822122058befbc87262d571b2abbe14e0c814db466a05fd13d281d0d304977114fe8ce964736f6c63430008070033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "beforeTokenTransfer(address,address,address,uint256[],uint256[],bytes)": {
        "params": {
          "data": "Passes a flag for an initial creation event",
          "from": "The address sending the membership token",
          "ids": "An array of membership token ids to be transfered",
          "operator": "The address that initiated the action",
          "to": "The address recieveing the membership token"
        }
      },
      "constructor": {
        "details": "Will instantiate safe teller with gnosis master and proxy addresses",
        "params": {
          "_controllerRegistry": "The address of the ControllerRegistry contract",
          "_gnosisMasterAddress": "The gnosis master address",
          "_memberToken": "The address of the MemberToken contract",
          "_proxyFactoryAddress": "The proxy factory address"
        }
      },
      "createPod(address[],uint256,address,bytes32,string)": {
        "params": {
          "_admin": "The address of the pod admin",
          "_ensString": "string of pod ens name (i.e.'mypod.pod.xyz')",
          "_label": "label hash of pod name (i.e labelhash('mypod'))",
          "_members": "The addresses of the members of the pod",
          "threshold": "The number of members that are required to sign a transaction"
        }
      },
      "createPodWithSafe(address,address,bytes32,string)": {
        "details": "Used to create a pod with an existing safeWill automatically distribute membership NFTs to current safe members",
        "params": {
          "_admin": "The address of the pod admin",
          "_ensString": "string of pod ens name (i.e.'mypod.pod.xyz')",
          "_label": "label hash of pod name (i.e labelhash('mypod'))",
          "_safe": "The address of existing safe"
        }
      },
      "migratePodController(uint256,address,address)": {
        "details": "This will nullify all pod state on this controllerUpdate state on _newControllerUpdate controller to _newController in Safe and MemberToken",
        "params": {
          "_newController": "The address of the new pod controller",
          "_podId": "The id number of the pod",
          "_prevModule": "The module that points to the orca module in the safe's ModuleManager linked list"
        }
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "updatePodAdmin(uint256,address)": {
        "params": {
          "_newAdmin": "The address of the new pod admin",
          "_podId": "The id number of the pod"
        }
      },
      "updatePodState(uint256,address,address)": {
        "details": "This is called by another version of controller to migrate a pod to this versionWill only accept calls from registered controllersCan only be called once.",
        "params": {
          "_podAdmin": "The address of the pod admin",
          "_podId": "The id number of the pod",
          "_safeAddress": "The address of the safe"
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 775,
        "contract": "contracts/Controller.sol:Controller",
        "label": "_owner",
        "offset": 0,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 3564,
        "contract": "contracts/Controller.sol:Controller",
        "label": "podEnsRegistrar",
        "offset": 0,
        "slot": "1",
        "type": "t_contract(IPodEnsRegistrar)5504"
      },
      {
        "astId": 3568,
        "contract": "contracts/Controller.sol:Controller",
        "label": "safeToPodId",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 3572,
        "contract": "contracts/Controller.sol:Controller",
        "label": "podIdToSafe",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_address)"
      },
      {
        "astId": 3576,
        "contract": "contracts/Controller.sol:Controller",
        "label": "podAdmin",
        "offset": 0,
        "slot": "4",
        "type": "t_mapping(t_uint256,t_address)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_contract(IPodEnsRegistrar)5504": {
        "encoding": "inplace",
        "label": "contract IPodEnsRegistrar",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_uint256,t_address)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}