🧩
NFT碎片化
合约名称 | 目录 |
---|---|
contracts/SmartRoute/proxies/ | |
contracts/CollateralVault/ | |
contracts/GeneralizedFragment/ | |
contracts/Factory/Registries/ |

首先用户通过调用
DODONFTProxy
合约中的 createNFTCollateralVault
函数,创建新的 Vault 合约,Vault 合约用来存放 NFT,兼容 ERC721,ERC1155。并且可以为 Vault 设置全局的名称以及 baseURI,baseURI 可以指向资源文 件,作为 Vault 的介绍信息function createNFTCollateralVault(
string memory name,
string memory baseURI
) external returns (address newVault);
创建的 Vault 合约用来存放 NFT,用户可以存入 ERC721,ERC1155,且没有任何数量限制,可以是一个 NFT,也可以是多个。存入的 NFT 被 Vault 合约的 owner 所拥有,owner 有权利以 Vault 为单位,进行整体的碎片化操作。
若用户向 Vault 存入 ERC721,需要将 ERC721 授权给 Vault 合约,第二步调用
NFTCollateralVault
的 depositERC721
函数, 传入的参数包括 ERC721 合约地址,以及存入的 tokenId 数组。function depositERC721(
address nftContract,
uint256[] memory tokenIds
) external;
若用户向 Vault 存入 ERC1155,需要将 ERC1155 授权给 Vault 合约,第二步调用
NFTCollateralVault
的 depositERC1155
函数,传入的参数包括 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,则可以触发买断的功能,调用
DODONFTProxy
的 buyout
函数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;
最近更新 1yr ago