project screenshot 1
project screenshot 2
project screenshot 3

Secret Fans

Secretfans lets you be a top fan of content creators and download their exclusive NFTs and make money from the subscriptions share market

Secret Fans

Created At

ETHGlobal Istanbul

Winner of

Scroll - Deploy on Scroll

Prize Pool

Worldcoin - Pool Prize

Prize Pool

MetaMask - Best Metamask Snap Runner Up

Project Description

Create Private NFTs (DMs) Send Connect wallet Use Web3Modal V3 Create random encryption key (from now on refered as content encryption key or CEK) (arnau: go back to prvious research, to get encryption schema) Upload content to be encrypted Encrypt content Upload encrypted content to IPFS using NFT Storage should qualify for IPFS challenge Specify destination public key. NOTE that public key != ethereum addr, but the public key can be deducted from an Ethereum tx. Ideally, the frontend should be able to ask user for Ethereum address or ENS, and find the public key on it’s own. But, just in case let’s give the option to manually input public key Use ENS to get address, potentially qualify for ENS challenge Encrypt the CEK for the destination address (from now on refered as encrypted content encryptopn key or ECEK) Create NFT: owner destination address, link to IPFS for the encrypted content and the ECEK + image of a vault to be displayed by default NFT explorers, in the message description specify that the NFT is encrypted and that they need to go to projectName.ens to decrypt (helps qualifying for ENS challenge) Deploy on [Gnosis, Linea, Scroll, Base] to qualify for their respective challanges (is it posible to deploy on many chains and win all challenges? If so, maybe explore cross-chai features?) (optional) use Push Protocol to send notifications for the receivers? (optional) use Web3Inbox to send a message of the NFT link to be downloaded? Receive Connect wallet Frontend queries events of NFTs minted / transfered to this address List encrypted NFTs with decrypt button On decrypt: Download encrypted file from IPFS Build or use MM snap to decrypt the ECEK and obtain the CEK Decrypt the file using the CEK Download the file on the users machine Transfer Connect wallet Frontend queries events of NFTs minted / transfered to this address List encrypted NFTs with send button On send: Specify receiver (… needs public key) Build or use MM snap to decrypt the ECEK and obtain the CEK Encrypt the CEK for the destination public key (generate new ECEK) Build a ZKP that demonstrates that both the new and the old ECEKs devrypt to the same CEK Mint / Transfer the NFT to the destination address, after verifying ZKP Trading / auction Needs research on how the transfer / sell interfaces work for NFTs. Following section describes a potential flow that may NOT fit actual standards for ERC721 and ERC1155. Also would be nice to research how NFTs are traded on LENS

Bidder Connect wallet Input ID of the NFT that wants to buy This should be easy to acheive by learning the ID / link from other NFT exchanges Generate links that can be posted on social media and others for owners to promote their NFTs Locks some amount of ERC20 tokens ==> emit offer event Use Unlimit Crypto for fiat payments (Also needs to implement feature to cancel the bid and unlock tokens)

Seller Connect wallet Frontend queries events of NFTs minted / transfered to this address List encrypted NFTs with sell button On sell: List received bids Press sell on a specific bid, and get public key of the bidder Build or use MM snap to decrypt the ECEK and obtain the CEK Encrypt the CEK for the destination public key (generate new ECEK) Build a ZKP that demonstrates that both the new and the old ECEKs devrypt to the same CEK Mint / Transfer the NFT to the destination address, after verifying ZKP PUB / SUB (OnlyFans) Subscribe NFTs that represents a subscription to the content published from a specific Ethereum address. All the value of buying a subscription NFT will be locked by the publisher to collect, when it publishes content, except a % buyerFee defined by governance, that will tax part of the sells to fund a protocol treassury

Register: in order to be able to subscribe, each account will need to register a public key (mapping addr => pubKey) Subscription can only happen through our SC. This NFTs can not be transferred by any other means that the ones explained here Only buy w/ETH (or native token) Fixed supply per address per (1 publisher : N subs). N defiened by governance MinPrice defined by governance: minimum price to pay to mint a sunscription NFT Once all minted, a buyer can buy a specific subscription NFT, without the agreement of the holder, as long as it pays more money than the value left on the subscription (more on this later). The previous holder will be compensated by the amount of money left + % sellerFee defined by governance Publish Encrypted content distributed in the form of NFTs that the publisher (identified by an Ethereum addr) will publish, and will be accessible to their subscribers

Create NFT Mint NFTs for all the subscribers Send ECEKs in the calldata, verify that all the subs have it When doing a post collect `% publisherFee defined by governance

How it's Made

framework : scaffold eth, nextjs frontend, smart contracts solidity. We implemented some metamask snaps to encrypt and decrypt the NFT content. We also wrote an algorithm for ZKP using noir. We also added a proof of personhood functionality using worldcoin which gives content creators and subscribers the option to prove that they are not bots. We also deployed the smart contract on scroll, base, gnosis, sepolia, and goerli. We also created channels on push protocol to send notifications of new NFT releases to subscribers.

background image mobile

Join the mailing list

Get the latest news and updates