├── .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 |
{
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(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 |
{
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 |
--------------------------------------------------------------------------------