Modules
/
Liquid Splits

Liquid Splits

Unlike standard Splits where ownership is manually controlled, Liquid Splits use NFTs to make ownership tranferrable. This allows each recipient to control their share of the Split themselves, since they may freely transfer their ownership by simply transfering their Liquid Split NFTs.

How It Works

  • Each Liquid Split is comprised of an NFT contract (ERC-1155) and a mutable Split. The NFT contract gets set as the Controlling Address of the mutable Split when it's created. After those two contracts have been deployed, 1,000 NFTs are minted from the NFT contract to the initial Split recipients.
  • Just like standard Splits, each Liquid Split is a payable smart contract with its own address to which ETH and ERC20 tokens may be sent. Tokens sent to the Liquid Split are held until the balance is distributed.
  • When a Liquid Split balance is distributed, first the Split recipients are updated to match the current NFT holders and then the balance is distributed to those recipients. This happens in a single transaction, ensuring the owners of the NFTs receive their share of the balance at the time of distribution. This means that if there's a balance and you transfer your NFTs to Alice, Alice will be entitled to that share of the balance.

Addresses

Mainnet Deployments

Ethereum - 1
Optimism – 10
Polygon – 137
Arbitrum – 42161

Testnet Deployments

Goerli - 5
Optimism Goerli – 420
Polygon Mumbai – 80001
Arbitrum Goerli – 421613

How To Use

  • Create a new Liquid Split by selecting it as the Split type on the new Split form. Add recipients and a distribution incentive, and then hit Create Split.
  • Once the transaction has been confirmed, you'll be redirected to the Liquid Split's page. Subgraph may take a few minutes to update, so if this redirect doesn't happen automatically you can locate the Liquid Split's page by searching for one of the recipients and looking at their "Receiving" section.
  • On the Liquid Split page you can see the earnings, the address to which funds can be sent, and the current NFT holders. In the Holders section, next to each recipient's name you will see the total number of NFTs they hold and their corresponding share of the Split. Whenever the Liquid Split NFTs change hands, the holders will be automatically updated.
  • Tokens sent to the Liquid Split are held as a balance until they're distributed. You can see the Liquid Split's balance and distributions in the Liquid Split section. Hitting "Distribute Funds" will update the Split (to match current NFT holders) and distribute the balance in a single transaction.
⚠️

When adding this functionality to your contracts, if sum(percentAllocations) != 1e6 the Split will fail to update and funds will be stuck! Be careful when managing supply (including burns, rounding on odd numbers, etc). For this reason there is no burn function exposed in our implementation.

Integrating

You can integrate Liquid Splits into your own NFT project by forking this repo.

Notes

  • We recommend setting the distribution incentive on Liquid Splits to be slightly higher (i.e., ~2-3%) than on standard Splits. This is because distributions require more gas given the need to both update and distribute the Split.
  • Liquid Split NFTs should only be considered to represent funds that have not yet been received by the Split. Because recipients of a Liquid Split are updated at the time of a distribution, it is unsafe to assume that acquiring Liquid Split NFTs will entitle you to any portion of the current balance. A seller could easily distribute the balance right before transferring you the shares, causing them to receive that portion of the balance.
  • Since there are 1,000 NFTs for each Liquid Split, ownership can be defined to one tenth of a percent vs traditional Splits, which can be defined to one hundreth of a percent.
  • We used the ERC-1155 standard since it allows batch transfers. This means that someone can transfer 1% of the Split (10 NFTs) in a single transaction instead of 10 separate ones (which would be required if using the ERC-721 standard).

Code & Natspec

Github