Skip to main content
Version: 2.0.0

DODO NFT 碎片化

DODONFT 相关合约

合约名称目录
DODONFTProxycontracts/SmartRoute/proxies/
NFTCollateralVaultcontracts/CollateralVault/
Fragmentcontracts/GeneralizedFragment/
DODONFTRegistrycontracts/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;