[
  {
    "type": "function",
    "name": "backfillBatchAddComment",
    "inputs": [
      {
        "name": "commentIdentifiers",
        "type": "tuple[]",
        "internalType": "struct IComments.CommentIdentifier[]",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "texts",
        "type": "string[]",
        "internalType": "string[]"
      },
      {
        "name": "timestamps",
        "type": "uint256[]",
        "internalType": "uint256[]"
      },
      {
        "name": "originalTransactionHashes",
        "type": "bytes32[]",
        "internalType": "bytes32[]"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "comment",
    "inputs": [
      {
        "name": "commenter",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "contractAddress",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "tokenId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "text",
        "type": "string",
        "internalType": "string"
      },
      {
        "name": "replyTo",
        "type": "tuple",
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "commenterSmartWalletOwner",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "referrer",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "tuple",
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      }
    ],
    "stateMutability": "payable"
  },
  {
    "type": "function",
    "name": "commentSparksQuantity",
    "inputs": [
      {
        "name": "commentIdentifier",
        "type": "tuple",
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "delegateComment",
    "inputs": [
      {
        "name": "commenter",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "contractAddress",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "tokenId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "text",
        "type": "string",
        "internalType": "string"
      },
      {
        "name": "replyTo",
        "type": "tuple",
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "commenterSmartWalletOwner",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "referrer",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "tuple",
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "commentId",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "payable"
  },
  {
    "type": "function",
    "name": "hashAndCheckCommentExists",
    "inputs": [
      {
        "name": "commentIdentifier",
        "type": "tuple",
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "commentId",
        "type": "bytes32",
        "internalType": "bytes32"
      },
      {
        "name": "exists",
        "type": "bool",
        "internalType": "bool"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "hashAndValidateCommentExists",
    "inputs": [
      {
        "name": "commentIdentifier",
        "type": "tuple",
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "commentId",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "hashCommentIdentifier",
    "inputs": [
      {
        "name": "commentIdentifier",
        "type": "tuple",
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "hashPermitComment",
    "inputs": [
      {
        "name": "permit",
        "type": "tuple",
        "internalType": "struct IComments.PermitComment",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "commenterSmartWallet",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "replyTo",
            "type": "tuple",
            "internalType": "struct IComments.CommentIdentifier",
            "components": [
              {
                "name": "commenter",
                "type": "address",
                "internalType": "address"
              },
              {
                "name": "contractAddress",
                "type": "address",
                "internalType": "address"
              },
              {
                "name": "tokenId",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "nonce",
                "type": "bytes32",
                "internalType": "bytes32"
              }
            ]
          },
          {
            "name": "text",
            "type": "string",
            "internalType": "string"
          },
          {
            "name": "referrer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "deadline",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          },
          {
            "name": "sourceChainId",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "destinationChainId",
            "type": "uint32",
            "internalType": "uint32"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "hashPermitSparkComment",
    "inputs": [
      {
        "name": "permit",
        "type": "tuple",
        "internalType": "struct IComments.PermitSparkComment",
        "components": [
          {
            "name": "comment",
            "type": "tuple",
            "internalType": "struct IComments.CommentIdentifier",
            "components": [
              {
                "name": "commenter",
                "type": "address",
                "internalType": "address"
              },
              {
                "name": "contractAddress",
                "type": "address",
                "internalType": "address"
              },
              {
                "name": "tokenId",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "nonce",
                "type": "bytes32",
                "internalType": "bytes32"
              }
            ]
          },
          {
            "name": "sparker",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "sparksQuantity",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "deadline",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          },
          {
            "name": "referrer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "sourceChainId",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "destinationChainId",
            "type": "uint32",
            "internalType": "uint32"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "implementation",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address",
        "internalType": "address"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "initialize",
    "inputs": [
      {
        "name": "commentsAdmin",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "backfiller",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "delegateCommenters",
        "type": "address[]",
        "internalType": "address[]"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "nextNonce",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "permitComment",
    "inputs": [
      {
        "name": "permit",
        "type": "tuple",
        "internalType": "struct IComments.PermitComment",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "commenterSmartWallet",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "replyTo",
            "type": "tuple",
            "internalType": "struct IComments.CommentIdentifier",
            "components": [
              {
                "name": "commenter",
                "type": "address",
                "internalType": "address"
              },
              {
                "name": "contractAddress",
                "type": "address",
                "internalType": "address"
              },
              {
                "name": "tokenId",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "nonce",
                "type": "bytes32",
                "internalType": "bytes32"
              }
            ]
          },
          {
            "name": "text",
            "type": "string",
            "internalType": "string"
          },
          {
            "name": "referrer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "deadline",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          },
          {
            "name": "sourceChainId",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "destinationChainId",
            "type": "uint32",
            "internalType": "uint32"
          }
        ]
      },
      {
        "name": "signature",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [],
    "stateMutability": "payable"
  },
  {
    "type": "function",
    "name": "permitSparkComment",
    "inputs": [
      {
        "name": "permit",
        "type": "tuple",
        "internalType": "struct IComments.PermitSparkComment",
        "components": [
          {
            "name": "comment",
            "type": "tuple",
            "internalType": "struct IComments.CommentIdentifier",
            "components": [
              {
                "name": "commenter",
                "type": "address",
                "internalType": "address"
              },
              {
                "name": "contractAddress",
                "type": "address",
                "internalType": "address"
              },
              {
                "name": "tokenId",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "nonce",
                "type": "bytes32",
                "internalType": "bytes32"
              }
            ]
          },
          {
            "name": "sparker",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "sparksQuantity",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "deadline",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          },
          {
            "name": "referrer",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "sourceChainId",
            "type": "uint32",
            "internalType": "uint32"
          },
          {
            "name": "destinationChainId",
            "type": "uint32",
            "internalType": "uint32"
          }
        ]
      },
      {
        "name": "signature",
        "type": "bytes",
        "internalType": "bytes"
      }
    ],
    "outputs": [],
    "stateMutability": "payable"
  },
  {
    "type": "function",
    "name": "sparkComment",
    "inputs": [
      {
        "name": "commentIdentifier",
        "type": "tuple",
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "sparksQuantity",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "referrer",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [],
    "stateMutability": "payable"
  },
  {
    "type": "function",
    "name": "sparkValue",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "event",
    "name": "BackfilledComment",
    "inputs": [
      {
        "name": "commentId",
        "type": "bytes32",
        "indexed": true,
        "internalType": "bytes32"
      },
      {
        "name": "commentIdentifier",
        "type": "tuple",
        "indexed": false,
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "text",
        "type": "string",
        "indexed": false,
        "internalType": "string"
      },
      {
        "name": "timestamp",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "originalTransactionId",
        "type": "bytes32",
        "indexed": false,
        "internalType": "bytes32"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "Commented",
    "inputs": [
      {
        "name": "commentId",
        "type": "bytes32",
        "indexed": true,
        "internalType": "bytes32"
      },
      {
        "name": "commentIdentifier",
        "type": "tuple",
        "indexed": false,
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "replyToId",
        "type": "bytes32",
        "indexed": false,
        "internalType": "bytes32"
      },
      {
        "name": "replyTo",
        "type": "tuple",
        "indexed": false,
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "sparksQuantity",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "text",
        "type": "string",
        "indexed": false,
        "internalType": "string"
      },
      {
        "name": "timestamp",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "referrer",
        "type": "address",
        "indexed": false,
        "internalType": "address"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "SparkedComment",
    "inputs": [
      {
        "name": "commentId",
        "type": "bytes32",
        "indexed": true,
        "internalType": "bytes32"
      },
      {
        "name": "commentIdentifier",
        "type": "tuple",
        "indexed": false,
        "internalType": "struct IComments.CommentIdentifier",
        "components": [
          {
            "name": "commenter",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "contractAddress",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256",
            "internalType": "uint256"
          },
          {
            "name": "nonce",
            "type": "bytes32",
            "internalType": "bytes32"
          }
        ]
      },
      {
        "name": "sparksQuantity",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "sparker",
        "type": "address",
        "indexed": false,
        "internalType": "address"
      },
      {
        "name": "timestamp",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "referrer",
        "type": "address",
        "indexed": false,
        "internalType": "address"
      }
    ],
    "anonymous": false
  },
  {
    "type": "error",
    "name": "AddressZero",
    "inputs": []
  },
  {
    "type": "error",
    "name": "ArrayLengthMismatch",
    "inputs": []
  },
  {
    "type": "error",
    "name": "CannotSparkOwnComment",
    "inputs": []
  },
  {
    "type": "error",
    "name": "CommentAddressOrTokenIdsDoNotMatch",
    "inputs": [
      {
        "name": "commentAddress",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "commentTokenId",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "replyAddress",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "replyTokenId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ]
  },
  {
    "type": "error",
    "name": "CommentDoesntExist",
    "inputs": []
  },
  {
    "type": "error",
    "name": "CommenterMismatch",
    "inputs": [
      {
        "name": "expected",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "actual",
        "type": "address",
        "internalType": "address"
      }
    ]
  },
  {
    "type": "error",
    "name": "DuplicateComment",
    "inputs": [
      {
        "name": "commentId",
        "type": "bytes32",
        "internalType": "bytes32"
      }
    ]
  },
  {
    "type": "error",
    "name": "ERC2612ExpiredSignature",
    "inputs": [
      {
        "name": "deadline",
        "type": "uint256",
        "internalType": "uint256"
      }
    ]
  },
  {
    "type": "error",
    "name": "EmptyComment",
    "inputs": []
  },
  {
    "type": "error",
    "name": "IncorrectDestinationChain",
    "inputs": [
      {
        "name": "wrongDestinationChainId",
        "type": "uint256",
        "internalType": "uint256"
      }
    ]
  },
  {
    "type": "error",
    "name": "IncorrectETHAmountForSparks",
    "inputs": [
      {
        "name": "actual",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "expected",
        "type": "uint256",
        "internalType": "uint256"
      }
    ]
  },
  {
    "type": "error",
    "name": "InvalidSignature",
    "inputs": []
  },
  {
    "type": "error",
    "name": "MustSendAtLeastOneSpark",
    "inputs": []
  },
  {
    "type": "error",
    "name": "NoFundsRecipient",
    "inputs": []
  },
  {
    "type": "error",
    "name": "NotSmartWallet",
    "inputs": []
  },
  {
    "type": "error",
    "name": "NotSmartWalletOwner",
    "inputs": []
  },
  {
    "type": "error",
    "name": "OnlySparksContract",
    "inputs": []
  },
  {
    "type": "error",
    "name": "TransferFailed",
    "inputs": []
  },
  {
    "type": "error",
    "name": "UpgradeToMismatchedContractName",
    "inputs": [
      {
        "name": "currentName",
        "type": "string",
        "internalType": "string"
      },
      {
        "name": "newName",
        "type": "string",
        "internalType": "string"
      }
    ]
  }
]