ERC721 NFTs that can be treated as ERC20s or vice versa for instant composability with AMMs and defi primitives.
ERC721F tokens are actually composed of two contracts: An ERC721 and an ERC20 contract. State is shared and synced between them so balances can be manipulated using either! Transferring ERC20 tokens will result in ERC721 tokens in being moved around, and vice versa!
To hold a non-zero balance of the ERC721 token, you must have some (fixed) multiple of the ERC20 token. If your ERC20 balance dips below a multiple, one of your NFTs will be set aside to be awarded to the next user that reaches a new ERC20 balance multiple. On the flip side, transferring individual ERC721 tokens results in a multiple of ERC20 tokens being transferred as well.
The system is designed to be compatible with AMM architectures at all stages of the collection lifecycle. During setup, ERC20 tokens can be minted to a pool without backing ERC721 tokens, so they can be lazy-minted when ERC20 tokens are transferred out of the AMM pool to buyers. This mechanism allows NFT collections to use the "Initial Dex Offering" strategy of distributing their mints. There are many benefits to this approach:
The core project is all solidity, using foundry as the dev, testing, and deployment framework. It frankensteins the ERC721 and ERC20 standards together. Along with the token contracts, a demo token and a canonical helper contract for deploying new collections to uniswap v3 pools are provided. It's been deployed to polygon and tested against Uniswap, Opensea, and Metamask interaces and it all seems to work 🤞.