{
  "abi": [
    {
      "type": "function",
      "name": "CAMPAIGN_START_TIME",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint40", "internalType": "uint40" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "CLAIM_TYPE",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint8", "internalType": "enum ClaimType" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "COMPTROLLER",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "EXPIRATION",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint40", "internalType": "uint40" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "IS_SABLIER_MERKLE",
      "inputs": [],
      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "MERKLE_ROOT",
      "inputs": [],
      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "TOKEN",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "contract IERC20" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "admin",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "attestor",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "calculateMinFeeWei",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "campaignName",
      "inputs": [],
      "outputs": [{ "name": "", "type": "string", "internalType": "string" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "claim",
      "inputs": [
        { "name": "index", "type": "uint256", "internalType": "uint256" },
        { "name": "recipient", "type": "address", "internalType": "address" },
        { "name": "amount", "type": "uint128", "internalType": "uint128" },
        { "name": "merkleProof", "type": "bytes32[]", "internalType": "bytes32[]" }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "claimTo",
      "inputs": [
        { "name": "index", "type": "uint256", "internalType": "uint256" },
        { "name": "to", "type": "address", "internalType": "address" },
        { "name": "amount", "type": "uint128", "internalType": "uint128" },
        { "name": "merkleProof", "type": "bytes32[]", "internalType": "bytes32[]" }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "claimViaAttestation",
      "inputs": [
        { "name": "index", "type": "uint256", "internalType": "uint256" },
        { "name": "to", "type": "address", "internalType": "address" },
        { "name": "amount", "type": "uint128", "internalType": "uint128" },
        { "name": "expireAt", "type": "uint40", "internalType": "uint40" },
        { "name": "merkleProof", "type": "bytes32[]", "internalType": "bytes32[]" },
        { "name": "attestation", "type": "bytes", "internalType": "bytes" }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "claimViaSig",
      "inputs": [
        { "name": "index", "type": "uint256", "internalType": "uint256" },
        { "name": "recipient", "type": "address", "internalType": "address" },
        { "name": "to", "type": "address", "internalType": "address" },
        { "name": "amount", "type": "uint128", "internalType": "uint128" },
        { "name": "validFrom", "type": "uint40", "internalType": "uint40" },
        { "name": "merkleProof", "type": "bytes32[]", "internalType": "bytes32[]" },
        { "name": "signature", "type": "bytes", "internalType": "bytes" }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "clawback",
      "inputs": [
        { "name": "to", "type": "address", "internalType": "address" },
        { "name": "amount", "type": "uint128", "internalType": "uint128" }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "domainSeparator",
      "inputs": [],
      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "firstClaimTime",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint40", "internalType": "uint40" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "hasClaimed",
      "inputs": [{ "name": "index", "type": "uint256", "internalType": "uint256" }],
      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "hasExpired",
      "inputs": [],
      "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "ipfsCID",
      "inputs": [],
      "outputs": [{ "name": "", "type": "string", "internalType": "string" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "lowerMinFeeUSD",
      "inputs": [{ "name": "newMinFeeUSD", "type": "uint256", "internalType": "uint256" }],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "minFeeUSD",
      "inputs": [],
      "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "setAttestor",
      "inputs": [{ "name": "newAttestor", "type": "address", "internalType": "address" }],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "sponsor",
      "inputs": [
        { "name": "token", "type": "address", "internalType": "contract IERC20" },
        { "name": "amount", "type": "uint128", "internalType": "uint128" },
        { "name": "biller", "type": "address", "internalType": "address" }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "transferAdmin",
      "inputs": [{ "name": "newAdmin", "type": "address", "internalType": "address" }],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "event",
      "name": "ClaimInstant",
      "inputs": [
        { "name": "index", "type": "uint256", "indexed": false, "internalType": "uint256" },
        { "name": "recipient", "type": "address", "indexed": true, "internalType": "address" },
        { "name": "amount", "type": "uint128", "indexed": false, "internalType": "uint128" },
        { "name": "to", "type": "address", "indexed": false, "internalType": "address" },
        { "name": "viaSig", "type": "bool", "indexed": false, "internalType": "bool" }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "Clawback",
      "inputs": [
        { "name": "admin", "type": "address", "indexed": true, "internalType": "address" },
        { "name": "to", "type": "address", "indexed": true, "internalType": "address" },
        { "name": "amount", "type": "uint128", "indexed": false, "internalType": "uint128" }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "LowerMinFeeUSD",
      "inputs": [
        { "name": "comptroller", "type": "address", "indexed": true, "internalType": "address" },
        { "name": "newMinFeeUSD", "type": "uint256", "indexed": false, "internalType": "uint256" },
        { "name": "previousMinFeeUSD", "type": "uint256", "indexed": false, "internalType": "uint256" }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "SetAttestor",
      "inputs": [
        { "name": "caller", "type": "address", "indexed": true, "internalType": "address" },
        { "name": "previousAttestor", "type": "address", "indexed": true, "internalType": "address" },
        { "name": "newAttestor", "type": "address", "indexed": true, "internalType": "address" }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "Sponsor",
      "inputs": [
        { "name": "caller", "type": "address", "indexed": true, "internalType": "address" },
        { "name": "token", "type": "address", "indexed": true, "internalType": "contract IERC20" },
        { "name": "amount", "type": "uint128", "indexed": false, "internalType": "uint128" },
        { "name": "biller", "type": "address", "indexed": true, "internalType": "address" }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "TransferAdmin",
      "inputs": [
        { "name": "oldAdmin", "type": "address", "indexed": true, "internalType": "address" },
        { "name": "newAdmin", "type": "address", "indexed": true, "internalType": "address" }
      ],
      "anonymous": false
    }
  ],
  "bytecode": { "object": "0x", "sourceMap": "", "linkReferences": {} },
  "deployedBytecode": { "object": "0x", "sourceMap": "", "linkReferences": {} },
  "methodIdentifiers": {
    "CAMPAIGN_START_TIME()": "7ca3944d",
    "CLAIM_TYPE()": "eb8cd775",
    "COMPTROLLER()": "5f82c67e",
    "EXPIRATION()": "bb4b5734",
    "IS_SABLIER_MERKLE()": "7423649b",
    "MERKLE_ROOT()": "51e75e8b",
    "TOKEN()": "82bfefc8",
    "admin()": "f851a440",
    "attestor()": "cada25c2",
    "calculateMinFeeWei()": "3a12a5bc",
    "campaignName()": "0724fda9",
    "claim(uint256,address,uint128,bytes32[])": "3f31ae3f",
    "claimTo(uint256,address,uint128,bytes32[])": "0854a79c",
    "claimViaAttestation(uint256,address,uint128,uint40,bytes32[],bytes)": "e74f822d",
    "claimViaSig(uint256,address,address,uint128,uint40,bytes32[],bytes)": "20743583",
    "clawback(address,uint128)": "1686c909",
    "domainSeparator()": "f698da25",
    "firstClaimTime()": "82d72f7f",
    "hasClaimed(uint256)": "ce516507",
    "hasExpired()": "90e64d13",
    "ipfsCID()": "49fc73dd",
    "lowerMinFeeUSD(uint256)": "8ec68869",
    "minFeeUSD()": "4e0bb8cc",
    "setAttestor(address)": "f5770b1f",
    "sponsor(address,uint128,address)": "2481a13a",
    "transferAdmin(address)": "75829def"
  },
  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.29+commit.ab55807c\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"viaSig\",\"type\":\"bool\"}],\"name\":\"ClaimInstant\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"}],\"name\":\"Clawback\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"comptroller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMinFeeUSD\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousMinFeeUSD\",\"type\":\"uint256\"}],\"name\":\"LowerMinFeeUSD\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousAttestor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAttestor\",\"type\":\"address\"}],\"name\":\"SetAttestor\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"biller\",\"type\":\"address\"}],\"name\":\"Sponsor\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"TransferAdmin\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CAMPAIGN_START_TIME\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CLAIM_TYPE\",\"outputs\":[{\"internalType\":\"enum ClaimType\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COMPTROLLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXPIRATION\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"IS_SABLIER_MERKLE\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MERKLE_ROOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"attestor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"calculateMinFeeWei\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"campaignName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"}],\"name\":\"claimTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"uint40\",\"name\":\"expireAt\",\"type\":\"uint40\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"attestation\",\"type\":\"bytes\"}],\"name\":\"claimViaAttestation\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"uint40\",\"name\":\"validFrom\",\"type\":\"uint40\"},{\"internalType\":\"bytes32[]\",\"name\":\"merkleProof\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"claimViaSig\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"}],\"name\":\"clawback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"firstClaimTime\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"hasClaimed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hasExpired\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ipfsCID\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newMinFeeUSD\",\"type\":\"uint256\"}],\"name\":\"lowerMinFeeUSD\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minFeeUSD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAttestor\",\"type\":\"address\"}],\"name\":\"setAttestor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"address\",\"name\":\"biller\",\"type\":\"address\"}],\"name\":\"sponsor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"transferAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"TransferAdmin(address,address)\":{\"params\":{\"newAdmin\":\"The address of the new admin.\",\"oldAdmin\":\"The address of the old admin.\"}}},\"kind\":\"dev\",\"methods\":{\"CAMPAIGN_START_TIME()\":{\"details\":\"This is an immutable state variable.\"},\"CLAIM_TYPE()\":{\"details\":\"This is an immutable state variable.\"},\"EXPIRATION()\":{\"details\":\"This is an immutable state variable.\"},\"IS_SABLIER_MERKLE()\":{\"details\":\"This is a constant state variable.\"},\"MERKLE_ROOT()\":{\"details\":\"This is an immutable state variable.\"},\"TOKEN()\":{\"details\":\"This is an immutable state variable.\"},\"claim(uint256,address,uint128,bytes32[])\":{\"details\":\"It emits a {ClaimInstant} event. Requirements: - `CLAIM_TYPE` must be `DEFAULT`. - The current time must be greater than or equal to the campaign start time. - The campaign must not have expired. - `msg.value` must not be less than the value returned by {COMPTROLLER.calculateMinFeeWei}. - The `index` must not be claimed already. - The Merkle proof must be valid.\",\"params\":{\"amount\":\"The amount of ERC-20 tokens allocated to the recipient.\",\"index\":\"The index of the recipient in the Merkle tree.\",\"merkleProof\":\"The proof of inclusion in the Merkle tree.\",\"recipient\":\"The address of the airdrop recipient.\"}},\"claimTo(uint256,address,uint128,bytes32[])\":{\"details\":\"It emits a {ClaimInstant} event. Requirements: - `CLAIM_TYPE` must be `DEFAULT`. - `msg.sender` must be the airdrop recipient. - The `to` must not be the zero address. - Refer to the requirements in {claim}.\",\"params\":{\"amount\":\"The amount of ERC-20 tokens allocated to the `msg.sender`.\",\"index\":\"The index of the `msg.sender` in the Merkle tree.\",\"merkleProof\":\"The proof of inclusion in the Merkle tree.\",\"to\":\"The address receiving the ERC-20 tokens on behalf of `msg.sender`.\"}},\"claimViaAttestation(uint256,address,uint128,uint40,bytes32[],bytes)\":{\"details\":\"It emits a {ClaimInstant} event. Notes: - The attestation must be an EIP-712 signature from the attestor. - See the example in the {claimViaSig} function. - If the attestor is not set in the campaign, the attestor from the comptroller is used. Requirements: - `msg.sender` must be the airdrop recipient. - `CLAIM_TYPE` must be `ATTEST`. - The `to` must not be the zero address. - The attestor must not be the zero address. - The `expireAt` timestamp must not be in the past. - The attestation signature must be valid. - Refer to the requirements in {claim}.\",\"params\":{\"amount\":\"The amount of ERC-20 tokens allocated to the `msg.sender`.\",\"attestation\":\"The EIP-712 signature from the attestor.\",\"expireAt\":\"The timestamp after which the attestation signature is no longer valid.\",\"index\":\"The index of the `msg.sender` in the Merkle tree.\",\"merkleProof\":\"The proof of inclusion in the Merkle tree.\",\"to\":\"The address receiving the ERC-20 tokens on behalf of `msg.sender`.\"}},\"claimViaSig(uint256,address,address,uint128,uint40,bytes32[],bytes)\":{\"details\":\"It emits a {ClaimInstant} event. Requirements: - `CLAIM_TYPE` must be `DEFAULT`. - If `recipient` is an EOA, it must match the recovered signer. - If `recipient` is a contract, it must implement the IERC-1271 interface. - The `to` must not be the zero address. - The `validFrom` must be less than or equal to the current block timestamp. - Refer to the requirements in {claim}. Below is the example of typed data to be signed by the airdrop recipient, referenced from https://docs.metamask.io/wallet/how-to/sign-data/#example. ```json types: {   EIP712Domain: [     { name: \\\"name\\\", type: \\\"string\\\" },     { name: \\\"chainId\\\", type: \\\"uint256\\\" },     { name: \\\"verifyingContract\\\", type: \\\"address\\\" },   ],   Claim: [     { name: \\\"index\\\", type: \\\"uint256\\\" },     { name: \\\"recipient\\\", type: \\\"address\\\" },     { name: \\\"to\\\", type: \\\"address\\\" },     { name: \\\"amount\\\", type: \\\"uint128\\\" },     { name: \\\"validFrom\\\", type: \\\"uint40\\\" },   ], }, domain: {   name: \\\"Sablier Airdrops Protocol\\\",   chainId: 1, // Chain on which the contract is deployed   verifyingContract: \\\"0xTheAddressOfThisContract\\\", // The address of this contract }, primaryType: \\\"Claim\\\", message: {   index: 2, // The index of the signer in the Merkle tree   recipient: \\\"0xTheAddressOfTheRecipient\\\", // The address of the airdrop recipient   to: \\\"0xTheAddressReceivingTheTokens\\\", // The address where recipient wants to transfer the tokens   amount: \\\"1000000000000000000000\\\", // The amount of tokens allocated to the recipient   validFrom: 1752425637 // The timestamp from which the claim signature is valid }, ```\",\"params\":{\"amount\":\"The amount of ERC-20 tokens allocated to the recipient.\",\"index\":\"The index of the recipient in the Merkle tree.\",\"merkleProof\":\"The proof of inclusion in the Merkle tree.\",\"recipient\":\"The address of the airdrop recipient who is providing the signature.\",\"signature\":\"The EIP-712 or EIP-1271 signature from the airdrop recipient.\",\"to\":\"The address receiving the ERC-20 tokens on behalf of the recipient.\",\"validFrom\":\"The timestamp from which the claim signature is valid.\"}},\"clawback(address,uint128)\":{\"details\":\"Emits a {Clawback} event. Requirements: - `msg.sender` must be the admin. - No claim must be made, OR   The current timestamp must not exceed 7 days after the first claim, OR   The campaign must be expired.\",\"params\":{\"amount\":\"The amount of tokens to claw back.\",\"to\":\"The address to receive the tokens.\"}},\"hasClaimed(uint256)\":{\"details\":\"Uses a bitmap to save gas.\",\"params\":{\"index\":\"The index of the recipient to check.\"}},\"ipfsCID()\":{\"details\":\"An empty value may break certain UI features that depend upon the IPFS CID.\"},\"lowerMinFeeUSD(uint256)\":{\"details\":\"Emits a {LowerMinFeeUSD} event. Requirements: - `msg.sender` must be the comptroller. - The new fee must be less than the current {minFeeUSD}.\",\"params\":{\"newMinFeeUSD\":\"The new min USD fee to set, denominated in 8 decimals.\"}},\"minFeeUSD()\":{\"details\":\"The denomination is based on Chainlink's 8-decimal format for USD prices, where 1e8 is $1.\"},\"setAttestor(address)\":{\"details\":\"Emits a {SetAttestor} event. Requirements: - `msg.sender` must be either the comptroller or the campaign admin.\",\"params\":{\"newAttestor\":\"The new attestor address. If zero, the attestor from the comptroller will be used.\"}},\"sponsor(address,uint128,address)\":{\"details\":\"Emits a {Sponsor} event. Notes: - This function only makes the payment. The claim fees are updated only after the payment has been verified off-chain. - Refer to the Sablier website in order to sponsor with the correct token, otherwise the sponsorship may be ignored. Requirements: - `biller` must not be the zero address. - `amount` must be greater than zero. - `token` must not be the zero address and must be a valid ERC20 token. - `msg.sender` must have approved the contract to spend the tokens.\",\"params\":{\"amount\":\"The amount of tokens to transfer.\",\"biller\":\"The address to receive the tokens.\",\"token\":\"The ERC-20 token to transfer.\"}},\"transferAdmin(address)\":{\"details\":\"Notes: - Does not revert if the admin is the same. - This function can potentially leave the contract without an admin, thereby removing any functionality that is only available to the admin. Requirements: - `msg.sender` must be the contract admin.\",\"params\":{\"newAdmin\":\"The address of the new admin.\"}}},\"title\":\"ISablierMerkleInstant\",\"version\":1},\"userdoc\":{\"events\":{\"ClaimInstant(uint256,address,uint128,address,bool)\":{\"notice\":\"Emitted when an airdrop is claimed on behalf of an eligible recipient.\"},\"Clawback(address,address,uint128)\":{\"notice\":\"Emitted when the admin claws back the unclaimed tokens.\"},\"LowerMinFeeUSD(address,uint256,uint256)\":{\"notice\":\"Emitted when the min USD fee is lowered by the comptroller.\"},\"SetAttestor(address,address,address)\":{\"notice\":\"Emitted when the address of the attestor is set in this contract.\"},\"Sponsor(address,address,uint128,address)\":{\"notice\":\"Emitted when campaign owner sponsors the claim fees for eligible recipients.\"},\"TransferAdmin(address,address)\":{\"notice\":\"Emitted when the admin is transferred.\"}},\"kind\":\"user\",\"methods\":{\"CAMPAIGN_START_TIME()\":{\"notice\":\"The timestamp at which campaign starts and claim begins.\"},\"CLAIM_TYPE()\":{\"notice\":\"Retrieves the claim type supported by the campaign.\"},\"COMPTROLLER()\":{\"notice\":\"Retrieves the address of the comptroller contract.\"},\"EXPIRATION()\":{\"notice\":\"The cut-off point for the campaign, as a Unix timestamp. A value of zero means there is no expiration.\"},\"IS_SABLIER_MERKLE()\":{\"notice\":\"Returns `true` indicating that this campaign contract is deployed using the Sablier Factory.\"},\"MERKLE_ROOT()\":{\"notice\":\"The root of the Merkle tree used to validate the proofs of inclusion.\"},\"TOKEN()\":{\"notice\":\"The ERC-20 token to distribute.\"},\"admin()\":{\"notice\":\"The address of the admin account or contract.\"},\"attestor()\":{\"notice\":\"Retrieves the attestor address used for creating attestation signatures.\"},\"calculateMinFeeWei()\":{\"notice\":\"Calculates the minimum fee in wei required to claim the airdrop.\"},\"campaignName()\":{\"notice\":\"Retrieves the name of the campaign.\"},\"claim(uint256,address,uint128,bytes32[])\":{\"notice\":\"Claim airdrop on behalf of eligible recipient and transfer it to the recipient address.\"},\"claimTo(uint256,address,uint128,bytes32[])\":{\"notice\":\"Claim airdrop and transfer the tokens to the `to` address.\"},\"claimViaAttestation(uint256,address,uint128,uint40,bytes32[],bytes)\":{\"notice\":\"Claim airdrop using an external attestation from a trusted attestor (e.g., KYC verifier).\"},\"claimViaSig(uint256,address,address,uint128,uint40,bytes32[],bytes)\":{\"notice\":\"Claim airdrop on behalf of eligible recipient using an EIP-712 or EIP-1271 signature, and transfer the tokens to the `to` address.\"},\"clawback(address,uint128)\":{\"notice\":\"Claws back the unclaimed tokens.\"},\"domainSeparator()\":{\"notice\":\"The domain separator, as required by EIP-712 and EIP-1271, used for signing claims to prevent replay attacks across different campaigns.\"},\"firstClaimTime()\":{\"notice\":\"Retrieves the timestamp when the first claim is made, and zero if no claim was made yet.\"},\"hasClaimed(uint256)\":{\"notice\":\"Returns a flag indicating whether a claim has been made for a given index.\"},\"hasExpired()\":{\"notice\":\"Returns a flag indicating whether the campaign has expired.\"},\"ipfsCID()\":{\"notice\":\"The content identifier for indexing the campaign on IPFS.\"},\"lowerMinFeeUSD(uint256)\":{\"notice\":\"Lowers the min USD fee.\"},\"minFeeUSD()\":{\"notice\":\"Retrieves the min USD fee required to claim the airdrop, denominated in 8 decimals.\"},\"setAttestor(address)\":{\"notice\":\"Sets the attestor address used for verifying attestation signatures.\"},\"sponsor(address,uint128,address)\":{\"notice\":\"Sponsors the claim fees for eligible recipients.\"},\"transferAdmin(address)\":{\"notice\":\"Transfers the contract admin to a new address.\"}},\"notice\":\"MerkleInstant enables an airdrop model where eligible users receive the tokens as soon as they claim.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/interfaces/ISablierMerkleInstant.sol\":\"ISablierMerkleInstant\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":60000},\"remappings\":[\":@arbitrum/=node_modules/@arbitrum/\",\":@chainlink/=node_modules/@chainlink/\",\":@eth-optimism/=node_modules/@eth-optimism/\",\":@offchainlabs/=node_modules/@offchainlabs/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@prb/=node_modules/@prb/\",\":@sablier/=node_modules/@sablier/\",\":@scroll-tech/=node_modules/@scroll-tech/\",\":@zksync/=node_modules/@zksync/\",\":forge-std/=node_modules/forge-std/\",\":murky/=node_modules/murky/\",\":openzeppelin-contracts/=node_modules/murky/lib/openzeppelin-contracts/\",\":solady/=node_modules/solady/\",\":solarray/=node_modules/solarray/\"],\"viaIR\":true},\"sources\":{\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"node_modules/@sablier/evm-utils/src/interfaces/IAdminable.sol\":{\"keccak256\":\"0x3228d63e9b0b951030c73c42bb071e64f0ff0eadbcbeefad3f29a48366539c26\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://acc90ad2bec0e84349b56611b35b56bfb75a5930fd1babb2bd638fbbb15bd126\",\"dweb:/ipfs/QmSLnHx6bo4BQeBKYferfEhZo1Z4xCXdDF1bzJoHUafHt4\"]},\"src/interfaces/ISablierMerkleBase.sol\":{\"keccak256\":\"0xfc4e9b4737765f3f66fb81390154aaff3f21ee63fd21bed441baf553ac090993\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://189aab3a9ddf0e72425cb3b6420129ce971da916967a920c3132e328e546abbb\",\"dweb:/ipfs/QmQZaV1yvBs6MBf5jzgboTYztsVLMi5q3L4JVowyn6Yhrp\"]},\"src/interfaces/ISablierMerkleInstant.sol\":{\"keccak256\":\"0x03ae076658b6b4243b3dc3d68bc8e187a369deb01ec5510e9a2b7b3c96647439\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://b6b19c1699eb6ced4040bd35b1544097788e2cfe35c1c57e4f14d86b05ed92d1\",\"dweb:/ipfs/Qmf8ciPgHLbXJhGTbyChQfxJyAs1yEGgdRQToCFqpov4eq\"]},\"src/interfaces/ISablierMerkleSignature.sol\":{\"keccak256\":\"0x2e6e8cc3b951ddc10344883c08d662161efbd5fb5bc4672f77b51aa7ed8bf87d\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://dd48f5c162987c93e45f7f942b7f23817d81ef588bb776816a207639c91e6e4e\",\"dweb:/ipfs/QmQHyHxPG6YVt5BVMYKfb5YWX6cQdp5yMVHoP1u2U3E1ut\"]},\"src/types/MerkleBase.sol\":{\"keccak256\":\"0x33004c31ccf302e5da76dbb8476816db31c2c0984fb9c928c45528bbfdef6397\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://55b26d1a6beda8cb76043d2fde56445910ae3e88e8ab20d2c48678e4456beca3\",\"dweb:/ipfs/QmYrMXbpPcjzJen93uFXiBws7fauseuXZcQ9fpbsNbaGN8\"]}},\"version\":1}",
  "metadata": {
    "compiler": { "version": "0.8.29+commit.ab55807c" },
    "language": "Solidity",
    "output": {
      "abi": [
        {
          "inputs": [
            { "internalType": "uint256", "name": "index", "type": "uint256", "indexed": false },
            { "internalType": "address", "name": "recipient", "type": "address", "indexed": true },
            { "internalType": "uint128", "name": "amount", "type": "uint128", "indexed": false },
            { "internalType": "address", "name": "to", "type": "address", "indexed": false },
            { "internalType": "bool", "name": "viaSig", "type": "bool", "indexed": false }
          ],
          "type": "event",
          "name": "ClaimInstant",
          "anonymous": false
        },
        {
          "inputs": [
            { "internalType": "address", "name": "admin", "type": "address", "indexed": true },
            { "internalType": "address", "name": "to", "type": "address", "indexed": true },
            { "internalType": "uint128", "name": "amount", "type": "uint128", "indexed": false }
          ],
          "type": "event",
          "name": "Clawback",
          "anonymous": false
        },
        {
          "inputs": [
            { "internalType": "address", "name": "comptroller", "type": "address", "indexed": true },
            { "internalType": "uint256", "name": "newMinFeeUSD", "type": "uint256", "indexed": false },
            { "internalType": "uint256", "name": "previousMinFeeUSD", "type": "uint256", "indexed": false }
          ],
          "type": "event",
          "name": "LowerMinFeeUSD",
          "anonymous": false
        },
        {
          "inputs": [
            { "internalType": "address", "name": "caller", "type": "address", "indexed": true },
            { "internalType": "address", "name": "previousAttestor", "type": "address", "indexed": true },
            { "internalType": "address", "name": "newAttestor", "type": "address", "indexed": true }
          ],
          "type": "event",
          "name": "SetAttestor",
          "anonymous": false
        },
        {
          "inputs": [
            { "internalType": "address", "name": "caller", "type": "address", "indexed": true },
            { "internalType": "contract IERC20", "name": "token", "type": "address", "indexed": true },
            { "internalType": "uint128", "name": "amount", "type": "uint128", "indexed": false },
            { "internalType": "address", "name": "biller", "type": "address", "indexed": true }
          ],
          "type": "event",
          "name": "Sponsor",
          "anonymous": false
        },
        {
          "inputs": [
            { "internalType": "address", "name": "oldAdmin", "type": "address", "indexed": true },
            { "internalType": "address", "name": "newAdmin", "type": "address", "indexed": true }
          ],
          "type": "event",
          "name": "TransferAdmin",
          "anonymous": false
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "CAMPAIGN_START_TIME",
          "outputs": [{ "internalType": "uint40", "name": "", "type": "uint40" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "CLAIM_TYPE",
          "outputs": [{ "internalType": "enum ClaimType", "name": "", "type": "uint8" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "COMPTROLLER",
          "outputs": [{ "internalType": "address", "name": "", "type": "address" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "EXPIRATION",
          "outputs": [{ "internalType": "uint40", "name": "", "type": "uint40" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "IS_SABLIER_MERKLE",
          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "MERKLE_ROOT",
          "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "TOKEN",
          "outputs": [{ "internalType": "contract IERC20", "name": "", "type": "address" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "admin",
          "outputs": [{ "internalType": "address", "name": "", "type": "address" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "attestor",
          "outputs": [{ "internalType": "address", "name": "", "type": "address" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "calculateMinFeeWei",
          "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "campaignName",
          "outputs": [{ "internalType": "string", "name": "", "type": "string" }]
        },
        {
          "inputs": [
            { "internalType": "uint256", "name": "index", "type": "uint256" },
            { "internalType": "address", "name": "recipient", "type": "address" },
            { "internalType": "uint128", "name": "amount", "type": "uint128" },
            { "internalType": "bytes32[]", "name": "merkleProof", "type": "bytes32[]" }
          ],
          "stateMutability": "payable",
          "type": "function",
          "name": "claim"
        },
        {
          "inputs": [
            { "internalType": "uint256", "name": "index", "type": "uint256" },
            { "internalType": "address", "name": "to", "type": "address" },
            { "internalType": "uint128", "name": "amount", "type": "uint128" },
            { "internalType": "bytes32[]", "name": "merkleProof", "type": "bytes32[]" }
          ],
          "stateMutability": "payable",
          "type": "function",
          "name": "claimTo"
        },
        {
          "inputs": [
            { "internalType": "uint256", "name": "index", "type": "uint256" },
            { "internalType": "address", "name": "to", "type": "address" },
            { "internalType": "uint128", "name": "amount", "type": "uint128" },
            { "internalType": "uint40", "name": "expireAt", "type": "uint40" },
            { "internalType": "bytes32[]", "name": "merkleProof", "type": "bytes32[]" },
            { "internalType": "bytes", "name": "attestation", "type": "bytes" }
          ],
          "stateMutability": "payable",
          "type": "function",
          "name": "claimViaAttestation"
        },
        {
          "inputs": [
            { "internalType": "uint256", "name": "index", "type": "uint256" },
            { "internalType": "address", "name": "recipient", "type": "address" },
            { "internalType": "address", "name": "to", "type": "address" },
            { "internalType": "uint128", "name": "amount", "type": "uint128" },
            { "internalType": "uint40", "name": "validFrom", "type": "uint40" },
            { "internalType": "bytes32[]", "name": "merkleProof", "type": "bytes32[]" },
            { "internalType": "bytes", "name": "signature", "type": "bytes" }
          ],
          "stateMutability": "payable",
          "type": "function",
          "name": "claimViaSig"
        },
        {
          "inputs": [
            { "internalType": "address", "name": "to", "type": "address" },
            { "internalType": "uint128", "name": "amount", "type": "uint128" }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "clawback"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "domainSeparator",
          "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "firstClaimTime",
          "outputs": [{ "internalType": "uint40", "name": "", "type": "uint40" }]
        },
        {
          "inputs": [{ "internalType": "uint256", "name": "index", "type": "uint256" }],
          "stateMutability": "view",
          "type": "function",
          "name": "hasClaimed",
          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "hasExpired",
          "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "ipfsCID",
          "outputs": [{ "internalType": "string", "name": "", "type": "string" }]
        },
        {
          "inputs": [{ "internalType": "uint256", "name": "newMinFeeUSD", "type": "uint256" }],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "lowerMinFeeUSD"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "minFeeUSD",
          "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
        },
        {
          "inputs": [{ "internalType": "address", "name": "newAttestor", "type": "address" }],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "setAttestor"
        },
        {
          "inputs": [
            { "internalType": "contract IERC20", "name": "token", "type": "address" },
            { "internalType": "uint128", "name": "amount", "type": "uint128" },
            { "internalType": "address", "name": "biller", "type": "address" }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "sponsor"
        },
        {
          "inputs": [{ "internalType": "address", "name": "newAdmin", "type": "address" }],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "transferAdmin"
        }
      ],
      "devdoc": {
        "kind": "dev",
        "methods": {
          "CAMPAIGN_START_TIME()": { "details": "This is an immutable state variable." },
          "CLAIM_TYPE()": { "details": "This is an immutable state variable." },
          "EXPIRATION()": { "details": "This is an immutable state variable." },
          "IS_SABLIER_MERKLE()": { "details": "This is a constant state variable." },
          "MERKLE_ROOT()": { "details": "This is an immutable state variable." },
          "TOKEN()": { "details": "This is an immutable state variable." },
          "claim(uint256,address,uint128,bytes32[])": {
            "details": "It emits a {ClaimInstant} event. Requirements: - `CLAIM_TYPE` must be `DEFAULT`. - The current time must be greater than or equal to the campaign start time. - The campaign must not have expired. - `msg.value` must not be less than the value returned by {COMPTROLLER.calculateMinFeeWei}. - The `index` must not be claimed already. - The Merkle proof must be valid.",
            "params": {
              "amount": "The amount of ERC-20 tokens allocated to the recipient.",
              "index": "The index of the recipient in the Merkle tree.",
              "merkleProof": "The proof of inclusion in the Merkle tree.",
              "recipient": "The address of the airdrop recipient."
            }
          },
          "claimTo(uint256,address,uint128,bytes32[])": {
            "details": "It emits a {ClaimInstant} event. Requirements: - `CLAIM_TYPE` must be `DEFAULT`. - `msg.sender` must be the airdrop recipient. - The `to` must not be the zero address. - Refer to the requirements in {claim}.",
            "params": {
              "amount": "The amount of ERC-20 tokens allocated to the `msg.sender`.",
              "index": "The index of the `msg.sender` in the Merkle tree.",
              "merkleProof": "The proof of inclusion in the Merkle tree.",
              "to": "The address receiving the ERC-20 tokens on behalf of `msg.sender`."
            }
          },
          "claimViaAttestation(uint256,address,uint128,uint40,bytes32[],bytes)": {
            "details": "It emits a {ClaimInstant} event. Notes: - The attestation must be an EIP-712 signature from the attestor. - See the example in the {claimViaSig} function. - If the attestor is not set in the campaign, the attestor from the comptroller is used. Requirements: - `msg.sender` must be the airdrop recipient. - `CLAIM_TYPE` must be `ATTEST`. - The `to` must not be the zero address. - The attestor must not be the zero address. - The `expireAt` timestamp must not be in the past. - The attestation signature must be valid. - Refer to the requirements in {claim}.",
            "params": {
              "amount": "The amount of ERC-20 tokens allocated to the `msg.sender`.",
              "attestation": "The EIP-712 signature from the attestor.",
              "expireAt": "The timestamp after which the attestation signature is no longer valid.",
              "index": "The index of the `msg.sender` in the Merkle tree.",
              "merkleProof": "The proof of inclusion in the Merkle tree.",
              "to": "The address receiving the ERC-20 tokens on behalf of `msg.sender`."
            }
          },
          "claimViaSig(uint256,address,address,uint128,uint40,bytes32[],bytes)": {
            "details": "It emits a {ClaimInstant} event. Requirements: - `CLAIM_TYPE` must be `DEFAULT`. - If `recipient` is an EOA, it must match the recovered signer. - If `recipient` is a contract, it must implement the IERC-1271 interface. - The `to` must not be the zero address. - The `validFrom` must be less than or equal to the current block timestamp. - Refer to the requirements in {claim}. Below is the example of typed data to be signed by the airdrop recipient, referenced from https://docs.metamask.io/wallet/how-to/sign-data/#example. ```json types: {   EIP712Domain: [     { name: \"name\", type: \"string\" },     { name: \"chainId\", type: \"uint256\" },     { name: \"verifyingContract\", type: \"address\" },   ],   Claim: [     { name: \"index\", type: \"uint256\" },     { name: \"recipient\", type: \"address\" },     { name: \"to\", type: \"address\" },     { name: \"amount\", type: \"uint128\" },     { name: \"validFrom\", type: \"uint40\" },   ], }, domain: {   name: \"Sablier Airdrops Protocol\",   chainId: 1, // Chain on which the contract is deployed   verifyingContract: \"0xTheAddressOfThisContract\", // The address of this contract }, primaryType: \"Claim\", message: {   index: 2, // The index of the signer in the Merkle tree   recipient: \"0xTheAddressOfTheRecipient\", // The address of the airdrop recipient   to: \"0xTheAddressReceivingTheTokens\", // The address where recipient wants to transfer the tokens   amount: \"1000000000000000000000\", // The amount of tokens allocated to the recipient   validFrom: 1752425637 // The timestamp from which the claim signature is valid }, ```",
            "params": {
              "amount": "The amount of ERC-20 tokens allocated to the recipient.",
              "index": "The index of the recipient in the Merkle tree.",
              "merkleProof": "The proof of inclusion in the Merkle tree.",
              "recipient": "The address of the airdrop recipient who is providing the signature.",
              "signature": "The EIP-712 or EIP-1271 signature from the airdrop recipient.",
              "to": "The address receiving the ERC-20 tokens on behalf of the recipient.",
              "validFrom": "The timestamp from which the claim signature is valid."
            }
          },
          "clawback(address,uint128)": {
            "details": "Emits a {Clawback} event. Requirements: - `msg.sender` must be the admin. - No claim must be made, OR   The current timestamp must not exceed 7 days after the first claim, OR   The campaign must be expired.",
            "params": { "amount": "The amount of tokens to claw back.", "to": "The address to receive the tokens." }
          },
          "hasClaimed(uint256)": {
            "details": "Uses a bitmap to save gas.",
            "params": { "index": "The index of the recipient to check." }
          },
          "ipfsCID()": { "details": "An empty value may break certain UI features that depend upon the IPFS CID." },
          "lowerMinFeeUSD(uint256)": {
            "details": "Emits a {LowerMinFeeUSD} event. Requirements: - `msg.sender` must be the comptroller. - The new fee must be less than the current {minFeeUSD}.",
            "params": { "newMinFeeUSD": "The new min USD fee to set, denominated in 8 decimals." }
          },
          "minFeeUSD()": {
            "details": "The denomination is based on Chainlink's 8-decimal format for USD prices, where 1e8 is $1."
          },
          "setAttestor(address)": {
            "details": "Emits a {SetAttestor} event. Requirements: - `msg.sender` must be either the comptroller or the campaign admin.",
            "params": {
              "newAttestor": "The new attestor address. If zero, the attestor from the comptroller will be used."
            }
          },
          "sponsor(address,uint128,address)": {
            "details": "Emits a {Sponsor} event. Notes: - This function only makes the payment. The claim fees are updated only after the payment has been verified off-chain. - Refer to the Sablier website in order to sponsor with the correct token, otherwise the sponsorship may be ignored. Requirements: - `biller` must not be the zero address. - `amount` must be greater than zero. - `token` must not be the zero address and must be a valid ERC20 token. - `msg.sender` must have approved the contract to spend the tokens.",
            "params": {
              "amount": "The amount of tokens to transfer.",
              "biller": "The address to receive the tokens.",
              "token": "The ERC-20 token to transfer."
            }
          },
          "transferAdmin(address)": {
            "details": "Notes: - Does not revert if the admin is the same. - This function can potentially leave the contract without an admin, thereby removing any functionality that is only available to the admin. Requirements: - `msg.sender` must be the contract admin.",
            "params": { "newAdmin": "The address of the new admin." }
          }
        },
        "version": 1
      },
      "userdoc": {
        "kind": "user",
        "methods": {
          "CAMPAIGN_START_TIME()": { "notice": "The timestamp at which campaign starts and claim begins." },
          "CLAIM_TYPE()": { "notice": "Retrieves the claim type supported by the campaign." },
          "COMPTROLLER()": { "notice": "Retrieves the address of the comptroller contract." },
          "EXPIRATION()": {
            "notice": "The cut-off point for the campaign, as a Unix timestamp. A value of zero means there is no expiration."
          },
          "IS_SABLIER_MERKLE()": {
            "notice": "Returns `true` indicating that this campaign contract is deployed using the Sablier Factory."
          },
          "MERKLE_ROOT()": { "notice": "The root of the Merkle tree used to validate the proofs of inclusion." },
          "TOKEN()": { "notice": "The ERC-20 token to distribute." },
          "admin()": { "notice": "The address of the admin account or contract." },
          "attestor()": { "notice": "Retrieves the attestor address used for creating attestation signatures." },
          "calculateMinFeeWei()": { "notice": "Calculates the minimum fee in wei required to claim the airdrop." },
          "campaignName()": { "notice": "Retrieves the name of the campaign." },
          "claim(uint256,address,uint128,bytes32[])": {
            "notice": "Claim airdrop on behalf of eligible recipient and transfer it to the recipient address."
          },
          "claimTo(uint256,address,uint128,bytes32[])": {
            "notice": "Claim airdrop and transfer the tokens to the `to` address."
          },
          "claimViaAttestation(uint256,address,uint128,uint40,bytes32[],bytes)": {
            "notice": "Claim airdrop using an external attestation from a trusted attestor (e.g., KYC verifier)."
          },
          "claimViaSig(uint256,address,address,uint128,uint40,bytes32[],bytes)": {
            "notice": "Claim airdrop on behalf of eligible recipient using an EIP-712 or EIP-1271 signature, and transfer the tokens to the `to` address."
          },
          "clawback(address,uint128)": { "notice": "Claws back the unclaimed tokens." },
          "domainSeparator()": {
            "notice": "The domain separator, as required by EIP-712 and EIP-1271, used for signing claims to prevent replay attacks across different campaigns."
          },
          "firstClaimTime()": {
            "notice": "Retrieves the timestamp when the first claim is made, and zero if no claim was made yet."
          },
          "hasClaimed(uint256)": {
            "notice": "Returns a flag indicating whether a claim has been made for a given index."
          },
          "hasExpired()": { "notice": "Returns a flag indicating whether the campaign has expired." },
          "ipfsCID()": { "notice": "The content identifier for indexing the campaign on IPFS." },
          "lowerMinFeeUSD(uint256)": { "notice": "Lowers the min USD fee." },
          "minFeeUSD()": {
            "notice": "Retrieves the min USD fee required to claim the airdrop, denominated in 8 decimals."
          },
          "setAttestor(address)": { "notice": "Sets the attestor address used for verifying attestation signatures." },
          "sponsor(address,uint128,address)": { "notice": "Sponsors the claim fees for eligible recipients." },
          "transferAdmin(address)": { "notice": "Transfers the contract admin to a new address." }
        },
        "version": 1
      }
    },
    "settings": {
      "remappings": [
        "@arbitrum/=node_modules/@arbitrum/",
        "@chainlink/=node_modules/@chainlink/",
        "@eth-optimism/=node_modules/@eth-optimism/",
        "@offchainlabs/=node_modules/@offchainlabs/",
        "@openzeppelin/=node_modules/@openzeppelin/",
        "@prb/=node_modules/@prb/",
        "@sablier/=node_modules/@sablier/",
        "@scroll-tech/=node_modules/@scroll-tech/",
        "@zksync/=node_modules/@zksync/",
        "forge-std/=node_modules/forge-std/",
        "murky/=node_modules/murky/",
        "openzeppelin-contracts/=node_modules/murky/lib/openzeppelin-contracts/",
        "solady/=node_modules/solady/",
        "solarray/=node_modules/solarray/"
      ],
      "optimizer": { "enabled": true, "runs": 60000 },
      "metadata": { "bytecodeHash": "ipfs" },
      "compilationTarget": { "src/interfaces/ISablierMerkleInstant.sol": "ISablierMerkleInstant" },
      "evmVersion": "shanghai",
      "libraries": {},
      "viaIR": true
    },
    "sources": {
      "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": {
        "keccak256": "0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7",
        "urls": [
          "bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db",
          "dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"
        ],
        "license": "MIT"
      },
      "node_modules/@sablier/evm-utils/src/interfaces/IAdminable.sol": {
        "keccak256": "0x3228d63e9b0b951030c73c42bb071e64f0ff0eadbcbeefad3f29a48366539c26",
        "urls": [
          "bzz-raw://acc90ad2bec0e84349b56611b35b56bfb75a5930fd1babb2bd638fbbb15bd126",
          "dweb:/ipfs/QmSLnHx6bo4BQeBKYferfEhZo1Z4xCXdDF1bzJoHUafHt4"
        ],
        "license": "GPL-3.0-or-later"
      },
      "src/interfaces/ISablierMerkleBase.sol": {
        "keccak256": "0xfc4e9b4737765f3f66fb81390154aaff3f21ee63fd21bed441baf553ac090993",
        "urls": [
          "bzz-raw://189aab3a9ddf0e72425cb3b6420129ce971da916967a920c3132e328e546abbb",
          "dweb:/ipfs/QmQZaV1yvBs6MBf5jzgboTYztsVLMi5q3L4JVowyn6Yhrp"
        ],
        "license": "GPL-3.0-or-later"
      },
      "src/interfaces/ISablierMerkleInstant.sol": {
        "keccak256": "0x03ae076658b6b4243b3dc3d68bc8e187a369deb01ec5510e9a2b7b3c96647439",
        "urls": [
          "bzz-raw://b6b19c1699eb6ced4040bd35b1544097788e2cfe35c1c57e4f14d86b05ed92d1",
          "dweb:/ipfs/Qmf8ciPgHLbXJhGTbyChQfxJyAs1yEGgdRQToCFqpov4eq"
        ],
        "license": "GPL-3.0-or-later"
      },
      "src/interfaces/ISablierMerkleSignature.sol": {
        "keccak256": "0x2e6e8cc3b951ddc10344883c08d662161efbd5fb5bc4672f77b51aa7ed8bf87d",
        "urls": [
          "bzz-raw://dd48f5c162987c93e45f7f942b7f23817d81ef588bb776816a207639c91e6e4e",
          "dweb:/ipfs/QmQHyHxPG6YVt5BVMYKfb5YWX6cQdp5yMVHoP1u2U3E1ut"
        ],
        "license": "GPL-3.0-or-later"
      },
      "src/types/MerkleBase.sol": {
        "keccak256": "0x33004c31ccf302e5da76dbb8476816db31c2c0984fb9c928c45528bbfdef6397",
        "urls": [
          "bzz-raw://55b26d1a6beda8cb76043d2fde56445910ae3e88e8ab20d2c48678e4456beca3",
          "dweb:/ipfs/QmYrMXbpPcjzJen93uFXiBws7fauseuXZcQ9fpbsNbaGN8"
        ],
        "license": "GPL-3.0-or-later"
      }
    },
    "version": 1
  },
  "id": 123
}
