// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

struct SismoConnectRequest {
  bytes16 namespace;
  AuthRequest[] auths;
  ClaimRequest[] claims;
  SignatureRequest signature;
}

struct SismoConnectConfig {
  bytes16 appId;
  VaultConfig vault;
}

struct VaultConfig {
  bool isImpersonationMode;
}

struct AuthRequest {
  AuthType authType;
  uint256 userId; // default: 0
  // flags
  bool isAnon; // default: false -> true not supported yet, need to throw if true
  bool isOptional; // default: false
  bool isSelectableByUser; // default: true
  //
  bytes extraData; // default: ""
}

struct ClaimRequest {
  ClaimType claimType; // default: GTE
  bytes16 groupId;
  bytes16 groupTimestamp; // default: bytes16("latest")
  uint256 value; // default: 1
  // flags
  bool isOptional; // default: false
  bool isSelectableByUser; // default: true
  //
  bytes extraData; // default: ""
}

struct SignatureRequest {
  bytes message; // default: "MESSAGE_SELECTED_BY_USER"
  bool isSelectableByUser; // default: false
  bytes extraData; // default: ""
}

enum AuthType {
  VAULT,
  GITHUB,
  TWITTER,
  EVM_ACCOUNT,
  TELEGRAM,
  DISCORD
}

enum ClaimType {
  GTE,
  GT,
  EQ,
  LT,
  LTE
}

struct Auth {
  AuthType authType;
  bool isAnon;
  bool isSelectableByUser;
  uint256 userId;
  bytes extraData;
}

struct Claim {
  ClaimType claimType;
  bytes16 groupId;
  bytes16 groupTimestamp;
  bool isSelectableByUser;
  uint256 value;
  bytes extraData;
}

struct Signature {
  bytes message;
  bytes extraData;
}

struct SismoConnectResponse {
  bytes16 appId;
  bytes16 namespace;
  bytes32 version;
  bytes signedMessage;
  SismoConnectProof[] proofs;
}

struct SismoConnectProof {
  Auth[] auths;
  Claim[] claims;
  bytes32 provingScheme;
  bytes proofData;
  bytes extraData;
}

struct SismoConnectVerifiedResult {
  bytes16 appId;
  bytes16 namespace;
  bytes32 version;
  VerifiedAuth[] auths;
  VerifiedClaim[] claims;
  bytes signedMessage;
}

struct VerifiedAuth {
  AuthType authType;
  bool isAnon;
  uint256 userId;
  bytes extraData;
  bytes proofData;
}

struct VerifiedClaim {
  ClaimType claimType;
  bytes16 groupId;
  bytes16 groupTimestamp;
  uint256 value;
  bytes extraData;
  uint256 proofId;
  bytes proofData;
}
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"bytes16","name":"appId_","type":"bytes16"},{"internalType":"bool","name":"isImpersonationMode_","type":"bool"},{"components":[{"internalType":"enum AuthType","name":"authType","type":"uint8"},{"internalType":"uint256","name":"userId","type":"uint256"},{"internalType":"bool","name":"isAnon","type":"bool"},{"internalType":"bool","name":"isOptional","type":"bool"},{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct AuthRequest[]","name":"authRequests_","type":"tuple[]"},{"components":[{"internalType":"enum ClaimType","name":"claimType","type":"uint8"},{"internalType":"bytes16","name":"groupId","type":"bytes16"},{"internalType":"bytes16","name":"groupTimestamp","type":"bytes16"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"isOptional","type":"bool"},{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct ClaimRequest[]","name":"claimRequests_","type":"tuple[]"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"bool","name":"isTransferable_","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"enum AuthType","name":"authType","type":"uint8"}],"name":"AuthTypeNotFoundInVerifiedResult","type":"error"},{"inputs":[],"name":"ERC721NonTransferable","type":"error"},{"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":"string","name":"baseTokenURI","type":"string"}],"name":"BaseTokenURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[],"name":"ADDRESSES_PROVIDER_V2","outputs":[{"internalType":"contract IAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"APP_ID","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_IMPERSONATION_MODE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_TRANSFERABLE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SISMO_CONNECT_LIB_VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","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":"bool","name":"isSelectableByUser","type":"bool"}],"name":"buildSignature","outputs":[{"components":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct SignatureRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"buildSignature","outputs":[{"components":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct SignatureRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"buildSignature","outputs":[{"components":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct SignatureRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"buildSignature","outputs":[{"components":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct SignatureRequest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"responseBytes","type":"bytes"},{"internalType":"address","name":"to","type":"address"}],"name":"claimWithSismoConnect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"config","outputs":[{"components":[{"internalType":"bytes16","name":"appId","type":"bytes16"},{"components":[{"internalType":"bool","name":"isImpersonationMode","type":"bool"}],"internalType":"struct VaultConfig","name":"vault","type":"tuple"}],"internalType":"struct SismoConnectConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRequests","outputs":[{"components":[{"components":[{"internalType":"enum AuthType","name":"authType","type":"uint8"},{"internalType":"uint256","name":"userId","type":"uint256"},{"internalType":"bool","name":"isAnon","type":"bool"},{"internalType":"bool","name":"isOptional","type":"bool"},{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct AuthRequest[]","name":"auths","type":"tuple[]"},{"components":[{"internalType":"enum ClaimType","name":"claimType","type":"uint8"},{"internalType":"bytes16","name":"groupId","type":"bytes16"},{"internalType":"bytes16","name":"groupTimestamp","type":"bytes16"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"isOptional","type":"bool"},{"internalType":"bool","name":"isSelectableByUser","type":"bool"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct ClaimRequest[]","name":"claims","type":"tuple[]"}],"internalType":"struct ZKDrop.Requests","name":"","type":"tuple"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseTokenUri","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":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]