├── .vscode └── settings.json ├── public ├── robots.txt ├── favicon.ico ├── logo192.png ├── logo512.png ├── follow-icon.png ├── default-avatar.png ├── manifest.json └── index.html ├── src ├── assets │ ├── follow-icon.png │ ├── default-avatar.png │ └── gradient-background.png ├── gradient-background.png ├── index.js ├── index.css ├── App.js ├── queries.js └── lenshub.json ├── README.md ├── .gitignore └── package.json /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "window.zoomLevel": 1 3 | } 4 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ed-roh/decentralized-social-media-app/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ed-roh/decentralized-social-media-app/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ed-roh/decentralized-social-media-app/HEAD/public/logo512.png -------------------------------------------------------------------------------- /public/follow-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ed-roh/decentralized-social-media-app/HEAD/public/follow-icon.png -------------------------------------------------------------------------------- /public/default-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ed-roh/decentralized-social-media-app/HEAD/public/default-avatar.png -------------------------------------------------------------------------------- /src/assets/follow-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ed-roh/decentralized-social-media-app/HEAD/src/assets/follow-icon.png -------------------------------------------------------------------------------- /src/gradient-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ed-roh/decentralized-social-media-app/HEAD/src/gradient-background.png -------------------------------------------------------------------------------- /src/assets/default-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ed-roh/decentralized-social-media-app/HEAD/src/assets/default-avatar.png -------------------------------------------------------------------------------- /src/assets/gradient-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ed-roh/decentralized-social-media-app/HEAD/src/assets/gradient-background.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Decentralized Social Media Application 2 | 3 | This is the complete, finished application for the Decentralized Social Media Application. 4 | 5 | Video: https://www.youtube.com/watch?v=FiZIGm41dgE 6 | 7 | For all related questions and discussions about this project, check out the discord: 8 | https://discord.gg/2FfPeEk2mX 9 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import { ChakraProvider } from "@chakra-ui/react"; 4 | import "./index.css"; 5 | import App from "./App"; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById("root")); 8 | root.render( 9 | 10 | 11 | 12 | 13 | 14 | ); 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=DM+Serif+Display&display=swap"); 2 | @import url("https://fonts.googleapis.com/css2?family=DM+Serif+Display&family=Quattrocento+Sans&display=swap"); 3 | 4 | html, 5 | body { 6 | padding: 0; 7 | margin: 0; 8 | font-family: "Quattrocento Sans", sans-serif; 9 | } 10 | 11 | img { 12 | max-width: none !important; 13 | border-radius: 50%; 14 | } 15 | 16 | .app { 17 | background: url("./gradient-background.png") no-repeat center center fixed; 18 | background-size: cover; 19 | -webkit-background-size: cover; 20 | -moz-background-size: cover; 21 | -o-background-size: cover; 22 | } 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "decentralized-social", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@chakra-ui/react": "^2.3.4", 7 | "@emotion/react": "^11.10.4", 8 | "@emotion/styled": "^11.10.4", 9 | "@testing-library/jest-dom": "^5.16.5", 10 | "@testing-library/react": "^13.4.0", 11 | "@testing-library/user-event": "^13.5.0", 12 | "ethers": "^5.7.1", 13 | "framer-motion": "^7.3.6", 14 | "graphql": "^16.6.0", 15 | "react": "^18.2.0", 16 | "react-dom": "^18.2.0", 17 | "react-scripts": "5.0.1", 18 | "urql": "^3.0.3", 19 | "web-vitals": "^2.1.4" 20 | }, 21 | "scripts": { 22 | "start": "react-scripts start", 23 | "build": "react-scripts build", 24 | "test": "react-scripts test", 25 | "eject": "react-scripts eject" 26 | }, 27 | "eslintConfig": { 28 | "extends": [ 29 | "react-app", 30 | "react-app/jest" 31 | ] 32 | }, 33 | "browserslist": { 34 | "production": [ 35 | ">0.2%", 36 | "not dead", 37 | "not op_mini all" 38 | ], 39 | "development": [ 40 | "last 1 chrome version", 41 | "last 1 firefox version", 42 | "last 1 safari version" 43 | ] 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import { 3 | urlClient, 4 | LENS_HUB_CONTRACT_ADDRESS, 5 | queryRecommendedProfiles, 6 | queryExplorePublications, 7 | } from "./queries"; 8 | import LENSHUB from "./lenshub"; 9 | import { ethers } from "ethers"; 10 | import { Box, Button, Image } from "@chakra-ui/react"; 11 | 12 | function App() { 13 | const [account, setAccount] = useState(null); 14 | const [profiles, setProfiles] = useState([]); 15 | const [posts, setPosts] = useState([]); 16 | 17 | async function signIn() { 18 | const accounts = await window.ethereum.request({ 19 | method: "eth_requestAccounts", 20 | }); 21 | setAccount(accounts[0]); 22 | } 23 | 24 | async function getRecommendedProfiles() { 25 | const response = await urlClient 26 | .query(queryRecommendedProfiles) 27 | .toPromise(); 28 | const profiles = response.data.recommendedProfiles.slice(0, 5); 29 | setProfiles(profiles); 30 | } 31 | 32 | async function getPosts() { 33 | const response = await urlClient 34 | .query(queryExplorePublications) 35 | .toPromise(); 36 | 37 | const posts = response.data.explorePublications.items.filter((post) => { 38 | if (post.profile) return post; 39 | return ""; 40 | }); 41 | setPosts(posts); 42 | } 43 | 44 | async function follow(id) { 45 | const provider = new ethers.providers.Web3Provider(window.ethereum); 46 | const contract = new ethers.Contract( 47 | LENS_HUB_CONTRACT_ADDRESS, 48 | LENSHUB, 49 | provider.getSigner() 50 | ); 51 | const tx = await contract.follow([parseInt(id)], [0x0]); 52 | await tx.wait(); 53 | } 54 | 55 | useEffect(() => { 56 | getRecommendedProfiles(); 57 | getPosts(); 58 | }, []); 59 | 60 | const parseImageUrl = (profile) => { 61 | if (profile) { 62 | const url = profile.picture?.original?.url; 63 | if (url && url.startsWith("ipfs:")) { 64 | const ipfsHash = url.split("//")[1]; 65 | return `https://gateway.pinata.cloud/ipfs/${ipfsHash}`; 66 | } 67 | 68 | return url; 69 | } 70 | 71 | return "/default-avatar.png"; 72 | }; 73 | 74 | return ( 75 |
76 | {/* NAVBAR */} 77 | 78 | 87 | 88 | 93 | DECENTRA 94 | 95 | Decentralized Social Media App 96 | 97 | {account ? ( 98 | 99 | Connected 100 | 101 | ) : ( 102 | 109 | )} 110 | 111 | 112 | 113 | {/* CONTENT */} 114 | 121 | {/* POSTS */} 122 | 123 | {posts.map((post) => ( 124 | 131 | 132 | {/* PROFILE IMAGE */} 133 | 134 | profile { 140 | currentTarget.onerror = null; // prevents looping 141 | currentTarget.src = "/default-avatar.png"; 142 | }} 143 | /> 144 | 145 | 146 | {/* POST CONTENT */} 147 | 148 | 149 | 150 | {post.profile?.handle} 151 | 152 | 153 | follow-icon follow(post.id)} 159 | /> 160 | 161 | 162 | 163 | {post.metadata?.content} 164 | 165 | 166 | 167 | 168 | ))} 169 | 170 | 171 | {/* FRIEND SUGGESTIONS */} 172 | 179 | FRIEND SUGGESTIONS 180 | 181 | {profiles.map((profile, i) => ( 182 | 190 | profile { 196 | currentTarget.onerror = null; // prevents looping 197 | currentTarget.src = "/default-avatar.png"; 198 | }} 199 | /> 200 | 201 |

{profile.name}

202 |

{profile.handle}

203 |
204 |
205 | ))} 206 |
207 |
208 |
209 |
210 | ); 211 | } 212 | 213 | export default App; 214 | -------------------------------------------------------------------------------- /src/queries.js: -------------------------------------------------------------------------------- 1 | import { createClient } from "urql"; 2 | 3 | export const APIURL = "https://api.lens.dev"; 4 | export const LENS_HUB_CONTRACT_ADDRESS = 5 | "0xDb46d1Dc155634FbC732f92E853b10B288AD5a1d"; 6 | 7 | export const urlClient = createClient({ 8 | url: APIURL, 9 | }); 10 | 11 | export const queryRecommendedProfiles = ` 12 | query RecommendedProfiles { 13 | recommendedProfiles { 14 | id 15 | name 16 | bio 17 | attributes { 18 | displayType 19 | traitType 20 | key 21 | value 22 | } 23 | followNftAddress 24 | metadata 25 | isDefault 26 | picture { 27 | ... on NftImage { 28 | contractAddress 29 | tokenId 30 | uri 31 | verified 32 | } 33 | ... on MediaSet { 34 | original { 35 | url 36 | mimeType 37 | } 38 | } 39 | __typename 40 | } 41 | handle 42 | coverPicture { 43 | ... on NftImage { 44 | contractAddress 45 | tokenId 46 | uri 47 | verified 48 | } 49 | ... on MediaSet { 50 | original { 51 | url 52 | mimeType 53 | } 54 | } 55 | __typename 56 | } 57 | ownedBy 58 | dispatcher { 59 | address 60 | canUseRelay 61 | } 62 | stats { 63 | totalFollowers 64 | totalFollowing 65 | totalPosts 66 | totalComments 67 | totalMirrors 68 | totalPublications 69 | totalCollects 70 | } 71 | followModule { 72 | ... on FeeFollowModuleSettings { 73 | type 74 | amount { 75 | asset { 76 | symbol 77 | name 78 | decimals 79 | address 80 | } 81 | value 82 | } 83 | recipient 84 | } 85 | ... on ProfileFollowModuleSettings { 86 | type 87 | } 88 | ... on RevertFollowModuleSettings { 89 | type 90 | } 91 | } 92 | } 93 | } 94 | `; 95 | 96 | export const queryExplorePublications = ` 97 | query ExplorePublications { 98 | explorePublications(request: { 99 | sortCriteria: TOP_COMMENTED, 100 | publicationTypes: [POST, COMMENT, MIRROR], 101 | limit: 10 102 | }) { 103 | items { 104 | __typename 105 | ... on Post { 106 | ...PostFields 107 | } 108 | ... on Comment { 109 | ...CommentFields 110 | } 111 | ... on Mirror { 112 | ...MirrorFields 113 | } 114 | } 115 | pageInfo { 116 | prev 117 | next 118 | totalCount 119 | } 120 | } 121 | } 122 | 123 | fragment MediaFields on Media { 124 | url 125 | width 126 | height 127 | mimeType 128 | } 129 | 130 | fragment ProfileFields on Profile { 131 | id 132 | name 133 | bio 134 | attributes { 135 | displayType 136 | traitType 137 | key 138 | value 139 | } 140 | isFollowedByMe 141 | isFollowing(who: null) 142 | followNftAddress 143 | metadata 144 | isDefault 145 | handle 146 | picture { 147 | ... on NftImage { 148 | contractAddress 149 | tokenId 150 | uri 151 | verified 152 | } 153 | ... on MediaSet { 154 | original { 155 | ...MediaFields 156 | } 157 | small { 158 | ...MediaFields 159 | } 160 | medium { 161 | ...MediaFields 162 | } 163 | } 164 | } 165 | coverPicture { 166 | ... on NftImage { 167 | contractAddress 168 | tokenId 169 | uri 170 | verified 171 | } 172 | ... on MediaSet { 173 | original { 174 | ...MediaFields 175 | } 176 | small { 177 | ...MediaFields 178 | } 179 | medium { 180 | ...MediaFields 181 | } 182 | } 183 | } 184 | ownedBy 185 | dispatcher { 186 | address 187 | } 188 | stats { 189 | totalFollowers 190 | totalFollowing 191 | totalPosts 192 | totalComments 193 | totalMirrors 194 | totalPublications 195 | totalCollects 196 | } 197 | followModule { 198 | ...FollowModuleFields 199 | } 200 | } 201 | 202 | fragment PublicationStatsFields on PublicationStats { 203 | totalAmountOfMirrors 204 | totalAmountOfCollects 205 | totalAmountOfComments 206 | } 207 | 208 | fragment MetadataOutputFields on MetadataOutput { 209 | name 210 | description 211 | content 212 | media { 213 | original { 214 | ...MediaFields 215 | } 216 | small { 217 | ...MediaFields 218 | } 219 | medium { 220 | ...MediaFields 221 | } 222 | } 223 | attributes { 224 | displayType 225 | traitType 226 | value 227 | } 228 | } 229 | 230 | fragment Erc20Fields on Erc20 { 231 | name 232 | symbol 233 | decimals 234 | address 235 | } 236 | 237 | fragment PostFields on Post { 238 | id 239 | profile { 240 | ...ProfileFields 241 | } 242 | stats { 243 | ...PublicationStatsFields 244 | } 245 | metadata { 246 | ...MetadataOutputFields 247 | } 248 | createdAt 249 | collectModule { 250 | ...CollectModuleFields 251 | } 252 | referenceModule { 253 | ...ReferenceModuleFields 254 | } 255 | appId 256 | hidden 257 | reaction(request: null) 258 | mirrors(by: null) 259 | hasCollectedByMe 260 | } 261 | 262 | fragment MirrorBaseFields on Mirror { 263 | id 264 | profile { 265 | ...ProfileFields 266 | } 267 | stats { 268 | ...PublicationStatsFields 269 | } 270 | metadata { 271 | ...MetadataOutputFields 272 | } 273 | createdAt 274 | collectModule { 275 | ...CollectModuleFields 276 | } 277 | referenceModule { 278 | ...ReferenceModuleFields 279 | } 280 | appId 281 | hidden 282 | reaction(request: null) 283 | hasCollectedByMe 284 | } 285 | 286 | fragment MirrorFields on Mirror { 287 | ...MirrorBaseFields 288 | mirrorOf { 289 | ... on Post { 290 | ...PostFields 291 | } 292 | ... on Comment { 293 | ...CommentFields 294 | } 295 | } 296 | } 297 | 298 | fragment CommentBaseFields on Comment { 299 | id 300 | profile { 301 | ...ProfileFields 302 | } 303 | stats { 304 | ...PublicationStatsFields 305 | } 306 | metadata { 307 | ...MetadataOutputFields 308 | } 309 | createdAt 310 | collectModule { 311 | ...CollectModuleFields 312 | } 313 | referenceModule { 314 | ...ReferenceModuleFields 315 | } 316 | appId 317 | hidden 318 | reaction(request: null) 319 | mirrors(by: null) 320 | hasCollectedByMe 321 | } 322 | 323 | fragment CommentFields on Comment { 324 | ...CommentBaseFields 325 | mainPost { 326 | ... on Post { 327 | ...PostFields 328 | } 329 | ... on Mirror { 330 | ...MirrorBaseFields 331 | mirrorOf { 332 | ... on Post { 333 | ...PostFields 334 | } 335 | ... on Comment { 336 | ...CommentMirrorOfFields 337 | } 338 | } 339 | } 340 | } 341 | } 342 | 343 | fragment CommentMirrorOfFields on Comment { 344 | ...CommentBaseFields 345 | mainPost { 346 | ... on Post { 347 | ...PostFields 348 | } 349 | ... on Mirror { 350 | ...MirrorBaseFields 351 | } 352 | } 353 | } 354 | 355 | fragment FollowModuleFields on FollowModule { 356 | ... on FeeFollowModuleSettings { 357 | type 358 | amount { 359 | asset { 360 | name 361 | symbol 362 | decimals 363 | address 364 | } 365 | value 366 | } 367 | recipient 368 | } 369 | ... on ProfileFollowModuleSettings { 370 | type 371 | contractAddress 372 | } 373 | ... on RevertFollowModuleSettings { 374 | type 375 | contractAddress 376 | } 377 | ... on UnknownFollowModuleSettings { 378 | type 379 | contractAddress 380 | followModuleReturnData 381 | } 382 | } 383 | 384 | fragment CollectModuleFields on CollectModule { 385 | __typename 386 | ... on FreeCollectModuleSettings { 387 | type 388 | followerOnly 389 | contractAddress 390 | } 391 | ... on FeeCollectModuleSettings { 392 | type 393 | amount { 394 | asset { 395 | ...Erc20Fields 396 | } 397 | value 398 | } 399 | recipient 400 | referralFee 401 | } 402 | ... on LimitedFeeCollectModuleSettings { 403 | type 404 | collectLimit 405 | amount { 406 | asset { 407 | ...Erc20Fields 408 | } 409 | value 410 | } 411 | recipient 412 | referralFee 413 | } 414 | ... on LimitedTimedFeeCollectModuleSettings { 415 | type 416 | collectLimit 417 | amount { 418 | asset { 419 | ...Erc20Fields 420 | } 421 | value 422 | } 423 | recipient 424 | referralFee 425 | endTimestamp 426 | } 427 | ... on RevertCollectModuleSettings { 428 | type 429 | } 430 | ... on TimedFeeCollectModuleSettings { 431 | type 432 | amount { 433 | asset { 434 | ...Erc20Fields 435 | } 436 | value 437 | } 438 | recipient 439 | referralFee 440 | endTimestamp 441 | } 442 | ... on UnknownCollectModuleSettings { 443 | type 444 | contractAddress 445 | collectModuleReturnData 446 | } 447 | } 448 | 449 | fragment ReferenceModuleFields on ReferenceModule { 450 | ... on FollowOnlyReferenceModuleSettings { 451 | type 452 | contractAddress 453 | } 454 | ... on UnknownReferenceModuleSettings { 455 | type 456 | contractAddress 457 | referenceModuleReturnData 458 | } 459 | ... on DegreesOfSeparationReferenceModuleSettings { 460 | type 461 | contractAddress 462 | commentsRestricted 463 | mirrorsRestricted 464 | degreesOfSeparation 465 | } 466 | } 467 | 468 | 469 | `; 470 | -------------------------------------------------------------------------------- /src/lenshub.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { "internalType": "address", "name": "followNFTImpl", "type": "address" }, 5 | { "internalType": "address", "name": "collectNFTImpl", "type": "address" } 6 | ], 7 | "stateMutability": "nonpayable", 8 | "type": "constructor" 9 | }, 10 | { "inputs": [], "name": "CallerNotCollectNFT", "type": "error" }, 11 | { "inputs": [], "name": "CallerNotFollowNFT", "type": "error" }, 12 | { "inputs": [], "name": "CannotInitImplementation", "type": "error" }, 13 | { "inputs": [], "name": "EmergencyAdminCannotUnpause", "type": "error" }, 14 | { "inputs": [], "name": "InitParamsInvalid", "type": "error" }, 15 | { "inputs": [], "name": "Initialized", "type": "error" }, 16 | { "inputs": [], "name": "NotGovernance", "type": "error" }, 17 | { "inputs": [], "name": "NotGovernanceOrEmergencyAdmin", "type": "error" }, 18 | { "inputs": [], "name": "NotOwnerOrApproved", "type": "error" }, 19 | { "inputs": [], "name": "NotProfileOwner", "type": "error" }, 20 | { "inputs": [], "name": "NotProfileOwnerOrDispatcher", "type": "error" }, 21 | { "inputs": [], "name": "Paused", "type": "error" }, 22 | { "inputs": [], "name": "ProfileCreatorNotWhitelisted", "type": "error" }, 23 | { "inputs": [], "name": "ProfileImageURILengthInvalid", "type": "error" }, 24 | { "inputs": [], "name": "PublicationDoesNotExist", "type": "error" }, 25 | { "inputs": [], "name": "PublishingPaused", "type": "error" }, 26 | { "inputs": [], "name": "SignatureExpired", "type": "error" }, 27 | { "inputs": [], "name": "SignatureInvalid", "type": "error" }, 28 | { "inputs": [], "name": "ZeroSpender", "type": "error" }, 29 | { 30 | "anonymous": false, 31 | "inputs": [ 32 | { 33 | "indexed": true, 34 | "internalType": "address", 35 | "name": "owner", 36 | "type": "address" 37 | }, 38 | { 39 | "indexed": true, 40 | "internalType": "address", 41 | "name": "approved", 42 | "type": "address" 43 | }, 44 | { 45 | "indexed": true, 46 | "internalType": "uint256", 47 | "name": "tokenId", 48 | "type": "uint256" 49 | } 50 | ], 51 | "name": "Approval", 52 | "type": "event" 53 | }, 54 | { 55 | "anonymous": false, 56 | "inputs": [ 57 | { 58 | "indexed": true, 59 | "internalType": "address", 60 | "name": "owner", 61 | "type": "address" 62 | }, 63 | { 64 | "indexed": true, 65 | "internalType": "address", 66 | "name": "operator", 67 | "type": "address" 68 | }, 69 | { 70 | "indexed": false, 71 | "internalType": "bool", 72 | "name": "approved", 73 | "type": "bool" 74 | } 75 | ], 76 | "name": "ApprovalForAll", 77 | "type": "event" 78 | }, 79 | { 80 | "anonymous": false, 81 | "inputs": [ 82 | { 83 | "indexed": true, 84 | "internalType": "address", 85 | "name": "from", 86 | "type": "address" 87 | }, 88 | { 89 | "indexed": true, 90 | "internalType": "address", 91 | "name": "to", 92 | "type": "address" 93 | }, 94 | { 95 | "indexed": true, 96 | "internalType": "uint256", 97 | "name": "tokenId", 98 | "type": "uint256" 99 | } 100 | ], 101 | "name": "Transfer", 102 | "type": "event" 103 | }, 104 | { 105 | "inputs": [ 106 | { "internalType": "address", "name": "to", "type": "address" }, 107 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 108 | ], 109 | "name": "approve", 110 | "outputs": [], 111 | "stateMutability": "nonpayable", 112 | "type": "function" 113 | }, 114 | { 115 | "inputs": [ 116 | { "internalType": "address", "name": "owner", "type": "address" } 117 | ], 118 | "name": "balanceOf", 119 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 120 | "stateMutability": "view", 121 | "type": "function" 122 | }, 123 | { 124 | "inputs": [ 125 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 126 | ], 127 | "name": "burn", 128 | "outputs": [], 129 | "stateMutability": "nonpayable", 130 | "type": "function" 131 | }, 132 | { 133 | "inputs": [ 134 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, 135 | { 136 | "components": [ 137 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 138 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 139 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 140 | { "internalType": "uint256", "name": "deadline", "type": "uint256" } 141 | ], 142 | "internalType": "struct DataTypes.EIP712Signature", 143 | "name": "sig", 144 | "type": "tuple" 145 | } 146 | ], 147 | "name": "burnWithSig", 148 | "outputs": [], 149 | "stateMutability": "nonpayable", 150 | "type": "function" 151 | }, 152 | { 153 | "inputs": [ 154 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 155 | { "internalType": "uint256", "name": "pubId", "type": "uint256" }, 156 | { "internalType": "bytes", "name": "data", "type": "bytes" } 157 | ], 158 | "name": "collect", 159 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 160 | "stateMutability": "nonpayable", 161 | "type": "function" 162 | }, 163 | { 164 | "inputs": [ 165 | { 166 | "components": [ 167 | { "internalType": "address", "name": "collector", "type": "address" }, 168 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 169 | { "internalType": "uint256", "name": "pubId", "type": "uint256" }, 170 | { "internalType": "bytes", "name": "data", "type": "bytes" }, 171 | { 172 | "components": [ 173 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 174 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 175 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 176 | { 177 | "internalType": "uint256", 178 | "name": "deadline", 179 | "type": "uint256" 180 | } 181 | ], 182 | "internalType": "struct DataTypes.EIP712Signature", 183 | "name": "sig", 184 | "type": "tuple" 185 | } 186 | ], 187 | "internalType": "struct DataTypes.CollectWithSigData", 188 | "name": "vars", 189 | "type": "tuple" 190 | } 191 | ], 192 | "name": "collectWithSig", 193 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 194 | "stateMutability": "nonpayable", 195 | "type": "function" 196 | }, 197 | { 198 | "inputs": [ 199 | { 200 | "components": [ 201 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 202 | { "internalType": "string", "name": "contentURI", "type": "string" }, 203 | { 204 | "internalType": "uint256", 205 | "name": "profileIdPointed", 206 | "type": "uint256" 207 | }, 208 | { 209 | "internalType": "uint256", 210 | "name": "pubIdPointed", 211 | "type": "uint256" 212 | }, 213 | { 214 | "internalType": "bytes", 215 | "name": "referenceModuleData", 216 | "type": "bytes" 217 | }, 218 | { 219 | "internalType": "address", 220 | "name": "collectModule", 221 | "type": "address" 222 | }, 223 | { 224 | "internalType": "bytes", 225 | "name": "collectModuleInitData", 226 | "type": "bytes" 227 | }, 228 | { 229 | "internalType": "address", 230 | "name": "referenceModule", 231 | "type": "address" 232 | }, 233 | { 234 | "internalType": "bytes", 235 | "name": "referenceModuleInitData", 236 | "type": "bytes" 237 | } 238 | ], 239 | "internalType": "struct DataTypes.CommentData", 240 | "name": "vars", 241 | "type": "tuple" 242 | } 243 | ], 244 | "name": "comment", 245 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 246 | "stateMutability": "nonpayable", 247 | "type": "function" 248 | }, 249 | { 250 | "inputs": [ 251 | { 252 | "components": [ 253 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 254 | { "internalType": "string", "name": "contentURI", "type": "string" }, 255 | { 256 | "internalType": "uint256", 257 | "name": "profileIdPointed", 258 | "type": "uint256" 259 | }, 260 | { 261 | "internalType": "uint256", 262 | "name": "pubIdPointed", 263 | "type": "uint256" 264 | }, 265 | { 266 | "internalType": "bytes", 267 | "name": "referenceModuleData", 268 | "type": "bytes" 269 | }, 270 | { 271 | "internalType": "address", 272 | "name": "collectModule", 273 | "type": "address" 274 | }, 275 | { 276 | "internalType": "bytes", 277 | "name": "collectModuleInitData", 278 | "type": "bytes" 279 | }, 280 | { 281 | "internalType": "address", 282 | "name": "referenceModule", 283 | "type": "address" 284 | }, 285 | { 286 | "internalType": "bytes", 287 | "name": "referenceModuleInitData", 288 | "type": "bytes" 289 | }, 290 | { 291 | "components": [ 292 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 293 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 294 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 295 | { 296 | "internalType": "uint256", 297 | "name": "deadline", 298 | "type": "uint256" 299 | } 300 | ], 301 | "internalType": "struct DataTypes.EIP712Signature", 302 | "name": "sig", 303 | "type": "tuple" 304 | } 305 | ], 306 | "internalType": "struct DataTypes.CommentWithSigData", 307 | "name": "vars", 308 | "type": "tuple" 309 | } 310 | ], 311 | "name": "commentWithSig", 312 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 313 | "stateMutability": "nonpayable", 314 | "type": "function" 315 | }, 316 | { 317 | "inputs": [ 318 | { 319 | "components": [ 320 | { "internalType": "address", "name": "to", "type": "address" }, 321 | { "internalType": "string", "name": "handle", "type": "string" }, 322 | { "internalType": "string", "name": "imageURI", "type": "string" }, 323 | { 324 | "internalType": "address", 325 | "name": "followModule", 326 | "type": "address" 327 | }, 328 | { 329 | "internalType": "bytes", 330 | "name": "followModuleInitData", 331 | "type": "bytes" 332 | }, 333 | { "internalType": "string", "name": "followNFTURI", "type": "string" } 334 | ], 335 | "internalType": "struct DataTypes.CreateProfileData", 336 | "name": "vars", 337 | "type": "tuple" 338 | } 339 | ], 340 | "name": "createProfile", 341 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 342 | "stateMutability": "nonpayable", 343 | "type": "function" 344 | }, 345 | { 346 | "inputs": [ 347 | { "internalType": "address", "name": "wallet", "type": "address" } 348 | ], 349 | "name": "defaultProfile", 350 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 351 | "stateMutability": "view", 352 | "type": "function" 353 | }, 354 | { 355 | "inputs": [ 356 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 357 | { "internalType": "uint256", "name": "pubId", "type": "uint256" }, 358 | { "internalType": "uint256", "name": "collectNFTId", "type": "uint256" }, 359 | { "internalType": "address", "name": "from", "type": "address" }, 360 | { "internalType": "address", "name": "to", "type": "address" } 361 | ], 362 | "name": "emitCollectNFTTransferEvent", 363 | "outputs": [], 364 | "stateMutability": "nonpayable", 365 | "type": "function" 366 | }, 367 | { 368 | "inputs": [ 369 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 370 | { "internalType": "uint256", "name": "followNFTId", "type": "uint256" }, 371 | { "internalType": "address", "name": "from", "type": "address" }, 372 | { "internalType": "address", "name": "to", "type": "address" } 373 | ], 374 | "name": "emitFollowNFTTransferEvent", 375 | "outputs": [], 376 | "stateMutability": "nonpayable", 377 | "type": "function" 378 | }, 379 | { 380 | "inputs": [ 381 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 382 | ], 383 | "name": "exists", 384 | "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], 385 | "stateMutability": "view", 386 | "type": "function" 387 | }, 388 | { 389 | "inputs": [ 390 | { 391 | "internalType": "uint256[]", 392 | "name": "profileIds", 393 | "type": "uint256[]" 394 | }, 395 | { "internalType": "bytes[]", "name": "datas", "type": "bytes[]" } 396 | ], 397 | "name": "follow", 398 | "outputs": [ 399 | { "internalType": "uint256[]", "name": "", "type": "uint256[]" } 400 | ], 401 | "stateMutability": "nonpayable", 402 | "type": "function" 403 | }, 404 | { 405 | "inputs": [ 406 | { 407 | "components": [ 408 | { "internalType": "address", "name": "follower", "type": "address" }, 409 | { 410 | "internalType": "uint256[]", 411 | "name": "profileIds", 412 | "type": "uint256[]" 413 | }, 414 | { "internalType": "bytes[]", "name": "datas", "type": "bytes[]" }, 415 | { 416 | "components": [ 417 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 418 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 419 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 420 | { 421 | "internalType": "uint256", 422 | "name": "deadline", 423 | "type": "uint256" 424 | } 425 | ], 426 | "internalType": "struct DataTypes.EIP712Signature", 427 | "name": "sig", 428 | "type": "tuple" 429 | } 430 | ], 431 | "internalType": "struct DataTypes.FollowWithSigData", 432 | "name": "vars", 433 | "type": "tuple" 434 | } 435 | ], 436 | "name": "followWithSig", 437 | "outputs": [ 438 | { "internalType": "uint256[]", "name": "", "type": "uint256[]" } 439 | ], 440 | "stateMutability": "nonpayable", 441 | "type": "function" 442 | }, 443 | { 444 | "inputs": [ 445 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 446 | ], 447 | "name": "getApproved", 448 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 449 | "stateMutability": "view", 450 | "type": "function" 451 | }, 452 | { 453 | "inputs": [ 454 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 455 | { "internalType": "uint256", "name": "pubId", "type": "uint256" } 456 | ], 457 | "name": "getCollectModule", 458 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 459 | "stateMutability": "view", 460 | "type": "function" 461 | }, 462 | { 463 | "inputs": [ 464 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 465 | { "internalType": "uint256", "name": "pubId", "type": "uint256" } 466 | ], 467 | "name": "getCollectNFT", 468 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 469 | "stateMutability": "view", 470 | "type": "function" 471 | }, 472 | { 473 | "inputs": [], 474 | "name": "getCollectNFTImpl", 475 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 476 | "stateMutability": "view", 477 | "type": "function" 478 | }, 479 | { 480 | "inputs": [ 481 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 482 | { "internalType": "uint256", "name": "pubId", "type": "uint256" } 483 | ], 484 | "name": "getContentURI", 485 | "outputs": [{ "internalType": "string", "name": "", "type": "string" }], 486 | "stateMutability": "view", 487 | "type": "function" 488 | }, 489 | { 490 | "inputs": [ 491 | { "internalType": "uint256", "name": "profileId", "type": "uint256" } 492 | ], 493 | "name": "getDispatcher", 494 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 495 | "stateMutability": "view", 496 | "type": "function" 497 | }, 498 | { 499 | "inputs": [], 500 | "name": "getDomainSeparator", 501 | "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], 502 | "stateMutability": "view", 503 | "type": "function" 504 | }, 505 | { 506 | "inputs": [ 507 | { "internalType": "uint256", "name": "profileId", "type": "uint256" } 508 | ], 509 | "name": "getFollowModule", 510 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 511 | "stateMutability": "view", 512 | "type": "function" 513 | }, 514 | { 515 | "inputs": [ 516 | { "internalType": "uint256", "name": "profileId", "type": "uint256" } 517 | ], 518 | "name": "getFollowNFT", 519 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 520 | "stateMutability": "view", 521 | "type": "function" 522 | }, 523 | { 524 | "inputs": [], 525 | "name": "getFollowNFTImpl", 526 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 527 | "stateMutability": "view", 528 | "type": "function" 529 | }, 530 | { 531 | "inputs": [ 532 | { "internalType": "uint256", "name": "profileId", "type": "uint256" } 533 | ], 534 | "name": "getFollowNFTURI", 535 | "outputs": [{ "internalType": "string", "name": "", "type": "string" }], 536 | "stateMutability": "view", 537 | "type": "function" 538 | }, 539 | { 540 | "inputs": [], 541 | "name": "getGovernance", 542 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 543 | "stateMutability": "view", 544 | "type": "function" 545 | }, 546 | { 547 | "inputs": [ 548 | { "internalType": "uint256", "name": "profileId", "type": "uint256" } 549 | ], 550 | "name": "getHandle", 551 | "outputs": [{ "internalType": "string", "name": "", "type": "string" }], 552 | "stateMutability": "view", 553 | "type": "function" 554 | }, 555 | { 556 | "inputs": [ 557 | { "internalType": "uint256", "name": "profileId", "type": "uint256" } 558 | ], 559 | "name": "getProfile", 560 | "outputs": [ 561 | { 562 | "components": [ 563 | { "internalType": "uint256", "name": "pubCount", "type": "uint256" }, 564 | { 565 | "internalType": "address", 566 | "name": "followModule", 567 | "type": "address" 568 | }, 569 | { "internalType": "address", "name": "followNFT", "type": "address" }, 570 | { "internalType": "string", "name": "handle", "type": "string" }, 571 | { "internalType": "string", "name": "imageURI", "type": "string" }, 572 | { "internalType": "string", "name": "followNFTURI", "type": "string" } 573 | ], 574 | "internalType": "struct DataTypes.ProfileStruct", 575 | "name": "", 576 | "type": "tuple" 577 | } 578 | ], 579 | "stateMutability": "view", 580 | "type": "function" 581 | }, 582 | { 583 | "inputs": [ 584 | { "internalType": "string", "name": "handle", "type": "string" } 585 | ], 586 | "name": "getProfileIdByHandle", 587 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 588 | "stateMutability": "view", 589 | "type": "function" 590 | }, 591 | { 592 | "inputs": [ 593 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 594 | { "internalType": "uint256", "name": "pubId", "type": "uint256" } 595 | ], 596 | "name": "getPub", 597 | "outputs": [ 598 | { 599 | "components": [ 600 | { 601 | "internalType": "uint256", 602 | "name": "profileIdPointed", 603 | "type": "uint256" 604 | }, 605 | { 606 | "internalType": "uint256", 607 | "name": "pubIdPointed", 608 | "type": "uint256" 609 | }, 610 | { "internalType": "string", "name": "contentURI", "type": "string" }, 611 | { 612 | "internalType": "address", 613 | "name": "referenceModule", 614 | "type": "address" 615 | }, 616 | { 617 | "internalType": "address", 618 | "name": "collectModule", 619 | "type": "address" 620 | }, 621 | { "internalType": "address", "name": "collectNFT", "type": "address" } 622 | ], 623 | "internalType": "struct DataTypes.PublicationStruct", 624 | "name": "", 625 | "type": "tuple" 626 | } 627 | ], 628 | "stateMutability": "view", 629 | "type": "function" 630 | }, 631 | { 632 | "inputs": [ 633 | { "internalType": "uint256", "name": "profileId", "type": "uint256" } 634 | ], 635 | "name": "getPubCount", 636 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 637 | "stateMutability": "view", 638 | "type": "function" 639 | }, 640 | { 641 | "inputs": [ 642 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 643 | { "internalType": "uint256", "name": "pubId", "type": "uint256" } 644 | ], 645 | "name": "getPubPointer", 646 | "outputs": [ 647 | { "internalType": "uint256", "name": "", "type": "uint256" }, 648 | { "internalType": "uint256", "name": "", "type": "uint256" } 649 | ], 650 | "stateMutability": "view", 651 | "type": "function" 652 | }, 653 | { 654 | "inputs": [ 655 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 656 | { "internalType": "uint256", "name": "pubId", "type": "uint256" } 657 | ], 658 | "name": "getPubType", 659 | "outputs": [ 660 | { "internalType": "enum DataTypes.PubType", "name": "", "type": "uint8" } 661 | ], 662 | "stateMutability": "view", 663 | "type": "function" 664 | }, 665 | { 666 | "inputs": [ 667 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 668 | { "internalType": "uint256", "name": "pubId", "type": "uint256" } 669 | ], 670 | "name": "getReferenceModule", 671 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 672 | "stateMutability": "view", 673 | "type": "function" 674 | }, 675 | { 676 | "inputs": [], 677 | "name": "getState", 678 | "outputs": [ 679 | { 680 | "internalType": "enum DataTypes.ProtocolState", 681 | "name": "", 682 | "type": "uint8" 683 | } 684 | ], 685 | "stateMutability": "view", 686 | "type": "function" 687 | }, 688 | { 689 | "inputs": [ 690 | { "internalType": "string", "name": "name", "type": "string" }, 691 | { "internalType": "string", "name": "symbol", "type": "string" }, 692 | { "internalType": "address", "name": "newGovernance", "type": "address" } 693 | ], 694 | "name": "initialize", 695 | "outputs": [], 696 | "stateMutability": "nonpayable", 697 | "type": "function" 698 | }, 699 | { 700 | "inputs": [ 701 | { "internalType": "address", "name": "owner", "type": "address" }, 702 | { "internalType": "address", "name": "operator", "type": "address" } 703 | ], 704 | "name": "isApprovedForAll", 705 | "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], 706 | "stateMutability": "view", 707 | "type": "function" 708 | }, 709 | { 710 | "inputs": [ 711 | { "internalType": "address", "name": "collectModule", "type": "address" } 712 | ], 713 | "name": "isCollectModuleWhitelisted", 714 | "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], 715 | "stateMutability": "view", 716 | "type": "function" 717 | }, 718 | { 719 | "inputs": [ 720 | { "internalType": "address", "name": "followModule", "type": "address" } 721 | ], 722 | "name": "isFollowModuleWhitelisted", 723 | "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], 724 | "stateMutability": "view", 725 | "type": "function" 726 | }, 727 | { 728 | "inputs": [ 729 | { "internalType": "address", "name": "profileCreator", "type": "address" } 730 | ], 731 | "name": "isProfileCreatorWhitelisted", 732 | "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], 733 | "stateMutability": "view", 734 | "type": "function" 735 | }, 736 | { 737 | "inputs": [ 738 | { 739 | "internalType": "address", 740 | "name": "referenceModule", 741 | "type": "address" 742 | } 743 | ], 744 | "name": "isReferenceModuleWhitelisted", 745 | "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], 746 | "stateMutability": "view", 747 | "type": "function" 748 | }, 749 | { 750 | "inputs": [ 751 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 752 | ], 753 | "name": "mintTimestampOf", 754 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 755 | "stateMutability": "view", 756 | "type": "function" 757 | }, 758 | { 759 | "inputs": [ 760 | { 761 | "components": [ 762 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 763 | { 764 | "internalType": "uint256", 765 | "name": "profileIdPointed", 766 | "type": "uint256" 767 | }, 768 | { 769 | "internalType": "uint256", 770 | "name": "pubIdPointed", 771 | "type": "uint256" 772 | }, 773 | { 774 | "internalType": "bytes", 775 | "name": "referenceModuleData", 776 | "type": "bytes" 777 | }, 778 | { 779 | "internalType": "address", 780 | "name": "referenceModule", 781 | "type": "address" 782 | }, 783 | { 784 | "internalType": "bytes", 785 | "name": "referenceModuleInitData", 786 | "type": "bytes" 787 | } 788 | ], 789 | "internalType": "struct DataTypes.MirrorData", 790 | "name": "vars", 791 | "type": "tuple" 792 | } 793 | ], 794 | "name": "mirror", 795 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 796 | "stateMutability": "nonpayable", 797 | "type": "function" 798 | }, 799 | { 800 | "inputs": [ 801 | { 802 | "components": [ 803 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 804 | { 805 | "internalType": "uint256", 806 | "name": "profileIdPointed", 807 | "type": "uint256" 808 | }, 809 | { 810 | "internalType": "uint256", 811 | "name": "pubIdPointed", 812 | "type": "uint256" 813 | }, 814 | { 815 | "internalType": "bytes", 816 | "name": "referenceModuleData", 817 | "type": "bytes" 818 | }, 819 | { 820 | "internalType": "address", 821 | "name": "referenceModule", 822 | "type": "address" 823 | }, 824 | { 825 | "internalType": "bytes", 826 | "name": "referenceModuleInitData", 827 | "type": "bytes" 828 | }, 829 | { 830 | "components": [ 831 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 832 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 833 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 834 | { 835 | "internalType": "uint256", 836 | "name": "deadline", 837 | "type": "uint256" 838 | } 839 | ], 840 | "internalType": "struct DataTypes.EIP712Signature", 841 | "name": "sig", 842 | "type": "tuple" 843 | } 844 | ], 845 | "internalType": "struct DataTypes.MirrorWithSigData", 846 | "name": "vars", 847 | "type": "tuple" 848 | } 849 | ], 850 | "name": "mirrorWithSig", 851 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 852 | "stateMutability": "nonpayable", 853 | "type": "function" 854 | }, 855 | { 856 | "inputs": [], 857 | "name": "name", 858 | "outputs": [{ "internalType": "string", "name": "", "type": "string" }], 859 | "stateMutability": "view", 860 | "type": "function" 861 | }, 862 | { 863 | "inputs": [ 864 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 865 | ], 866 | "name": "ownerOf", 867 | "outputs": [{ "internalType": "address", "name": "", "type": "address" }], 868 | "stateMutability": "view", 869 | "type": "function" 870 | }, 871 | { 872 | "inputs": [ 873 | { "internalType": "address", "name": "spender", "type": "address" }, 874 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, 875 | { 876 | "components": [ 877 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 878 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 879 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 880 | { "internalType": "uint256", "name": "deadline", "type": "uint256" } 881 | ], 882 | "internalType": "struct DataTypes.EIP712Signature", 883 | "name": "sig", 884 | "type": "tuple" 885 | } 886 | ], 887 | "name": "permit", 888 | "outputs": [], 889 | "stateMutability": "nonpayable", 890 | "type": "function" 891 | }, 892 | { 893 | "inputs": [ 894 | { "internalType": "address", "name": "owner", "type": "address" }, 895 | { "internalType": "address", "name": "operator", "type": "address" }, 896 | { "internalType": "bool", "name": "approved", "type": "bool" }, 897 | { 898 | "components": [ 899 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 900 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 901 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 902 | { "internalType": "uint256", "name": "deadline", "type": "uint256" } 903 | ], 904 | "internalType": "struct DataTypes.EIP712Signature", 905 | "name": "sig", 906 | "type": "tuple" 907 | } 908 | ], 909 | "name": "permitForAll", 910 | "outputs": [], 911 | "stateMutability": "nonpayable", 912 | "type": "function" 913 | }, 914 | { 915 | "inputs": [ 916 | { 917 | "components": [ 918 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 919 | { "internalType": "string", "name": "contentURI", "type": "string" }, 920 | { 921 | "internalType": "address", 922 | "name": "collectModule", 923 | "type": "address" 924 | }, 925 | { 926 | "internalType": "bytes", 927 | "name": "collectModuleInitData", 928 | "type": "bytes" 929 | }, 930 | { 931 | "internalType": "address", 932 | "name": "referenceModule", 933 | "type": "address" 934 | }, 935 | { 936 | "internalType": "bytes", 937 | "name": "referenceModuleInitData", 938 | "type": "bytes" 939 | } 940 | ], 941 | "internalType": "struct DataTypes.PostData", 942 | "name": "vars", 943 | "type": "tuple" 944 | } 945 | ], 946 | "name": "post", 947 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 948 | "stateMutability": "nonpayable", 949 | "type": "function" 950 | }, 951 | { 952 | "inputs": [ 953 | { 954 | "components": [ 955 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 956 | { "internalType": "string", "name": "contentURI", "type": "string" }, 957 | { 958 | "internalType": "address", 959 | "name": "collectModule", 960 | "type": "address" 961 | }, 962 | { 963 | "internalType": "bytes", 964 | "name": "collectModuleInitData", 965 | "type": "bytes" 966 | }, 967 | { 968 | "internalType": "address", 969 | "name": "referenceModule", 970 | "type": "address" 971 | }, 972 | { 973 | "internalType": "bytes", 974 | "name": "referenceModuleInitData", 975 | "type": "bytes" 976 | }, 977 | { 978 | "components": [ 979 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 980 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 981 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 982 | { 983 | "internalType": "uint256", 984 | "name": "deadline", 985 | "type": "uint256" 986 | } 987 | ], 988 | "internalType": "struct DataTypes.EIP712Signature", 989 | "name": "sig", 990 | "type": "tuple" 991 | } 992 | ], 993 | "internalType": "struct DataTypes.PostWithSigData", 994 | "name": "vars", 995 | "type": "tuple" 996 | } 997 | ], 998 | "name": "postWithSig", 999 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 1000 | "stateMutability": "nonpayable", 1001 | "type": "function" 1002 | }, 1003 | { 1004 | "inputs": [ 1005 | { "internalType": "address", "name": "from", "type": "address" }, 1006 | { "internalType": "address", "name": "to", "type": "address" }, 1007 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 1008 | ], 1009 | "name": "safeTransferFrom", 1010 | "outputs": [], 1011 | "stateMutability": "nonpayable", 1012 | "type": "function" 1013 | }, 1014 | { 1015 | "inputs": [ 1016 | { "internalType": "address", "name": "from", "type": "address" }, 1017 | { "internalType": "address", "name": "to", "type": "address" }, 1018 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, 1019 | { "internalType": "bytes", "name": "_data", "type": "bytes" } 1020 | ], 1021 | "name": "safeTransferFrom", 1022 | "outputs": [], 1023 | "stateMutability": "nonpayable", 1024 | "type": "function" 1025 | }, 1026 | { 1027 | "inputs": [ 1028 | { "internalType": "address", "name": "operator", "type": "address" }, 1029 | { "internalType": "bool", "name": "approved", "type": "bool" } 1030 | ], 1031 | "name": "setApprovalForAll", 1032 | "outputs": [], 1033 | "stateMutability": "nonpayable", 1034 | "type": "function" 1035 | }, 1036 | { 1037 | "inputs": [ 1038 | { "internalType": "uint256", "name": "profileId", "type": "uint256" } 1039 | ], 1040 | "name": "setDefaultProfile", 1041 | "outputs": [], 1042 | "stateMutability": "nonpayable", 1043 | "type": "function" 1044 | }, 1045 | { 1046 | "inputs": [ 1047 | { 1048 | "components": [ 1049 | { "internalType": "address", "name": "wallet", "type": "address" }, 1050 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 1051 | { 1052 | "components": [ 1053 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 1054 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 1055 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 1056 | { 1057 | "internalType": "uint256", 1058 | "name": "deadline", 1059 | "type": "uint256" 1060 | } 1061 | ], 1062 | "internalType": "struct DataTypes.EIP712Signature", 1063 | "name": "sig", 1064 | "type": "tuple" 1065 | } 1066 | ], 1067 | "internalType": "struct DataTypes.SetDefaultProfileWithSigData", 1068 | "name": "vars", 1069 | "type": "tuple" 1070 | } 1071 | ], 1072 | "name": "setDefaultProfileWithSig", 1073 | "outputs": [], 1074 | "stateMutability": "nonpayable", 1075 | "type": "function" 1076 | }, 1077 | { 1078 | "inputs": [ 1079 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 1080 | { "internalType": "address", "name": "dispatcher", "type": "address" } 1081 | ], 1082 | "name": "setDispatcher", 1083 | "outputs": [], 1084 | "stateMutability": "nonpayable", 1085 | "type": "function" 1086 | }, 1087 | { 1088 | "inputs": [ 1089 | { 1090 | "components": [ 1091 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 1092 | { 1093 | "internalType": "address", 1094 | "name": "dispatcher", 1095 | "type": "address" 1096 | }, 1097 | { 1098 | "components": [ 1099 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 1100 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 1101 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 1102 | { 1103 | "internalType": "uint256", 1104 | "name": "deadline", 1105 | "type": "uint256" 1106 | } 1107 | ], 1108 | "internalType": "struct DataTypes.EIP712Signature", 1109 | "name": "sig", 1110 | "type": "tuple" 1111 | } 1112 | ], 1113 | "internalType": "struct DataTypes.SetDispatcherWithSigData", 1114 | "name": "vars", 1115 | "type": "tuple" 1116 | } 1117 | ], 1118 | "name": "setDispatcherWithSig", 1119 | "outputs": [], 1120 | "stateMutability": "nonpayable", 1121 | "type": "function" 1122 | }, 1123 | { 1124 | "inputs": [ 1125 | { 1126 | "internalType": "address", 1127 | "name": "newEmergencyAdmin", 1128 | "type": "address" 1129 | } 1130 | ], 1131 | "name": "setEmergencyAdmin", 1132 | "outputs": [], 1133 | "stateMutability": "nonpayable", 1134 | "type": "function" 1135 | }, 1136 | { 1137 | "inputs": [ 1138 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 1139 | { "internalType": "address", "name": "followModule", "type": "address" }, 1140 | { 1141 | "internalType": "bytes", 1142 | "name": "followModuleInitData", 1143 | "type": "bytes" 1144 | } 1145 | ], 1146 | "name": "setFollowModule", 1147 | "outputs": [], 1148 | "stateMutability": "nonpayable", 1149 | "type": "function" 1150 | }, 1151 | { 1152 | "inputs": [ 1153 | { 1154 | "components": [ 1155 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 1156 | { 1157 | "internalType": "address", 1158 | "name": "followModule", 1159 | "type": "address" 1160 | }, 1161 | { 1162 | "internalType": "bytes", 1163 | "name": "followModuleInitData", 1164 | "type": "bytes" 1165 | }, 1166 | { 1167 | "components": [ 1168 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 1169 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 1170 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 1171 | { 1172 | "internalType": "uint256", 1173 | "name": "deadline", 1174 | "type": "uint256" 1175 | } 1176 | ], 1177 | "internalType": "struct DataTypes.EIP712Signature", 1178 | "name": "sig", 1179 | "type": "tuple" 1180 | } 1181 | ], 1182 | "internalType": "struct DataTypes.SetFollowModuleWithSigData", 1183 | "name": "vars", 1184 | "type": "tuple" 1185 | } 1186 | ], 1187 | "name": "setFollowModuleWithSig", 1188 | "outputs": [], 1189 | "stateMutability": "nonpayable", 1190 | "type": "function" 1191 | }, 1192 | { 1193 | "inputs": [ 1194 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 1195 | { "internalType": "string", "name": "followNFTURI", "type": "string" } 1196 | ], 1197 | "name": "setFollowNFTURI", 1198 | "outputs": [], 1199 | "stateMutability": "nonpayable", 1200 | "type": "function" 1201 | }, 1202 | { 1203 | "inputs": [ 1204 | { 1205 | "components": [ 1206 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 1207 | { 1208 | "internalType": "string", 1209 | "name": "followNFTURI", 1210 | "type": "string" 1211 | }, 1212 | { 1213 | "components": [ 1214 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 1215 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 1216 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 1217 | { 1218 | "internalType": "uint256", 1219 | "name": "deadline", 1220 | "type": "uint256" 1221 | } 1222 | ], 1223 | "internalType": "struct DataTypes.EIP712Signature", 1224 | "name": "sig", 1225 | "type": "tuple" 1226 | } 1227 | ], 1228 | "internalType": "struct DataTypes.SetFollowNFTURIWithSigData", 1229 | "name": "vars", 1230 | "type": "tuple" 1231 | } 1232 | ], 1233 | "name": "setFollowNFTURIWithSig", 1234 | "outputs": [], 1235 | "stateMutability": "nonpayable", 1236 | "type": "function" 1237 | }, 1238 | { 1239 | "inputs": [ 1240 | { "internalType": "address", "name": "newGovernance", "type": "address" } 1241 | ], 1242 | "name": "setGovernance", 1243 | "outputs": [], 1244 | "stateMutability": "nonpayable", 1245 | "type": "function" 1246 | }, 1247 | { 1248 | "inputs": [ 1249 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 1250 | { "internalType": "string", "name": "imageURI", "type": "string" } 1251 | ], 1252 | "name": "setProfileImageURI", 1253 | "outputs": [], 1254 | "stateMutability": "nonpayable", 1255 | "type": "function" 1256 | }, 1257 | { 1258 | "inputs": [ 1259 | { 1260 | "components": [ 1261 | { "internalType": "uint256", "name": "profileId", "type": "uint256" }, 1262 | { "internalType": "string", "name": "imageURI", "type": "string" }, 1263 | { 1264 | "components": [ 1265 | { "internalType": "uint8", "name": "v", "type": "uint8" }, 1266 | { "internalType": "bytes32", "name": "r", "type": "bytes32" }, 1267 | { "internalType": "bytes32", "name": "s", "type": "bytes32" }, 1268 | { 1269 | "internalType": "uint256", 1270 | "name": "deadline", 1271 | "type": "uint256" 1272 | } 1273 | ], 1274 | "internalType": "struct DataTypes.EIP712Signature", 1275 | "name": "sig", 1276 | "type": "tuple" 1277 | } 1278 | ], 1279 | "internalType": "struct DataTypes.SetProfileImageURIWithSigData", 1280 | "name": "vars", 1281 | "type": "tuple" 1282 | } 1283 | ], 1284 | "name": "setProfileImageURIWithSig", 1285 | "outputs": [], 1286 | "stateMutability": "nonpayable", 1287 | "type": "function" 1288 | }, 1289 | { 1290 | "inputs": [ 1291 | { 1292 | "internalType": "enum DataTypes.ProtocolState", 1293 | "name": "newState", 1294 | "type": "uint8" 1295 | } 1296 | ], 1297 | "name": "setState", 1298 | "outputs": [], 1299 | "stateMutability": "nonpayable", 1300 | "type": "function" 1301 | }, 1302 | { 1303 | "inputs": [{ "internalType": "address", "name": "", "type": "address" }], 1304 | "name": "sigNonces", 1305 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 1306 | "stateMutability": "view", 1307 | "type": "function" 1308 | }, 1309 | { 1310 | "inputs": [ 1311 | { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } 1312 | ], 1313 | "name": "supportsInterface", 1314 | "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], 1315 | "stateMutability": "view", 1316 | "type": "function" 1317 | }, 1318 | { 1319 | "inputs": [], 1320 | "name": "symbol", 1321 | "outputs": [{ "internalType": "string", "name": "", "type": "string" }], 1322 | "stateMutability": "view", 1323 | "type": "function" 1324 | }, 1325 | { 1326 | "inputs": [ 1327 | { "internalType": "uint256", "name": "index", "type": "uint256" } 1328 | ], 1329 | "name": "tokenByIndex", 1330 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 1331 | "stateMutability": "view", 1332 | "type": "function" 1333 | }, 1334 | { 1335 | "inputs": [ 1336 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 1337 | ], 1338 | "name": "tokenDataOf", 1339 | "outputs": [ 1340 | { 1341 | "components": [ 1342 | { "internalType": "address", "name": "owner", "type": "address" }, 1343 | { 1344 | "internalType": "uint96", 1345 | "name": "mintTimestamp", 1346 | "type": "uint96" 1347 | } 1348 | ], 1349 | "internalType": "struct IERC721Time.TokenData", 1350 | "name": "", 1351 | "type": "tuple" 1352 | } 1353 | ], 1354 | "stateMutability": "view", 1355 | "type": "function" 1356 | }, 1357 | { 1358 | "inputs": [ 1359 | { "internalType": "address", "name": "owner", "type": "address" }, 1360 | { "internalType": "uint256", "name": "index", "type": "uint256" } 1361 | ], 1362 | "name": "tokenOfOwnerByIndex", 1363 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 1364 | "stateMutability": "view", 1365 | "type": "function" 1366 | }, 1367 | { 1368 | "inputs": [ 1369 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 1370 | ], 1371 | "name": "tokenURI", 1372 | "outputs": [{ "internalType": "string", "name": "", "type": "string" }], 1373 | "stateMutability": "view", 1374 | "type": "function" 1375 | }, 1376 | { 1377 | "inputs": [], 1378 | "name": "totalSupply", 1379 | "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], 1380 | "stateMutability": "view", 1381 | "type": "function" 1382 | }, 1383 | { 1384 | "inputs": [ 1385 | { "internalType": "address", "name": "from", "type": "address" }, 1386 | { "internalType": "address", "name": "to", "type": "address" }, 1387 | { "internalType": "uint256", "name": "tokenId", "type": "uint256" } 1388 | ], 1389 | "name": "transferFrom", 1390 | "outputs": [], 1391 | "stateMutability": "nonpayable", 1392 | "type": "function" 1393 | }, 1394 | { 1395 | "inputs": [ 1396 | { "internalType": "address", "name": "collectModule", "type": "address" }, 1397 | { "internalType": "bool", "name": "whitelist", "type": "bool" } 1398 | ], 1399 | "name": "whitelistCollectModule", 1400 | "outputs": [], 1401 | "stateMutability": "nonpayable", 1402 | "type": "function" 1403 | }, 1404 | { 1405 | "inputs": [ 1406 | { "internalType": "address", "name": "followModule", "type": "address" }, 1407 | { "internalType": "bool", "name": "whitelist", "type": "bool" } 1408 | ], 1409 | "name": "whitelistFollowModule", 1410 | "outputs": [], 1411 | "stateMutability": "nonpayable", 1412 | "type": "function" 1413 | }, 1414 | { 1415 | "inputs": [ 1416 | { 1417 | "internalType": "address", 1418 | "name": "profileCreator", 1419 | "type": "address" 1420 | }, 1421 | { "internalType": "bool", "name": "whitelist", "type": "bool" } 1422 | ], 1423 | "name": "whitelistProfileCreator", 1424 | "outputs": [], 1425 | "stateMutability": "nonpayable", 1426 | "type": "function" 1427 | }, 1428 | { 1429 | "inputs": [ 1430 | { 1431 | "internalType": "address", 1432 | "name": "referenceModule", 1433 | "type": "address" 1434 | }, 1435 | { "internalType": "bool", "name": "whitelist", "type": "bool" } 1436 | ], 1437 | "name": "whitelistReferenceModule", 1438 | "outputs": [], 1439 | "stateMutability": "nonpayable", 1440 | "type": "function" 1441 | } 1442 | ] 1443 | --------------------------------------------------------------------------------