[
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "trustedForwarder_",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "accessControl_",
        "type": "address"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "addr",
        "type": "address"
      }
    ],
    "name": "EasyAccessControl_DoesNotHaveTransferAdminRole",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferRules_BadRestrictionCode",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferRules_InvalidAccessControl",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferRules_InvalidArrayLengths",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferRules_InvalidTokenType",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferRules_InvalidTrustedForwarder",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferRules_LockDurationTooLarge",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferRules_RecipientNotAmlKycPassed",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferRules_TokenTypeRuleNotFound",
    "type": "error"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "requiresAmlKyc",
        "type": "bool"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "isActive",
        "type": "bool"
      }
    ],
    "name": "DefaultTokenTypeRuleSet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "region",
        "type": "uint256"
      },
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "accreditation",
        "type": "uint256"
      }
    ],
    "name": "TokenTypeRuleRemoved",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "region",
        "type": "uint256"
      },
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "accreditation",
        "type": "uint256"
      },
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "requiresAmlKyc",
        "type": "bool"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "isActive",
        "type": "bool"
      }
    ],
    "name": "TokenTypeRuleSet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "recipientRegion",
        "type": "uint256"
      },
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "recipientAccreditation",
        "type": "uint256"
      }
    ],
    "name": "TransferRuleRemoved",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "recipientRegion",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "recipientAccreditation",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "lockDurationSeconds",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "requiresAmlKyc",
        "type": "bool"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "isActive",
        "type": "bool"
      }
    ],
    "name": "TransferRuleSet",
    "type": "event"
  },
  {
    "inputs": [],
    "name": "ALL_TRANSFERS_PAUSED",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "DO_NOT_SEND_TO_EMPTY_ADDRESS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "DO_NOT_SEND_TO_TOKEN_CONTRACT",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "GREATER_THAN_RECIPIENT_MAX_BALANCE",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "HOLDING_PERIOD_NOT_MET",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "INSUFFICIENT_BALANCE_OF_SENDER",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "INTERFACE_ID",
    "outputs": [
      {
        "internalType": "bytes4",
        "name": "",
        "type": "bytes4"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "LOWER_THAN_RECIPIENT_MIN_BALANCE",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "MAX_LOCK_DURATION",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "MAX_RESTRICTION_CODE",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "NEVER_UNLOCKS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "NO_RULE_FOR_RECIPIENT",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "RECIPIENT_ADDRESS_FROZEN",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "RECIPIENT_NOT_AMLKYCPASSED",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "RECIPIENT_NOT_QUALIFIED",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "SENDER_ADDRESS_FROZEN",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "SENDER_NOT_AMLKYCPASSED",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "SENDER_TOKENS_TIME_LOCKED",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "SUCCESS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "TOKEN_TYPE_GENERIC",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "accessControl",
    "outputs": [
      {
        "internalType": "contract IAccessControl",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256[]",
        "name": "regions",
        "type": "uint256[]"
      },
      {
        "internalType": "uint256[]",
        "name": "accreditations",
        "type": "uint256[]"
      },
      {
        "internalType": "uint256[]",
        "name": "tokenTypes",
        "type": "uint256[]"
      },
      {
        "internalType": "bool[]",
        "name": "requiresAmlKycFlags",
        "type": "bool[]"
      },
      {
        "internalType": "bool[]",
        "name": "isActiveFlags",
        "type": "bool[]"
      }
    ],
    "name": "batchSetTokenTypeRules",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256[]",
        "name": "tokenType",
        "type": "uint256[]"
      },
      {
        "internalType": "uint256[]",
        "name": "recipientRegion",
        "type": "uint256[]"
      },
      {
        "internalType": "uint256[]",
        "name": "recipientAccreditation",
        "type": "uint256[]"
      },
      {
        "components": [
          {
            "internalType": "uint256",
            "name": "lockDurationSeconds",
            "type": "uint256"
          },
          {
            "internalType": "bool",
            "name": "requiresAmlKyc",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isActive",
            "type": "bool"
          }
        ],
        "internalType": "struct ITransferRules.TransferRule[]",
        "name": "rules",
        "type": "tuple[]"
      }
    ],
    "name": "batchSetTransferRules",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "restrictionCode",
        "type": "uint256"
      }
    ],
    "name": "checkSuccess",
    "outputs": [
      {
        "internalType": "bool",
        "name": "isSuccess",
        "type": "bool"
      }
    ],
    "stateMutability": "pure",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "defaultTokenTypeRule",
    "outputs": [
      {
        "components": [
          {
            "internalType": "uint256",
            "name": "tokenType",
            "type": "uint256"
          },
          {
            "internalType": "bool",
            "name": "requiresAmlKyc",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isActive",
            "type": "bool"
          }
        ],
        "internalType": "struct ITransferRules.TokenTypeRule",
        "name": "",
        "type": "tuple"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "tokenAddr",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "detectTransferRestriction",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "tokenAddr",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "detectTransferRestrictionBasic",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "mintTimestamp",
        "type": "uint256"
      },
      {
        "components": [
          {
            "internalType": "uint256[]",
            "name": "regions",
            "type": "uint256[]"
          },
          {
            "internalType": "uint256",
            "name": "accreditationType",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "lastAmlKycChangeTimestamp",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "lastAccreditationChangeTimestamp",
            "type": "uint256"
          },
          {
            "internalType": "bool",
            "name": "amlKycPassed",
            "type": "bool"
          }
        ],
        "internalType": "struct IIdentityRegistry.IdentityInfo",
        "name": "recipientIdentity",
        "type": "tuple"
      },
      {
        "internalType": "bool",
        "name": "isAmlKycPassed",
        "type": "bool"
      }
    ],
    "name": "detectTransferRestrictionForHolding",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "restrictionCode",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "wallet",
        "type": "address"
      },
      {
        "internalType": "contract IIdentityRegistry",
        "name": "identityRegistry",
        "type": "address"
      }
    ],
    "name": "determineTokenType",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "components": [
          {
            "internalType": "uint256[]",
            "name": "regions",
            "type": "uint256[]"
          },
          {
            "internalType": "uint256",
            "name": "accreditationType",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "lastAmlKycChangeTimestamp",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "lastAccreditationChangeTimestamp",
            "type": "uint256"
          },
          {
            "internalType": "bool",
            "name": "amlKycPassed",
            "type": "bool"
          }
        ],
        "internalType": "struct IIdentityRegistry.IdentityInfo",
        "name": "recipientIdentity",
        "type": "tuple"
      },
      {
        "internalType": "bool",
        "name": "isAmlKycPassed",
        "type": "bool"
      }
    ],
    "name": "eligibilityThresholdFor",
    "outputs": [
      {
        "internalType": "bool",
        "name": "allowed",
        "type": "bool"
      },
      {
        "internalType": "uint256",
        "name": "maxEligibleMintTimestamp",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "failureCode",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "region",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "accreditation",
        "type": "uint256"
      }
    ],
    "name": "getTokenTypeRule",
    "outputs": [
      {
        "components": [
          {
            "internalType": "uint256",
            "name": "tokenType",
            "type": "uint256"
          },
          {
            "internalType": "bool",
            "name": "requiresAmlKyc",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isActive",
            "type": "bool"
          }
        ],
        "internalType": "struct ITransferRules.TokenTypeRule",
        "name": "",
        "type": "tuple"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "mintTimestamp",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "recipient",
        "type": "address"
      },
      {
        "internalType": "contract IIdentityRegistry",
        "name": "identityRegistry",
        "type": "address"
      }
    ],
    "name": "getUnlockTimestamp",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "unlockTimestamp",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "forwarder",
        "type": "address"
      }
    ],
    "name": "isTrustedForwarder",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "restrictionCode",
        "type": "uint256"
      }
    ],
    "name": "messageForTransferRestriction",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "region",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "accreditation",
        "type": "uint256"
      }
    ],
    "name": "removeTokenTypeRule",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "recipientRegion",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "recipientAccreditation",
        "type": "uint256"
      }
    ],
    "name": "removeTransferRule",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "resetDefaultTokenTypeRule",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "internalType": "bool",
        "name": "requiresAmlKyc",
        "type": "bool"
      },
      {
        "internalType": "bool",
        "name": "isActive",
        "type": "bool"
      }
    ],
    "name": "setDefaultTokenTypeRule",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "region",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "accreditation",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "internalType": "bool",
        "name": "requiresAmlKyc",
        "type": "bool"
      },
      {
        "internalType": "bool",
        "name": "isActive",
        "type": "bool"
      }
    ],
    "name": "setTokenTypeRule",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "recipientRegion",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "recipientAccreditation",
        "type": "uint256"
      },
      {
        "components": [
          {
            "internalType": "uint256",
            "name": "lockDurationSeconds",
            "type": "uint256"
          },
          {
            "internalType": "bool",
            "name": "requiresAmlKyc",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isActive",
            "type": "bool"
          }
        ],
        "internalType": "struct ITransferRules.TransferRule",
        "name": "_rule",
        "type": "tuple"
      }
    ],
    "name": "setTransferRule",
    "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": [
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "wallet",
        "type": "address"
      },
      {
        "internalType": "contract IIdentityRegistry",
        "name": "identityRegistry",
        "type": "address"
      }
    ],
    "name": "tokenTypeAllowed",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenType",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "recipientRegion",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "recipientAccreditation",
        "type": "uint256"
      }
    ],
    "name": "transferRuleFor",
    "outputs": [
      {
        "components": [
          {
            "internalType": "uint256",
            "name": "lockDurationSeconds",
            "type": "uint256"
          },
          {
            "internalType": "bool",
            "name": "requiresAmlKyc",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isActive",
            "type": "bool"
          }
        ],
        "internalType": "struct ITransferRules.TransferRule",
        "name": "rule",
        "type": "tuple"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "trustedForwarder",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  }
]
