{
  "contractName": "ICompliance",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "TokenAgentAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "TokenAgentRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "TokenBound",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "TokenUnbound",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "isTokenAgent",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "isTokenBound",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "addTokenAgent",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "removeTokenAgent",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "bindToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "unbindToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "canTransfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "transferred",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "created",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "destroyed",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnershipOnComplianceContract",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"TokenAgentAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"TokenAgentRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"TokenBound\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"TokenUnbound\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"addTokenAgent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"bindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"canTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"created\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"destroyed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"isTokenAgent\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"isTokenBound\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"removeTokenAgent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnershipOnComplianceContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferred\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"unbindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addTokenAgent(address)\":{\"details\":\"adds an agent to the list of token agents\",\"params\":{\"_agentAddress\":\"address of the agent to be added  Emits a TokenAgentAdded event\"}},\"bindToken(address)\":{\"details\":\"binds a token to the compliance contract\",\"params\":{\"_token\":\"address of the token to bind  Emits a TokenBound event\"}},\"canTransfer(address,address,uint256)\":{\"details\":\"checks that the transfer is compliant.  default compliance always returns true  READ ONLY FUNCTION, this function cannot be used to increment  counters, emit events, ...\",\"params\":{\"_amount\":\"The amount of tokens involved in the transfer\",\"_from\":\"The address of the sender\",\"_to\":\"The address of the receiver\"}},\"created(address,uint256)\":{\"details\":\"function called whenever tokens are created  on a wallet  this function can update state variables in the compliance contract  these state variables being used by `canTransfer` to decide if a transfer  is compliant or not depending on the values stored in these state variables and on  the parameters of the compliance smart contract\",\"params\":{\"_amount\":\"The amount of tokens involved in the transfer\",\"_to\":\"The address of the receiver\"}},\"destroyed(address,uint256)\":{\"details\":\"function called whenever tokens are destroyed  this function can update state variables in the compliance contract  these state variables being used by `canTransfer` to decide if a transfer  is compliant or not depending on the values stored in these state variables and on  the parameters of the compliance smart contract\",\"params\":{\"_amount\":\"The amount of tokens involved in the transfer\",\"_from\":\"The address of the receiver\"}},\"isTokenAgent(address)\":{\"details\":\"Returns true if the Address is in the list of token agents\",\"params\":{\"_agentAddress\":\"address of this agent\"}},\"isTokenBound(address)\":{\"details\":\"Returns true if the address given corresponds to a token that is bound with the Compliance contract\",\"params\":{\"_token\":\"address of the token\"}},\"removeTokenAgent(address)\":{\"details\":\"remove Agent from the list of token agents\",\"params\":{\"_agentAddress\":\"address of the agent to be removed (must be added first)  Emits a TokenAgentRemoved event\"}},\"transferOwnershipOnComplianceContract(address)\":{\"details\":\"function used to transfer the ownership of the compliance contract  to a new owner, giving him access to the `OnlyOwner` functions implemented on the contract\",\"params\":{\"newOwner\":\"The address of the new owner of the compliance contract  This function can only be called by the owner of the compliance contract  emits an `OwnershipTransferred` event\"}},\"transferred(address,address,uint256)\":{\"details\":\"function called whenever tokens are transferred  from one wallet to another  this function can update state variables in the compliance contract  these state variables being used by `canTransfer` to decide if a transfer  is compliant or not depending on the values stored in these state variables and on  the parameters of the compliance smart contract\",\"params\":{\"_amount\":\"The amount of tokens involved in the transfer\",\"_from\":\"The address of the sender\",\"_to\":\"The address of the receiver\"}},\"unbindToken(address)\":{\"details\":\"unbinds a token from the compliance contract\",\"params\":{\"_token\":\"address of the token to unbind  Emits a TokenUnbound event\"}}},\"version\":1},\"userdoc\":{\"events\":{\"TokenAgentAdded(address)\":{\"notice\":\"this event is emitted when the Agent has been added on the allowedList of this Compliance.  the event is emitted by the Compliance constructor and by the addTokenAgent function  `_agentAddress` is the address of the Agent to add\"},\"TokenAgentRemoved(address)\":{\"notice\":\"this event is emitted when the Agent has been removed from the agent list of this Compliance.  the event is emitted by the Compliance constructor and by the removeTokenAgent function  `_agentAddress` is the address of the Agent to remove\"},\"TokenBound(address)\":{\"notice\":\"this event is emitted when a token has been bound to the compliance contract  the event is emitted by the bindToken function  `_token` is the address of the token to bind\"},\"TokenUnbound(address)\":{\"notice\":\"this event is emitted when a token has been unbound from the compliance contract  the event is emitted by the unbindToken function  `_token` is the address of the token to unbind\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/compliance/ICompliance.sol\":\"ICompliance\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"project:/contracts/compliance/ICompliance.sol\":{\"keccak256\":\"0x4049905b34eab118c0c3f644450299a5ed8022bbbdb26036e7c2854dae8ae1ba\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://f8144953d88f543b2f537514f1136b8adf705837ba6d420b95569f6895153edb\",\"dweb:/ipfs/QmRqM7A6XrofFR67k8RtNNEkriAbKsQHDgUYaKZTMr9Nm5\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "// SPDX-License-Identifier: GPL-3.0\n\n/**\n *     NOTICE\n *\n *     The T-REX software is licensed under a proprietary license or the GPL v.3.\n *     If you choose to receive it under the GPL v.3 license, the following applies:\n *     T-REX is a suite of smart contracts developed by Tokeny to manage and transfer financial assets on the ethereum blockchain\n *\n *     Copyright (C) 2021, Tokeny sàrl.\n *\n *     This program is free software: you can redistribute it and/or modify\n *     it under the terms of the GNU General Public License as published by\n *     the Free Software Foundation, either version 3 of the License, or\n *     (at your option) any later version.\n *\n *     This program is distributed in the hope that it will be useful,\n *     but WITHOUT ANY WARRANTY; without even the implied warranty of\n *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *     GNU General Public License for more details.\n *\n *     You should have received a copy of the GNU General Public License\n *     along with this program.  If not, see <https://www.gnu.org/licenses/>.\n */\n\npragma solidity ^0.8.0;\n\ninterface ICompliance {\n    /**\n     *  this event is emitted when the Agent has been added on the allowedList of this Compliance.\n     *  the event is emitted by the Compliance constructor and by the addTokenAgent function\n     *  `_agentAddress` is the address of the Agent to add\n     */\n    event TokenAgentAdded(address _agentAddress);\n\n    /**\n     *  this event is emitted when the Agent has been removed from the agent list of this Compliance.\n     *  the event is emitted by the Compliance constructor and by the removeTokenAgent function\n     *  `_agentAddress` is the address of the Agent to remove\n     */\n    event TokenAgentRemoved(address _agentAddress);\n\n    /**\n     *  this event is emitted when a token has been bound to the compliance contract\n     *  the event is emitted by the bindToken function\n     *  `_token` is the address of the token to bind\n     */\n    event TokenBound(address _token);\n\n    /**\n     *  this event is emitted when a token has been unbound from the compliance contract\n     *  the event is emitted by the unbindToken function\n     *  `_token` is the address of the token to unbind\n     */\n    event TokenUnbound(address _token);\n\n    /**\n     *  @dev Returns true if the Address is in the list of token agents\n     *  @param _agentAddress address of this agent\n     */\n    function isTokenAgent(address _agentAddress) external view returns (bool);\n\n    /**\n     *  @dev Returns true if the address given corresponds to a token that is bound with the Compliance contract\n     *  @param _token address of the token\n     */\n    function isTokenBound(address _token) external view returns (bool);\n\n    /**\n     *  @dev adds an agent to the list of token agents\n     *  @param _agentAddress address of the agent to be added\n     *  Emits a TokenAgentAdded event\n     */\n    function addTokenAgent(address _agentAddress) external;\n\n    /**\n     *  @dev remove Agent from the list of token agents\n     *  @param _agentAddress address of the agent to be removed (must be added first)\n     *  Emits a TokenAgentRemoved event\n     */\n    function removeTokenAgent(address _agentAddress) external;\n\n    /**\n     *  @dev binds a token to the compliance contract\n     *  @param _token address of the token to bind\n     *  Emits a TokenBound event\n     */\n    function bindToken(address _token) external;\n\n    /**\n     *  @dev unbinds a token from the compliance contract\n     *  @param _token address of the token to unbind\n     *  Emits a TokenUnbound event\n     */\n    function unbindToken(address _token) external;\n\n    /**\n     *  @dev checks that the transfer is compliant.\n     *  default compliance always returns true\n     *  READ ONLY FUNCTION, this function cannot be used to increment\n     *  counters, emit events, ...\n     *  @param _from The address of the sender\n     *  @param _to The address of the receiver\n     *  @param _amount The amount of tokens involved in the transfer\n     */\n    function canTransfer(\n        address _from,\n        address _to,\n        uint256 _amount\n    ) external view returns (bool);\n\n    /**\n     *  @dev function called whenever tokens are transferred\n     *  from one wallet to another\n     *  this function can update state variables in the compliance contract\n     *  these state variables being used by `canTransfer` to decide if a transfer\n     *  is compliant or not depending on the values stored in these state variables and on\n     *  the parameters of the compliance smart contract\n     *  @param _from The address of the sender\n     *  @param _to The address of the receiver\n     *  @param _amount The amount of tokens involved in the transfer\n     */\n    function transferred(\n        address _from,\n        address _to,\n        uint256 _amount\n    ) external;\n\n    /**\n     *  @dev function called whenever tokens are created\n     *  on a wallet\n     *  this function can update state variables in the compliance contract\n     *  these state variables being used by `canTransfer` to decide if a transfer\n     *  is compliant or not depending on the values stored in these state variables and on\n     *  the parameters of the compliance smart contract\n     *  @param _to The address of the receiver\n     *  @param _amount The amount of tokens involved in the transfer\n     */\n    function created(address _to, uint256 _amount) external;\n\n    /**\n     *  @dev function called whenever tokens are destroyed\n     *  this function can update state variables in the compliance contract\n     *  these state variables being used by `canTransfer` to decide if a transfer\n     *  is compliant or not depending on the values stored in these state variables and on\n     *  the parameters of the compliance smart contract\n     *  @param _from The address of the receiver\n     *  @param _amount The amount of tokens involved in the transfer\n     */\n    function destroyed(address _from, uint256 _amount) external;\n\n    /**\n     *  @dev function used to transfer the ownership of the compliance contract\n     *  to a new owner, giving him access to the `OnlyOwner` functions implemented on the contract\n     *  @param newOwner The address of the new owner of the compliance contract\n     *  This function can only be called by the owner of the compliance contract\n     *  emits an `OwnershipTransferred` event\n     */\n    function transferOwnershipOnComplianceContract(address newOwner) external;\n}\n",
  "sourcePath": "/home/webxpert/workspace/shipfinex/latest-repos/tokenx_smartcontract/contracts/compliance/ICompliance.sol",
  "ast": {
    "absolutePath": "project:/contracts/compliance/ICompliance.sol",
    "exportedSymbols": {
      "ICompliance": [
        5596
      ]
    },
    "id": 5597,
    "license": "GPL-3.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5491,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "1094:23:30"
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "ICompliance",
        "contractDependencies": [],
        "contractKind": "interface",
        "fullyImplemented": false,
        "id": 5596,
        "linearizedBaseContracts": [
          5596
        ],
        "name": "ICompliance",
        "nameLocation": "1129:11:30",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": {
              "id": 5492,
              "nodeType": "StructuredDocumentation",
              "src": "1147:262:30",
              "text": "  this event is emitted when the Agent has been added on the allowedList of this Compliance.\n  the event is emitted by the Compliance constructor and by the addTokenAgent function\n  `_agentAddress` is the address of the Agent to add"
            },
            "eventSelector": "d62c45e13ac30396aceb3ad37c89bd1ba9048032fe61679000e92eb93dbfd67d",
            "id": 5496,
            "name": "TokenAgentAdded",
            "nameLocation": "1420:15:30",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5495,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5494,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_agentAddress",
                  "nameLocation": "1444:13:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5496,
                  "src": "1436:21:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5493,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1436:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1435:23:30"
            },
            "src": "1414:45:30"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 5497,
              "nodeType": "StructuredDocumentation",
              "src": "1465:271:30",
              "text": "  this event is emitted when the Agent has been removed from the agent list of this Compliance.\n  the event is emitted by the Compliance constructor and by the removeTokenAgent function\n  `_agentAddress` is the address of the Agent to remove"
            },
            "eventSelector": "6a659bb87bb23efbdc295f8eed8ae8c4379bfb77660ced2ef0f3d7d26b05c6a6",
            "id": 5501,
            "name": "TokenAgentRemoved",
            "nameLocation": "1747:17:30",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5500,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5499,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_agentAddress",
                  "nameLocation": "1773:13:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5501,
                  "src": "1765:21:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5498,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1765:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1764:23:30"
            },
            "src": "1741:47:30"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 5502,
              "nodeType": "StructuredDocumentation",
              "src": "1794:204:30",
              "text": "  this event is emitted when a token has been bound to the compliance contract\n  the event is emitted by the bindToken function\n  `_token` is the address of the token to bind"
            },
            "eventSelector": "2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b",
            "id": 5506,
            "name": "TokenBound",
            "nameLocation": "2009:10:30",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5505,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5504,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_token",
                  "nameLocation": "2028:6:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5506,
                  "src": "2020:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5503,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2020:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2019:16:30"
            },
            "src": "2003:33:30"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 5507,
              "nodeType": "StructuredDocumentation",
              "src": "2042:212:30",
              "text": "  this event is emitted when a token has been unbound from the compliance contract\n  the event is emitted by the unbindToken function\n  `_token` is the address of the token to unbind"
            },
            "eventSelector": "28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a",
            "id": 5511,
            "name": "TokenUnbound",
            "nameLocation": "2265:12:30",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5510,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5509,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_token",
                  "nameLocation": "2286:6:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5511,
                  "src": "2278:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5508,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2278:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2277:16:30"
            },
            "src": "2259:35:30"
          },
          {
            "documentation": {
              "id": 5512,
              "nodeType": "StructuredDocumentation",
              "src": "2300:134:30",
              "text": "  @dev Returns true if the Address is in the list of token agents\n  @param _agentAddress address of this agent"
            },
            "functionSelector": "346531fa",
            "id": 5519,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "isTokenAgent",
            "nameLocation": "2448:12:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5515,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5514,
                  "mutability": "mutable",
                  "name": "_agentAddress",
                  "nameLocation": "2469:13:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5519,
                  "src": "2461:21:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5513,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2461:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2460:23:30"
            },
            "returnParameters": {
              "id": 5518,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5517,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5519,
                  "src": "2507:4:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5516,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2507:4:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2506:6:30"
            },
            "scope": 5596,
            "src": "2439:74:30",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5520,
              "nodeType": "StructuredDocumentation",
              "src": "2519:167:30",
              "text": "  @dev Returns true if the address given corresponds to a token that is bound with the Compliance contract\n  @param _token address of the token"
            },
            "functionSelector": "993e8b95",
            "id": 5527,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "isTokenBound",
            "nameLocation": "2700:12:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5523,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5522,
                  "mutability": "mutable",
                  "name": "_token",
                  "nameLocation": "2721:6:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5527,
                  "src": "2713:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5521,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2713:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2712:16:30"
            },
            "returnParameters": {
              "id": 5526,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5525,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5527,
                  "src": "2752:4:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5524,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2752:4:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2751:6:30"
            },
            "scope": 5596,
            "src": "2691:67:30",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5528,
              "nodeType": "StructuredDocumentation",
              "src": "2764:166:30",
              "text": "  @dev adds an agent to the list of token agents\n  @param _agentAddress address of the agent to be added\n  Emits a TokenAgentAdded event"
            },
            "functionSelector": "ff3e6954",
            "id": 5533,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "addTokenAgent",
            "nameLocation": "2944:13:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5531,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5530,
                  "mutability": "mutable",
                  "name": "_agentAddress",
                  "nameLocation": "2966:13:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5533,
                  "src": "2958:21:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5529,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2958:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2957:23:30"
            },
            "returnParameters": {
              "id": 5532,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2989:0:30"
            },
            "scope": 5596,
            "src": "2935:55:30",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5534,
              "nodeType": "StructuredDocumentation",
              "src": "2996:193:30",
              "text": "  @dev remove Agent from the list of token agents\n  @param _agentAddress address of the agent to be removed (must be added first)\n  Emits a TokenAgentRemoved event"
            },
            "functionSelector": "cdde2932",
            "id": 5539,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "removeTokenAgent",
            "nameLocation": "3203:16:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5537,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5536,
                  "mutability": "mutable",
                  "name": "_agentAddress",
                  "nameLocation": "3228:13:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5539,
                  "src": "3220:21:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5535,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3220:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3219:23:30"
            },
            "returnParameters": {
              "id": 5538,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3251:0:30"
            },
            "scope": 5596,
            "src": "3194:58:30",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5540,
              "nodeType": "StructuredDocumentation",
              "src": "3258:149:30",
              "text": "  @dev binds a token to the compliance contract\n  @param _token address of the token to bind\n  Emits a TokenBound event"
            },
            "functionSelector": "3ff5aa02",
            "id": 5545,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "bindToken",
            "nameLocation": "3421:9:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5543,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5542,
                  "mutability": "mutable",
                  "name": "_token",
                  "nameLocation": "3439:6:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5545,
                  "src": "3431:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5541,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3431:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3430:16:30"
            },
            "returnParameters": {
              "id": 5544,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3455:0:30"
            },
            "scope": 5596,
            "src": "3412:44:30",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5546,
              "nodeType": "StructuredDocumentation",
              "src": "3462:157:30",
              "text": "  @dev unbinds a token from the compliance contract\n  @param _token address of the token to unbind\n  Emits a TokenUnbound event"
            },
            "functionSelector": "40db3b50",
            "id": 5551,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "unbindToken",
            "nameLocation": "3633:11:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5549,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5548,
                  "mutability": "mutable",
                  "name": "_token",
                  "nameLocation": "3653:6:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5551,
                  "src": "3645:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5547,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3645:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3644:16:30"
            },
            "returnParameters": {
              "id": 5550,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3669:0:30"
            },
            "scope": 5596,
            "src": "3624:46:30",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5552,
              "nodeType": "StructuredDocumentation",
              "src": "3676:378:30",
              "text": "  @dev checks that the transfer is compliant.\n  default compliance always returns true\n  READ ONLY FUNCTION, this function cannot be used to increment\n  counters, emit events, ...\n  @param _from The address of the sender\n  @param _to The address of the receiver\n  @param _amount The amount of tokens involved in the transfer"
            },
            "functionSelector": "e46638e6",
            "id": 5563,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "canTransfer",
            "nameLocation": "4068:11:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5559,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5554,
                  "mutability": "mutable",
                  "name": "_from",
                  "nameLocation": "4097:5:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5563,
                  "src": "4089:13:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5553,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4089:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5556,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "4120:3:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5563,
                  "src": "4112:11:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5555,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4112:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5558,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "4141:7:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5563,
                  "src": "4133:15:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5557,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4133:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4079:75:30"
            },
            "returnParameters": {
              "id": 5562,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5561,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5563,
                  "src": "4178:4:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5560,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4178:4:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4177:6:30"
            },
            "scope": 5596,
            "src": "4059:125:30",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5564,
              "nodeType": "StructuredDocumentation",
              "src": "4190:575:30",
              "text": "  @dev function called whenever tokens are transferred\n  from one wallet to another\n  this function can update state variables in the compliance contract\n  these state variables being used by `canTransfer` to decide if a transfer\n  is compliant or not depending on the values stored in these state variables and on\n  the parameters of the compliance smart contract\n  @param _from The address of the sender\n  @param _to The address of the receiver\n  @param _amount The amount of tokens involved in the transfer"
            },
            "functionSelector": "8baf29b4",
            "id": 5573,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "transferred",
            "nameLocation": "4779:11:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5571,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5566,
                  "mutability": "mutable",
                  "name": "_from",
                  "nameLocation": "4808:5:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5573,
                  "src": "4800:13:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5565,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4800:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5568,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "4831:3:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5573,
                  "src": "4823:11:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5567,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4823:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5570,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "4852:7:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5573,
                  "src": "4844:15:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5569,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4844:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4790:75:30"
            },
            "returnParameters": {
              "id": 5572,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4874:0:30"
            },
            "scope": 5596,
            "src": "4770:105:30",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5574,
              "nodeType": "StructuredDocumentation",
              "src": "4881:509:30",
              "text": "  @dev function called whenever tokens are created\n  on a wallet\n  this function can update state variables in the compliance contract\n  these state variables being used by `canTransfer` to decide if a transfer\n  is compliant or not depending on the values stored in these state variables and on\n  the parameters of the compliance smart contract\n  @param _to The address of the receiver\n  @param _amount The amount of tokens involved in the transfer"
            },
            "functionSelector": "5f8dead3",
            "id": 5581,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "created",
            "nameLocation": "5404:7:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5579,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5576,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "5420:3:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5581,
                  "src": "5412:11:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5575,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5412:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5578,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "5433:7:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5581,
                  "src": "5425:15:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5577,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5425:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5411:30:30"
            },
            "returnParameters": {
              "id": 5580,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5450:0:30"
            },
            "scope": 5596,
            "src": "5395:56:30",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5582,
              "nodeType": "StructuredDocumentation",
              "src": "5457:493:30",
              "text": "  @dev function called whenever tokens are destroyed\n  this function can update state variables in the compliance contract\n  these state variables being used by `canTransfer` to decide if a transfer\n  is compliant or not depending on the values stored in these state variables and on\n  the parameters of the compliance smart contract\n  @param _from The address of the receiver\n  @param _amount The amount of tokens involved in the transfer"
            },
            "functionSelector": "8d2ea772",
            "id": 5589,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "destroyed",
            "nameLocation": "5964:9:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5587,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5584,
                  "mutability": "mutable",
                  "name": "_from",
                  "nameLocation": "5982:5:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5589,
                  "src": "5974:13:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5583,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5974:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5586,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "5997:7:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5589,
                  "src": "5989:15:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5585,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5989:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5973:32:30"
            },
            "returnParameters": {
              "id": 5588,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6014:0:30"
            },
            "scope": 5596,
            "src": "5955:60:30",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 5590,
              "nodeType": "StructuredDocumentation",
              "src": "6021:397:30",
              "text": "  @dev function used to transfer the ownership of the compliance contract\n  to a new owner, giving him access to the `OnlyOwner` functions implemented on the contract\n  @param newOwner The address of the new owner of the compliance contract\n  This function can only be called by the owner of the compliance contract\n  emits an `OwnershipTransferred` event"
            },
            "functionSelector": "7bcf0487",
            "id": 5595,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "transferOwnershipOnComplianceContract",
            "nameLocation": "6432:37:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5593,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5592,
                  "mutability": "mutable",
                  "name": "newOwner",
                  "nameLocation": "6478:8:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5595,
                  "src": "6470:16:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5591,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6470:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6469:18:30"
            },
            "returnParameters": {
              "id": 5594,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6496:0:30"
            },
            "scope": 5596,
            "src": "6423:74:30",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 5597,
        "src": "1119:5380:30",
        "usedErrors": []
      }
    ],
    "src": "1094:5406:30"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.17+commit.8df45f5f.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.8",
  "updatedAt": "2022-12-08T12:51:01.357Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "addTokenAgent(address)": {
        "details": "adds an agent to the list of token agents",
        "params": {
          "_agentAddress": "address of the agent to be added  Emits a TokenAgentAdded event"
        }
      },
      "bindToken(address)": {
        "details": "binds a token to the compliance contract",
        "params": {
          "_token": "address of the token to bind  Emits a TokenBound event"
        }
      },
      "canTransfer(address,address,uint256)": {
        "details": "checks that the transfer is compliant.  default compliance always returns true  READ ONLY FUNCTION, this function cannot be used to increment  counters, emit events, ...",
        "params": {
          "_amount": "The amount of tokens involved in the transfer",
          "_from": "The address of the sender",
          "_to": "The address of the receiver"
        }
      },
      "created(address,uint256)": {
        "details": "function called whenever tokens are created  on a wallet  this function can update state variables in the compliance contract  these state variables being used by `canTransfer` to decide if a transfer  is compliant or not depending on the values stored in these state variables and on  the parameters of the compliance smart contract",
        "params": {
          "_amount": "The amount of tokens involved in the transfer",
          "_to": "The address of the receiver"
        }
      },
      "destroyed(address,uint256)": {
        "details": "function called whenever tokens are destroyed  this function can update state variables in the compliance contract  these state variables being used by `canTransfer` to decide if a transfer  is compliant or not depending on the values stored in these state variables and on  the parameters of the compliance smart contract",
        "params": {
          "_amount": "The amount of tokens involved in the transfer",
          "_from": "The address of the receiver"
        }
      },
      "isTokenAgent(address)": {
        "details": "Returns true if the Address is in the list of token agents",
        "params": {
          "_agentAddress": "address of this agent"
        }
      },
      "isTokenBound(address)": {
        "details": "Returns true if the address given corresponds to a token that is bound with the Compliance contract",
        "params": {
          "_token": "address of the token"
        }
      },
      "removeTokenAgent(address)": {
        "details": "remove Agent from the list of token agents",
        "params": {
          "_agentAddress": "address of the agent to be removed (must be added first)  Emits a TokenAgentRemoved event"
        }
      },
      "transferOwnershipOnComplianceContract(address)": {
        "details": "function used to transfer the ownership of the compliance contract  to a new owner, giving him access to the `OnlyOwner` functions implemented on the contract",
        "params": {
          "newOwner": "The address of the new owner of the compliance contract  This function can only be called by the owner of the compliance contract  emits an `OwnershipTransferred` event"
        }
      },
      "transferred(address,address,uint256)": {
        "details": "function called whenever tokens are transferred  from one wallet to another  this function can update state variables in the compliance contract  these state variables being used by `canTransfer` to decide if a transfer  is compliant or not depending on the values stored in these state variables and on  the parameters of the compliance smart contract",
        "params": {
          "_amount": "The amount of tokens involved in the transfer",
          "_from": "The address of the sender",
          "_to": "The address of the receiver"
        }
      },
      "unbindToken(address)": {
        "details": "unbinds a token from the compliance contract",
        "params": {
          "_token": "address of the token to unbind  Emits a TokenUnbound event"
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "events": {
      "TokenAgentAdded(address)": {
        "notice": "this event is emitted when the Agent has been added on the allowedList of this Compliance.  the event is emitted by the Compliance constructor and by the addTokenAgent function  `_agentAddress` is the address of the Agent to add"
      },
      "TokenAgentRemoved(address)": {
        "notice": "this event is emitted when the Agent has been removed from the agent list of this Compliance.  the event is emitted by the Compliance constructor and by the removeTokenAgent function  `_agentAddress` is the address of the Agent to remove"
      },
      "TokenBound(address)": {
        "notice": "this event is emitted when a token has been bound to the compliance contract  the event is emitted by the bindToken function  `_token` is the address of the token to bind"
      },
      "TokenUnbound(address)": {
        "notice": "this event is emitted when a token has been unbound from the compliance contract  the event is emitted by the unbindToken function  `_token` is the address of the token to unbind"
      }
    },
    "kind": "user",
    "methods": {},
    "version": 1
  }
}