DCIPs/assets/eip-5058/extensions/ERC5058Bound.sol

54 lines
1.4 KiB
Solidity

// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.0;
import "../factory/IERC5058Factory.sol";
import "../factory/IERC721Bound.sol";
import "../ERC5058.sol";
abstract contract ERC5058Bound is ERC5058 {
address public bound;
function _setFactory(address _factory) internal {
bound = IERC5058Factory(_factory).boundOf(address(this));
}
function _setBoundBaseTokenURI(string memory uri) internal {
IERC721Bound(bound).setBaseTokenURI(uri);
}
function _setBoundContractURI(string memory uri) internal {
IERC721Bound(bound).setContractURI(uri);
}
function burnBound(uint256 tokenId) external {
IERC721Bound(bound).burn(tokenId);
}
// NOTE:
//
// this will be called when `lock` or `unlock`
function _afterTokenLock(
address operator,
address from,
uint256 tokenId,
uint256 expired
) internal virtual override {
super._afterTokenLock(operator, from, tokenId, expired);
if (bound != address(0)) {
if (expired != 0) {
// lock mint
if (operator != address(0)) {
IERC721Bound(bound).safeMint(msg.sender, tokenId, "");
}
} else {
// unlock
if (IERC721Bound(bound).exists(tokenId)) {
IERC721Bound(bound).burn(tokenId);
}
}
}
}
}