NFT Memberships
🚧 UNDER CONSTRUCTION: Please bear 🧸 with me! If you can't wait please try read more.
Static Content
sequenceDiagram autonumber participant browser as Browser participant edge as Edge (CDN) participant mdbook as mdbook mdbook->>edge: static content browser->>edge: request static content edge->>browser: static content
Continue with mobile wallet
sequenceDiagram
autonumber
participant wallet as Wallet
participant browser as Browser
participant edge as Edge (Worker)
browser->>wallet: connect
wallet->>browser: phantom_pubkey, nonce, data
browser->>edge: /auth/phantom
Note right of browser: agent=mobile<br>phantom_pubkey, nonce, data
edge->>edge: decrypt data w/ 🔑 secret_key
alt Invalid
edge->>browser: null cookie
Note left of edge: error
else Valid
edge->>browser: httpOnly cookie
Note left of edge: 🎫 web3_token = { wallet_pubkey, <br>provider:{ name, session, data } }
end
Continue with web wallet
sequenceDiagram
autonumber
participant wallet as Wallet
participant browser as Browser
participant edge as Edge (Worker)
browser->>wallet: connect
wallet->>browser: wallet_pubkey
browser->>wallet: sign
wallet->>browser: signed_wallet_pubkey
browser->>+edge: /auth/phantom
Note right of browser: agent=extension<br>signed_wallet_pubkey
edge->>edge: verify signed_wallet_pubkey
alt Invalid
edge->>browser: null cookie
Note left of edge: error
else Valid
edge->>browser: httpOnly cookie
Note left of edge: 🎫 web3_token = { wallet_pubkey, <br>provider:{ name, session, data } }
end
Publish public unlisted IPFS content as NFT
sequenceDiagram
autonumber
participant browser as Browser
participant edge as Edge (Worker)
participant ipfs as Edge (IPFS)
participant candy as Chain (Candy Machine)
browser->>+edge: PUT /nft/new/{content_slug}
Note right of browser: content, img
edge->>ipfs: publish_content
Note right of edge: slug, content, img
ipfs->>edge: ipfs_result
Note left of ipfs: ipfs_hash
edge->>candy: publish NFT
Note right of edge: ipfs_url
candy->>edge: candy_result
Note left of candy: candy_address,<br>mint_address
edge->>-browser: publish_result
Note left of edge: ipfs_url,<br>candy_address,<br>mint_address
Publish membership as NFT
sequenceDiagram
autonumber
participant browser as Browser
participant edge as Edge (Worker)
participant ipfs as Edge (IPFS)
participant candy as Chain (Candy Machine)
browser->>+edge: PUT /nft/new/{content_slug}
Note right of browser: site_url, img
edge->>ipfs: publish_content
Note right of edge: slug, content, img
ipfs->>edge: ipfs_result
Note left of ipfs: ipfs_hash
edge->>candy: publish NFT
Note right of edge: ipfs_url
candy->>edge: candy_result
Note left of candy: candy_address,<br>mint_address
edge->>-browser: publish_result
Note left of edge: ipfs_url,<br>candy_address,<br>mint_address
NFT Paywalls Content
Flow (with web3_token via server side cookie)
sequenceDiagram
autonumber
participant browser as Browser
participant edge as Edge (Worker)
participant cf_kv as Edge (KV)
participant chain as Chain
browser->>+edge: /nft/view/{mint_address}
Note right of browser: 🎫 web3_token
alt validate internal
edge->>edge: Verify 🎫 web3_token
edge->>browser: error: invalid
end
alt validate external
edge->>chain: Get wallet PDA mint_address
chain->>edge: token account
Note left of chain: mint: address, amount
edge->>edge: Validate by mint_amount > 0
edge->>edge: Validate by PDA mint_address
edge->>chain: Get mint metadata
chain->>edge: metadata
Note left of chain: Metaplex::DataV2
edge->>browser: error: invalid
end
alt validate state
edge->>cf_kv: get url
Note right of edge: mint_address
edge->>edge: Validate by KV mint_address
edge->>browser: error: invalid
else
cf_kv->>edge: url
Note left of cf_kv: KV: mint_address → url
end
edge->>edge: handle Metaplex::DataV2
edge->>cf_kv: get content from metadata.uri
Note right of edge: uri
cf_kv->>browser: content
Known Limits
- Can be slow to query if has a number of holding
NFTs. - Required
cookie.
How to use
<nft data-chain="solana" data-cluster="mainnet-beta" src="8N6BAdK88vc2Nbrqviggk4kigyFbud2QjAap7Nq3KePN">
<button>🔑 continue with wallet</button>
</nft>
Demo
- TODO
Source
- TODO
Alternative Approach
Paywalls Content (ALTs)
Paywalls Content (ALTs)
Use Address Lookup Tables as indexing.
sequenceDiagram
autonumber
participant browser as Browser
participant edge as Edge (Worker)
participant cf_kv as Edge (KV)
participant mdbook as mdbook
mdbook->>cf_kv: key: nft_address, value: content_id
browser->>+edge: /view/{nft_address}
Note right of browser: 🎫 access_token
edge->>edge: Verify 🎫 access_token
edge->>edge: Validate member by<br>user_pubkey exist in ALTs
edge->>cf_kv: get contents
cf_kv->>edge: contents
edge->>-browser: contents
Pros
- Direct map
- Less query overhead for <256 members.
Cons
- Limited to 256 accounts.
- Need upfront record and maintain.