{
  "contractName": "IToken",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bool",
          "name": "_isFrozen",
          "type": "bool"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "name": "AddressFrozen",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_compliance",
          "type": "address"
        }
      ],
      "name": "ComplianceAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_identityRegistry",
          "type": "address"
        }
      ],
      "name": "IdentityRegistryAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        }
      ],
      "name": "Paused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_lostWallet",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "_newWallet",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "_investorOnchainID",
          "type": "address"
        }
      ],
      "name": "RecoverySuccess",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "TokensFrozen",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "TokensUnfrozen",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        }
      ],
      "name": "Unpaused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "string",
          "name": "_newName",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "_newSymbol",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "_newDecimals",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "_newVersion",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "_newOnchainID",
          "type": "address"
        }
      ],
      "name": "UpdatedTokenInformation",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "onchainID",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "version",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "identityRegistry",
      "outputs": [
        {
          "internalType": "contract IIdentityRegistry",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "compliance",
      "outputs": [
        {
          "internalType": "contract ICompliance",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        }
      ],
      "name": "isFrozen",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        }
      ],
      "name": "getFrozenTokens",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        }
      ],
      "name": "setName",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_symbol",
          "type": "string"
        }
      ],
      "name": "setSymbol",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_onchainID",
          "type": "address"
        }
      ],
      "name": "setOnchainID",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_freeze",
          "type": "bool"
        }
      ],
      "name": "setAddressFrozen",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "freezePartialTokens",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "unfreezePartialTokens",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_identityRegistry",
          "type": "address"
        }
      ],
      "name": "setIdentityRegistry",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_compliance",
          "type": "address"
        }
      ],
      "name": "setCompliance",
      "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": "forcedTransfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_userAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "burn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_lostWallet",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_newWallet",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_investorOnchainID",
          "type": "address"
        }
      ],
      "name": "recoveryAddress",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_toList",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_amounts",
          "type": "uint256[]"
        }
      ],
      "name": "batchTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_fromList",
          "type": "address[]"
        },
        {
          "internalType": "address[]",
          "name": "_toList",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_amounts",
          "type": "uint256[]"
        }
      ],
      "name": "batchForcedTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_toList",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_amounts",
          "type": "uint256[]"
        }
      ],
      "name": "batchMint",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_userAddresses",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_amounts",
          "type": "uint256[]"
        }
      ],
      "name": "batchBurn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_userAddresses",
          "type": "address[]"
        },
        {
          "internalType": "bool[]",
          "name": "_freeze",
          "type": "bool[]"
        }
      ],
      "name": "batchSetAddressFrozen",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_userAddresses",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_amounts",
          "type": "uint256[]"
        }
      ],
      "name": "batchFreezePartialTokens",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_userAddresses",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_amounts",
          "type": "uint256[]"
        }
      ],
      "name": "batchUnfreezePartialTokens",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnershipOnTokenContract",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_agent",
          "type": "address"
        }
      ],
      "name": "addAgentOnTokenContract",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_agent",
          "type": "address"
        }
      ],
      "name": "removeAgentOnTokenContract",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"_isFrozen\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"AddressFrozen\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_compliance\",\"type\":\"address\"}],\"name\":\"ComplianceAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_identityRegistry\",\"type\":\"address\"}],\"name\":\"IdentityRegistryAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_lostWallet\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newWallet\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_investorOnchainID\",\"type\":\"address\"}],\"name\":\"RecoverySuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokensFrozen\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokensUnfrozen\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_newName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_newSymbol\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"_newDecimals\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_newVersion\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_newOnchainID\",\"type\":\"address\"}],\"name\":\"UpdatedTokenInformation\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_agent\",\"type\":\"address\"}],\"name\":\"addAgentOnTokenContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_userAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amounts\",\"type\":\"uint256[]\"}],\"name\":\"batchBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_fromList\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_toList\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amounts\",\"type\":\"uint256[]\"}],\"name\":\"batchForcedTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_userAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amounts\",\"type\":\"uint256[]\"}],\"name\":\"batchFreezePartialTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_toList\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amounts\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_userAddresses\",\"type\":\"address[]\"},{\"internalType\":\"bool[]\",\"name\":\"_freeze\",\"type\":\"bool[]\"}],\"name\":\"batchSetAddressFrozen\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_toList\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amounts\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_userAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amounts\",\"type\":\"uint256[]\"}],\"name\":\"batchUnfreezePartialTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"compliance\",\"outputs\":[{\"internalType\":\"contract ICompliance\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"forcedTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"freezePartialTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"}],\"name\":\"getFrozenTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"identityRegistry\",\"outputs\":[{\"internalType\":\"contract IIdentityRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"}],\"name\":\"isFrozen\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"onchainID\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lostWallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newWallet\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_investorOnchainID\",\"type\":\"address\"}],\"name\":\"recoveryAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_agent\",\"type\":\"address\"}],\"name\":\"removeAgentOnTokenContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_freeze\",\"type\":\"bool\"}],\"name\":\"setAddressFrozen\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_compliance\",\"type\":\"address\"}],\"name\":\"setCompliance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_identityRegistry\",\"type\":\"address\"}],\"name\":\"setIdentityRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_onchainID\",\"type\":\"address\"}],\"name\":\"setOnchainID\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"setSymbol\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnershipOnTokenContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_userAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"unfreezePartialTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"interface\",\"kind\":\"dev\",\"methods\":{\"addAgentOnTokenContract(address)\":{\"details\":\"adds an agent to the token smart contract\",\"params\":{\"_agent\":\"the address of the new agent of the token smart contract  This function can only be called by the owner of the token  emits an `AgentAdded` event\"}},\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"batchBurn(address[],uint256[])\":{\"details\":\"function allowing to burn tokens in batch  Require that the `_userAddresses` addresses are all verified addresses  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \\\"OUT OF GAS\\\" TRANSACTION\",\"params\":{\"_amounts\":\"The number of tokens to burn from the corresponding wallets  This function can only be called by a wallet set as agent of the token  emits _userAddresses.length `Transfer` events\",\"_userAddresses\":\"The addresses of the wallets concerned by the burn\"}},\"batchForcedTransfer(address[],address[],uint256[])\":{\"details\":\"function allowing to issue forced transfers in batch  Require that `_amounts[i]` should not exceed available balance of `_fromList[i]`.  Require that the `_toList` addresses are all verified addresses  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_fromList.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \\\"OUT OF GAS\\\" TRANSACTION\",\"params\":{\"_amounts\":\"The number of tokens to transfer to the corresponding receiver  This function can only be called by a wallet set as agent of the token  emits `TokensUnfrozen` events if `_amounts[i]` is higher than the free balance of `_fromList[i]`  emits _fromList.length `Transfer` events\",\"_fromList\":\"The addresses of the senders\",\"_toList\":\"The addresses of the receivers\"}},\"batchFreezePartialTokens(address[],uint256[])\":{\"details\":\"function allowing to freeze tokens partially in batch  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \\\"OUT OF GAS\\\" TRANSACTION\",\"params\":{\"_amounts\":\"the amount of tokens to freeze on the corresponding address  This function can only be called by a wallet set as agent of the token  emits _userAddresses.length `TokensFrozen` events\",\"_userAddresses\":\"The addresses on which tokens need to be frozen\"}},\"batchMint(address[],uint256[])\":{\"details\":\"function allowing to mint tokens in batch  Require that the `_toList` addresses are all verified addresses  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_toList.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \\\"OUT OF GAS\\\" TRANSACTION\",\"params\":{\"_amounts\":\"The number of tokens to mint to the corresponding receiver  This function can only be called by a wallet set as agent of the token  emits _toList.length `Transfer` events\",\"_toList\":\"The addresses of the receivers\"}},\"batchSetAddressFrozen(address[],bool[])\":{\"details\":\"function allowing to set frozen addresses in batch  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \\\"OUT OF GAS\\\" TRANSACTION\",\"params\":{\"_freeze\":\"Frozen status of the corresponding address  This function can only be called by a wallet set as agent of the token  emits _userAddresses.length `AddressFrozen` events\",\"_userAddresses\":\"The addresses for which to update frozen status\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"function allowing to issue transfers in batch  Require that the msg.sender and `to` addresses are not frozen.  Require that the total value should not exceed available balance.  Require that the `to` addresses are all verified addresses,  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_toList.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \\\"OUT OF GAS\\\" TRANSACTION\",\"params\":{\"_amounts\":\"The number of tokens to transfer to the corresponding receiver  emits _toList.length `Transfer` events\",\"_toList\":\"The addresses of the receivers\"}},\"batchUnfreezePartialTokens(address[],uint256[])\":{\"details\":\"function allowing to unfreeze tokens partially in batch  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \\\"OUT OF GAS\\\" TRANSACTION\",\"params\":{\"_amounts\":\"the amount of tokens to unfreeze on the corresponding address  This function can only be called by a wallet set as agent of the token  emits _userAddresses.length `TokensUnfrozen` events\",\"_userAddresses\":\"The addresses on which tokens need to be unfrozen\"}},\"burn(address,uint256)\":{\"details\":\"burn tokens on a wallet  In case the `account` address has not enough free tokens (unfrozen tokens)  but has a total balance higher or equal to the `value` amount  the amount of frozen tokens is reduced in order to have enough free tokens  to proceed the burn, in such a case, the remaining balance on the `account`  is 100% composed of frozen tokens post-transaction.\",\"params\":{\"_amount\":\"Amount of tokens to burn.  This function can only be called by a wallet set as agent of the token  emits a `TokensUnfrozen` event if `_amount` is higher than the free balance of `_userAddress`  emits a `Transfer` event\",\"_userAddress\":\"Address to burn the tokens from.\"}},\"compliance()\":{\"details\":\"Returns the Compliance contract linked to the token\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 1 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including balanceOf() and transfer().\"},\"forcedTransfer(address,address,uint256)\":{\"details\":\"force a transfer of tokens between 2 whitelisted wallets  In case the `from` address has not enough free tokens (unfrozen tokens)  but has a total balance higher or equal to the `amount`  the amount of frozen tokens is reduced in order to have enough free tokens  to proceed the transfer, in such a case, the remaining balance on the `from`  account is 100% composed of frozen tokens post-transfer.  Require that the `to` address is a verified address,\",\"params\":{\"_amount\":\"The number of tokens to transfer\",\"_from\":\"The address of the sender\",\"_to\":\"The address of the receiver\"},\"returns\":{\"_0\":\"`true` if successful and revert if unsuccessful  This function can only be called by a wallet set as agent of the token  emits a `TokensUnfrozen` event if `_amount` is higher than the free balance of `_from`  emits a `Transfer` event\"}},\"freezePartialTokens(address,uint256)\":{\"details\":\"freezes token amount specified for given address.\",\"params\":{\"_amount\":\"Amount of Tokens to be frozen  This function can only be called by a wallet set as agent of the token  emits a `TokensFrozen` event\",\"_userAddress\":\"The address for which to update frozen tokens\"}},\"getFrozenTokens(address)\":{\"details\":\"Returns the amount of tokens that are partially frozen on a wallet  the amount of frozen tokens is always <= to the total balance of the wallet\",\"params\":{\"_userAddress\":\"the address of the wallet on which getFrozenTokens is called\"}},\"identityRegistry()\":{\"details\":\"Returns the Identity Registry linked to the token\"},\"isFrozen(address)\":{\"details\":\"Returns the freezing status of a wallet  if isFrozen returns `true` the wallet is frozen  if isFrozen returns `false` the wallet is not frozen  isFrozen returning `true` doesn't mean that the balance is free, tokens could be blocked by  a partial freeze or the whole token could be blocked by pause\",\"params\":{\"_userAddress\":\"the address of the wallet on which isFrozen is called\"}},\"mint(address,uint256)\":{\"details\":\"mint tokens on a wallet  Improved version of default mint method. Tokens can be minted  to an address if only it is a verified address as per the security token.\",\"params\":{\"_amount\":\"Amount of tokens to mint.  This function can only be called by a wallet set as agent of the token  emits a `Transfer` event\",\"_to\":\"Address to mint the tokens to.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"onchainID()\":{\"details\":\"Returns the address of the onchainID of the token. the onchainID of the token gives all the information available about the token and is managed by the token issuer or his agent.\"},\"pause()\":{\"details\":\"pauses the token contract, when contract is paused investors cannot transfer tokens anymore  This function can only be called by a wallet set as agent of the token  emits a `Paused` event\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"recoveryAddress(address,address,address)\":{\"details\":\"recovery function used to force transfer tokens from a  lost wallet to a new wallet for an investor.\",\"params\":{\"_investorOnchainID\":\"the onchainID of the investor asking for a recovery  This function can only be called by a wallet set as agent of the token  emits a `TokensUnfrozen` event if there is some frozen tokens on the lost wallet if the recovery process is successful  emits a `Transfer` event if the recovery process is successful  emits a `RecoverySuccess` event if the recovery process is successful  emits a `RecoveryFails` event if the recovery process fails\",\"_lostWallet\":\"the wallet that the investor lost\",\"_newWallet\":\"the newly provided wallet on which tokens have to be transferred\"}},\"removeAgentOnTokenContract(address)\":{\"details\":\"remove an agent from the token smart contract\",\"params\":{\"_agent\":\"the address of the agent to remove  This function can only be called by the owner of the token  emits an `AgentRemoved` event\"}},\"setAddressFrozen(address,bool)\":{\"details\":\"sets an address frozen status for this token.\",\"params\":{\"_freeze\":\"Frozen status of the address  This function can only be called by a wallet set as agent of the token  emits an `AddressFrozen` event\",\"_userAddress\":\"The address for which to update frozen status\"}},\"setCompliance(address)\":{\"details\":\"sets the compliance contract of the token\",\"params\":{\"_compliance\":\"the address of the compliance contract to set  Only the owner of the token smart contract can call this function  emits a `ComplianceAdded` event\"}},\"setIdentityRegistry(address)\":{\"details\":\"sets the Identity Registry for the token\",\"params\":{\"_identityRegistry\":\"the address of the Identity Registry to set  Only the owner of the token smart contract can call this function  emits an `IdentityRegistryAdded` event\"}},\"setName(string)\":{\"details\":\"sets the token name\",\"params\":{\"_name\":\"the name of token to set  Only the owner of the token smart contract can call this function  emits a `UpdatedTokenInformation` event\"}},\"setOnchainID(address)\":{\"details\":\"sets the onchain ID of the token\",\"params\":{\"_onchainID\":\"the address of the onchain ID to set  Only the owner of the token smart contract can call this function  emits a `UpdatedTokenInformation` event\"}},\"setSymbol(string)\":{\"details\":\"sets the token symbol\",\"params\":{\"_symbol\":\"the token symbol to set  Only the owner of the token smart contract can call this function  emits a `UpdatedTokenInformation` event\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves `amount` tokens from `from` to `to` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferOwnershipOnTokenContract(address)\":{\"details\":\"transfers the ownership of the token smart contract\",\"params\":{\"_newOwner\":\"the address of the new token smart contract owner  This function can only be called by the owner of the token  emits an `OwnershipTransferred` event\"}},\"unfreezePartialTokens(address,uint256)\":{\"details\":\"unfreezes token amount specified for given address\",\"params\":{\"_amount\":\"Amount of Tokens to be unfrozen  This function can only be called by a wallet set as agent of the token  emits a `TokensUnfrozen` event\",\"_userAddress\":\"The address for which to update frozen tokens\"}},\"unpause()\":{\"details\":\"unpauses the token contract, when contract is unpaused investors can transfer tokens  if their wallet is not blocked & if the amount to transfer is <= to the amount of free tokens  This function can only be called by a wallet set as agent of the token  emits an `Unpaused` event\"},\"version()\":{\"details\":\"Returns the TREX version of the token. current version is 3.0.0\"}},\"version\":1},\"userdoc\":{\"events\":{\"AddressFrozen(address,bool,address)\":{\"notice\":\"this event is emitted when the wallet of an investor is frozen or unfrozen  the event is emitted by setAddressFrozen and batchSetAddressFrozen functions  `_userAddress` is the wallet of the investor that is concerned by the freezing status  `_isFrozen` is the freezing status of the wallet  if `_isFrozen` equals `true` the wallet is frozen after emission of the event  if `_isFrozen` equals `false` the wallet is unfrozen after emission of the event  `_owner` is the address of the agent who called the function to freeze the wallet\"},\"ComplianceAdded(address)\":{\"notice\":\"this event is emitted when the Compliance has been set for the token  the event is emitted by the token constructor and by the setCompliance function  `_compliance` is the address of the Compliance contract of the token\"},\"IdentityRegistryAdded(address)\":{\"notice\":\"this event is emitted when the IdentityRegistry has been set for the token  the event is emitted by the token constructor and by the setIdentityRegistry function  `_identityRegistry` is the address of the Identity Registry of the token\"},\"Paused(address)\":{\"notice\":\"this event is emitted when the token is paused  the event is emitted by the pause function  `_userAddress` is the address of the wallet that called the pause function\"},\"RecoverySuccess(address,address,address)\":{\"notice\":\"this event is emitted when an investor successfully recovers his tokens  the event is emitted by the recoveryAddress function  `_lostWallet` is the address of the wallet that the investor lost access to  `_newWallet` is the address of the wallet that the investor provided for the recovery  `_investorOnchainID` is the address of the onchainID of the investor who asked for a recovery\"},\"TokensFrozen(address,uint256)\":{\"notice\":\"this event is emitted when a certain amount of tokens is frozen on a wallet  the event is emitted by freezePartialTokens and batchFreezePartialTokens functions  `_userAddress` is the wallet of the investor that is concerned by the freezing status  `_amount` is the amount of tokens that are frozen\"},\"TokensUnfrozen(address,uint256)\":{\"notice\":\"this event is emitted when a certain amount of tokens is unfrozen on a wallet  the event is emitted by unfreezePartialTokens and batchUnfreezePartialTokens functions  `_userAddress` is the wallet of the investor that is concerned by the freezing status  `_amount` is the amount of tokens that are unfrozen\"},\"Unpaused(address)\":{\"notice\":\"this event is emitted when the token is unpaused  the event is emitted by the unpause function  `_userAddress` is the address of the wallet that called the unpause function\"},\"UpdatedTokenInformation(string,string,uint8,string,address)\":{\"notice\":\"this event is emitted when the token information is updated.  the event is emitted by the token constructor and by the setTokenInformation function  `_newName` is the name of the token  `_newSymbol` is the symbol of the token  `_newDecimals` is the decimals of the token  `_newVersion` is the version of the token, current version is 3.0  `_newOnchainID` is the address of the onchainID of the token\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/token/IToken.sol\":\"IToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@onchain-id/solidity/contracts/interface/IClaimIssuer.sol\":{\"keccak256\":\"0xd0493be7cb7342962b46f8e2afdca4614ea0fe34a7f493b2da9db7d361a9042c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://105232aae24e3d0fcb4c80c00793b61b6019f6127c0ec6f9e3082ae01b2e778b\",\"dweb:/ipfs/QmV5C1wbq7H5H6DiakafSX5agAAP6rQSZ5qq7Qgq6VLkXo\"]},\"@onchain-id/solidity/contracts/interface/IERC734.sol\":{\"keccak256\":\"0x3302de9e9fe7a548cb7395b6fda38f952f6a6d1c599dfeee181a1ef80741fc1d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://fc9f00e5b2f1523fecf52b1a833e9263a53edbebb7d1458f9004cfd41dd0402e\",\"dweb:/ipfs/QmWcNcVQrg66KeQz39jPgJun7jF3CbdJKHQa19q97n5Hzb\"]},\"@onchain-id/solidity/contracts/interface/IERC735.sol\":{\"keccak256\":\"0x3b77ce6012a96cf0075197cdeb1b98b66ca1722ef23241e40ba6185f03bf4584\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://766e139f0c3cc0c6489561e75df0d8eab8c277f90009e4fa19add4f22bb40d82\",\"dweb:/ipfs/QmcbAReZn9nLcnYn9AHiDmcYJ42JqAU5QSy4dKhUcJUnjy\"]},\"@onchain-id/solidity/contracts/interface/IIdentity.sol\":{\"keccak256\":\"0xdcefbe2a850f9f43e959b9f7ed93fd5b35f29ff3dfbfaac7530af737c9eba7c6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://2e887c7cc67fdb2710c48bed22dbb27880f6dfb84ee93178ad4fcd659099cb96\",\"dweb:/ipfs/QmUuDEsZJC7uQQEErmuNJzePsNgHiTDdS2TuMzG1GRqrC3\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"project:/contracts/compliance/ICompliance.sol\":{\"keccak256\":\"0x4049905b34eab118c0c3f644450299a5ed8022bbbdb26036e7c2854dae8ae1ba\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://f8144953d88f543b2f537514f1136b8adf705837ba6d420b95569f6895153edb\",\"dweb:/ipfs/QmRqM7A6XrofFR67k8RtNNEkriAbKsQHDgUYaKZTMr9Nm5\"]},\"project:/contracts/registry/IClaimTopicsRegistry.sol\":{\"keccak256\":\"0x95f8fa17a716771125b203f00890eceb20ac3807f7a39a25b644427b1ff81d61\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://460dceb9e88957d5ce002b80748767c80a7e146c9b38b055a3c1ca04586b2009\",\"dweb:/ipfs/QmVdqEpGMRzSpLKBCtPzaPGatBgUyNm3NS5rQnkkYMnc1C\"]},\"project:/contracts/registry/IIdentityRegistry.sol\":{\"keccak256\":\"0x16a31f2d35143f99cc6b83d0cf6e9da9543c2b8561712079098f3a39d12ae32a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7669a9272b1df8e27e0fc3f5f64977b2b16615e585b673383db1eb157a62bf7c\",\"dweb:/ipfs/QmQzXmoFcFyBPehPyiUzGjaKfXJHLEPZMtFTBTgjuCavah\"]},\"project:/contracts/registry/IIdentityRegistryStorage.sol\":{\"keccak256\":\"0x8cd4de1e77c5da8ca2ff732069bc184aef86bcb94f95a5229e5bd6336abbd06d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://f88894a3d046940be03a12cc2da3b3fb6efb51e0461fbea060a9a3190cadcf16\",\"dweb:/ipfs/QmNndZUPdpc83A9LungeAsrcencq3CzTum1tkU6KVdSRNC\"]},\"project:/contracts/registry/ITrustedIssuersRegistry.sol\":{\"keccak256\":\"0x01af20f2f537db3122c60b7c6e60e5036e07c673ef9762428b42129f65fcbc60\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://28f514b876c975777fe84bdb9f96ec5c687e4e4ff5d2b14961ba61affc57d46c\",\"dweb:/ipfs/QmdbVRsg1Q71PVHYxy1r7e5MeiMN5hHHDD8vRnXBSr8JiV\"]},\"project:/contracts/token/IToken.sol\":{\"keccak256\":\"0x34ce3cabab2f6b66aeb4e89fe8e9952b8aa57663e7b33429963169a835fc1f25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://cffd212e911fd0a6a402d5438e5f5da0c1637226bfcab173a7c58efba12f2655\",\"dweb:/ipfs/QmVbqFNczrUAETfAX6F9MxXKivALRvt1HBTMhrjAKWHniq\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "// SPDX-License-Identifier: GPL-3.0\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\nimport '../registry/IIdentityRegistry.sol';\nimport '../compliance/ICompliance.sol';\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\n\n/// @dev interface\ninterface IToken is IERC20 {\n    /**\n     *  this event is emitted when the token information is updated.\n     *  the event is emitted by the token constructor and by the setTokenInformation function\n     *  `_newName` is the name of the token\n     *  `_newSymbol` is the symbol of the token\n     *  `_newDecimals` is the decimals of the token\n     *  `_newVersion` is the version of the token, current version is 3.0\n     *  `_newOnchainID` is the address of the onchainID of the token\n     */\n    event UpdatedTokenInformation(string _newName, string _newSymbol, uint8 _newDecimals, string _newVersion, address _newOnchainID);\n\n    /**\n     *  this event is emitted when the IdentityRegistry has been set for the token\n     *  the event is emitted by the token constructor and by the setIdentityRegistry function\n     *  `_identityRegistry` is the address of the Identity Registry of the token\n     */\n    event IdentityRegistryAdded(address indexed _identityRegistry);\n\n    /**\n     *  this event is emitted when the Compliance has been set for the token\n     *  the event is emitted by the token constructor and by the setCompliance function\n     *  `_compliance` is the address of the Compliance contract of the token\n     */\n    event ComplianceAdded(address indexed _compliance);\n\n    /**\n     *  this event is emitted when an investor successfully recovers his tokens\n     *  the event is emitted by the recoveryAddress function\n     *  `_lostWallet` is the address of the wallet that the investor lost access to\n     *  `_newWallet` is the address of the wallet that the investor provided for the recovery\n     *  `_investorOnchainID` is the address of the onchainID of the investor who asked for a recovery\n     */\n    event RecoverySuccess(address _lostWallet, address _newWallet, address _investorOnchainID);\n\n    /**\n     *  this event is emitted when the wallet of an investor is frozen or unfrozen\n     *  the event is emitted by setAddressFrozen and batchSetAddressFrozen functions\n     *  `_userAddress` is the wallet of the investor that is concerned by the freezing status\n     *  `_isFrozen` is the freezing status of the wallet\n     *  if `_isFrozen` equals `true` the wallet is frozen after emission of the event\n     *  if `_isFrozen` equals `false` the wallet is unfrozen after emission of the event\n     *  `_owner` is the address of the agent who called the function to freeze the wallet\n     */\n    event AddressFrozen(address indexed _userAddress, bool indexed _isFrozen, address indexed _owner);\n\n    /**\n     *  this event is emitted when a certain amount of tokens is frozen on a wallet\n     *  the event is emitted by freezePartialTokens and batchFreezePartialTokens functions\n     *  `_userAddress` is the wallet of the investor that is concerned by the freezing status\n     *  `_amount` is the amount of tokens that are frozen\n     */\n    event TokensFrozen(address indexed _userAddress, uint256 _amount);\n\n    /**\n     *  this event is emitted when a certain amount of tokens is unfrozen on a wallet\n     *  the event is emitted by unfreezePartialTokens and batchUnfreezePartialTokens functions\n     *  `_userAddress` is the wallet of the investor that is concerned by the freezing status\n     *  `_amount` is the amount of tokens that are unfrozen\n     */\n    event TokensUnfrozen(address indexed _userAddress, uint256 _amount);\n\n    /**\n     *  this event is emitted when the token is paused\n     *  the event is emitted by the pause function\n     *  `_userAddress` is the address of the wallet that called the pause function\n     */\n    event Paused(address _userAddress);\n\n    /**\n     *  this event is emitted when the token is unpaused\n     *  the event is emitted by the unpause function\n     *  `_userAddress` is the address of the wallet that called the unpause function\n     */\n    event Unpaused(address _userAddress);\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5,05` (`505 / 1 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei.\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * balanceOf() and transfer().\n     */\n    function decimals() external view returns (uint8);\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the address of the onchainID of the token.\n     * the onchainID of the token gives all the information available\n     * about the token and is managed by the token issuer or his agent.\n     */\n    function onchainID() external view returns (address);\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the TREX version of the token.\n     * current version is 3.0.0\n     */\n    function version() external view returns (string memory);\n\n    /**\n     *  @dev Returns the Identity Registry linked to the token\n     */\n    function identityRegistry() external view returns (IIdentityRegistry);\n\n    /**\n     *  @dev Returns the Compliance contract linked to the token\n     */\n    function compliance() external view returns (ICompliance);\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() external view returns (bool);\n\n    /**\n     *  @dev Returns the freezing status of a wallet\n     *  if isFrozen returns `true` the wallet is frozen\n     *  if isFrozen returns `false` the wallet is not frozen\n     *  isFrozen returning `true` doesn't mean that the balance is free, tokens could be blocked by\n     *  a partial freeze or the whole token could be blocked by pause\n     *  @param _userAddress the address of the wallet on which isFrozen is called\n     */\n    function isFrozen(address _userAddress) external view returns (bool);\n\n    /**\n     *  @dev Returns the amount of tokens that are partially frozen on a wallet\n     *  the amount of frozen tokens is always <= to the total balance of the wallet\n     *  @param _userAddress the address of the wallet on which getFrozenTokens is called\n     */\n    function getFrozenTokens(address _userAddress) external view returns (uint256);\n\n    /**\n     *  @dev sets the token name\n     *  @param _name the name of token to set\n     *  Only the owner of the token smart contract can call this function\n     *  emits a `UpdatedTokenInformation` event\n     */\n    function setName(string calldata _name) external;\n\n    /**\n     *  @dev sets the token symbol\n     *  @param _symbol the token symbol to set\n     *  Only the owner of the token smart contract can call this function\n     *  emits a `UpdatedTokenInformation` event\n     */\n    function setSymbol(string calldata _symbol) external;\n\n    /**\n     *  @dev sets the onchain ID of the token\n     *  @param _onchainID the address of the onchain ID to set\n     *  Only the owner of the token smart contract can call this function\n     *  emits a `UpdatedTokenInformation` event\n     */\n    function setOnchainID(address _onchainID) external;\n\n    /**\n     *  @dev pauses the token contract, when contract is paused investors cannot transfer tokens anymore\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits a `Paused` event\n     */\n    function pause() external;\n\n    /**\n     *  @dev unpauses the token contract, when contract is unpaused investors can transfer tokens\n     *  if their wallet is not blocked & if the amount to transfer is <= to the amount of free tokens\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits an `Unpaused` event\n     */\n    function unpause() external;\n\n    /**\n     *  @dev sets an address frozen status for this token.\n     *  @param _userAddress The address for which to update frozen status\n     *  @param _freeze Frozen status of the address\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits an `AddressFrozen` event\n     */\n    function setAddressFrozen(address _userAddress, bool _freeze) external;\n\n    /**\n     *  @dev freezes token amount specified for given address.\n     *  @param _userAddress The address for which to update frozen tokens\n     *  @param _amount Amount of Tokens to be frozen\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits a `TokensFrozen` event\n     */\n    function freezePartialTokens(address _userAddress, uint256 _amount) external;\n\n    /**\n     *  @dev unfreezes token amount specified for given address\n     *  @param _userAddress The address for which to update frozen tokens\n     *  @param _amount Amount of Tokens to be unfrozen\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits a `TokensUnfrozen` event\n     */\n    function unfreezePartialTokens(address _userAddress, uint256 _amount) external;\n\n    /**\n     *  @dev sets the Identity Registry for the token\n     *  @param _identityRegistry the address of the Identity Registry to set\n     *  Only the owner of the token smart contract can call this function\n     *  emits an `IdentityRegistryAdded` event\n     */\n    function setIdentityRegistry(address _identityRegistry) external;\n\n    /**\n     *  @dev sets the compliance contract of the token\n     *  @param _compliance the address of the compliance contract to set\n     *  Only the owner of the token smart contract can call this function\n     *  emits a `ComplianceAdded` event\n     */\n    function setCompliance(address _compliance) external;\n\n    /**\n     *  @dev force a transfer of tokens between 2 whitelisted wallets\n     *  In case the `from` address has not enough free tokens (unfrozen tokens)\n     *  but has a total balance higher or equal to the `amount`\n     *  the amount of frozen tokens is reduced in order to have enough free tokens\n     *  to proceed the transfer, in such a case, the remaining balance on the `from`\n     *  account is 100% composed of frozen tokens post-transfer.\n     *  Require that the `to` address is a verified address,\n     *  @param _from The address of the sender\n     *  @param _to The address of the receiver\n     *  @param _amount The number of tokens to transfer\n     *  @return `true` if successful and revert if unsuccessful\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits a `TokensUnfrozen` event if `_amount` is higher than the free balance of `_from`\n     *  emits a `Transfer` event\n     */\n    function forcedTransfer(\n        address _from,\n        address _to,\n        uint256 _amount\n    ) external returns (bool);\n\n    /**\n     *  @dev mint tokens on a wallet\n     *  Improved version of default mint method. Tokens can be minted\n     *  to an address if only it is a verified address as per the security token.\n     *  @param _to Address to mint the tokens to.\n     *  @param _amount Amount of tokens to mint.\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits a `Transfer` event\n     */\n    function mint(address _to, uint256 _amount) external;\n\n    /**\n     *  @dev burn tokens on a wallet\n     *  In case the `account` address has not enough free tokens (unfrozen tokens)\n     *  but has a total balance higher or equal to the `value` amount\n     *  the amount of frozen tokens is reduced in order to have enough free tokens\n     *  to proceed the burn, in such a case, the remaining balance on the `account`\n     *  is 100% composed of frozen tokens post-transaction.\n     *  @param _userAddress Address to burn the tokens from.\n     *  @param _amount Amount of tokens to burn.\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits a `TokensUnfrozen` event if `_amount` is higher than the free balance of `_userAddress`\n     *  emits a `Transfer` event\n     */\n    function burn(address _userAddress, uint256 _amount) external;\n\n    /**\n     *  @dev recovery function used to force transfer tokens from a\n     *  lost wallet to a new wallet for an investor.\n     *  @param _lostWallet the wallet that the investor lost\n     *  @param _newWallet the newly provided wallet on which tokens have to be transferred\n     *  @param _investorOnchainID the onchainID of the investor asking for a recovery\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits a `TokensUnfrozen` event if there is some frozen tokens on the lost wallet if the recovery process is successful\n     *  emits a `Transfer` event if the recovery process is successful\n     *  emits a `RecoverySuccess` event if the recovery process is successful\n     *  emits a `RecoveryFails` event if the recovery process fails\n     */\n    function recoveryAddress(\n        address _lostWallet,\n        address _newWallet,\n        address _investorOnchainID\n    ) external returns (bool);\n\n    /**\n     *  @dev function allowing to issue transfers in batch\n     *  Require that the msg.sender and `to` addresses are not frozen.\n     *  Require that the total value should not exceed available balance.\n     *  Require that the `to` addresses are all verified addresses,\n     *  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_toList.length` IS TOO HIGH,\n     *  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n     *  @param _toList The addresses of the receivers\n     *  @param _amounts The number of tokens to transfer to the corresponding receiver\n     *  emits _toList.length `Transfer` events\n     */\n    function batchTransfer(address[] calldata _toList, uint256[] calldata _amounts) external;\n\n    /**\n     *  @dev function allowing to issue forced transfers in batch\n     *  Require that `_amounts[i]` should not exceed available balance of `_fromList[i]`.\n     *  Require that the `_toList` addresses are all verified addresses\n     *  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_fromList.length` IS TOO HIGH,\n     *  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n     *  @param _fromList The addresses of the senders\n     *  @param _toList The addresses of the receivers\n     *  @param _amounts The number of tokens to transfer to the corresponding receiver\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits `TokensUnfrozen` events if `_amounts[i]` is higher than the free balance of `_fromList[i]`\n     *  emits _fromList.length `Transfer` events\n     */\n    function batchForcedTransfer(\n        address[] calldata _fromList,\n        address[] calldata _toList,\n        uint256[] calldata _amounts\n    ) external;\n\n    /**\n     *  @dev function allowing to mint tokens in batch\n     *  Require that the `_toList` addresses are all verified addresses\n     *  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_toList.length` IS TOO HIGH,\n     *  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n     *  @param _toList The addresses of the receivers\n     *  @param _amounts The number of tokens to mint to the corresponding receiver\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits _toList.length `Transfer` events\n     */\n    function batchMint(address[] calldata _toList, uint256[] calldata _amounts) external;\n\n    /**\n     *  @dev function allowing to burn tokens in batch\n     *  Require that the `_userAddresses` addresses are all verified addresses\n     *  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,\n     *  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n     *  @param _userAddresses The addresses of the wallets concerned by the burn\n     *  @param _amounts The number of tokens to burn from the corresponding wallets\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits _userAddresses.length `Transfer` events\n     */\n    function batchBurn(address[] calldata _userAddresses, uint256[] calldata _amounts) external;\n\n    /**\n     *  @dev function allowing to set frozen addresses in batch\n     *  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,\n     *  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n     *  @param _userAddresses The addresses for which to update frozen status\n     *  @param _freeze Frozen status of the corresponding address\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits _userAddresses.length `AddressFrozen` events\n     */\n    function batchSetAddressFrozen(address[] calldata _userAddresses, bool[] calldata _freeze) external;\n\n    /**\n     *  @dev function allowing to freeze tokens partially in batch\n     *  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,\n     *  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n     *  @param _userAddresses The addresses on which tokens need to be frozen\n     *  @param _amounts the amount of tokens to freeze on the corresponding address\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits _userAddresses.length `TokensFrozen` events\n     */\n    function batchFreezePartialTokens(address[] calldata _userAddresses, uint256[] calldata _amounts) external;\n\n    /**\n     *  @dev function allowing to unfreeze tokens partially in batch\n     *  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,\n     *  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n     *  @param _userAddresses The addresses on which tokens need to be unfrozen\n     *  @param _amounts the amount of tokens to unfreeze on the corresponding address\n     *  This function can only be called by a wallet set as agent of the token\n     *  emits _userAddresses.length `TokensUnfrozen` events\n     */\n    function batchUnfreezePartialTokens(address[] calldata _userAddresses, uint256[] calldata _amounts) external;\n\n    /**\n     *  @dev transfers the ownership of the token smart contract\n     *  @param _newOwner the address of the new token smart contract owner\n     *  This function can only be called by the owner of the token\n     *  emits an `OwnershipTransferred` event\n     */\n    function transferOwnershipOnTokenContract(address _newOwner) external;\n\n    /**\n     *  @dev adds an agent to the token smart contract\n     *  @param _agent the address of the new agent of the token smart contract\n     *  This function can only be called by the owner of the token\n     *  emits an `AgentAdded` event\n     */\n    function addAgentOnTokenContract(address _agent) external;\n\n    /**\n     *  @dev remove an agent from the token smart contract\n     *  @param _agent the address of the agent to remove\n     *  This function can only be called by the owner of the token\n     *  emits an `AgentRemoved` event\n     */\n    function removeAgentOnTokenContract(address _agent) external;\n}\n",
  "sourcePath": "/home/webxpert/workspace/shipfinex/latest-repos/tokenx_smartcontract/contracts/token/IToken.sol",
  "ast": {
    "absolutePath": "project:/contracts/token/IToken.sol",
    "exportedSymbols": {
      "IClaimIssuer": [
        1456
      ],
      "IClaimTopicsRegistry": [
        6444
      ],
      "ICompliance": [
        5596
      ],
      "IERC20": [
        3317
      ],
      "IERC734": [
        1609
      ],
      "IERC735": [
        1734
      ],
      "IIdentity": [
        1743
      ],
      "IIdentityRegistry": [
        6637
      ],
      "IIdentityRegistryStorage": [
        6759
      ],
      "IToken": [
        12234
      ],
      "ITrustedIssuersRegistry": [
        6856
      ]
    },
    "id": 12235,
    "license": "GPL-3.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 11903,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "1093:23:51"
      },
      {
        "absolutePath": "project:/contracts/registry/IIdentityRegistry.sol",
        "file": "../registry/IIdentityRegistry.sol",
        "id": 11904,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 12235,
        "sourceUnit": 6638,
        "src": "1118:43:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/compliance/ICompliance.sol",
        "file": "../compliance/ICompliance.sol",
        "id": 11905,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 12235,
        "sourceUnit": 5597,
        "src": "1162:39:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "id": 11906,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 12235,
        "sourceUnit": 3318,
        "src": "1202:56:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 11908,
              "name": "IERC20",
              "nameLocations": [
                "1299:6:51"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 3317,
              "src": "1299:6:51"
            },
            "id": 11909,
            "nodeType": "InheritanceSpecifier",
            "src": "1299:6:51"
          }
        ],
        "canonicalName": "IToken",
        "contractDependencies": [],
        "contractKind": "interface",
        "documentation": {
          "id": 11907,
          "nodeType": "StructuredDocumentation",
          "src": "1260:19:51",
          "text": "@dev interface"
        },
        "fullyImplemented": false,
        "id": 12234,
        "linearizedBaseContracts": [
          12234,
          3317
        ],
        "name": "IToken",
        "nameLocation": "1289:6:51",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": {
              "id": 11910,
              "nodeType": "StructuredDocumentation",
              "src": "1312:461:51",
              "text": "  this event is emitted when the token information is updated.\n  the event is emitted by the token constructor and by the setTokenInformation function\n  `_newName` is the name of the token\n  `_newSymbol` is the symbol of the token\n  `_newDecimals` is the decimals of the token\n  `_newVersion` is the version of the token, current version is 3.0\n  `_newOnchainID` is the address of the onchainID of the token"
            },
            "eventSelector": "6a1105ac8148a3c319adbc369f9072573e8a11d3a3d195e067e7c40767ec54d1",
            "id": 11922,
            "name": "UpdatedTokenInformation",
            "nameLocation": "1784:23:51",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 11921,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11912,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_newName",
                  "nameLocation": "1815:8:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11922,
                  "src": "1808:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 11911,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1808:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11914,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_newSymbol",
                  "nameLocation": "1832:10:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11922,
                  "src": "1825:17:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 11913,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1825:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11916,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_newDecimals",
                  "nameLocation": "1850:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11922,
                  "src": "1844:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 11915,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "1844:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11918,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_newVersion",
                  "nameLocation": "1871:11:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11922,
                  "src": "1864:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 11917,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1864:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11920,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_newOnchainID",
                  "nameLocation": "1892:13:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11922,
                  "src": "1884:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11919,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1884:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1807:99:51"
            },
            "src": "1778:129:51"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 11923,
              "nodeType": "StructuredDocumentation",
              "src": "1913:269:51",
              "text": "  this event is emitted when the IdentityRegistry has been set for the token\n  the event is emitted by the token constructor and by the setIdentityRegistry function\n  `_identityRegistry` is the address of the Identity Registry of the token"
            },
            "eventSelector": "d2be862d755bca7e0d39772b2cab3a5578da9c285f69199f4c063c2294a7f36c",
            "id": 11927,
            "name": "IdentityRegistryAdded",
            "nameLocation": "2193:21:51",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 11926,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11925,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "_identityRegistry",
                  "nameLocation": "2231:17:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11927,
                  "src": "2215:33:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11924,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2215:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2214:35:51"
            },
            "src": "2187:63:51"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 11928,
              "nodeType": "StructuredDocumentation",
              "src": "2256:253:51",
              "text": "  this event is emitted when the Compliance has been set for the token\n  the event is emitted by the token constructor and by the setCompliance function\n  `_compliance` is the address of the Compliance contract of the token"
            },
            "eventSelector": "7f3a888862559648ec01d97deb7b5012bff86dc91e654a1de397170db40e35b6",
            "id": 11932,
            "name": "ComplianceAdded",
            "nameLocation": "2520:15:51",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 11931,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11930,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "_compliance",
                  "nameLocation": "2552:11:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11932,
                  "src": "2536:27:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11929,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2536:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2535:29:51"
            },
            "src": "2514:51:51"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 11933,
              "nodeType": "StructuredDocumentation",
              "src": "2571:432:51",
              "text": "  this event is emitted when an investor successfully recovers his tokens\n  the event is emitted by the recoveryAddress function\n  `_lostWallet` is the address of the wallet that the investor lost access to\n  `_newWallet` is the address of the wallet that the investor provided for the recovery\n  `_investorOnchainID` is the address of the onchainID of the investor who asked for a recovery"
            },
            "eventSelector": "f0c9129a94f30f1caaceb63e44b9811d0a3edf1d6c23757f346093af5553fed0",
            "id": 11941,
            "name": "RecoverySuccess",
            "nameLocation": "3014:15:51",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 11940,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11935,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_lostWallet",
                  "nameLocation": "3038:11:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11941,
                  "src": "3030:19:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11934,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3030:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11937,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_newWallet",
                  "nameLocation": "3059:10:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11941,
                  "src": "3051:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11936,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3051:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11939,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_investorOnchainID",
                  "nameLocation": "3079:18:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11941,
                  "src": "3071:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11938,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3071:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3029:69:51"
            },
            "src": "3008:91:51"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 11942,
              "nodeType": "StructuredDocumentation",
              "src": "3105:595:51",
              "text": "  this event is emitted when the wallet of an investor is frozen or unfrozen\n  the event is emitted by setAddressFrozen and batchSetAddressFrozen functions\n  `_userAddress` is the wallet of the investor that is concerned by the freezing status\n  `_isFrozen` is the freezing status of the wallet\n  if `_isFrozen` equals `true` the wallet is frozen after emission of the event\n  if `_isFrozen` equals `false` the wallet is unfrozen after emission of the event\n  `_owner` is the address of the agent who called the function to freeze the wallet"
            },
            "eventSelector": "7fa523c84ab8d7fc5b72f08b9e46dbbf10c39e119a075b3e317002d14bc9f436",
            "id": 11950,
            "name": "AddressFrozen",
            "nameLocation": "3711:13:51",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 11949,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11944,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "3741:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11950,
                  "src": "3725:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11943,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3725:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11946,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "_isFrozen",
                  "nameLocation": "3768:9:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11950,
                  "src": "3755:22:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 11945,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3755:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11948,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "3795:6:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11950,
                  "src": "3779:22:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11947,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3779:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3724:78:51"
            },
            "src": "3705:98:51"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 11951,
              "nodeType": "StructuredDocumentation",
              "src": "3809:338:51",
              "text": "  this event is emitted when a certain amount of tokens is frozen on a wallet\n  the event is emitted by freezePartialTokens and batchFreezePartialTokens functions\n  `_userAddress` is the wallet of the investor that is concerned by the freezing status\n  `_amount` is the amount of tokens that are frozen"
            },
            "eventSelector": "a065e63c631c86f1b9f66a4a2f63f2093bf1c2168d23290259dbd969e0222a45",
            "id": 11957,
            "name": "TokensFrozen",
            "nameLocation": "4158:12:51",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 11956,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11953,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "4187:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11957,
                  "src": "4171:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11952,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4171:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11955,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "4209:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11957,
                  "src": "4201:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 11954,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4201:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4170:47:51"
            },
            "src": "4152:66:51"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 11958,
              "nodeType": "StructuredDocumentation",
              "src": "4224:346:51",
              "text": "  this event is emitted when a certain amount of tokens is unfrozen on a wallet\n  the event is emitted by unfreezePartialTokens and batchUnfreezePartialTokens functions\n  `_userAddress` is the wallet of the investor that is concerned by the freezing status\n  `_amount` is the amount of tokens that are unfrozen"
            },
            "eventSelector": "9bed35cb62ad0dba04f9d5bfee4b5bc91443e77da8a65c4c84834c51bb08b0d6",
            "id": 11964,
            "name": "TokensUnfrozen",
            "nameLocation": "4581:14:51",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 11963,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11960,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "4612:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11964,
                  "src": "4596:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11959,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4596:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 11962,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "4634:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11964,
                  "src": "4626:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 11961,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4626:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4595:47:51"
            },
            "src": "4575:68:51"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 11965,
              "nodeType": "StructuredDocumentation",
              "src": "4649:200:51",
              "text": "  this event is emitted when the token is paused\n  the event is emitted by the pause function\n  `_userAddress` is the address of the wallet that called the pause function"
            },
            "eventSelector": "62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258",
            "id": 11969,
            "name": "Paused",
            "nameLocation": "4860:6:51",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 11968,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11967,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "4875:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11969,
                  "src": "4867:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11966,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4867:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4866:22:51"
            },
            "src": "4854:35:51"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 11970,
              "nodeType": "StructuredDocumentation",
              "src": "4895:206:51",
              "text": "  this event is emitted when the token is unpaused\n  the event is emitted by the unpause function\n  `_userAddress` is the address of the wallet that called the unpause function"
            },
            "eventSelector": "5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa",
            "id": 11974,
            "name": "Unpaused",
            "nameLocation": "5112:8:51",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 11973,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11972,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "5129:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 11974,
                  "src": "5121:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11971,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5121:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5120:22:51"
            },
            "src": "5106:37:51"
          },
          {
            "documentation": {
              "id": 11975,
              "nodeType": "StructuredDocumentation",
              "src": "5149:523:51",
              "text": " @dev Returns the number of decimals used to get its user representation.\n For example, if `decimals` equals `2`, a balance of `505` tokens should\n be displayed to a user as `5,05` (`505 / 1 ** 2`).\n Tokens usually opt for a value of 18, imitating the relationship between\n Ether and Wei.\n NOTE: This information is only used for _display_ purposes: it in\n no way affects any of the arithmetic of the contract, including\n balanceOf() and transfer()."
            },
            "functionSelector": "313ce567",
            "id": 11980,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "decimals",
            "nameLocation": "5686:8:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 11976,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5694:2:51"
            },
            "returnParameters": {
              "id": 11979,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11978,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 11980,
                  "src": "5720:5:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 11977,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "5720:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5719:7:51"
            },
            "scope": 12234,
            "src": "5677:50:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 11981,
              "nodeType": "StructuredDocumentation",
              "src": "5733:54:51",
              "text": " @dev Returns the name of the token."
            },
            "functionSelector": "06fdde03",
            "id": 11986,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "name",
            "nameLocation": "5801:4:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 11982,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5805:2:51"
            },
            "returnParameters": {
              "id": 11985,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11984,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 11986,
                  "src": "5831:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 11983,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5831:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5830:15:51"
            },
            "scope": 12234,
            "src": "5792:54:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 11987,
              "nodeType": "StructuredDocumentation",
              "src": "5852:216:51",
              "text": " @dev Returns the address of the onchainID of the token.\n the onchainID of the token gives all the information available\n about the token and is managed by the token issuer or his agent."
            },
            "functionSelector": "aba63705",
            "id": 11992,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "onchainID",
            "nameLocation": "6082:9:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 11988,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6091:2:51"
            },
            "returnParameters": {
              "id": 11991,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11990,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 11992,
                  "src": "6117:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 11989,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6117:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6116:9:51"
            },
            "scope": 12234,
            "src": "6073:53:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 11993,
              "nodeType": "StructuredDocumentation",
              "src": "6132:102:51",
              "text": " @dev Returns the symbol of the token, usually a shorter version of the\n name."
            },
            "functionSelector": "95d89b41",
            "id": 11998,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "symbol",
            "nameLocation": "6248:6:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 11994,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6254:2:51"
            },
            "returnParameters": {
              "id": 11997,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 11996,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 11998,
                  "src": "6280:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 11995,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "6280:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6279:15:51"
            },
            "scope": 12234,
            "src": "6239:56:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 11999,
              "nodeType": "StructuredDocumentation",
              "src": "6301:94:51",
              "text": " @dev Returns the TREX version of the token.\n current version is 3.0.0"
            },
            "functionSelector": "54fd4d50",
            "id": 12004,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "version",
            "nameLocation": "6409:7:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12000,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6416:2:51"
            },
            "returnParameters": {
              "id": 12003,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12002,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12004,
                  "src": "6442:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 12001,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "6442:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6441:15:51"
            },
            "scope": 12234,
            "src": "6400:57:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12005,
              "nodeType": "StructuredDocumentation",
              "src": "6463:74:51",
              "text": "  @dev Returns the Identity Registry linked to the token"
            },
            "functionSelector": "134e18f4",
            "id": 12011,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "identityRegistry",
            "nameLocation": "6551:16:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12006,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6567:2:51"
            },
            "returnParameters": {
              "id": 12010,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12009,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12011,
                  "src": "6593:17:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IIdentityRegistry_$6637",
                    "typeString": "contract IIdentityRegistry"
                  },
                  "typeName": {
                    "id": 12008,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 12007,
                      "name": "IIdentityRegistry",
                      "nameLocations": [
                        "6593:17:51"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 6637,
                      "src": "6593:17:51"
                    },
                    "referencedDeclaration": 6637,
                    "src": "6593:17:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IIdentityRegistry_$6637",
                      "typeString": "contract IIdentityRegistry"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6592:19:51"
            },
            "scope": 12234,
            "src": "6542:70:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12012,
              "nodeType": "StructuredDocumentation",
              "src": "6618:76:51",
              "text": "  @dev Returns the Compliance contract linked to the token"
            },
            "functionSelector": "6290865d",
            "id": 12018,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "compliance",
            "nameLocation": "6708:10:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12013,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6718:2:51"
            },
            "returnParameters": {
              "id": 12017,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12016,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12018,
                  "src": "6744:11:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ICompliance_$5596",
                    "typeString": "contract ICompliance"
                  },
                  "typeName": {
                    "id": 12015,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 12014,
                      "name": "ICompliance",
                      "nameLocations": [
                        "6744:11:51"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 5596,
                      "src": "6744:11:51"
                    },
                    "referencedDeclaration": 5596,
                    "src": "6744:11:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ICompliance_$5596",
                      "typeString": "contract ICompliance"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6743:13:51"
            },
            "scope": 12234,
            "src": "6699:58:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12019,
              "nodeType": "StructuredDocumentation",
              "src": "6763:84:51",
              "text": " @dev Returns true if the contract is paused, and false otherwise."
            },
            "functionSelector": "5c975abb",
            "id": 12024,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "paused",
            "nameLocation": "6861:6:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12020,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6867:2:51"
            },
            "returnParameters": {
              "id": 12023,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12022,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12024,
                  "src": "6893:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 12021,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6893:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6892:6:51"
            },
            "scope": 12234,
            "src": "6852:47:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12025,
              "nodeType": "StructuredDocumentation",
              "src": "6905:433:51",
              "text": "  @dev Returns the freezing status of a wallet\n  if isFrozen returns `true` the wallet is frozen\n  if isFrozen returns `false` the wallet is not frozen\n  isFrozen returning `true` doesn't mean that the balance is free, tokens could be blocked by\n  a partial freeze or the whole token could be blocked by pause\n  @param _userAddress the address of the wallet on which isFrozen is called"
            },
            "functionSelector": "e5839836",
            "id": 12032,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "isFrozen",
            "nameLocation": "7352:8:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12028,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12027,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "7369:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12032,
                  "src": "7361:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12026,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7361:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7360:22:51"
            },
            "returnParameters": {
              "id": 12031,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12030,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12032,
                  "src": "7406:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 12029,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "7406:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7405:6:51"
            },
            "scope": 12234,
            "src": "7343:69:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12033,
              "nodeType": "StructuredDocumentation",
              "src": "7418:264:51",
              "text": "  @dev Returns the amount of tokens that are partially frozen on a wallet\n  the amount of frozen tokens is always <= to the total balance of the wallet\n  @param _userAddress the address of the wallet on which getFrozenTokens is called"
            },
            "functionSelector": "158b1a57",
            "id": 12040,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "getFrozenTokens",
            "nameLocation": "7696:15:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12036,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12035,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "7720:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12040,
                  "src": "7712:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12034,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7712:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7711:22:51"
            },
            "returnParameters": {
              "id": 12039,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12038,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12040,
                  "src": "7757:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12037,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7757:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7756:9:51"
            },
            "scope": 12234,
            "src": "7687:79:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12041,
              "nodeType": "StructuredDocumentation",
              "src": "7772:212:51",
              "text": "  @dev sets the token name\n  @param _name the name of token to set\n  Only the owner of the token smart contract can call this function\n  emits a `UpdatedTokenInformation` event"
            },
            "functionSelector": "c47f0027",
            "id": 12046,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "setName",
            "nameLocation": "7998:7:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12044,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12043,
                  "mutability": "mutable",
                  "name": "_name",
                  "nameLocation": "8022:5:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12046,
                  "src": "8006:21:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_calldata_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 12042,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "8006:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8005:23:51"
            },
            "returnParameters": {
              "id": 12045,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8037:0:51"
            },
            "scope": 12234,
            "src": "7989:49:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12047,
              "nodeType": "StructuredDocumentation",
              "src": "8044:215:51",
              "text": "  @dev sets the token symbol\n  @param _symbol the token symbol to set\n  Only the owner of the token smart contract can call this function\n  emits a `UpdatedTokenInformation` event"
            },
            "functionSelector": "b84c8246",
            "id": 12052,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "setSymbol",
            "nameLocation": "8273:9:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12050,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12049,
                  "mutability": "mutable",
                  "name": "_symbol",
                  "nameLocation": "8299:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12052,
                  "src": "8283:23:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_calldata_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 12048,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "8283:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8282:25:51"
            },
            "returnParameters": {
              "id": 12051,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8316:0:51"
            },
            "scope": 12234,
            "src": "8264:53:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12053,
              "nodeType": "StructuredDocumentation",
              "src": "8323:242:51",
              "text": "  @dev sets the onchain ID of the token\n  @param _onchainID the address of the onchain ID to set\n  Only the owner of the token smart contract can call this function\n  emits a `UpdatedTokenInformation` event"
            },
            "functionSelector": "3d1ddc5b",
            "id": 12058,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "setOnchainID",
            "nameLocation": "8579:12:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12056,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12055,
                  "mutability": "mutable",
                  "name": "_onchainID",
                  "nameLocation": "8600:10:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12058,
                  "src": "8592:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12054,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8592:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8591:20:51"
            },
            "returnParameters": {
              "id": 12057,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8620:0:51"
            },
            "scope": 12234,
            "src": "8570:51:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12059,
              "nodeType": "StructuredDocumentation",
              "src": "8627:226:51",
              "text": "  @dev pauses the token contract, when contract is paused investors cannot transfer tokens anymore\n  This function can only be called by a wallet set as agent of the token\n  emits a `Paused` event"
            },
            "functionSelector": "8456cb59",
            "id": 12062,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "pause",
            "nameLocation": "8867:5:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12060,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8872:2:51"
            },
            "returnParameters": {
              "id": 12061,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8883:0:51"
            },
            "scope": 12234,
            "src": "8858:26:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12063,
              "nodeType": "StructuredDocumentation",
              "src": "8890:324:51",
              "text": "  @dev unpauses the token contract, when contract is unpaused investors can transfer tokens\n  if their wallet is not blocked & if the amount to transfer is <= to the amount of free tokens\n  This function can only be called by a wallet set as agent of the token\n  emits an `Unpaused` event"
            },
            "functionSelector": "3f4ba83a",
            "id": 12066,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "unpause",
            "nameLocation": "9228:7:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12064,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9235:2:51"
            },
            "returnParameters": {
              "id": 12065,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9246:0:51"
            },
            "scope": 12234,
            "src": "9219:28:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12067,
              "nodeType": "StructuredDocumentation",
              "src": "9253:314:51",
              "text": "  @dev sets an address frozen status for this token.\n  @param _userAddress The address for which to update frozen status\n  @param _freeze Frozen status of the address\n  This function can only be called by a wallet set as agent of the token\n  emits an `AddressFrozen` event"
            },
            "functionSelector": "c69c09cf",
            "id": 12074,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "setAddressFrozen",
            "nameLocation": "9581:16:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12072,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12069,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "9606:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12074,
                  "src": "9598:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12068,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9598:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12071,
                  "mutability": "mutable",
                  "name": "_freeze",
                  "nameLocation": "9625:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12074,
                  "src": "9620:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 12070,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "9620:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9597:36:51"
            },
            "returnParameters": {
              "id": 12073,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9642:0:51"
            },
            "scope": 12234,
            "src": "9572:71:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12075,
              "nodeType": "StructuredDocumentation",
              "src": "9649:317:51",
              "text": "  @dev freezes token amount specified for given address.\n  @param _userAddress The address for which to update frozen tokens\n  @param _amount Amount of Tokens to be frozen\n  This function can only be called by a wallet set as agent of the token\n  emits a `TokensFrozen` event"
            },
            "functionSelector": "125c4a33",
            "id": 12082,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "freezePartialTokens",
            "nameLocation": "9980:19:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12080,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12077,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "10008:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12082,
                  "src": "10000:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12076,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10000:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12079,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "10030:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12082,
                  "src": "10022:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12078,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10022:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9999:39:51"
            },
            "returnParameters": {
              "id": 12081,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10047:0:51"
            },
            "scope": 12234,
            "src": "9971:77:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12083,
              "nodeType": "StructuredDocumentation",
              "src": "10054:322:51",
              "text": "  @dev unfreezes token amount specified for given address\n  @param _userAddress The address for which to update frozen tokens\n  @param _amount Amount of Tokens to be unfrozen\n  This function can only be called by a wallet set as agent of the token\n  emits a `TokensUnfrozen` event"
            },
            "functionSelector": "1fe56f7d",
            "id": 12090,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "unfreezePartialTokens",
            "nameLocation": "10390:21:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12088,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12085,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "10420:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12090,
                  "src": "10412:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12084,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10412:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12087,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "10442:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12090,
                  "src": "10434:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12086,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10434:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "10411:39:51"
            },
            "returnParameters": {
              "id": 12089,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10459:0:51"
            },
            "scope": 12234,
            "src": "10381:79:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12091,
              "nodeType": "StructuredDocumentation",
              "src": "10466:263:51",
              "text": "  @dev sets the Identity Registry for the token\n  @param _identityRegistry the address of the Identity Registry to set\n  Only the owner of the token smart contract can call this function\n  emits an `IdentityRegistryAdded` event"
            },
            "functionSelector": "cbf3f861",
            "id": 12096,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "setIdentityRegistry",
            "nameLocation": "10743:19:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12094,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12093,
                  "mutability": "mutable",
                  "name": "_identityRegistry",
                  "nameLocation": "10771:17:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12096,
                  "src": "10763:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12092,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10763:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "10762:27:51"
            },
            "returnParameters": {
              "id": 12095,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10798:0:51"
            },
            "scope": 12234,
            "src": "10734:65:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12097,
              "nodeType": "StructuredDocumentation",
              "src": "10805:253:51",
              "text": "  @dev sets the compliance contract of the token\n  @param _compliance the address of the compliance contract to set\n  Only the owner of the token smart contract can call this function\n  emits a `ComplianceAdded` event"
            },
            "functionSelector": "f8981789",
            "id": 12102,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "setCompliance",
            "nameLocation": "11072:13:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12100,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12099,
                  "mutability": "mutable",
                  "name": "_compliance",
                  "nameLocation": "11094:11:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12102,
                  "src": "11086:19:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12098,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "11086:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "11085:21:51"
            },
            "returnParameters": {
              "id": 12101,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11115:0:51"
            },
            "scope": 12234,
            "src": "11063:53:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12103,
              "nodeType": "StructuredDocumentation",
              "src": "11122:940:51",
              "text": "  @dev force a transfer of tokens between 2 whitelisted wallets\n  In case the `from` address has not enough free tokens (unfrozen tokens)\n  but has a total balance higher or equal to the `amount`\n  the amount of frozen tokens is reduced in order to have enough free tokens\n  to proceed the transfer, in such a case, the remaining balance on the `from`\n  account is 100% composed of frozen tokens post-transfer.\n  Require that the `to` address is a verified address,\n  @param _from The address of the sender\n  @param _to The address of the receiver\n  @param _amount The number of tokens to transfer\n  @return `true` if successful and revert if unsuccessful\n  This function can only be called by a wallet set as agent of the token\n  emits a `TokensUnfrozen` event if `_amount` is higher than the free balance of `_from`\n  emits a `Transfer` event"
            },
            "functionSelector": "9fc1d0e7",
            "id": 12114,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "forcedTransfer",
            "nameLocation": "12076:14:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12110,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12105,
                  "mutability": "mutable",
                  "name": "_from",
                  "nameLocation": "12108:5:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12114,
                  "src": "12100:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12104,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12100:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12107,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "12131:3:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12114,
                  "src": "12123:11:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12106,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12123:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12109,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "12152:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12114,
                  "src": "12144:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12108,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12144:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "12090:75:51"
            },
            "returnParameters": {
              "id": 12113,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12112,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12114,
                  "src": "12184:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 12111,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "12184:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "12183:6:51"
            },
            "scope": 12234,
            "src": "12067:123:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12115,
              "nodeType": "StructuredDocumentation",
              "src": "12196:411:51",
              "text": "  @dev mint tokens on a wallet\n  Improved version of default mint method. Tokens can be minted\n  to an address if only it is a verified address as per the security token.\n  @param _to Address to mint the tokens to.\n  @param _amount Amount of tokens to mint.\n  This function can only be called by a wallet set as agent of the token\n  emits a `Transfer` event"
            },
            "functionSelector": "40c10f19",
            "id": 12122,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "mint",
            "nameLocation": "12621:4:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12120,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12117,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "12634:3:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12122,
                  "src": "12626:11:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12116,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12626:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12119,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "12647:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12122,
                  "src": "12639:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12118,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12639:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "12625:30:51"
            },
            "returnParameters": {
              "id": 12121,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12664:0:51"
            },
            "scope": 12234,
            "src": "12612:53:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12123,
              "nodeType": "StructuredDocumentation",
              "src": "12671:752:51",
              "text": "  @dev burn tokens on a wallet\n  In case the `account` address has not enough free tokens (unfrozen tokens)\n  but has a total balance higher or equal to the `value` amount\n  the amount of frozen tokens is reduced in order to have enough free tokens\n  to proceed the burn, in such a case, the remaining balance on the `account`\n  is 100% composed of frozen tokens post-transaction.\n  @param _userAddress Address to burn the tokens from.\n  @param _amount Amount of tokens to burn.\n  This function can only be called by a wallet set as agent of the token\n  emits a `TokensUnfrozen` event if `_amount` is higher than the free balance of `_userAddress`\n  emits a `Transfer` event"
            },
            "functionSelector": "9dc29fac",
            "id": 12130,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "burn",
            "nameLocation": "13437:4:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12128,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12125,
                  "mutability": "mutable",
                  "name": "_userAddress",
                  "nameLocation": "13450:12:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12130,
                  "src": "13442:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12124,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13442:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12127,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "13472:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12130,
                  "src": "13464:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12126,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13464:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "13441:39:51"
            },
            "returnParameters": {
              "id": 12129,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "13489:0:51"
            },
            "scope": 12234,
            "src": "13428:62:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12131,
              "nodeType": "StructuredDocumentation",
              "src": "13496:793:51",
              "text": "  @dev recovery function used to force transfer tokens from a\n  lost wallet to a new wallet for an investor.\n  @param _lostWallet the wallet that the investor lost\n  @param _newWallet the newly provided wallet on which tokens have to be transferred\n  @param _investorOnchainID the onchainID of the investor asking for a recovery\n  This function can only be called by a wallet set as agent of the token\n  emits a `TokensUnfrozen` event if there is some frozen tokens on the lost wallet if the recovery process is successful\n  emits a `Transfer` event if the recovery process is successful\n  emits a `RecoverySuccess` event if the recovery process is successful\n  emits a `RecoveryFails` event if the recovery process fails"
            },
            "functionSelector": "9285948a",
            "id": 12142,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "recoveryAddress",
            "nameLocation": "14303:15:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12138,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12133,
                  "mutability": "mutable",
                  "name": "_lostWallet",
                  "nameLocation": "14336:11:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12142,
                  "src": "14328:19:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12132,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14328:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12135,
                  "mutability": "mutable",
                  "name": "_newWallet",
                  "nameLocation": "14365:10:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12142,
                  "src": "14357:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12134,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14357:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12137,
                  "mutability": "mutable",
                  "name": "_investorOnchainID",
                  "nameLocation": "14393:18:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12142,
                  "src": "14385:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12136,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14385:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "14318:99:51"
            },
            "returnParameters": {
              "id": 12141,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12140,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12142,
                  "src": "14436:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 12139,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "14436:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "14435:6:51"
            },
            "scope": 12234,
            "src": "14294:148:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12143,
              "nodeType": "StructuredDocumentation",
              "src": "14448:645:51",
              "text": "  @dev function allowing to issue transfers in batch\n  Require that the msg.sender and `to` addresses are not frozen.\n  Require that the total value should not exceed available balance.\n  Require that the `to` addresses are all verified addresses,\n  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_toList.length` IS TOO HIGH,\n  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n  @param _toList The addresses of the receivers\n  @param _amounts The number of tokens to transfer to the corresponding receiver\n  emits _toList.length `Transfer` events"
            },
            "functionSelector": "88d695b2",
            "id": 12152,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "batchTransfer",
            "nameLocation": "15107:13:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12150,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12146,
                  "mutability": "mutable",
                  "name": "_toList",
                  "nameLocation": "15140:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12152,
                  "src": "15121:26:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12144,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "15121:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 12145,
                    "nodeType": "ArrayTypeName",
                    "src": "15121:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12149,
                  "mutability": "mutable",
                  "name": "_amounts",
                  "nameLocation": "15168:8:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12152,
                  "src": "15149:27:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12147,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "15149:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 12148,
                    "nodeType": "ArrayTypeName",
                    "src": "15149:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "15120:57:51"
            },
            "returnParameters": {
              "id": 12151,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "15186:0:51"
            },
            "scope": 12234,
            "src": "15098:89:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12153,
              "nodeType": "StructuredDocumentation",
              "src": "15193:843:51",
              "text": "  @dev function allowing to issue forced transfers in batch\n  Require that `_amounts[i]` should not exceed available balance of `_fromList[i]`.\n  Require that the `_toList` addresses are all verified addresses\n  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_fromList.length` IS TOO HIGH,\n  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n  @param _fromList The addresses of the senders\n  @param _toList The addresses of the receivers\n  @param _amounts The number of tokens to transfer to the corresponding receiver\n  This function can only be called by a wallet set as agent of the token\n  emits `TokensUnfrozen` events if `_amounts[i]` is higher than the free balance of `_fromList[i]`\n  emits _fromList.length `Transfer` events"
            },
            "functionSelector": "42a47abc",
            "id": 12165,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "batchForcedTransfer",
            "nameLocation": "16050:19:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12163,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12156,
                  "mutability": "mutable",
                  "name": "_fromList",
                  "nameLocation": "16098:9:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12165,
                  "src": "16079:28:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12154,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "16079:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 12155,
                    "nodeType": "ArrayTypeName",
                    "src": "16079:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12159,
                  "mutability": "mutable",
                  "name": "_toList",
                  "nameLocation": "16136:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12165,
                  "src": "16117:26:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12157,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "16117:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 12158,
                    "nodeType": "ArrayTypeName",
                    "src": "16117:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12162,
                  "mutability": "mutable",
                  "name": "_amounts",
                  "nameLocation": "16172:8:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12165,
                  "src": "16153:27:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12160,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "16153:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 12161,
                    "nodeType": "ArrayTypeName",
                    "src": "16153:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "16069:117:51"
            },
            "returnParameters": {
              "id": 12164,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16195:0:51"
            },
            "scope": 12234,
            "src": "16041:155:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12166,
              "nodeType": "StructuredDocumentation",
              "src": "16202:575:51",
              "text": "  @dev function allowing to mint tokens in batch\n  Require that the `_toList` addresses are all verified addresses\n  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_toList.length` IS TOO HIGH,\n  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n  @param _toList The addresses of the receivers\n  @param _amounts The number of tokens to mint to the corresponding receiver\n  This function can only be called by a wallet set as agent of the token\n  emits _toList.length `Transfer` events"
            },
            "functionSelector": "68573107",
            "id": 12175,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "batchMint",
            "nameLocation": "16791:9:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12173,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12169,
                  "mutability": "mutable",
                  "name": "_toList",
                  "nameLocation": "16820:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12175,
                  "src": "16801:26:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12167,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "16801:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 12168,
                    "nodeType": "ArrayTypeName",
                    "src": "16801:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12172,
                  "mutability": "mutable",
                  "name": "_amounts",
                  "nameLocation": "16848:8:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12175,
                  "src": "16829:27:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12170,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "16829:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 12171,
                    "nodeType": "ArrayTypeName",
                    "src": "16829:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "16800:57:51"
            },
            "returnParameters": {
              "id": 12174,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16866:0:51"
            },
            "scope": 12234,
            "src": "16782:85:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12176,
              "nodeType": "StructuredDocumentation",
              "src": "16873:624:51",
              "text": "  @dev function allowing to burn tokens in batch\n  Require that the `_userAddresses` addresses are all verified addresses\n  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,\n  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n  @param _userAddresses The addresses of the wallets concerned by the burn\n  @param _amounts The number of tokens to burn from the corresponding wallets\n  This function can only be called by a wallet set as agent of the token\n  emits _userAddresses.length `Transfer` events"
            },
            "functionSelector": "4a6cc677",
            "id": 12185,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "batchBurn",
            "nameLocation": "17511:9:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12183,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12179,
                  "mutability": "mutable",
                  "name": "_userAddresses",
                  "nameLocation": "17540:14:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12185,
                  "src": "17521:33:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12177,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "17521:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 12178,
                    "nodeType": "ArrayTypeName",
                    "src": "17521:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12182,
                  "mutability": "mutable",
                  "name": "_amounts",
                  "nameLocation": "17575:8:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12185,
                  "src": "17556:27:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12180,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "17556:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 12181,
                    "nodeType": "ArrayTypeName",
                    "src": "17556:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "17520:64:51"
            },
            "returnParameters": {
              "id": 12184,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17593:0:51"
            },
            "scope": 12234,
            "src": "17502:92:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12186,
              "nodeType": "StructuredDocumentation",
              "src": "17600:538:51",
              "text": "  @dev function allowing to set frozen addresses in batch\n  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,\n  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n  @param _userAddresses The addresses for which to update frozen status\n  @param _freeze Frozen status of the corresponding address\n  This function can only be called by a wallet set as agent of the token\n  emits _userAddresses.length `AddressFrozen` events"
            },
            "functionSelector": "1a7af379",
            "id": 12195,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "batchSetAddressFrozen",
            "nameLocation": "18152:21:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12193,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12189,
                  "mutability": "mutable",
                  "name": "_userAddresses",
                  "nameLocation": "18193:14:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12195,
                  "src": "18174:33:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12187,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "18174:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 12188,
                    "nodeType": "ArrayTypeName",
                    "src": "18174:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12192,
                  "mutability": "mutable",
                  "name": "_freeze",
                  "nameLocation": "18225:7:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12195,
                  "src": "18209:23:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_bool_$dyn_calldata_ptr",
                    "typeString": "bool[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12190,
                      "name": "bool",
                      "nodeType": "ElementaryTypeName",
                      "src": "18209:4:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "id": 12191,
                    "nodeType": "ArrayTypeName",
                    "src": "18209:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_bool_$dyn_storage_ptr",
                      "typeString": "bool[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "18173:60:51"
            },
            "returnParameters": {
              "id": 12194,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "18242:0:51"
            },
            "scope": 12234,
            "src": "18143:100:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12196,
              "nodeType": "StructuredDocumentation",
              "src": "18249:558:51",
              "text": "  @dev function allowing to freeze tokens partially in batch\n  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,\n  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n  @param _userAddresses The addresses on which tokens need to be frozen\n  @param _amounts the amount of tokens to freeze on the corresponding address\n  This function can only be called by a wallet set as agent of the token\n  emits _userAddresses.length `TokensFrozen` events"
            },
            "functionSelector": "fc7e5fa8",
            "id": 12205,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "batchFreezePartialTokens",
            "nameLocation": "18821:24:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12203,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12199,
                  "mutability": "mutable",
                  "name": "_userAddresses",
                  "nameLocation": "18865:14:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12205,
                  "src": "18846:33:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12197,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "18846:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 12198,
                    "nodeType": "ArrayTypeName",
                    "src": "18846:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12202,
                  "mutability": "mutable",
                  "name": "_amounts",
                  "nameLocation": "18900:8:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12205,
                  "src": "18881:27:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12200,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "18881:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 12201,
                    "nodeType": "ArrayTypeName",
                    "src": "18881:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "18845:64:51"
            },
            "returnParameters": {
              "id": 12204,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "18918:0:51"
            },
            "scope": 12234,
            "src": "18812:107:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12206,
              "nodeType": "StructuredDocumentation",
              "src": "18925:566:51",
              "text": "  @dev function allowing to unfreeze tokens partially in batch\n  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,\n  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION\n  @param _userAddresses The addresses on which tokens need to be unfrozen\n  @param _amounts the amount of tokens to unfreeze on the corresponding address\n  This function can only be called by a wallet set as agent of the token\n  emits _userAddresses.length `TokensUnfrozen` events"
            },
            "functionSelector": "4710362d",
            "id": 12215,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "batchUnfreezePartialTokens",
            "nameLocation": "19505:26:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12213,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12209,
                  "mutability": "mutable",
                  "name": "_userAddresses",
                  "nameLocation": "19551:14:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12215,
                  "src": "19532:33:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12207,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "19532:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 12208,
                    "nodeType": "ArrayTypeName",
                    "src": "19532:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 12212,
                  "mutability": "mutable",
                  "name": "_amounts",
                  "nameLocation": "19586:8:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12215,
                  "src": "19567:27:51",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                    "typeString": "uint256[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 12210,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "19567:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 12211,
                    "nodeType": "ArrayTypeName",
                    "src": "19567:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                      "typeString": "uint256[]"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "19531:64:51"
            },
            "returnParameters": {
              "id": 12214,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19604:0:51"
            },
            "scope": 12234,
            "src": "19496:109:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12216,
              "nodeType": "StructuredDocumentation",
              "src": "19611:264:51",
              "text": "  @dev transfers the ownership of the token smart contract\n  @param _newOwner the address of the new token smart contract owner\n  This function can only be called by the owner of the token\n  emits an `OwnershipTransferred` event"
            },
            "functionSelector": "51411b33",
            "id": 12221,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "transferOwnershipOnTokenContract",
            "nameLocation": "19889:32:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12219,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12218,
                  "mutability": "mutable",
                  "name": "_newOwner",
                  "nameLocation": "19930:9:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12221,
                  "src": "19922:17:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12217,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "19922:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "19921:19:51"
            },
            "returnParameters": {
              "id": 12220,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19949:0:51"
            },
            "scope": 12234,
            "src": "19880:70:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12222,
              "nodeType": "StructuredDocumentation",
              "src": "19956:248:51",
              "text": "  @dev adds an agent to the token smart contract\n  @param _agent the address of the new agent of the token smart contract\n  This function can only be called by the owner of the token\n  emits an `AgentAdded` event"
            },
            "functionSelector": "b422d830",
            "id": 12227,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "addAgentOnTokenContract",
            "nameLocation": "20218:23:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12225,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12224,
                  "mutability": "mutable",
                  "name": "_agent",
                  "nameLocation": "20250:6:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12227,
                  "src": "20242:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12223,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "20242:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "20241:16:51"
            },
            "returnParameters": {
              "id": 12226,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "20266:0:51"
            },
            "scope": 12234,
            "src": "20209:58:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "documentation": {
              "id": 12228,
              "nodeType": "StructuredDocumentation",
              "src": "20273:232:51",
              "text": "  @dev remove an agent from the token smart contract\n  @param _agent the address of the agent to remove\n  This function can only be called by the owner of the token\n  emits an `AgentRemoved` event"
            },
            "functionSelector": "5dc7a3cb",
            "id": 12233,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "removeAgentOnTokenContract",
            "nameLocation": "20519:26:51",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12231,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12230,
                  "mutability": "mutable",
                  "name": "_agent",
                  "nameLocation": "20554:6:51",
                  "nodeType": "VariableDeclaration",
                  "scope": 12233,
                  "src": "20546:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12229,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "20546:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "20545:16:51"
            },
            "returnParameters": {
              "id": 12232,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "20570:0:51"
            },
            "scope": 12234,
            "src": "20510:61:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 12235,
        "src": "1279:19294:51",
        "usedErrors": []
      }
    ],
    "src": "1093:19481:51"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.17+commit.8df45f5f.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.8",
  "updatedAt": "2022-12-08T12:51:01.407Z",
  "devdoc": {
    "details": "interface",
    "kind": "dev",
    "methods": {
      "addAgentOnTokenContract(address)": {
        "details": "adds an agent to the token smart contract",
        "params": {
          "_agent": "the address of the new agent of the token smart contract  This function can only be called by the owner of the token  emits an `AgentAdded` event"
        }
      },
      "allowance(address,address)": {
        "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."
      },
      "approve(address,uint256)": {
        "details": "Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."
      },
      "balanceOf(address)": {
        "details": "Returns the amount of tokens owned by `account`."
      },
      "batchBurn(address[],uint256[])": {
        "details": "function allowing to burn tokens in batch  Require that the `_userAddresses` addresses are all verified addresses  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION",
        "params": {
          "_amounts": "The number of tokens to burn from the corresponding wallets  This function can only be called by a wallet set as agent of the token  emits _userAddresses.length `Transfer` events",
          "_userAddresses": "The addresses of the wallets concerned by the burn"
        }
      },
      "batchForcedTransfer(address[],address[],uint256[])": {
        "details": "function allowing to issue forced transfers in batch  Require that `_amounts[i]` should not exceed available balance of `_fromList[i]`.  Require that the `_toList` addresses are all verified addresses  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_fromList.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION",
        "params": {
          "_amounts": "The number of tokens to transfer to the corresponding receiver  This function can only be called by a wallet set as agent of the token  emits `TokensUnfrozen` events if `_amounts[i]` is higher than the free balance of `_fromList[i]`  emits _fromList.length `Transfer` events",
          "_fromList": "The addresses of the senders",
          "_toList": "The addresses of the receivers"
        }
      },
      "batchFreezePartialTokens(address[],uint256[])": {
        "details": "function allowing to freeze tokens partially in batch  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION",
        "params": {
          "_amounts": "the amount of tokens to freeze on the corresponding address  This function can only be called by a wallet set as agent of the token  emits _userAddresses.length `TokensFrozen` events",
          "_userAddresses": "The addresses on which tokens need to be frozen"
        }
      },
      "batchMint(address[],uint256[])": {
        "details": "function allowing to mint tokens in batch  Require that the `_toList` addresses are all verified addresses  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_toList.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION",
        "params": {
          "_amounts": "The number of tokens to mint to the corresponding receiver  This function can only be called by a wallet set as agent of the token  emits _toList.length `Transfer` events",
          "_toList": "The addresses of the receivers"
        }
      },
      "batchSetAddressFrozen(address[],bool[])": {
        "details": "function allowing to set frozen addresses in batch  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION",
        "params": {
          "_freeze": "Frozen status of the corresponding address  This function can only be called by a wallet set as agent of the token  emits _userAddresses.length `AddressFrozen` events",
          "_userAddresses": "The addresses for which to update frozen status"
        }
      },
      "batchTransfer(address[],uint256[])": {
        "details": "function allowing to issue transfers in batch  Require that the msg.sender and `to` addresses are not frozen.  Require that the total value should not exceed available balance.  Require that the `to` addresses are all verified addresses,  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_toList.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION",
        "params": {
          "_amounts": "The number of tokens to transfer to the corresponding receiver  emits _toList.length `Transfer` events",
          "_toList": "The addresses of the receivers"
        }
      },
      "batchUnfreezePartialTokens(address[],uint256[])": {
        "details": "function allowing to unfreeze tokens partially in batch  IMPORTANT : THIS TRANSACTION COULD EXCEED GAS LIMIT IF `_userAddresses.length` IS TOO HIGH,  USE WITH CARE OR YOU COULD LOSE TX FEES WITH AN \"OUT OF GAS\" TRANSACTION",
        "params": {
          "_amounts": "the amount of tokens to unfreeze on the corresponding address  This function can only be called by a wallet set as agent of the token  emits _userAddresses.length `TokensUnfrozen` events",
          "_userAddresses": "The addresses on which tokens need to be unfrozen"
        }
      },
      "burn(address,uint256)": {
        "details": "burn tokens on a wallet  In case the `account` address has not enough free tokens (unfrozen tokens)  but has a total balance higher or equal to the `value` amount  the amount of frozen tokens is reduced in order to have enough free tokens  to proceed the burn, in such a case, the remaining balance on the `account`  is 100% composed of frozen tokens post-transaction.",
        "params": {
          "_amount": "Amount of tokens to burn.  This function can only be called by a wallet set as agent of the token  emits a `TokensUnfrozen` event if `_amount` is higher than the free balance of `_userAddress`  emits a `Transfer` event",
          "_userAddress": "Address to burn the tokens from."
        }
      },
      "compliance()": {
        "details": "Returns the Compliance contract linked to the token"
      },
      "decimals()": {
        "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 1 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including balanceOf() and transfer()."
      },
      "forcedTransfer(address,address,uint256)": {
        "details": "force a transfer of tokens between 2 whitelisted wallets  In case the `from` address has not enough free tokens (unfrozen tokens)  but has a total balance higher or equal to the `amount`  the amount of frozen tokens is reduced in order to have enough free tokens  to proceed the transfer, in such a case, the remaining balance on the `from`  account is 100% composed of frozen tokens post-transfer.  Require that the `to` address is a verified address,",
        "params": {
          "_amount": "The number of tokens to transfer",
          "_from": "The address of the sender",
          "_to": "The address of the receiver"
        },
        "returns": {
          "_0": "`true` if successful and revert if unsuccessful  This function can only be called by a wallet set as agent of the token  emits a `TokensUnfrozen` event if `_amount` is higher than the free balance of `_from`  emits a `Transfer` event"
        }
      },
      "freezePartialTokens(address,uint256)": {
        "details": "freezes token amount specified for given address.",
        "params": {
          "_amount": "Amount of Tokens to be frozen  This function can only be called by a wallet set as agent of the token  emits a `TokensFrozen` event",
          "_userAddress": "The address for which to update frozen tokens"
        }
      },
      "getFrozenTokens(address)": {
        "details": "Returns the amount of tokens that are partially frozen on a wallet  the amount of frozen tokens is always <= to the total balance of the wallet",
        "params": {
          "_userAddress": "the address of the wallet on which getFrozenTokens is called"
        }
      },
      "identityRegistry()": {
        "details": "Returns the Identity Registry linked to the token"
      },
      "isFrozen(address)": {
        "details": "Returns the freezing status of a wallet  if isFrozen returns `true` the wallet is frozen  if isFrozen returns `false` the wallet is not frozen  isFrozen returning `true` doesn't mean that the balance is free, tokens could be blocked by  a partial freeze or the whole token could be blocked by pause",
        "params": {
          "_userAddress": "the address of the wallet on which isFrozen is called"
        }
      },
      "mint(address,uint256)": {
        "details": "mint tokens on a wallet  Improved version of default mint method. Tokens can be minted  to an address if only it is a verified address as per the security token.",
        "params": {
          "_amount": "Amount of tokens to mint.  This function can only be called by a wallet set as agent of the token  emits a `Transfer` event",
          "_to": "Address to mint the tokens to."
        }
      },
      "name()": {
        "details": "Returns the name of the token."
      },
      "onchainID()": {
        "details": "Returns the address of the onchainID of the token. the onchainID of the token gives all the information available about the token and is managed by the token issuer or his agent."
      },
      "pause()": {
        "details": "pauses the token contract, when contract is paused investors cannot transfer tokens anymore  This function can only be called by a wallet set as agent of the token  emits a `Paused` event"
      },
      "paused()": {
        "details": "Returns true if the contract is paused, and false otherwise."
      },
      "recoveryAddress(address,address,address)": {
        "details": "recovery function used to force transfer tokens from a  lost wallet to a new wallet for an investor.",
        "params": {
          "_investorOnchainID": "the onchainID of the investor asking for a recovery  This function can only be called by a wallet set as agent of the token  emits a `TokensUnfrozen` event if there is some frozen tokens on the lost wallet if the recovery process is successful  emits a `Transfer` event if the recovery process is successful  emits a `RecoverySuccess` event if the recovery process is successful  emits a `RecoveryFails` event if the recovery process fails",
          "_lostWallet": "the wallet that the investor lost",
          "_newWallet": "the newly provided wallet on which tokens have to be transferred"
        }
      },
      "removeAgentOnTokenContract(address)": {
        "details": "remove an agent from the token smart contract",
        "params": {
          "_agent": "the address of the agent to remove  This function can only be called by the owner of the token  emits an `AgentRemoved` event"
        }
      },
      "setAddressFrozen(address,bool)": {
        "details": "sets an address frozen status for this token.",
        "params": {
          "_freeze": "Frozen status of the address  This function can only be called by a wallet set as agent of the token  emits an `AddressFrozen` event",
          "_userAddress": "The address for which to update frozen status"
        }
      },
      "setCompliance(address)": {
        "details": "sets the compliance contract of the token",
        "params": {
          "_compliance": "the address of the compliance contract to set  Only the owner of the token smart contract can call this function  emits a `ComplianceAdded` event"
        }
      },
      "setIdentityRegistry(address)": {
        "details": "sets the Identity Registry for the token",
        "params": {
          "_identityRegistry": "the address of the Identity Registry to set  Only the owner of the token smart contract can call this function  emits an `IdentityRegistryAdded` event"
        }
      },
      "setName(string)": {
        "details": "sets the token name",
        "params": {
          "_name": "the name of token to set  Only the owner of the token smart contract can call this function  emits a `UpdatedTokenInformation` event"
        }
      },
      "setOnchainID(address)": {
        "details": "sets the onchain ID of the token",
        "params": {
          "_onchainID": "the address of the onchain ID to set  Only the owner of the token smart contract can call this function  emits a `UpdatedTokenInformation` event"
        }
      },
      "setSymbol(string)": {
        "details": "sets the token symbol",
        "params": {
          "_symbol": "the token symbol to set  Only the owner of the token smart contract can call this function  emits a `UpdatedTokenInformation` event"
        }
      },
      "symbol()": {
        "details": "Returns the symbol of the token, usually a shorter version of the name."
      },
      "totalSupply()": {
        "details": "Returns the amount of tokens in existence."
      },
      "transfer(address,uint256)": {
        "details": "Moves `amount` tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
      },
      "transferFrom(address,address,uint256)": {
        "details": "Moves `amount` tokens from `from` to `to` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
      },
      "transferOwnershipOnTokenContract(address)": {
        "details": "transfers the ownership of the token smart contract",
        "params": {
          "_newOwner": "the address of the new token smart contract owner  This function can only be called by the owner of the token  emits an `OwnershipTransferred` event"
        }
      },
      "unfreezePartialTokens(address,uint256)": {
        "details": "unfreezes token amount specified for given address",
        "params": {
          "_amount": "Amount of Tokens to be unfrozen  This function can only be called by a wallet set as agent of the token  emits a `TokensUnfrozen` event",
          "_userAddress": "The address for which to update frozen tokens"
        }
      },
      "unpause()": {
        "details": "unpauses the token contract, when contract is unpaused investors can transfer tokens  if their wallet is not blocked & if the amount to transfer is <= to the amount of free tokens  This function can only be called by a wallet set as agent of the token  emits an `Unpaused` event"
      },
      "version()": {
        "details": "Returns the TREX version of the token. current version is 3.0.0"
      }
    },
    "version": 1
  },
  "userdoc": {
    "events": {
      "AddressFrozen(address,bool,address)": {
        "notice": "this event is emitted when the wallet of an investor is frozen or unfrozen  the event is emitted by setAddressFrozen and batchSetAddressFrozen functions  `_userAddress` is the wallet of the investor that is concerned by the freezing status  `_isFrozen` is the freezing status of the wallet  if `_isFrozen` equals `true` the wallet is frozen after emission of the event  if `_isFrozen` equals `false` the wallet is unfrozen after emission of the event  `_owner` is the address of the agent who called the function to freeze the wallet"
      },
      "ComplianceAdded(address)": {
        "notice": "this event is emitted when the Compliance has been set for the token  the event is emitted by the token constructor and by the setCompliance function  `_compliance` is the address of the Compliance contract of the token"
      },
      "IdentityRegistryAdded(address)": {
        "notice": "this event is emitted when the IdentityRegistry has been set for the token  the event is emitted by the token constructor and by the setIdentityRegistry function  `_identityRegistry` is the address of the Identity Registry of the token"
      },
      "Paused(address)": {
        "notice": "this event is emitted when the token is paused  the event is emitted by the pause function  `_userAddress` is the address of the wallet that called the pause function"
      },
      "RecoverySuccess(address,address,address)": {
        "notice": "this event is emitted when an investor successfully recovers his tokens  the event is emitted by the recoveryAddress function  `_lostWallet` is the address of the wallet that the investor lost access to  `_newWallet` is the address of the wallet that the investor provided for the recovery  `_investorOnchainID` is the address of the onchainID of the investor who asked for a recovery"
      },
      "TokensFrozen(address,uint256)": {
        "notice": "this event is emitted when a certain amount of tokens is frozen on a wallet  the event is emitted by freezePartialTokens and batchFreezePartialTokens functions  `_userAddress` is the wallet of the investor that is concerned by the freezing status  `_amount` is the amount of tokens that are frozen"
      },
      "TokensUnfrozen(address,uint256)": {
        "notice": "this event is emitted when a certain amount of tokens is unfrozen on a wallet  the event is emitted by unfreezePartialTokens and batchUnfreezePartialTokens functions  `_userAddress` is the wallet of the investor that is concerned by the freezing status  `_amount` is the amount of tokens that are unfrozen"
      },
      "Unpaused(address)": {
        "notice": "this event is emitted when the token is unpaused  the event is emitted by the unpause function  `_userAddress` is the address of the wallet that called the unpause function"
      },
      "UpdatedTokenInformation(string,string,uint8,string,address)": {
        "notice": "this event is emitted when the token information is updated.  the event is emitted by the token constructor and by the setTokenInformation function  `_newName` is the name of the token  `_newSymbol` is the symbol of the token  `_newDecimals` is the decimals of the token  `_newVersion` is the version of the token, current version is 3.0  `_newOnchainID` is the address of the onchainID of the token"
      }
    },
    "kind": "user",
    "methods": {},
    "version": 1
  }
}