ourzora / ocs-hackathon-24

Zora Onchain Summer Hackathon 24 Guide
7 stars 0 forks source link

syncing custom nft folders #3

Open grachyov opened 3 weeks ago

grachyov commented 3 weeks ago

hi, i am looking to discuss the possible ways to sync custom nft folders.

i am currently implementing folder sync for the nft folder app.

wonder if there is a way to come up with a standard approach to syncing nft folders that could be adopted.

below is a wip approach – would love your thoughts and criticism.

syncing custom nft folders

organize nfts into folders and see the same custom folders in zora, opensea, rainbow, etc.

what could be a good standard way to sync a custom folders structure?

proposal:

nft folders + ethereum attestation service

1️⃣ upload SyncedFolderSnapshot json to ipfs

struct SyncedFolderSnapshot: Codable {

    let formatVersion: Int
    let uuid: String
    let nonce: Int
    let timestamp: Int
    let address: String
    let rootFolder: SyncedFolder

}

struct SyncedFolder: Codable {

    let name: String
    let nfts: [NftInSyncedFolder]
    let childrenFolders: [SyncedFolder]

}

struct NftInSyncedFolder: Codable {

    let chainId: String
    let tokenId: String
    let address: String

}

2️⃣ create an attestation with SyncedFolderSnapshot ipfs cid

static func attestFolder(address: String, cid: String) -> URL? {
    let inputString = cid.toPaddedHexString()
    return URL(string: "\(easScanBase)/attestation/attestWithSchema/\(nftFolderAttestationSchema)#template=\(address)::0:false:\(inputString)")
}

https://base.easscan.org/attestation/attestWithSchema/0x39693b21ffe38b11da9ae29437c981de90e56ddb8606ead0c5460ba4a9f93880#template=0xE26067c76fdbe877F48b0a8400cf5Db8B47aF0fE::0:false:0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003b6261666b726569626437617376627864676d37746e746c676665636a736d743272686d6f78737a366176756d746175687068756e666872357461790000000000

3️⃣ get the latest attestation

using easscan graphql api

curl --request POST \
    --header 'content-type: application/json' \
    --url 'https://base.easscan.org/graphql' \
    --data '{"query":"query Attestation {\n  attestations(\n    take: 1,\n    orderBy: { timeCreated: desc},\n    where: { schemaId: { equals: \"0x39693b21ffe38b11da9ae29437c981de90e56ddb8606ead0c5460ba4a9f93880\" }, recipient: { equals: \"0xE26067c76fdbe877F48b0a8400cf5Db8B47aF0fE\" }, attester: { equals: \"0xE26067c76fdbe877F48b0a8400cf5Db8B47aF0fE\" } }\n  ) {\n    attester\n    recipient\n    decodedDataJson\n    timeCreated\n  }\n}","variables":{}}'

4️⃣ get SyncedFolderSnapshot json corresponding to the latest attestation

https://ipfs.decentralized-content.com/ipfs/bafkreibd7asvbxdgm7tntlgfecjsmt2rhmoxsz6avumtauhphunfhr5tay

5️⃣ get nfts from an api of your choice

use SyncedFolderSnapshot to display nfts in folders

grachyov commented 3 weeks ago

made a repo with an updated description of the wip approach https://github.com/lil-org/how-to-sync-nft-folders

not sure if this way would work for other apps

collecting feedback on it now

let me know if you get a chance to take a look at it

iainnash commented 2 weeks ago

Hi! This approach looks good at a glance.

Are there any specific questions you want feedback/help with?

grachyov commented 2 weeks ago

@iainnash thanks for taking a look at it.

something for the future:

if zora ever adds pinned albums / folders to the minted tab, it'd be cool if these were synced onchain too.

wonder if syncing via eas would work for zora in that case.

12345