TLDR

Collection+ is a way for any nft collection to "upgrade" to use a nouns style governance model. This features uses ERC6551 accounts and soulbound NFTs to give existing collection tokens governance capabilities without reworking the current governance system.

PartialSoulboundToken

The Partial Soulbound Token is a new token implementation that allows a portion of tokens to become soulbound ie bound to an account.

  • isLockedBitMap
    • bitmap to store locked status based on token id
  • lock()
    • permenantly locks an NFT
    • only callable for minted tokens in the reserve range
  • transferAndLock()
    • transfers the NFT to an account and permenantly locks it
    • allows the minter to setup delegations for an account before locking it
    • only callable for minted tokens in the reserve range
  • beforeTransfer()
    -revert if the token is currently locked

ERC721Votes (Update)

The votes contract must be modified to allow for batch delegation by sig. This will allow users to batch set delegations for their token bound accounts

  • batchDelegateBySig()
    • takes a single signature + an array of tokens and delegates to iterate on.
    • creates the signature hash of the tokens + delegates and verifies the signature for each token bound account using the verifySignature method on the smart contract wallet. revert if sig validation fails
    • set token delegations after validation

ERC721RedeemMinter

A minter that allows ERC721 holders to redeem one mint per token holding with an optional redemption fee. This minter will mint tokenIds on a 1 to 1 basis ie tokenId 70 for original collection A will mint tokenId 70 for DAO collection B.

  • setRedemptionFee()
    • allows a dao to set an optional fee for redemption
  • redeemAndDelegate()
    • verifies msg.sender is the holder of given tokenIds
    • verifies msg.value matches the optional redemption fee
    • batch calls mintFromReserve() to mint tokens to the minter contract
    • sets delegation to msg.sender for each token
    • calls transferAndLock() bounding each token to the original tokens ERC6551 account
Select a repo