🧩

NFT碎片化

DODONFT 相关合约
合约名称
目录
contracts/SmartRoute/proxies/
contracts/CollateralVault/
Fragment
contracts/GeneralizedFragment/
contracts/Factory/Registries/

DODONFT 合约概览图

主要流程

创建 Vault
首先用户通过调用 DODONFTProxy 合约中的 createNFTCollateralVault 函数,创建新的 Vault 合约,Vault 合约用来存放 NFT,兼容 ERC721,ERC1155。并且可以为 Vault 设置全局的名称以及 baseURI,baseURI 可以指向资源文件,作为 Vault 的介绍信息
function createNFTCollateralVault(
string memory name,
string memory baseURI
) external returns (address newVault);
导入 NFT
创建的 Vault 合约用来存放 NFT,用户可以存入 ERC721,ERC1155,且没有任何数量限制,可以是一个 NFT,也可以是多个。存入的 NFT 被 Vault 合约的 owner 所拥有,owner 有权利以 Vault 为单位,进行整体的碎片化操作。
若用户向 Vault 存入 ERC721,需要将 ERC721 授权给 Vault 合约,第二步调用 NFTCollateralVaultdepositERC721 函数, 传入的参数包括 ERC721 合约地址,以及存入的 tokenId 数组。
function depositERC721(
address nftContract,
uint256[] memory tokenIds
) external;
若用户向 Vault 存入 ERC1155,需要将 ERC1155 授权给 Vault 合约,第二步调用 NFTCollateralVaultdepositERC1155 函数,传入的参数包括 ERC1155 合约地址,以及存入的 tokenId 数组和对应的数量
function depoistERC1155(
address nftContract,
uint256[] memory tokenIds,
uint256[] memory amounts
) external;
碎片化
碎片化是针对 Vault 中导入的 NFT 进行统一的碎片化操作,背后的流程包括生成 ERC20,并创建 DODO Vending Machine 公开池,同时向池子添加流动性,向二级市场提供了流通,被 DODO DEX 聚合后,可以实现任意币与碎片化 ERC20 代币互换。同时碎片化也涉及到 Vault 合约 owner 转移给碎片化合约的过程,即经过碎片化后,Vault 中的 NFT 没有任何人可以提取,确保碎片化的 ERC20 代表着 Vault 中的全部 NFT。
碎片化需要由 Vault 的 owner 触发,通过调用 NFTCollateralVault 中的 createFragment 函数实现
买断
经过碎片化的 NFT,将会在二级市场流通,拥有碎片代币的人,代表了拥有背后 NFT 的一部分。若投资人希望完全拥有 NFT,则可以触发买断的功能,调用 DODONFTProxybuyout 函数
function buyout(
address fragment,
uint256 quoteMaxAmount,
uint8 flag, // 0 - ERC20, 1 - quoteInETH
uint256 deadLine
) external;
投资人需要按照当前碎片 NFT 的单价,乘上总量,提供对应总估值的代币,才可以进行买断。买断涉及到操作包括
  • 投资人充入当前碎片 NFT 对应的总估值代币
  • 撤掉当前碎片代币的流动性池,销毁流动性池中的碎片化代币
  • 分配投入的代币,包括向原 NFT 作者支付未流通部分的代币市值,剩下的投入代币预留在 Fragment 合约内,供二级市场持有碎片 NFT 代币的用户来按照买断价格等值赎回
  • 转移 Vault owner 为买断者,买断者可以后续将 Vault 中的 NFT 转出,当然可以再次碎片化,再次碎片化将会创建新的 ERC20 以及新的流动性池
赎回
若经过买断后,原二级市场流通的碎片 NFT 拥有者,可以按照买断时的单价,等值进行代币赎回,调用 Fragment 合约内的 redeem 函数,将自己手中的碎片 NFT 销毁,换取等值的代币
function redeem(address to, bytes calldata data) external;