{
  "XcertCustom": {
    "abi": [
      {
        "inputs": [
          {
            "internalType": "string",
            "name": "_name",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "_symbol",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "_uriPrefix",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "_uriPostfix",
            "type": "string"
          },
          {
            "internalType": "bytes32",
            "name": "_schemaURIIntegrityDigest",
            "type": "bytes32"
          },
          {
            "internalType": "bytes4[]",
            "name": "_capabilities",
            "type": "bytes4[]"
          },
          {
            "internalType": "address[6]",
            "name": "_addresses",
            "type": "address[6]"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "constructor"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "_approved",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "Approval",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "_operator",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "bool",
            "name": "_approved",
            "type": "bool"
          }
        ],
        "name": "ApprovalForAll",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "bool",
            "name": "isPaused",
            "type": "bool"
          }
        ],
        "name": "IsPaused",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "SetAbilities",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          },
          {
            "indexed": false,
            "internalType": "bytes32",
            "name": "_tokenURIIntegrityDigest",
            "type": "bytes32"
          }
        ],
        "name": "TokenURIIntegrityDigestUpdate",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_from",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "_to",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "Transfer",
        "type": "event"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "name": "addressToAbility",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_approved",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "approve",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          }
        ],
        "name": "balanceOf",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_operator",
            "type": "address"
          },
          {
            "internalType": "bool",
            "name": "_approved",
            "type": "bool"
          },
          {
            "internalType": "address",
            "name": "_feeToken",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_feeValue",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "_feeRecipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_seed",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "_expiration",
            "type": "uint256"
          }
        ],
        "name": "cancelSetApprovalForAllWithSignature",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ],
        "name": "claimCancelled",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ],
        "name": "claimPerformed",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_to",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_id",
            "type": "uint256"
          },
          {
            "internalType": "bytes32",
            "name": "_tokenURIIntegrityDigest",
            "type": "bytes32"
          }
        ],
        "name": "create",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "destroy",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_operator",
            "type": "address"
          },
          {
            "internalType": "bool",
            "name": "_approved",
            "type": "bool"
          },
          {
            "internalType": "address",
            "name": "_feeToken",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_feeValue",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "_feeRecipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_seed",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "_expiration",
            "type": "uint256"
          }
        ],
        "name": "generateClaim",
        "outputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "getApproved",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "grantAbilities",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "isAble",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_operator",
            "type": "address"
          }
        ],
        "name": "isApprovedForAll",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "isPaused",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_signer",
            "type": "address"
          },
          {
            "internalType": "bytes32",
            "name": "_claim",
            "type": "bytes32"
          },
          {
            "components": [
              {
                "internalType": "bytes32",
                "name": "r",
                "type": "bytes32"
              },
              {
                "internalType": "bytes32",
                "name": "s",
                "type": "bytes32"
              },
              {
                "internalType": "uint8",
                "name": "v",
                "type": "uint8"
              },
              {
                "internalType": "enum XcertToken.SignatureKind",
                "name": "kind",
                "type": "uint8"
              }
            ],
            "internalType": "struct XcertToken.SignatureData",
            "name": "_signature",
            "type": "tuple"
          }
        ],
        "name": "isValidSignature",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "name",
        "outputs": [
          {
            "internalType": "string",
            "name": "_name",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "ownerOf",
        "outputs": [
          {
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "revoke",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "revokeAbilities",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_from",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_to",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "safeTransferFrom",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_from",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_to",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          },
          {
            "internalType": "bytes",
            "name": "_data",
            "type": "bytes"
          }
        ],
        "name": "safeTransferFrom",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "setAbilities",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_operator",
            "type": "address"
          },
          {
            "internalType": "bool",
            "name": "_approved",
            "type": "bool"
          }
        ],
        "name": "setApprovalForAll",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_operator",
            "type": "address"
          },
          {
            "internalType": "bool",
            "name": "_approved",
            "type": "bool"
          },
          {
            "internalType": "address",
            "name": "_feeToken",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_feeValue",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "_feeRecipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_seed",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "_expiration",
            "type": "uint256"
          },
          {
            "components": [
              {
                "internalType": "bytes32",
                "name": "r",
                "type": "bytes32"
              },
              {
                "internalType": "bytes32",
                "name": "s",
                "type": "bytes32"
              },
              {
                "internalType": "uint8",
                "name": "v",
                "type": "uint8"
              },
              {
                "internalType": "enum XcertToken.SignatureKind",
                "name": "kind",
                "type": "uint8"
              }
            ],
            "internalType": "struct XcertToken.SignatureData",
            "name": "_signature",
            "type": "tuple"
          }
        ],
        "name": "setApprovalForAllWithSignature",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bool",
            "name": "_isPaused",
            "type": "bool"
          }
        ],
        "name": "setPause",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "string",
            "name": "_uriPrefix",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "_uriPostfix",
            "type": "string"
          }
        ],
        "name": "setUri",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes4",
            "name": "_interfaceID",
            "type": "bytes4"
          }
        ],
        "name": "supportsInterface",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "symbol",
        "outputs": [
          {
            "internalType": "string",
            "name": "_symbol",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "_index",
            "type": "uint256"
          }
        ],
        "name": "tokenByIndex",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_index",
            "type": "uint256"
          }
        ],
        "name": "tokenOfOwnerByIndex",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "tokenURI",
        "outputs": [
          {
            "internalType": "string",
            "name": "",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "tokenId",
            "type": "uint256"
          }
        ],
        "name": "tokenURIIntegrity",
        "outputs": [
          {
            "internalType": "bytes",
            "name": "digest",
            "type": "bytes"
          },
          {
            "internalType": "string",
            "name": "hashAlgorithm",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "tokenId",
            "type": "uint256"
          }
        ],
        "name": "tokenURISchemaIntegrity",
        "outputs": [
          {
            "internalType": "bytes",
            "name": "digest",
            "type": "bytes"
          },
          {
            "internalType": "string",
            "name": "hashAlgorithm",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "totalSupply",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_from",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_to",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          }
        ],
        "name": "transferFrom",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "_tokenId",
            "type": "uint256"
          },
          {
            "internalType": "bytes32",
            "name": "_tokenURIIntegrityDigest",
            "type": "bytes32"
          }
        ],
        "name": "updateTokenURIIntegrityDigest",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "uriPostfix",
        "outputs": [
          {
            "internalType": "string",
            "name": "",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "uriPrefix",
        "outputs": [
          {
            "internalType": "string",
            "name": "",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      }
    ],
    "evm": {
      "bytecode": {
        "object": "60806040523480156200001157600080fd5b50604051620036f2380380620036f2833981016040819052620000349162000521565b7f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c58054600160ff1991821681179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548216831790557f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df80548216831790557f77b7bbe0e49b76487c9476b5db3354cf5270619d0037ccb899c2a4c4a75b43188054821683179055336000908152600c602090815260408220600f9055630e5505c960e21b82529081527f51898dc9a6d4a1a28139a8ad74f01a2d4091d77ed3e22b500e2e4f337ecb7ab18054909216831790915588516200013d92918a0190620002bb565b50855162000153906002906020890190620002bb565b50845162000169906003906020880190620002bb565b5083516200017f906004906020870190620002bb565b50600f83905560005b825181101562000200576001600080858481518110620001b857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160e01b0319168252810191909152604001600020805460ff191691151591909117905580620001f78162000683565b91505062000188565b506020818101516001600160a01b039081166000908152600c835260408082206010905580850151831682528082206080908190556060860151841683528183206001908190553384528284208490558651851684528284206107ff9055865185168452600b8087528385209288015186168552918652828420805460ff19908116831790915587518616855291865282842060a09097015190941683529490935291909120805490921617905550620006c1945050505050565b828054620002c99062000646565b90600052602060002090601f016020900481019282620002ed576000855562000338565b82601f106200030857805160ff191683800117855562000338565b8280016001018555821562000338579182015b82811115620003385782518255916020019190600101906200031b565b50620003469291506200034a565b5090565b5b808211156200034657600081556001016200034b565b600082601f83011262000372578081fd5b60405160c081016001600160401b0381118282101715620003975762000397620006ab565b604052808360c08101861015620003ac578384fd5b835b6006811015620003e55781516001600160a01b0381168114620003cf578586fd5b83526020928301929190910190600101620003ae565b509195945050505050565b600082601f83011262000401578081fd5b815160206001600160401b038211156200041f576200041f620006ab565b8082026200042f8282016200061a565b8381528281019086840183880185018910156200044a578687fd5b8693505b85841015620004845780516001600160e01b0319811681146200046f578788fd5b8352600193909301929184019184016200044e565b50979650505050505050565b600082601f830112620004a1578081fd5b81516001600160401b03811115620004bd57620004bd620006ab565b6020620004d3601f8301601f191682016200061a565b8281528582848701011115620004e7578384fd5b835b8381101562000506578581018301518282018401528201620004e9565b838111156200051757848385840101525b5095945050505050565b6000806000806000806000610180888a0312156200053d578283fd5b87516001600160401b038082111562000554578485fd5b620005628b838c0162000490565b985060208a015191508082111562000578578485fd5b620005868b838c0162000490565b975060408a01519150808211156200059c578485fd5b620005aa8b838c0162000490565b965060608a0151915080821115620005c0578485fd5b620005ce8b838c0162000490565b955060808a0151945060a08a0151915080821115620005eb578384fd5b50620005fa8a828b01620003f0565b9250506200060c8960c08a0162000361565b905092959891949750929550565b6040518181016001600160401b03811182821017156200063e576200063e620006ab565b604052919050565b6002810460018216806200065b57607f821691505b602082108114156200067d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620006a457634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b61302180620006d16000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c806370a0823111610130578063b187bd26116100b8578063c87b56dd1161007c578063c87b56dd146104b5578063caae188e146104c8578063ce4e3273146104db578063e985e9c5146104ee578063f394b6df1461050157610232565b8063b187bd261461046c578063b88d4fde14610474578063ba00a33014610487578063bedb86fb1461049a578063c298bba5146104ad57610232565b806395d89b41116100ff57806395d89b41146104185780639d11877014610420578063a0fd419514610433578063a22cb46514610446578063b0e329e41461045957610232565b806370a08231146103cc5780637f9b45b0146103df57806389b73ec0146103f25780638fa76d8d1461040557610232565b806323b872dd116101be5780634984668011610182578063498466801461036a5780634f6ccce71461038b578063590318291461039e57806362b99ad4146103b15780636352211e146103b957610232565b806323b872dd1461030b57806323bf33961461031e5780632f745c591461033157806342842e0e1461034457806345a32c861461035757610232565b80630ab319e8116102055780630ab319e8146102aa5780630d04c3b8146102bd57806315ec3b8b146102d057806318160ddd146102e357806320c5429b146102f857610232565b806301ffc9a71461023757806306fdde0314610260578063081812fc14610275578063095ea7b314610295575b600080fd5b61024a610245366004612b0e565b610514565b6040516102579190612e41565b60405180910390f35b610268610537565b6040516102579190612e8f565b610288610283366004612af6565b6105c9565b6040516102579190612dcc565b6102a86102a3366004612a63565b610645565b005b6102a86102b8366004612a63565b610728565b6102a86102cb366004612bca565b6107e4565b6102a86102de366004612a63565b61096d565b6102eb610a23565b6040516102579190612d15565b6102a8610306366004612af6565b610a29565b6102a8610319366004612949565b610b22565b61024a61032c366004612af6565b610b32565b6102eb61033f366004612a63565b610b47565b6102a8610352366004612949565b610bec565b6102eb6103653660046127db565b610c07565b61037d610378366004612af6565b610c19565b604051610257929190612e6a565b6102eb610399366004612af6565b610cc4565b61024a6103ac366004612af6565b610d3a565b610268610d4f565b6102886103c7366004612af6565b610ddd565b6102eb6103da3660046127db565b610e3b565b6102a86103ed3660046128aa565b610e9f565b6102a8610400366004612b46565b611117565b61024a610413366004612a27565b611200565b61026861139e565b6102a861042e366004612af6565b6113ad565b6102eb610441366004612827565b6114cc565b6102a86104543660046129f1565b611513565b6102a8610467366004612a8c565b611582565b61024a61160e565b6102a8610482366004612984565b611617565b61024a610495366004612a63565b611659565b6102a86104a8366004612abe565b6116be565b6102686117e6565b6102686104c3366004612af6565b6117f3565b61037d6104d6366004612af6565b6118e3565b6102a86104e9366004612827565b611952565b61024a6104fc3660046127f5565b611a24565b6102a861050f366004612a63565b611a52565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60606001805461054690612f34565b80601f016020809104026020016040519081016040528092919081815260200182805461057290612f34565b80156105bf5780601f10610594576101008083540402835291602001916105bf565b820191906000526020600020905b8154815290600101906020018083116105a257829003601f168201915b5050505050905090565b6000818152600960209081526040808320548151808301909252600682526518181b18181960d11b92820192909252906001600160a01b03166106285760405162461bcd60e51b815260040161061f9190612e8f565b60405180910390fd5b50506000908152600a60205260409020546001600160a01b031690565b6000818152600960205260409020546001600160a01b03163381148061068e57506001600160a01b0381166000908152600b6020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303630303360d01b815250906106cb5760405162461bcd60e51b815260040161061f9190612e8f565b506000828152600a602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600c83528390205483518085019094529083526530313730303160d01b9183019190915260019190821682146107955760405162461bcd60e51b815260040161061f9190612e8f565b506001600160a01b0383166000818152600c6020526040808220805486179081905590519092917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600c83528390205483518085019094529083526530313730303160d01b9183019190915260809190821682146108515760405162461bcd60e51b815260040161061f9190612e8f565b506301a0987760e31b600090815260209081527f0d380c36f2a8666f3c5d1c38067efee2829e27fe2865b075864df1ea37b429f65460408051808201909152600681526530303730303160d01b9281019290925260ff166108c55760405162461bcd60e51b815260040161061f9190612e8f565b50600083815260096020908152604091829020548251808401909352600683526530303730303360d01b918301919091526001600160a01b031661091c5760405162461bcd60e51b815260040161061f9190612e8f565b50600083815260106020526040908190208390555183907fda81dc3bdaf65b621535dbd08fc4032c7e22d5ccab12c8aa2ad010611471d62790610960908590612d15565b60405180910390a2505050565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600c83528390205483518085019094529083526530313730303160d01b9183019190915260019190821682146109da5760405162461bcd60e51b815260040161061f9190612e8f565b506001600160a01b0383166000818152600c6020526040808220859055518492917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b60055490565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600c83528390205483518085019094529083526530313730303160d01b8383015290919082168214610a925760405162461bcd60e51b815260040161061f9190612e8f565b506320c5429b60e01b600090815260209081527fa475e1e33e639aa8527a4f5c4f611c4588486a1a8e7684839ad95dc8b4e841a45460408051808201909152600681526530303730303160d01b9281019290925260ff16610b065760405162461bcd60e51b815260040161061f9190612e8f565b50610b1082611b0f565b50600090815260106020526040812055565b610b2d838383611e5c565b505050565b600d6020526000908152604090205460ff1681565b6001600160a01b0382166000908152600760209081526040808320548151808301909252600682526530303630303760d01b92820192909252908310610ba05760405162461bcd60e51b815260040161061f9190612e8f565b506001600160a01b0383166000908152600760205260409020805483908110610bd957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b610b2d83838360405180602001604052806000815250611eaa565b600c6020526000908152604090205481565b600081815260096020908152604091829020548251808401909352600683526530303730303360d01b9183019190915260609182916001600160a01b0316610c745760405162461bcd60e51b815260040161061f9190612e8f565b50600083815260106020908152604091829020549151610c95929101612d15565b60408051601f19818403018152828201909152600682526539b430991a9b60d11b602083015294909350915050565b60055460408051808201909152600681526530303630303760d01b60208201526000918310610d065760405162461bcd60e51b815260040161061f9190612e8f565b5060058281548110610d2857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600e6020526000908152604090205460ff1681565b60038054610d5c90612f34565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890612f34565b8015610dd55780601f10610daa57610100808354040283529160200191610dd5565b820191906000526020600020905b815481529060010190602001808311610db857829003601f168201915b505050505081565b600081815260096020908152604091829020548251808401909352600683526518181b18181960d11b918301919091526001600160a01b03169081610e355760405162461bcd60e51b815260040161061f9190612e8f565b50919050565b60408051808201909152600681526530303630303160d01b60208201526000906001600160a01b038316610e825760405162461bcd60e51b815260040161061f9190612e8f565b50506001600160a01b031660009081526007602052604090205490565b6000610eb18a8a8a8a8a8a8a8a6114cc565b6000818152600e6020908152604091829020548251808401909352600683526530303730303960d01b918301919091529192509060ff1615610f065760405162461bcd60e51b815260040161061f9190612e8f565b50610f1b8a8261041336869003860186612baf565b6040518060400160405280600681526020016530303730303560d01b81525090610f585760405162461bcd60e51b815260040161061f9190612e8f565b506000818152600d6020908152604091829020548251808401909352600683526530303730303760d01b9183019190915260ff1615610faa5760405162461bcd60e51b815260040161061f9190612e8f565b50604080518082019091526006815265060606e6060760d31b602082015242841015610fe95760405162461bcd60e51b815260040161061f9190612e8f565b506000818152600d602090815260408083208054600160ff19918216179091556001600160a01b038e81168552600b84528285208e82168652909352922080549092168a151517909155851661103d573394505b6040516323b872dd60e01b81526001600160a01b038816906323b872dd9061106d908d9089908b90600401612de0565b602060405180830381600087803b15801561108757600080fd5b505af115801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf9190612ada565b50886001600160a01b03168a6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318a6040516111039190612e41565b60405180910390a350505050505050505050565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600c83528390205483518085019094529083526530313730303160d01b918301919091526101009190821682146111855760405162461bcd60e51b815260040161061f9190612e8f565b506111f985858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781529250879150869081908401838280828437600092019190915250611fa292505050565b5050505050565b6000808260600151600281111561122757634e487b7160e01b600052602160045260246000fd5b14156112c9576001836040516020016112409190612d6a565b60405160208183030381529060405280519060200120836040015184600001518560200151604051600081526020016040526040516112829493929190612e4c565b6020604051602081039080840390855afa1580156112a4573d6000803e3d6000fd5b505050602060405103516001600160a01b0316846001600160a01b0316149050611397565b6001826060015160028111156112ef57634e487b7160e01b600052602160045260246000fd5b1415611308576001836040516020016112409190612d9b565b60028260600151600281111561132e57634e487b7160e01b600052602160045260246000fd5b141561136357600183836040015184600001518560200151604051600081526020016040526040516112829493929190612e4c565b604080518082018252600681526518181b98181b60d11b6020820152905162461bcd60e51b815261061f9190600401612e8f565b9392505050565b60606002805461054690612f34565b6309d1187760e41b600090815260209081527fce9a4990a518db4a5651f73127cf155573e9e5e84e0b58e7d17581df388a54e15460408051808201909152600681526530303730303160d01b9281019290925260ff166114205760405162461bcd60e51b815260040161061f9190612e8f565b506000818152600960205260409020546001600160a01b031661144282611b0f565b6001600160a01b03811633148061147c57506001600160a01b0381166000908152600b6020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0dcc0c0d60d21b815250906114b95760405162461bcd60e51b815260040161061f9190612e8f565b5050600090815260106020526040812055565b60003089898989898989896040516020016114ef99989796959493929190612caf565b60405160208183030381529060405280519060200120905098975050505050505050565b336000818152600b602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190611576908590612e41565b60405180910390a35050565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600c83528390205483518085019094529083526530313730303160d01b9183019190915260109190821682146115ef5760405162461bcd60e51b815260040161061f9190612e8f565b506115fa8484611fc9565b506000918252601060205260409091205550565b60125460ff1681565b6111f985858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eaa92505050565b60008082116040518060400160405280600681526020016518189b98181960d11b8152509061169b5760405162461bcd60e51b815260040161061f9190612e8f565b50506001600160a01b03919091166000908152600c602052604090205481161490565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600c835283902054835180850185529182526530313730303160d01b9282019290925290821682146117275760405162461bcd60e51b815260040161061f9190612e8f565b5063bedb86fb60e01b600090815260209081527f7ce77c7e88ab598a61cf35ed6b2db755d687a852164358790f2ba8d2b1dc952d5460408051808201909152600681526530303730303160d01b9281019290925260ff1661179b5760405162461bcd60e51b815260040161061f9190612e8f565b506012805460ff19168315151790556040517fff4a5dbbab6b1963d10f5edd139f33a7987ecb3c4f65969be77ddba28d946594906117da908490612e41565b60405180910390a15050565b60048054610d5c90612f34565b600081815260096020908152604091829020548251808401909352600683526518181b18181960d11b91830191909152606091906001600160a01b031661184d5760405162461bcd60e51b815260040161061f9190612e8f565b50604080516020810190915260008082526003805461186b90612f34565b905011156118dd57600361187e8461215a565b60405160200161188f929190612d45565b60405160208183030381529060405290506000600480546118af90612f34565b905011156118dd578060046040516020016118cb929190612d1e565b60405160208183030381529060405290505b92915050565b600081815260096020908152604091829020548251808401909352600683526530303730303360d01b9183019190915260609182916001600160a01b031661193e5760405162461bcd60e51b815260040161061f9190612e8f565b50600f54604051602001610c959190612d15565b60408051808201909152600681526503030373031360d41b6020820152336001600160a01b038a16146119985760405162461bcd60e51b815260040161061f9190612e8f565b5060006119ab89898989898989896114cc565b6000818152600d6020908152604091829020548251808401909352600683526530303730303760d01b918301919091529192509060ff1615611a005760405162461bcd60e51b815260040161061f9190612e8f565b506000908152600e60205260409020805460ff191660011790555050505050505050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600c83528390205483518085019094529083526530313730303160d01b918301919091526001919082168214611abf5760405162461bcd60e51b815260040161061f9190612e8f565b506001600160a01b0383166000818152600c602052604080822080548619169081905590519092917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b600081815260096020908152604091829020548251808401909352600683526518181b18181960d11b918301919091526001600160a01b03169081611b675760405162461bcd60e51b815260040161061f9190612e8f565b506000828152600a60205260409020546001600160a01b031615611ba2576000828152600a6020526040902080546001600160a01b03191690555b6001600160a01b038116600090815260076020526040902054611bd557634e487b7160e01b600052600160045260246000fd5b6000828152600860209081526040808320546001600160a01b03851684526007909252822054909190611c0a90600190612eda565b90506000828214611cc0576001600160a01b0384166000908152600760205260409020805483908110611c4d57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060076000866001600160a01b03166001600160a01b031681526020019081526020016000208481548110611c9f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526008909152604090208390555b600085815260096020908152604080832080546001600160a01b0319169055600882528083208390556001600160a01b038716835260079091529020805480611d1957634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055600060058054905011611d5257634e487b7160e01b600052600160045260246000fd5b600085815260066020526040902054600554611d7090600190612eda565b925060058381548110611d9357634e487b7160e01b600052603260045260246000fd5b906000526020600020015491508160058281548110611dc257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001556005805480611ded57634e487b7160e01b600052603160045260246000fd5b600082815260208082208301600019908101839055909201909255838252600690526040808220839055878252808220829055518791906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050505050565b60125460408051808201909152600681526518181b98181960d11b60208201529060ff1615611e9e5760405162461bcd60e51b815260040161061f9190612e8f565b50610b2d838383612280565b611ebc836001600160a01b0316612648565b15611f9157604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290611ef5903390899088908890600401612e04565b602060405180830381600087803b158015611f0f57600080fd5b505af1158015611f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f479190612b2a565b6001600160e01b031916146040518060400160405280600681526020016530303630303560d01b81525090611f8f5760405162461bcd60e51b815260040161061f9190612e8f565b505b611f9c848484611e5c565b50505050565b8151611fb590600390602085019061264e565b508051610b2d90600490602084019061264e565b60408051808201909152600681526530303630303160d01b60208201526001600160a01b03831661200d5760405162461bcd60e51b815260040161061f9190612e8f565b50600081815260096020908152604091829020548251808401909352600683526518181b18181b60d11b918301919091526001600160a01b0316156120655760405162461bcd60e51b815260040161061f9190612e8f565b50600081815260096020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526007835290832080546001818101835582865293852001859055925290546120be9190612eda565b6000828152600860205260408120919091556005805460018181018355928290527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018390555461210f9190612eda565b60008281526006602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608161217f57506040805180820190915260018152600360fc1b6020820152610532565b8160005b81156121a9578061219381612f69565b91506121a29050600a83612ec6565b9150612183565b60008167ffffffffffffffff8111156121d257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121fc576020820181803683370190505b508593509050815b831561227757612215600a85612f84565b612220906030612eae565b60f81b8261222d83612f1d565b9250828151811061224e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612270600a85612ec6565b9350612204565b50949350505050565b60408051808201909152600681526530303630303160d01b60208201526001600160a01b0384166122c45760405162461bcd60e51b815260040161061f9190612e8f565b50600081815260096020908152604091829020548251808401909352600683526518181b18181960d11b918301919091526001600160a01b038581169116146123205760405162461bcd60e51b815260040161061f9190612e8f565b5060408051808201909152600681526530303630303160d01b60208201526001600160a01b0383166123655760405162461bcd60e51b815260040161061f9190612e8f565b506001600160a01b03831633148061239357506000818152600a60205260409020546001600160a01b031633145b806123c157506001600160a01b0383166000908152600b6020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0d8c0c0d60d21b815250906123fe5760405162461bcd60e51b815260040161061f9190612e8f565b506000818152600a60205260409020546001600160a01b031615612439576000818152600a6020526040902080546001600160a01b03191690555b6001600160a01b03831660009081526007602052604090205461246c57634e487b7160e01b600052600160045260246000fd5b6000818152600860209081526040808320546001600160a01b038716845260079092528220549091906124a190600190612eda565b9050818114612554576001600160a01b03851660009081526007602052604081208054839081106124e257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060076000886001600160a01b03166001600160a01b03168152602001908152602001600020848154811061253457634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925591825260089052604090208290555b6001600160a01b038516600090815260076020526040902080548061258957634e487b7160e01b600052603160045260246000fd5b60008281526020808220600019908401810183905590920190925584825260098152604080832080546001600160a01b0319166001600160a01b0389169081179091558084526007835290832080546001818101835582865293852001879055925290546125f79190612eda565b60008481526008602052604080822092909255905184916001600160a01b0380881692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050505050565b3b151590565b82805461265a90612f34565b90600052602060002090601f01602090048101928261267c57600085556126c2565b82601f1061269557805160ff19168380011785556126c2565b828001600101855582156126c2579182015b828111156126c25782518255916020019190600101906126a7565b506126ce9291506126d2565b5090565b5b808211156126ce57600081556001016126d3565b80356001600160a01b038116811461053257600080fd5b60008083601f84011261270f578182fd5b50813567ffffffffffffffff811115612726578182fd5b60208301915083602082850101111561273e57600080fd5b9250929050565b80356003811061053257600080fd5b600060808284031215612765578081fd5b6040516080810181811067ffffffffffffffff8211171561279457634e487b7160e01b83526041600452602483fd5b80604052508091508235815260208301356020820152604083013560ff811681146127be57600080fd5b60408201526127cf60608401612745565b60608201525092915050565b6000602082840312156127ec578081fd5b611397826126e7565b60008060408385031215612807578081fd5b612810836126e7565b915061281e602084016126e7565b90509250929050565b600080600080600080600080610100898b031215612843578384fd5b61284c896126e7565b975061285a60208a016126e7565b9650604089013561286a81612fc4565b955061287860608a016126e7565b94506080890135935061288d60a08a016126e7565b925060c0890135915060e089013590509295985092959890939650565b6000806000806000806000806000898b036101808112156128c9578182fd5b6128d28b6126e7565b99506128e060208c016126e7565b985060408b01356128f081612fc4565b97506128fe60608c016126e7565b965060808b0135955061291360a08c016126e7565b945060c08b0135935060e08b01359250608060ff1982011215612934578182fd5b506101008a0190509295985092959850929598565b60008060006060848603121561295d578283fd5b612966846126e7565b9250612974602085016126e7565b9150604084013590509250925092565b60008060008060006080868803121561299b578081fd5b6129a4866126e7565b94506129b2602087016126e7565b935060408601359250606086013567ffffffffffffffff8111156129d4578182fd5b6129e0888289016126fe565b969995985093965092949392505050565b60008060408385031215612a03578081fd5b612a0c836126e7565b91506020830135612a1c81612fc4565b809150509250929050565b600080600060c08486031215612a3b578081fd5b612a44846126e7565b925060208401359150612a5a8560408601612754565b90509250925092565b60008060408385031215612a75578182fd5b612a7e836126e7565b946020939093013593505050565b600080600060608486031215612aa0578081fd5b612aa9846126e7565b95602085013595506040909401359392505050565b600060208284031215612acf578081fd5b813561139781612fc4565b600060208284031215612aeb578081fd5b815161139781612fc4565b600060208284031215612b07578081fd5b5035919050565b600060208284031215612b1f578081fd5b813561139781612fd5565b600060208284031215612b3b578081fd5b815161139781612fd5565b60008060008060408587031215612b5b578182fd5b843567ffffffffffffffff80821115612b72578384fd5b612b7e888389016126fe565b90965094506020870135915080821115612b96578384fd5b50612ba3878288016126fe565b95989497509550505050565b600060808284031215612bc0578081fd5b6113978383612754565b60008060408385031215612bdc578182fd5b50508035926020909101359150565b60008151808452612c03816020860160208601612ef1565b601f01601f19169290920160200192915050565b805460009060028104600180831680612c3157607f831692505b6020808410821415612c5157634e487b7160e01b86526022600452602486fd5b818015612c655760018114612c7657612ca3565b60ff19861689528489019650612ca3565b612c7f88612ea2565b60005b86811015612c9b5781548b820152908501908301612c82565b505084890196505b50505050505092915050565b6bffffffffffffffffffffffff1960609a8b1b81168252988a1b8916601482015296891b8816602888015294151560f81b603c87015292871b8616603d860152605185019190915290941b9092166071820152608581019290925260a582015260c50190565b90815260200190565b60008351612d30818460208801612ef1565b612d3c81840185612c17565b95945050505050565b6000612d518285612c17565b8351612d61818360208801612ef1565b01949350505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b7f19457468657265756d205369676e6564204d6573736167653a0a2000000000008152601b810191909152603b0190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e3790830184612beb565b9695505050505050565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060408252612e7d6040830185612beb565b8281036020840152612d3c8185612beb565b6000602082526113976020830184612beb565b60009081526020902090565b60008219821115612ec157612ec1612f98565b500190565b600082612ed557612ed5612fae565b500490565b600082821015612eec57612eec612f98565b500390565b60005b83811015612f0c578181015183820152602001612ef4565b83811115611f9c5750506000910152565b600081612f2c57612f2c612f98565b506000190190565b600281046001821680612f4857607f821691505b60208210811415610e3557634e487b7160e01b600052602260045260246000fd5b6000600019821415612f7d57612f7d612f98565b5060010190565b600082612f9357612f93612fae565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b8015158114612fd257600080fd5b50565b6001600160e01b031981168114612fd257600080fdfea2646970667358221220e11d014229d86d6811a47ab7d5e418d89e33a8cc4e401cb389cfc914b97f47b164736f6c63430008000033"
      },
      "methodIdentifiers": {
        "addressToAbility(address)": "45a32c86",
        "approve(address,uint256)": "095ea7b3",
        "balanceOf(address)": "70a08231",
        "cancelSetApprovalForAllWithSignature(address,address,bool,address,uint256,address,uint256,uint256)": "ce4e3273",
        "claimCancelled(bytes32)": "59031829",
        "claimPerformed(bytes32)": "23bf3396",
        "create(address,uint256,bytes32)": "b0e329e4",
        "destroy(uint256)": "9d118770",
        "generateClaim(address,address,bool,address,uint256,address,uint256,uint256)": "a0fd4195",
        "getApproved(uint256)": "081812fc",
        "grantAbilities(address,uint256)": "0ab319e8",
        "isAble(address,uint256)": "ba00a330",
        "isApprovedForAll(address,address)": "e985e9c5",
        "isPaused()": "b187bd26",
        "isValidSignature(address,bytes32,(bytes32,bytes32,uint8,uint8))": "8fa76d8d",
        "name()": "06fdde03",
        "ownerOf(uint256)": "6352211e",
        "revoke(uint256)": "20c5429b",
        "revokeAbilities(address,uint256)": "f394b6df",
        "safeTransferFrom(address,address,uint256)": "42842e0e",
        "safeTransferFrom(address,address,uint256,bytes)": "b88d4fde",
        "setAbilities(address,uint256)": "15ec3b8b",
        "setApprovalForAll(address,bool)": "a22cb465",
        "setApprovalForAllWithSignature(address,address,bool,address,uint256,address,uint256,uint256,(bytes32,bytes32,uint8,uint8))": "7f9b45b0",
        "setPause(bool)": "bedb86fb",
        "setUri(string,string)": "89b73ec0",
        "supportsInterface(bytes4)": "01ffc9a7",
        "symbol()": "95d89b41",
        "tokenByIndex(uint256)": "4f6ccce7",
        "tokenOfOwnerByIndex(address,uint256)": "2f745c59",
        "tokenURI(uint256)": "c87b56dd",
        "tokenURIIntegrity(uint256)": "49846680",
        "tokenURISchemaIntegrity(uint256)": "caae188e",
        "totalSupply()": "18160ddd",
        "transferFrom(address,address,uint256)": "23b872dd",
        "updateTokenURIIntegrityDigest(uint256,bytes32)": "0d04c3b8",
        "uriPostfix()": "c298bba5",
        "uriPrefix()": "62b99ad4"
      }
    },
    "metadata": {
      "compiler": {
        "version": "0.8.0+commit.c7dfd78e"
      },
      "language": "Solidity",
      "output": {
        "abi": [
          {
            "inputs": [
              {
                "internalType": "string",
                "name": "_name",
                "type": "string"
              },
              {
                "internalType": "string",
                "name": "_symbol",
                "type": "string"
              },
              {
                "internalType": "string",
                "name": "_uriPrefix",
                "type": "string"
              },
              {
                "internalType": "string",
                "name": "_uriPostfix",
                "type": "string"
              },
              {
                "internalType": "bytes32",
                "name": "_schemaURIIntegrityDigest",
                "type": "bytes32"
              },
              {
                "internalType": "bytes4[]",
                "name": "_capabilities",
                "type": "bytes4[]"
              },
              {
                "internalType": "address[6]",
                "name": "_addresses",
                "type": "address[6]"
              }
            ],
            "stateMutability": "nonpayable",
            "type": "constructor"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "address",
                "name": "_approved",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "Approval",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "address",
                "name": "_operator",
                "type": "address"
              },
              {
                "indexed": false,
                "internalType": "bool",
                "name": "_approved",
                "type": "bool"
              }
            ],
            "name": "ApprovalForAll",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": false,
                "internalType": "bool",
                "name": "isPaused",
                "type": "bool"
              }
            ],
            "name": "IsPaused",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "SetAbilities",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              },
              {
                "indexed": false,
                "internalType": "bytes32",
                "name": "_tokenURIIntegrityDigest",
                "type": "bytes32"
              }
            ],
            "name": "TokenURIIntegrityDigestUpdate",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_from",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "address",
                "name": "_to",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "Transfer",
            "type": "event"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "",
                "type": "address"
              }
            ],
            "name": "addressToAbility",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_approved",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "approve",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              }
            ],
            "name": "balanceOf",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_operator",
                "type": "address"
              },
              {
                "internalType": "bool",
                "name": "_approved",
                "type": "bool"
              },
              {
                "internalType": "address",
                "name": "_feeToken",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_feeValue",
                "type": "uint256"
              },
              {
                "internalType": "address",
                "name": "_feeRecipient",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "_expiration",
                "type": "uint256"
              }
            ],
            "name": "cancelSetApprovalForAllWithSignature",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "bytes32",
                "name": "",
                "type": "bytes32"
              }
            ],
            "name": "claimCancelled",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "bytes32",
                "name": "",
                "type": "bytes32"
              }
            ],
            "name": "claimPerformed",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_to",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_id",
                "type": "uint256"
              },
              {
                "internalType": "bytes32",
                "name": "_tokenURIIntegrityDigest",
                "type": "bytes32"
              }
            ],
            "name": "create",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "destroy",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_operator",
                "type": "address"
              },
              {
                "internalType": "bool",
                "name": "_approved",
                "type": "bool"
              },
              {
                "internalType": "address",
                "name": "_feeToken",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_feeValue",
                "type": "uint256"
              },
              {
                "internalType": "address",
                "name": "_feeRecipient",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "_expiration",
                "type": "uint256"
              }
            ],
            "name": "generateClaim",
            "outputs": [
              {
                "internalType": "bytes32",
                "name": "",
                "type": "bytes32"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "getApproved",
            "outputs": [
              {
                "internalType": "address",
                "name": "",
                "type": "address"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "grantAbilities",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "isAble",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_operator",
                "type": "address"
              }
            ],
            "name": "isApprovedForAll",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "isPaused",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_signer",
                "type": "address"
              },
              {
                "internalType": "bytes32",
                "name": "_claim",
                "type": "bytes32"
              },
              {
                "components": [
                  {
                    "internalType": "bytes32",
                    "name": "r",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "bytes32",
                    "name": "s",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "uint8",
                    "name": "v",
                    "type": "uint8"
                  },
                  {
                    "internalType": "enum XcertToken.SignatureKind",
                    "name": "kind",
                    "type": "uint8"
                  }
                ],
                "internalType": "struct XcertToken.SignatureData",
                "name": "_signature",
                "type": "tuple"
              }
            ],
            "name": "isValidSignature",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "pure",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "name",
            "outputs": [
              {
                "internalType": "string",
                "name": "_name",
                "type": "string"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "ownerOf",
            "outputs": [
              {
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "revoke",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "revokeAbilities",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_from",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_to",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "safeTransferFrom",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_from",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_to",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              },
              {
                "internalType": "bytes",
                "name": "_data",
                "type": "bytes"
              }
            ],
            "name": "safeTransferFrom",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "setAbilities",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_operator",
                "type": "address"
              },
              {
                "internalType": "bool",
                "name": "_approved",
                "type": "bool"
              }
            ],
            "name": "setApprovalForAll",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_operator",
                "type": "address"
              },
              {
                "internalType": "bool",
                "name": "_approved",
                "type": "bool"
              },
              {
                "internalType": "address",
                "name": "_feeToken",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_feeValue",
                "type": "uint256"
              },
              {
                "internalType": "address",
                "name": "_feeRecipient",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "_expiration",
                "type": "uint256"
              },
              {
                "components": [
                  {
                    "internalType": "bytes32",
                    "name": "r",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "bytes32",
                    "name": "s",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "uint8",
                    "name": "v",
                    "type": "uint8"
                  },
                  {
                    "internalType": "enum XcertToken.SignatureKind",
                    "name": "kind",
                    "type": "uint8"
                  }
                ],
                "internalType": "struct XcertToken.SignatureData",
                "name": "_signature",
                "type": "tuple"
              }
            ],
            "name": "setApprovalForAllWithSignature",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "bool",
                "name": "_isPaused",
                "type": "bool"
              }
            ],
            "name": "setPause",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "string",
                "name": "_uriPrefix",
                "type": "string"
              },
              {
                "internalType": "string",
                "name": "_uriPostfix",
                "type": "string"
              }
            ],
            "name": "setUri",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "bytes4",
                "name": "_interfaceID",
                "type": "bytes4"
              }
            ],
            "name": "supportsInterface",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "symbol",
            "outputs": [
              {
                "internalType": "string",
                "name": "_symbol",
                "type": "string"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "_index",
                "type": "uint256"
              }
            ],
            "name": "tokenByIndex",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_index",
                "type": "uint256"
              }
            ],
            "name": "tokenOfOwnerByIndex",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "tokenURI",
            "outputs": [
              {
                "internalType": "string",
                "name": "",
                "type": "string"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "tokenId",
                "type": "uint256"
              }
            ],
            "name": "tokenURIIntegrity",
            "outputs": [
              {
                "internalType": "bytes",
                "name": "digest",
                "type": "bytes"
              },
              {
                "internalType": "string",
                "name": "hashAlgorithm",
                "type": "string"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "tokenId",
                "type": "uint256"
              }
            ],
            "name": "tokenURISchemaIntegrity",
            "outputs": [
              {
                "internalType": "bytes",
                "name": "digest",
                "type": "bytes"
              },
              {
                "internalType": "string",
                "name": "hashAlgorithm",
                "type": "string"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "totalSupply",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_from",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_to",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              }
            ],
            "name": "transferFrom",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "_tokenId",
                "type": "uint256"
              },
              {
                "internalType": "bytes32",
                "name": "_tokenURIIntegrityDigest",
                "type": "bytes32"
              }
            ],
            "name": "updateTokenURIIntegrityDigest",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "uriPostfix",
            "outputs": [
              {
                "internalType": "string",
                "name": "",
                "type": "string"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "uriPrefix",
            "outputs": [
              {
                "internalType": "string",
                "name": "",
                "type": "string"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          }
        ],
        "devdoc": {
          "details": "This is an implementation of the Xcert smart contract.",
          "kind": "dev",
          "methods": {
            "approve(address,uint256)": {
              "details": "Set or reaffirm the approved address for an NFT.",
              "params": {
                "_approved": "Address to be approved for the given NFT ID.",
                "_tokenId": "ID of the token to be approved."
              }
            },
            "balanceOf(address)": {
              "details": "Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are considered invalid, and this function throws for queries about the zero address.",
              "params": {
                "_owner": "Address for whom to query the balance."
              },
              "returns": {
                "_0": "Balance of _owner."
              }
            },
            "cancelSetApprovalForAllWithSignature(address,address,bool,address,uint256,address,uint256,uint256)": {
              "details": "Enables or disables approval for a third party (\"operator\") to manage all of `msg.sender`'s assets. It also emits the ApprovalForAll event.",
              "params": {
                "_approved": "True if the operator is approved, false to revoke approval.",
                "_expiration": "Timestamp of when the claim expires.",
                "_feeRecipient": "Address of the fee recipient. If set to zero address the msg.sender will automatically become the fee recipient.",
                "_feeToken": "The token then will be tranferred to the fee recipient of this method.",
                "_feeValue": "The amount of token then will be tranfered to the fee recipient of this method.",
                "_operator": "Address to add to the set of authorized operators.",
                "_owner": "Address to the owner who is approving.",
                "_seed": "Arbitrary number to facilitate uniqueness of the order's hash. Usually timestamp."
              }
            },
            "constructor": {
              "details": "Contract constructor.",
              "params": {
                "_addresses": "Array of addresses which need to be in following order: owner, xcertCreateProxy, xcertUpdateProxy, abilitableManageProxy, nftSafeTransferProxy, xcertBurnProxy.",
                "_capabilities": "Array of bytes4 representing supported interfaces which activate the corresponding capabilities.",
                "_name": "A descriptive name for a collection of NFTs.",
                "_schemaURIIntegrityDigest": "A bytes32 of keccak256 of json schema representing 0xcert Protocol convention.",
                "_symbol": "An abbreviated name for NFT.",
                "_uriPostfix": "Postfix of URI for token metadata URIs.",
                "_uriPrefix": "Prefix of URI for token metadata URIs."
              }
            },
            "create(address,uint256,bytes32)": {
              "details": "Creates a new Xcert.",
              "params": {
                "_id": "The Xcert to be created by the msg.sender.",
                "_to": "The address that will own the created Xcert.",
                "_tokenURIIntegrityDigest": "Cryptographic asset uri integrity digest."
              }
            },
            "destroy(uint256)": {
              "details": "Destroys a specified Xcert. Reverts if not called from Xcert owner or operator.",
              "params": {
                "_tokenId": "Id of the Xcert we want to destroy."
              }
            },
            "generateClaim(address,address,bool,address,uint256,address,uint256,uint256)": {
              "details": "Generates hash of the set approval for.",
              "params": {
                "_approved": "True if the operator is approved, false to revoke approval.",
                "_expiration": "Timestamp of when the claim expires.",
                "_feeRecipient": "Address of the fee recipient.",
                "_feeToken": "The token then will be tranferred to the fee recipient of this method.",
                "_feeValue": "The amount of token then will be tranfered to the fee recipient of this method.",
                "_operator": "Address to add to the set of authorized operators.",
                "_owner": "Address to the owner who is approving.",
                "_seed": "Arbitrary number to facilitate uniqueness of the order's hash. Usually, timestamp."
              }
            },
            "getApproved(uint256)": {
              "details": "Get the approved address for a single NFT.",
              "params": {
                "_tokenId": "ID of the NFT to query the approval of."
              },
              "returns": {
                "_0": "Address that _tokenId is approved for."
              }
            },
            "grantAbilities(address,uint256)": {
              "details": "Grants specific abilities to specified address.",
              "params": {
                "_abilities": "Number representing bitfield of abilities we are granting.",
                "_target": "Address to grant abilities to."
              }
            },
            "isAble(address,uint256)": {
              "details": "Check if an address has a specific ability. Throws if checking for 0.",
              "params": {
                "_abilities": "Number representing bitfield of abilities we are checking.",
                "_target": "Address for which we want to check if it has a specific abilities."
              }
            },
            "isApprovedForAll(address,address)": {
              "details": "Checks if `_operator` is an approved operator for `_owner`.",
              "params": {
                "_operator": "The address that acts on behalf of the owner.",
                "_owner": "The address that owns the NFTs."
              },
              "returns": {
                "_0": "True if approved for all, false otherwise."
              }
            },
            "isValidSignature(address,bytes32,(bytes32,bytes32,uint8,uint8))": {
              "details": "Verifies if claim signature is valid.",
              "params": {
                "_claim": "Signed Keccak-256 hash.",
                "_signature": "Signature data.",
                "_signer": "address of signer."
              }
            },
            "name()": {
              "details": "Returns a descriptive name for a collection of NFTs.",
              "returns": {
                "_name": "Representing name."
              }
            },
            "ownerOf(uint256)": {
              "details": "Returns the address of the owner of the NFT. NFTs assigned to zero address are considered invalid, and queries about them do throw.",
              "params": {
                "_tokenId": "The identifier for an NFT."
              },
              "returns": {
                "_owner": "Address of _tokenId owner."
              }
            },
            "revoke(uint256)": {
              "details": "Revokes(destroys) a specified Xcert. Reverts if not called from contract owner or authorized address.",
              "params": {
                "_tokenId": "Id of the Xcert we want to destroy."
              }
            },
            "revokeAbilities(address,uint256)": {
              "details": "Unassigns specific abilities from specified address.",
              "params": {
                "_abilities": "Number representing bitfield of abilities we are revoking.",
                "_target": "Address of which we revoke abilites."
              }
            },
            "safeTransferFrom(address,address,uint256)": {
              "details": "Transfers the ownership of an NFT from one address to another address.",
              "params": {
                "_from": "The current owner of the NFT.",
                "_to": "The new owner.",
                "_tokenId": "The NFT to transfer."
              }
            },
            "safeTransferFrom(address,address,uint256,bytes)": {
              "details": "Transfers the ownership of an NFT from one address to another address.",
              "params": {
                "_data": "Additional data with no specified format, sent in call to `_to`.",
                "_from": "The current owner of the NFT.",
                "_to": "The new owner.",
                "_tokenId": "The NFT to transfer."
              }
            },
            "setAbilities(address,uint256)": {
              "details": "Sets specific abilities to specified address.",
              "params": {
                "_abilities": "Number representing bitfield of abilities we are setting.",
                "_target": "Address to which we are setting abilitites."
              }
            },
            "setApprovalForAll(address,bool)": {
              "details": "Enables or disables approval for a third party (\"operator\") to manage all of `msg.sender`'s assets. It also emits the ApprovalForAll event.",
              "params": {
                "_approved": "True if the operator is approved, false to revoke approval.",
                "_operator": "Address to add to the set of authorized operators."
              }
            },
            "setApprovalForAllWithSignature(address,address,bool,address,uint256,address,uint256,uint256,(bytes32,bytes32,uint8,uint8))": {
              "details": "Enables or disables approval for a third party (\"operator\") to manage all of `msg.sender`'s assets. It also emits the ApprovalForAll event.",
              "params": {
                "_approved": "True if the operator is approved, false to revoke approval.",
                "_expiration": "Timestamp of when the claim expires.",
                "_feeRecipient": "Address of the fee recipient. If set to zero address the msg.sender will automatically become the fee recipient.",
                "_feeToken": "The token then will be tranferred to the fee recipient of this method.",
                "_feeValue": "The amount of token then will be tranfered to the fee recipient of this method.",
                "_operator": "Address to add to the set of authorized operators.",
                "_owner": "Address to the owner who is approving.",
                "_seed": "Arbitrary number to facilitate uniqueness of the order's hash. Usually timestamp.",
                "_signature": "Data from the signature."
              }
            },
            "setPause(bool)": {
              "details": "Sets if Xcerts transfers are paused (can be performed) or not.",
              "params": {
                "_isPaused": "Pause status."
              }
            },
            "setUri(string,string)": {
              "details": "Change URI.",
              "params": {
                "_uriPostfix": "New URI postfix.",
                "_uriPrefix": "New URI prefix."
              }
            },
            "supportsInterface(bytes4)": {
              "details": "Function to check which interfaces are supported by this contract.",
              "params": {
                "_interfaceID": "Id of the interface."
              }
            },
            "symbol()": {
              "details": "Returns an abbreviated name for NFTs.",
              "returns": {
                "_symbol": "Representing symbol."
              }
            },
            "tokenByIndex(uint256)": {
              "details": "Returns NFT ID by its index.",
              "params": {
                "_index": "A counter less than `totalSupply()`."
              },
              "returns": {
                "_0": "Token id."
              }
            },
            "tokenOfOwnerByIndex(address,uint256)": {
              "details": "returns the n-th NFT ID from a list of owner's tokens.",
              "params": {
                "_index": "Index number representing n-th token in owner's list of tokens.",
                "_owner": "Token owner's address."
              },
              "returns": {
                "_0": "Token id."
              }
            },
            "tokenURI(uint256)": {
              "details": "Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC 3986. The URI may point to a JSON file that conforms to the \"ERC721 Metadata JSON Schema\".",
              "params": {
                "_tokenId": "Id for which we want URI."
              },
              "returns": {
                "_0": "URI of _tokenId."
              }
            },
            "tokenURIIntegrity(uint256)": {
              "details": "Returns digest for Xcert.",
              "params": {
                "tokenId": "Id of the Xcert."
              },
              "returns": {
                "digest": "Bytes returned from the hash algorithm or \"\" if there is no schema",
                "hashAlgorithm": "The name of the cryptographic hash algorithm or \"\" if there is no schema"
              }
            },
            "tokenURISchemaIntegrity(uint256)": {
              "details": "Returns a bytes32 of sha256 of json schema representing 0xcert Protocol convention per token.",
              "params": {
                "tokenId": "Id of the Xcert."
              },
              "returns": {
                "digest": "Bytes returned from the hash algorithm",
                "hashAlgorithm": "The name of the cryptographic hash algorithm"
              }
            },
            "totalSupply()": {
              "details": "Returns the count of all existing NFTs.",
              "returns": {
                "_0": "Total supply of NFTs."
              }
            },
            "transferFrom(address,address,uint256)": {
              "details": "Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero address. Throws if `_tokenId` is not a valid NFT.",
              "params": {
                "_from": "The current owner of the NFT.",
                "_to": "The new owner.",
                "_tokenId": "The NFT to transfer."
              }
            },
            "updateTokenURIIntegrityDigest(uint256,bytes32)": {
              "details": "Updates Xcert integrity digest.",
              "params": {
                "_tokenId": "Id of the Xcert.",
                "_tokenURIIntegrityDigest": "New tokenURIIntegrityDigest."
              }
            }
          },
          "stateVariables": {
            "ABILITY_NONE": {
              "details": "Constant presenting all and none currently available Xcert abilities."
            }
          },
          "version": 1
        },
        "userdoc": {
          "kind": "user",
          "methods": {
            "approve(address,uint256)": {
              "notice": "The zero address indicates there is no approved address. Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner."
            },
            "cancelSetApprovalForAllWithSignature(address,address,bool,address,uint256,address,uint256,uint256)": {
              "notice": "This works even if sender doesn't own any tokens at the time."
            },
            "getApproved(uint256)": {
              "notice": "Throws if `_tokenId` is not a valid NFT."
            },
            "safeTransferFrom(address,address,uint256)": {
              "notice": "This works identically to the other function with an extra data parameter, except this function just sets data to \"\"."
            },
            "safeTransferFrom(address,address,uint256,bytes)": {
              "notice": "Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this function checks if `_to` is a smart contract (code size > 0). If so, it calls `onERC721Received` on `_to` and throws if the return value is not `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`."
            },
            "setApprovalForAll(address,bool)": {
              "notice": "This works even if sender doesn't own any tokens at the time."
            },
            "setApprovalForAllWithSignature(address,address,bool,address,uint256,address,uint256,uint256,(bytes32,bytes32,uint8,uint8))": {
              "notice": "This works even if sender doesn't own any tokens at the time."
            },
            "tokenURI(uint256)": {
              "notice": "A distinct Uniform Resource Identifier (URI) for a given asset."
            },
            "transferFrom(address,address,uint256)": {
              "notice": "The caller is responsible to confirm that `_to` is capable of receiving NFTs or else they may be permanently lost."
            }
          },
          "version": 1
        }
      },
      "settings": {
        "compilationTarget": {
          "./src/contracts/xcert-custom.sol": "XcertCustom"
        },
        "evmVersion": "istanbul",
        "libraries": {},
        "metadata": {
          "bytecodeHash": "ipfs"
        },
        "optimizer": {
          "enabled": true,
          "runs": 200
        },
        "remappings": []
      },
      "sources": {
        "./src/contracts/xcert-custom.sol": {
          "keccak256": "0x6591bf9da70f8c1851830f057aba3b2ba9f0ec568ca67e7b2f5500d1ec704d45",
          "license": "MIT",
          "urls": [
            "bzz-raw://ec973554986143181390c92569bd1b5c994222f4148448e851fef27aaee8b71e",
            "dweb:/ipfs/QmZhW2GLtArrgb24X5hyfsnbHgGCK2c6ts9keEzbWVMstZ"
          ]
        }
      },
      "version": 1
    }
  }
}