NFT fractionalization protocol: Split ERC721s into tradeable shares, redeem with 100% ownership. Gas-optimized minimal proxy architecture.
SplitKit enables anyone to fractionalize ERC721 NFTs into multiple ERC1155 "splits" that can be traded independently on any marketplace or DEX. The system uses ERC1155 to ensure that splits are fungible and natively compatible with NFT marketplaces, while enabling batch transfers with minimal gas costs.
Original NFTs remain safely escrowed in smart contracts and can be redeemed anytime by an address owning 100% of the splits. There is no pricing logic by design - price discovery is handled entirely by free markets. While splits should theoretically trade at a portion of the underlying NFT's floor price, market dynamics can create interesting trading and arbitrage opportunities. In addition, a minimal, oracle-free architecture ensures robustness and a significantly reduced attack surface.
π― Flexible Portfolio Management: Own an expensive NFT but need liquidity? Fractionalize it and sell just 20-30% while maintaining majority ownership and upside exposure.
π Democratized Access: Enable smaller investors to own pieces of blue-chip NFTs - buy 0.1% of a Bored Ape instead of needing $50K+ for the whole asset.
π Enhanced Liquidity: Transform illiquid NFTs into tradeable assets with multiple price points and trading opportunities.
βοΈ Risk Distribution: Spread exposure across multiple partial positions rather than concentrated bets on whole NFTs.
- π Fractionalize any ERC721 into 2 to 1,000,000 ERC1155 splits
- π± Trade splits freely on any NFT marketplace or DEX that supports ERC1155
- β½ Gas optimized with minimal proxy pattern and packed storage
- π¨ Preserves original NFT metadata - splits display the same image as the original
- π Market-driven pricing with natural arbitrage opportunities
- ποΈ Immutable and decentralized - no admin keys or upgradeability
SplitNFTFactory.sol- Factory contract that handles the NFT fractionalizationSplitERC721.sol- Implementation contract for individual fractionalized NFTsISplitERC721.sol- Clean external interface for the fractionalized NFTs, extending IERC1155ISplitERC721Errors.sol- Modular error definitions for better UX
Minimal Proxy Pattern: Each fractionalized NFT gets its own contract instance via OpenZeppelin Clones, drastically reducing deployment costs while maintaining isolated state.
Storage Optimization: Struct packing reduces gas costs by ~40% through careful type sizing and slot arrangement.
Market-Driven Economics: No oracle dependencies or complex pricing mechanisms - the free market determines split values through natural arbitrage.
Separation of Concerns: Clean interface architecture enables better external integration and error handling.
git clone https://github.com/vale-dinap/SplitKit.git
cd SplitKitcurl -L https://foundry.paradigm.xyz | bash
foundryupSplitERC721.sol's contractURI function:
// Line ~140
'"image": "[URL]/split-logo.png"', // Replace with an image URL(This should be replaced with some better logic)
forge create SplitNFTFactory --rpc-url <YOUR_RPC_URL> --private-key <YOUR_PRIVATE_KEY>import { SplitNFTFactory } from "./SplitNFTFactory.sol";
import { ISplitERC721 } from "./ISplitERC721.sol";
// Use deployed factory address
SplitNFTFactory factory = SplitNFTFactory(FACTORY_ADDRESS);
// Approve factory to transfer your NFT
IERC721(nftContract).approve(address(factory), tokenId);
// Fractionalize NFT into 1000 splits
address splitContract = factory.splitNFT(nftContract, tokenId, 1000);
// Interact with splits using the interface
ISplitERC721 splits = ISplitERC721(splitContract);
uint256 balance = splits.balanceOf(owner, 0);
uint256 ownership = splits.ownershipFromSplits(balance);Use the interface files for type-safe interactions:
// Import ABI from ISplitERC721.sol for frontend integration
import ISplitERC721 from './artifacts/ISplitERC721.sol/ISplitERC721.json';
// Contract instance
const splitContract = new ethers.Contract(splitAddress, ISplitERC721.abi, signer);Scenario 1: Bored Ape worth 50 ETH, split into 1000 shares
- Each split represents 0.1% ownership
- Fair value: ~0.05 ETH per split
- Market price discovery through trading
Scenario 2: Rare 1/1 artwork worth 10 ETH, split into 100 shares
- Each split represents 1% ownership
- Fair value: ~0.1 ETH per split
- Enables broader collector participation
- Immutable Contracts: No admin keys, upgradeability, or owner privileges by design
- Battle-tested Dependencies: Built exclusively on OpenZeppelin's audited contracts
- Minimal Attack Surface: Simple, focused contracts with clear, limited responsibilities
- No Oracle Risk: Market-driven pricing eliminates oracle manipulation and external dependency risks
- Reentrancy Protection: Follows strict checks-effects-interactions pattern
- Custom Error Handling: Gas-efficient custom errors with meaningful context
- Comprehensive Input Validation: All parameters validated before state changes
- Interface Separation: Clean modular architecture reduces integration risks
- Metadata Dependency: The system relies on the metadata of the NFTs being fractionalized, the integrity of which is not guaranteed. Future versions could include backend services that cache NFT metadata at fractionalization time and generate enhanced metadata specifically for splits.
- ERC721 Compliance: Relies on proper ERC721 implementation of source NFTs. This should typically not be an issue, as improperly implemented NFTs would also be incompatible with major marketplaces and wallets.
- Coordination Challenges: Accumulating 100% of splits for redemption may be difficult due to distributed ownership. However, the practical benefits of NFT redemption versus simply trading liquid splits remain debatable.
- Test thoroughly on testnets before mainnet deployment
- Start with lower-value NFTs to validate market mechanics
- Update placeholder metadata before deployment
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow Solidity style guide
- Add comprehensive tests for new features
- Update documentation for ABI changes
- Optimize for gas efficiency
- Maintain backwards compatibility
This project is licensed under the MIT License - see the LICENSE file for details.
Valerio Di Napoli
- GitHub: @vale-dinap
- X: @valedinapoli
- LinkedIn: @valeriodinapoli
Built with β‘ for the future of NFT ownership