文件 1 的 25:AccessControl.sol
pragma solidity >=0.6.0 <0.8.0;
import "../utils/EnumerableSet.sol";
import "../utils/Address.sol";
import "../utils/Context.sol";
abstract contract AccessControl is Context {
using EnumerableSet for EnumerableSet.AddressSet;
using Address for address;
struct RoleData {
EnumerableSet.AddressSet members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
function hasRole(bytes32 role, address account) public view returns (bool) {
return _roles[role].members.contains(account);
}
function getRoleMemberCount(bytes32 role) public view returns (uint256) {
return _roles[role].members.length();
}
function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
return _roles[role].members.at(index);
}
function getRoleAdmin(bytes32 role) public view returns (bytes32) {
return _roles[role].adminRole;
}
function grantRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");
_grantRole(role, account);
}
function revokeRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");
_revokeRole(role, account);
}
function renounceRole(bytes32 role, address account) public virtual {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (_roles[role].members.add(account)) {
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (_roles[role].members.remove(account)) {
emit RoleRevoked(role, account, _msgSender());
}
}
}
文件 2 的 25:Address.sol
pragma solidity >=0.6.2 <0.8.0;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 3 的 25:Asset.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "./IAsset.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
contract Asset is IAsset, AccessControl {
bytes32 private _managerRole = keccak256("MANAGER_ROLE");
bytes32 private _minterRole = keccak256("MINTER_ROLE");
constructor(){
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
}
function transferDefaultAdmin(address _defaultAdmin) external returns (bool) {
_onlyAdmin();
grantRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);
renounceRole(DEFAULT_ADMIN_ROLE, _msgSender());
return true;
}
function authorizeAssetManager(address manager) external override returns (bool) {
_onlyAdmin();
grantRole(_managerRole, manager);
emit AssetManagerAuthorized(manager, msg.sender);
return true;
}
function revokeAssetManager(address manager) external override returns (bool) {
_onlyAdmin();
revokeRole(_managerRole, manager);
emit AssetManagerRevoked(manager, msg.sender);
return true;
}
function authorizeAssetMinter(address minter) external override returns (bool) {
_onlyAdmin();
grantRole(_minterRole, minter);
emit AssetMinterAuthorized(minter, msg.sender);
return true;
}
function revokeAssetMinter(address minter) external override returns (bool) {
_onlyAdmin();
revokeRole(_minterRole, minter);
emit AssetMinterRevoked(minter, msg.sender);
return true;
}
function isAssetManager(address manager) public override view returns (bool) {
return hasRole(_managerRole, manager);
}
function isAssetMinter(address minter) external override view returns (bool) {
return hasRole(_minterRole, minter);
}
function _onlyAdmin() internal view {
require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
"0x28: must have admin role"
);
}
function _onlyManager() internal view{
require(hasRole(_managerRole, _msgSender()) ||
hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
"0x28: must have manager role"
);
}
function _onlyMinter() internal view {
require(hasRole(_minterRole, _msgSender()) ||
hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
"0x28: must have minter role"
);
}
}
文件 4 的 25:BurnerRole.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/access/AccessControl.sol";
abstract contract BurnerRole is AccessControl {
bytes32 private _burnerRole = keccak256("BURNER_ROLE");
event AssetBurnerAuthorized(address burner, address owner);
event AssetBurnerRevoked(address burner, address owner);
function authorizeAssetBurner(address _burner) public virtual returns (bool) {
grantRole(_burnerRole, _burner);
emit AssetBurnerAuthorized(_burner, msg.sender);
return true;
}
function revokeAssetBurner(address _burner) public virtual returns (bool) {
revokeRole(_burnerRole, _burner);
emit AssetBurnerRevoked(_burner, msg.sender);
return true;
}
function isAssetBurner(address _burner) public view returns (bool) {
return hasRole(_burnerRole, _burner);
}
}
文件 5 的 25:Context.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 6 的 25:ERC165.sol
pragma solidity >=0.6.0 <0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
mapping(bytes4 => bool) private _supportedInterfaces;
constructor () internal {
_registerInterface(_INTERFACE_ID_ERC165);
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return _supportedInterfaces[interfaceId];
}
function _registerInterface(bytes4 interfaceId) internal virtual {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
}
文件 7 的 25:EnumerableSet.sol
pragma solidity >=0.6.0 <0.8.0;
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping (bytes32 => uint256) _indexes;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
bytes32 lastvalue = set._values[lastIndex];
set._values[toDeleteIndex] = lastvalue;
set._indexes[lastvalue] = toDeleteIndex + 1;
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
struct Bytes32Set {
Set _inner;
}
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
文件 8 的 25:IAsset.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
interface IAsset {
struct AssetData {
string name;
string symbol;
uint256 supply;
uint8 decimals;
}
function authorizeAssetManager(address manager) external returns (bool);
function revokeAssetManager(address manager) external returns (bool);
function isAssetManager(address manager) external view returns (bool);
function authorizeAssetMinter(address minter) external returns (bool);
function revokeAssetMinter(address minter) external returns (bool);
function isAssetMinter(address minter) external view returns (bool);
event AssetManagerAuthorized(address manager, address owner);
event AssetManagerRevoked(address manager, address owner);
event AssetMinterAuthorized(address minter, address owner);
event AssetMinterRevoked(address minter, address owner);
}
文件 9 的 25:IDATSNFTCollection.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
interface IDATSNFTCollection {
event Withdraw(
string operationId,
address from,
address to,
string assetId,
uint256 tokenId
);
struct NFTCollectionWithdrawCommand {
string operationId;
address from;
address to;
string assetId;
uint256 tokenId;
}
struct NFTAssetBalance {
string id;
uint256 balance;
uint256 weight;
}
function assetsInCollection() external view returns (string[] memory);
function assetBalanceOf(string memory _assetId, address _to) external view returns (NFTAssetBalance memory);
function assetBalanceBatchOf(address _to) external view returns (NFTAssetBalance[] memory);
function isAutoIncrementalCollection() external view returns (bool);
function collectionId() external view returns(string memory);
function mint(
address _to,
string memory _assetId,
uint256 _tokenId,
bytes memory _data
) external returns (uint256 id, uint256 internalId);
function mint(
address _to,
string memory _assetId,
bytes memory _data
) external returns (uint256 id, uint256 internalId);
function burn(address _account, string memory _assetId, uint256 _tokenId) external;
function burnBatch(address _account, string memory _assetId, uint256[] memory _tokenIds) external;
function authorizeAssetBurner(address _burner) external returns (bool);
function withdraw(NFTCollectionWithdrawCommand calldata withdrawCommand) external;
function safeTransferFrom(
address _from,
address _to,
string calldata _assetId,
uint256 _tokenId,
bytes calldata _data
)
external;
function safeBatchTransferFrom(
address _from,
address _to,
string calldata _assetId,
uint256 [] calldata _tokenIds,
bytes calldata _data
)
external;
}
文件 10 的 25:IERC1155.sol
pragma solidity >=0.6.2 <0.8.0;
import "../../introspection/IERC165.sol";
interface IERC1155 is IERC165 {
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}
文件 11 的 25:IERC1155MetadataURI.sol
pragma solidity >=0.6.2 <0.8.0;
import "./IERC1155.sol";
interface IERC1155MetadataURI is IERC1155 {
function uri(uint256 id) external view returns (string memory);
}
文件 12 的 25:IERC1155Receiver.sol
pragma solidity >=0.6.0 <0.8.0;
import "../../introspection/IERC165.sol";
interface IERC1155Receiver is IERC165 {
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
returns(bytes4);
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
)
external
returns(bytes4);
}
文件 13 的 25:IERC165.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 14 的 25:IERC2981.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
interface IERC2981 {
function royaltyInfo(
uint256 _tokenId,
uint256 _salePrice
) external view returns (
address receiver,
uint256 royaltyAmount
);
}
文件 15 的 25:INFTCollection.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
interface INFTCollection {
event AssetCreated(
string id,
uint256 cap,
NFTCollectionAssetData assetData,
uint256 weight,
address royaltyReceiver,
uint256 royaltyFee
);
event AssetWeightModified(
string id,
uint256 oldWeight,
uint256 newWeight
);
event BaseAssetCollectionURISet(string baseUri);
event AssetCustomURISet(string baseUri, string assetId);
event NFTCollectionMint(
address to,
string assetId,
uint256 tokenId,
uint256 nftCollectionTokenId
);
event NFTCollectionMintBatch(
address to,
string assetId,
uint256[] tokenIds,
uint256[] nftCollectionTokenIds
);
event NFTCollectionBurn(
address account,
string assetId,
uint256 tokenId,
uint256 nftCollectionTokenId
);
event NFTCollectionBurnBatch(
address account,
string assetId,
uint256[] tokenIds,
uint256[] nftCollectionTokenIds
);
event NFTCollectionTransfer(
address from,
address to,
string assetId,
uint256 tokenId,
uint256 nftCollectionTokenId
);
event NFTCollectionTransferBatch(
address from,
address to,
string assetId,
uint256[] tokenIds,
uint256[] nftCollectionTokenIds
);
struct NFTCollectionData {
string name;
string symbol;
string baseUri;
string collectionId;
}
struct NFTCollectionAssetData {
string name;
string symbol;
string uri;
}
struct CreateAssetCommand {
string id;
uint256 cap;
NFTCollectionAssetData assetData;
uint256 weight;
address royaltyReceiver;
uint256 royaltyFee;
}
function mintBatch(
address _to,
string memory _assetId,
uint256[] memory _ids,
bytes memory _data
) external returns (uint256[] memory ids, uint256[] memory internalIds);
function mintBatch(
address _to,
string memory _assetId,
uint256 _totalTokens,
bytes memory _data
) external returns (uint256[] memory ids, uint256[] memory internalIds);
}
文件 16 的 25:IRoyaltyFee.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
interface IRoyaltyFee {
event RoyaltyModified(
string assetId,
address oldRoyaltyReceiver,
address newRoyaltyReceiver,
uint256 oldRoyaltyFee,
uint256 newRoyaltyFee
);
}
文件 17 的 25:NFTAssetCollection.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "./INFTCollection.sol";
import "../Asset.sol";
import "./NFTCollectionBurnable.sol";
import "../RoyaltyFee.sol";
import "../IDATSNFTCollection.sol";
abstract contract NFTAssetCollection is
IDATSNFTCollection,
INFTCollection,
NFTCollectionBurnable,
Asset,
RoyaltyFee
{
mapping(string => uint256) public assetCap;
mapping(string => uint256) public assetWeight;
mapping(string => address) public assetRoyaltyReceiver;
mapping(string => uint256) public assetRoyaltyFee;
mapping(string => NFTCollectionAssetData) public assets;
mapping(uint256 => string) private _numericalIdAsset;
string public name;
string public symbol;
string public override collectionId;
string[] public assetIds;
constructor(INFTCollection.NFTCollectionData memory _data)
NFTCollectionBase(_data.baseUri)
{
name = _data.name;
symbol = _data.symbol;
collectionId = _data.collectionId;
_registerInterface(_INTERFACE_ID_ERC2981);
_registerInterface(type(IDATSNFTCollection).interfaceId);
}
function createAsset(CreateAssetCommand memory _cmd) public {
_checkValidRoyaltyFee(_cmd.royaltyFee);
_onlyManager();
require(!_existAsset(_cmd.id), "Asset id already exists");
if (assetIds.length > 0) {
if (assetWeight[assetIds[0]] == 0) {
require(_cmd.weight == 0, "Existing assets have no weight, asset with weight not allowed");
}
else {
require(_cmd.weight > 0, "Existing assets have weight, asset without weight not allowed");
}
}
require(_cmd.royaltyReceiver != address(0), "Royalty receiver is zero");
assets[_cmd.id] = _cmd.assetData;
assetCap[_cmd.id] = _cmd.cap;
assetWeight[_cmd.id] = _cmd.weight;
_setRoyaltyReceiver(_cmd.id, _cmd.royaltyReceiver);
_setRoyaltyFee(_cmd.id, _cmd.royaltyFee);
_numericalIdAsset[calculateAssetNumericalId(_cmd.id)] = _cmd.id;
assetIds.push(_cmd.id);
emit AssetCreated(
_cmd.id,
_cmd.cap,
_cmd.assetData,
_cmd.weight,
_cmd.royaltyReceiver,
_cmd.royaltyFee
);
}
function modifyWeight(string memory _id, uint256 _newWeight) public {
_onlyManager();
_checkAssetExists(_id);
require(assetWeight[_id] != _newWeight, "Weight not changed");
uint256 oldWeight = assetWeight[_id];
assetWeight[_id] = _newWeight;
emit AssetWeightModified(_id, oldWeight, _newWeight);
}
function uriAsset(string memory _assetId)
public
view
returns (string memory)
{
_checkAssetExists(_assetId);
if (
keccak256(abi.encodePacked((assets[_assetId].uri))) !=
keccak256(abi.encodePacked(("NOT_BASE_URI")))
) {
return assets[_assetId].uri;
} else {
return _uri;
}
}
function cap(string memory _id) public view virtual returns (uint256) {
return assetCap[_id];
}
function weight(string memory _id) public view virtual returns (uint256) {
return assetWeight[_id];
}
function exists(string memory _id) external view returns (bool) {
return _existAsset(_id);
}
function setURI(string memory _newURI) public {
_onlyManager();
_setURI(_newURI);
emit BaseAssetCollectionURISet(_newURI);
}
function setAssetCustomUri(string memory _assetId, string memory _newURI) public {
_onlyManager();
_checkAssetExists(_assetId);
assets[_assetId].uri = _newURI;
emit AssetCustomURISet(_newURI, _assetId);
}
function pause() public virtual {
_onlyManager();
_pause();
}
function assetsInCollection() external view override returns (string[] memory) {
string[] memory _assetsInCollection = new string[](assetIds.length);
for (uint256 i = 0; i < _assetsInCollection.length; i++) {
_assetsInCollection[i] = assetIds[i];
}
return _assetsInCollection;
}
function unpause() public virtual {
_onlyManager();
_unpause();
}
function _existAsset(string memory _id) internal view returns (bool) {
return assetCap[_id] > 0;
}
function calculateAssetNumericalId(string memory _assetId)
public
pure
returns (uint256)
{
return uint256(keccak256(abi.encodePacked(_assetId)));
}
function modifyRoyaltyReceiver(string memory _assetId, address _newRoyaltyReceiver) public override {
_onlyManager();
super.modifyRoyaltyReceiver(_assetId, _newRoyaltyReceiver);
}
function modifyRoyaltyFee(string memory _assetId, uint256 _newRoyaltyFee) public override {
_onlyManager();
super.modifyRoyaltyFee(_assetId, _newRoyaltyFee);
}
function authorizeAssetBurner(
address _burner
) public virtual override(BurnerRole, IDATSNFTCollection) returns (bool) {
return super.authorizeAssetBurner(_burner);
}
function burn(
address _account,
string memory _assetId,
uint256 _tokenId
) public virtual override(NFTCollectionBurnable, IDATSNFTCollection) {
super.burn(_account, _assetId, _tokenId);
}
function burnBatch(
address _account,
string memory _assetId,
uint256[] memory _tokenIds
) public virtual override(NFTCollectionBurnable, IDATSNFTCollection) {
super.burnBatch(_account, _assetId, _tokenIds);
}
function _checkTransferIsApproved(address _from) internal override view {
require(
_from == _msgSender() || isApprovedForAll(_from, _msgSender()) ||
hasRole(DEFAULT_ADMIN_ROLE, _msgSender()) || isAssetManager(_msgSender()),
"Not approved"
);
}
function _getRoyaltyReceiverById(uint256 _numericalId) internal view override returns (address) {
return getRoyaltyReceiver(_numericalIdAsset[_numericalId]);
}
function getRoyaltyReceiver(string memory _assetId) public view override returns (address) {
return assetRoyaltyReceiver[_assetId];
}
function _setRoyaltyReceiver(string memory _assetId, address _newRoyaltyReceiver) internal override {
assetRoyaltyReceiver[_assetId] = _newRoyaltyReceiver;
}
function _getRoyaltyFeeById(uint256 _numericalId) internal view override returns (uint256) {
return getRoyaltyFee(_numericalIdAsset[_numericalId]);
}
function getRoyaltyFee(string memory _assetId) public view override returns (uint256) {
return assetRoyaltyFee[_assetId];
}
function _setRoyaltyFee(string memory _assetId, uint256 _newRoyaltyFee) internal override {
assetRoyaltyFee[_assetId] = _newRoyaltyFee;
}
function _checkAssetExists(string memory _id) internal view {
require(_existAsset(_id), "Non existent asset");
}
}
文件 18 的 25:NFTCollection.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "./NFTCollectionMintable.sol";
contract NFTCollection is NFTCollectionMintable {
using SafeMath for uint256;
constructor(
INFTCollection.NFTCollectionData memory _data,
bool _autoIncrementalCollection
) NFTCollectionMintable(_data, _autoIncrementalCollection) {}
function burn(
address _account,
string memory _assetId,
uint256 _tokenId
) public override {
uint256 nftCollectionTokenId = calculateNftCollectionTokenId(_assetId, _tokenId);
assetSupply[tokenAsset[nftCollectionTokenId]] = assetSupply[tokenAsset[nftCollectionTokenId]].sub(1);
_updateAssetAmount(_assetId, _account, address(0), 1);
super.burn(_account, _assetId, _tokenId);
emit NFTCollectionBurn(_account, _assetId, _tokenId, nftCollectionTokenId) ;
}
function burnBatch(
address _account,
string memory _assetId,
uint256[] memory _tokenIds
) public override {
uint256[] memory nftCollectionTokenIds = new uint256[](_tokenIds.length);
_updateAssetAmount(_assetId, _account, address(0), _tokenIds.length);
for (uint256 i = 0; i < _tokenIds.length; i++) {
nftCollectionTokenIds[i] = calculateNftCollectionTokenId(_assetId, _tokenIds[i]);
assetSupply[tokenAsset[nftCollectionTokenIds[i]]] =
assetSupply[tokenAsset[nftCollectionTokenIds[i]]].sub(1);
}
super.burnBatch(_account, _assetId, _tokenIds);
emit NFTCollectionBurnBatch(_account, _assetId, _tokenIds, nftCollectionTokenIds);
}
function safeTransferFrom(
address _from,
address _to,
uint256 _internalId,
uint256 _amount,
bytes memory _data
) public override {
require(_amount == 1, "amount must be 1");
_checkNotPaused();
_updateAssetAmount(_tokenMappings[_internalId], _from, _to, 1);
_safeTransferFrom(_from, _to, _internalId, 1, _data);
}
function safeTransferFrom(
address _from,
address _to,
string memory _assetId,
uint256 _tokenId,
bytes memory _data
)
public override
{
_checkNotPaused();
_updateAssetAmount(_assetId, _from, _to, 1);
uint256 internalId = calculateNftCollectionTokenId(_assetId, _tokenId);
_safeTransferFrom(_from, _to, internalId, 1, _data);
emit NFTCollectionTransfer(_from, _to, _assetId, _tokenId, internalId);
}
function safeBatchTransferFrom(
address _from,
address _to,
string memory _assetId,
uint256 [] memory _tokenIds,
bytes memory _data
)
public override
{
_checkNotPaused();
_updateAssetAmount(_assetId, _from, _to, _tokenIds.length);
uint256[] memory nftCollectionTokenIds = new uint256[](_tokenIds.length);
uint256[] memory amounts = new uint256[](_tokenIds.length);
for (uint256 i = 0; i < _tokenIds.length; i++) {
nftCollectionTokenIds[i] = calculateNftCollectionTokenId(_assetId, _tokenIds[i]);
amounts[i] = 1;
}
super.safeBatchTransferFrom(_from, _to, nftCollectionTokenIds, amounts, _data);
emit NFTCollectionTransferBatch(_from, _to, _assetId, _tokenIds, nftCollectionTokenIds);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public override {
_checkNotPaused();
super.safeBatchTransferFrom(from, to, ids, amounts, data);
}
function withdraw(NFTCollectionWithdrawCommand calldata withdrawCommand) external override {
safeTransferFrom(
withdrawCommand.from,
withdrawCommand.to,
withdrawCommand.assetId,
withdrawCommand.tokenId,
bytes("")
);
emit Withdraw(
withdrawCommand.operationId,
withdrawCommand.from,
withdrawCommand.to,
withdrawCommand.assetId,
withdrawCommand.tokenId
);
}
function authorizeAssetBurner(address _burner)
public override(NFTAssetCollection) returns (bool)
{
_onlyAdmin();
return super.authorizeAssetBurner(_burner);
}
function revokeAssetBurner(address _burner) public override returns (bool) {
_onlyAdmin();
return super.revokeAssetBurner(_burner);
}
function uri(uint256 _internalId) public view override returns (string memory) {
string memory _assetId = _tokenMappings[_internalId];
string memory _assetUri = uriAsset(_assetId);
if (!_isEmptyString(_assetUri)) {
return _assetUri;
}
return string(abi.encodePacked(_uri, "/", _assetId));
}
function _updateAssetAmount(string memory _assetId, address _from, address _to, uint256 _amount) private {
if (_from != address(0)) {
_assetAmountByUsers[_assetId][_from] =
_assetAmountByUsers[_assetId][_from].sub(_amount, "Insufficient balance");
}
if (_to != address(0)) {
_assetAmountByUsers[_assetId][_to] = _assetAmountByUsers[_assetId][_to].add(_amount);
}
}
function _checkNotPaused() internal view {
if (!hasRole(DEFAULT_ADMIN_ROLE, _msgSender())) {
require(!paused(), "Token transfer is paused");
}
}
function _checkApprovedToBurn(address _burner, address _account) internal override view {
_checkNotPaused();
return super._checkApprovedToBurn(_burner, _account);
}
function _isEmptyString(string memory _str) private pure returns (bool) {
bytes memory strBytes = bytes(_str);
return strBytes.length == 0;
}
}
文件 19 的 25:NFTCollectionBase.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155MetadataURI.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
import "@openzeppelin/contracts/introspection/ERC165.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
abstract contract NFTCollectionBase is Context, ERC165, Pausable, IERC1155, IERC1155MetadataURI {
using SafeMath for uint256;
using Address for address;
mapping(uint256 => mapping(address => uint256)) private _balances;
mapping(address => mapping(address => bool)) private _operatorApprovals;
string internal _uri;
bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26;
bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c;
constructor(string memory uri_) {
_setURI(uri_);
_registerInterface(_INTERFACE_ID_ERC1155);
_registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI);
}
function balanceOf(address account, uint256 id)
public
view
virtual
override
returns (uint256)
{
_checkNotZeroAddress(account);
return _balances[id][account];
}
function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
public
view
virtual
override
returns (uint256[] memory)
{
_checkArrayLengths(accounts.length, ids.length);
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
function setApprovalForAll(address operator, bool approved)
public
virtual
override
{
require(
_msgSender() != operator,
"Setting approval status for self"
);
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
function isApprovedForAll(address account, address operator)
public
view
virtual
override
returns (bool)
{
return _operatorApprovals[account][operator];
}
function _safeTransferFrom(
address from,
address to,
uint256 internalId,
uint256 amount,
bytes memory data
) internal {
_checkNotZeroAddress(to);
_checkTransferIsApproved(from);
address operator = _msgSender();
_balances[internalId][from] = _balances[internalId][from].sub(
amount,
"Insufficient balance"
);
_balances[internalId][to] = _balances[internalId][to].add(amount);
emit TransferSingle(operator, from, to, internalId, amount);
_doSafeTransferAcceptanceCheck(operator, from, to, internalId, amount, data);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public virtual override {
_checkArrayLengths(ids.length, amounts.length);
_checkNotZeroAddress(to);
_checkTransferIsApproved(from);
address operator = _msgSender();
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
_balances[id][from] = _balances[id][from].sub(
amount,
"Insufficient balance"
);
_balances[id][to] = _balances[id][to].add(amount);
}
emit TransferBatch(operator, from, to, ids, amounts);
_doSafeBatchTransferAcceptanceCheck(
operator,
from,
to,
ids,
amounts,
data
);
}
function calculateNftCollectionTokenId(
string memory _assetId,
uint256 _tokenId
) public pure returns (uint256) {
return uint256(keccak256(abi.encodePacked(_assetId, _tokenId)));
}
function _setURI(string memory newuri) internal virtual {
_uri = newuri;
}
function _mint(
address account,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
_checkNotZeroAddress(account);
address operator = _msgSender();
_balances[id][account] = _balances[id][account].add(amount);
emit TransferSingle(operator, address(0), account, id, amount);
_doSafeTransferAcceptanceCheck(
operator,
address(0),
account,
id,
amount,
data
);
}
function _mintBatch(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
_checkNotZeroAddress(to);
_checkArrayLengths(ids.length, amounts.length);
address operator = _msgSender();
for (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][to] = amounts[i].add(_balances[ids[i]][to]);
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_doSafeBatchTransferAcceptanceCheck(
operator,
address(0),
to,
ids,
amounts,
data
);
}
function _burn(
address account,
uint256 id,
uint256 amount
) internal virtual {
_checkNotZeroAddress(account);
_balances[id][account] = _balances[id][account].sub(
amount,
"Insufficient balance"
);
emit TransferSingle(_msgSender(), account, address(0), id, amount);
}
function _burnBatch(
address account,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
_checkNotZeroAddress(account);
for (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][account] = _balances[ids[i]][account].sub(
amounts[i],
"Insufficient balance"
);
}
emit TransferBatch(_msgSender(), account, address(0), ids, amounts);
}
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) private {
if (to.isContract()) {
try
IERC1155Receiver(to).onERC1155Received(
operator,
from,
id,
amount,
data
)
returns (bytes4 response) {
if (
response != IERC1155Receiver(to).onERC1155Received.selector
) {
revert("ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("Transfer to non ERC1155Receiver implementer");
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) private {
if (to.isContract()) {
try
IERC1155Receiver(to).onERC1155BatchReceived(
operator,
from,
ids,
amounts,
data
)
returns (bytes4 response) {
if (
response !=
IERC1155Receiver(to).onERC1155BatchReceived.selector
) {
revert("ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("Transfer to non ERC1155Receiver implementer");
}
}
}
function _checkArrayLengths(uint256 _array1Length, uint256 _array2Length) private pure {
require(_array1Length == _array2Length, "Array length mismatch");
}
function _checkNotZeroAddress(address _adr) private pure {
require(_adr != address(0), "Zero address not allowed");
}
function _checkTransferIsApproved(address _from) internal virtual view;
}
文件 20 的 25:NFTCollectionBurnable.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "./NFTCollectionBase.sol";
import "../BurnerRole.sol";
abstract contract NFTCollectionBurnable is BurnerRole, NFTCollectionBase {
function burn(address _account, string memory _assetId, uint256 _tokenId) public virtual {
_checkApprovedToBurn(msg.sender, _account);
_burn(
_account,
calculateNftCollectionTokenId(_assetId, _tokenId),
1
);
}
function burnBatch(
address _account,
string memory _assetId,
uint256[] memory _tokenIds
) public virtual {
_checkApprovedToBurn(msg.sender, _account);
uint256[] memory nftCollectionTokenIds = new uint256[](_tokenIds.length);
uint256[] memory amounts = new uint256[](_tokenIds.length);
for (uint256 i = 0; i < _tokenIds.length; i++) {
nftCollectionTokenIds[i] = calculateNftCollectionTokenId(_assetId, _tokenIds[i]);
amounts[i] = 1;
}
_burnBatch(_account, nftCollectionTokenIds, amounts);
}
function _checkApprovedToBurn(address _burner, address _account) internal virtual view {
require((_burner == _account) || isAssetBurner(_burner), "Not approved");
}
}
文件 21 的 25:NFTCollectionMintable.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./NFTAssetCollection.sol";
abstract contract NFTCollectionMintable is NFTAssetCollection {
using SafeMath for uint256;
bool private _autoIncremental;
mapping(string => uint256) public assetSupply;
mapping(uint256 => string) public tokenAsset;
mapping(string => mapping(address => uint256)) internal _assetAmountByUsers;
mapping(uint256 => string) internal _tokenMappings;
mapping(string => uint256) internal _nextTokenIds;
constructor(
INFTCollection.NFTCollectionData memory _data,
bool _autoIncrementalCollection
) NFTAssetCollection(_data) {
_autoIncremental = _autoIncrementalCollection;
}
function mint(
address _to,
string memory _assetId,
uint256 _tokenId,
bytes memory _data
)
public
virtual
override
returns (uint256 id, uint256 internalId)
{
_onlyMinter();
_checkIsNotAutoIncremental();
_checkAssetExists(_assetId);
return _mintAsset(_to, _assetId, _tokenId, _data);
}
function mintBatch(
address _to,
string memory _assetId,
uint256[] memory _ids,
bytes memory _data
)
public
override
returns (uint256[] memory ids, uint256[] memory internalIds)
{
_onlyMinter();
_checkIsNotAutoIncremental();
_checkAssetExists(_assetId);
uint256 totalNewTokens = _ids.length;
_checkCapNotExceeded(_assetId, totalNewTokens);
uint256[] memory nftCollectionTokenIds = new uint256[](totalNewTokens);
uint256[] memory quantities = new uint256[](totalNewTokens);
for (uint256 i = 0; i < totalNewTokens; i++) {
nftCollectionTokenIds[i] = calculateNftCollectionTokenId(
_assetId,
_ids[i]
);
_checkTokenDoesNotExist(_assetId, nftCollectionTokenIds[i]);
tokenAsset[nftCollectionTokenIds[i]] = _assetId;
quantities[i] = 1;
}
return _mintBatch(
_to,
_assetId,
_ids,
nftCollectionTokenIds,
quantities,
_data
);
}
function mint(
address _to,
string memory _assetId,
bytes memory _data
)
public
virtual
override
returns (uint256 id, uint256 internalId)
{
_onlyMinter();
_checkIsAutoIncremental();
_checkAssetExists(_assetId);
uint256 tokenId = _nextTokenIds[_assetId];
_nextTokenIds[_assetId] = _nextTokenIds[_assetId].add(1);
return _mintAsset(_to, _assetId, tokenId, _data);
}
function mintBatch(
address _to,
string memory _assetId,
uint256 _totalTokens,
bytes memory _data
)
public
virtual
override
returns (uint256[] memory ids, uint256[] memory internalIds)
{
_onlyMinter();
_checkIsAutoIncremental();
_checkAssetExists(_assetId);
_checkCapNotExceeded(_assetId, _totalTokens);
uint256[] memory nftCollectionTokenIds = new uint256[](_totalTokens);
uint256[] memory quantities = new uint256[](_totalTokens);
uint256[] memory tokenIds = new uint256[](_totalTokens);
for (uint256 i = 0; i < _totalTokens; i++) {
(
nftCollectionTokenIds[i],
tokenIds[i]
) = _generateNewTokenIdForAsset(_assetId);
tokenAsset[nftCollectionTokenIds[i]] = _assetId;
quantities[i] = 1;
}
return _mintBatch(
_to,
_assetId,
tokenIds,
nftCollectionTokenIds,
quantities,
_data
);
}
function balanceOf(
address _account,
string memory _assetId,
uint256 _tokenId
) public view returns (uint256 balance) {
return
super.balanceOf(
_account,
calculateNftCollectionTokenId(_assetId, _tokenId)
);
}
function balanceOf(address _account, string memory _assetId)
public
view
returns (uint256 balance)
{
return _assetAmountByUsers[_assetId][_account];
}
function balanceOfBatch(
address[] memory _accounts,
string memory _assetId,
uint256[] memory _tokenIds
) public view returns (uint256[] memory balances) {
uint256[] memory nftCollectionTokenIds = new uint256[](
_tokenIds.length
);
for (uint256 i = 0; i < _tokenIds.length; i++) {
nftCollectionTokenIds[i] = calculateNftCollectionTokenId(
_assetId,
_tokenIds[i]
);
}
return balanceOfBatch(_accounts, nftCollectionTokenIds);
}
function assetBalanceOf(
string memory _assetId,
address _to
) external view override returns (NFTAssetBalance memory) {
NFTAssetBalance memory assetBalance;
assetBalance.id = _assetId;
assetBalance.weight = assetWeight[_assetId];
assetBalance.balance = _assetAmountByUsers[_assetId][_to];
return assetBalance;
}
function assetBalanceBatchOf(address _to) external view override returns (NFTAssetBalance[] memory) {
NFTAssetBalance[] memory assetBalances = new NFTAssetBalance[](assetIds.length);
for (uint256 i = 0; i < assetIds.length; i++) {
assetBalances[i].id = assetIds[i];
assetBalances[i].balance = _assetAmountByUsers[assetIds[i]][_to];
assetBalances[i].weight = assetWeight[assetIds[i]];
}
return assetBalances;
}
function totalSupply(string memory _assetId) public view returns (uint256) {
return assetSupply[_assetId];
}
function isAutoIncrementalCollection() external view override returns (bool) {
return _autoIncremental;
}
function assetsOf(address _account) external view returns (string[] memory) {
uint256 _numberOfAssetsOfAccount;
for (uint256 i = 0; i < assetIds.length; i++) {
if (balanceOf(_account, assetIds[i]) > 0) {
_numberOfAssetsOfAccount = _numberOfAssetsOfAccount.add(1);
}
}
string[] memory _assetsOfAccount = new string[](_numberOfAssetsOfAccount);
uint256 _assetsOfAccountIndex;
for (uint256 i = 0; i < assetIds.length; i++) {
if (balanceOf(_account, assetIds[i]) > 0) {
_assetsOfAccount[_assetsOfAccountIndex] = assetIds[i];
_assetsOfAccountIndex = _assetsOfAccountIndex.add(1);
}
}
return _assetsOfAccount;
}
function _generateNewTokenIdForAsset(string memory _assetId)
internal
returns (uint256 nftCollectionTokenId_, uint256 tokenId_)
{
tokenId_ = _nextTokenIds[_assetId];
nftCollectionTokenId_ = calculateNftCollectionTokenId(
_assetId,
tokenId_
);
_nextTokenIds[_assetId] = _nextTokenIds[_assetId].add(1);
}
function _checkTokenDoesNotExist(string memory _assetId, uint256 _tokenId) internal view {
require(
keccak256(abi.encodePacked(tokenAsset[_tokenId])) != keccak256(abi.encodePacked(_assetId)),
"Token already minted"
);
}
function _mintAsset(
address _to,
string memory _assetId,
uint256 _tokenId,
bytes memory _data
) internal returns (uint256 id, uint256 internalId) {
_checkCapNotExceeded(_assetId, 1);
uint256 nftCollectionTokenId = calculateNftCollectionTokenId(
_assetId,
_tokenId
);
_checkTokenDoesNotExist(_assetId, nftCollectionTokenId);
_tokenMappings[nftCollectionTokenId] = _assetId;
assetSupply[_assetId] = assetSupply[_assetId].add(1);
tokenAsset[nftCollectionTokenId] = _assetId;
_assetAmountByUsers[_assetId][_to] = _assetAmountByUsers[_assetId][_to].add(1);
_mint(_to, nftCollectionTokenId, 1, _data);
id = _tokenId;
internalId = nftCollectionTokenId;
emit NFTCollectionMint(_to, _assetId, _tokenId, nftCollectionTokenId);
}
function _mintBatch(
address _to,
string memory _assetId,
uint256[] memory _ids,
uint256[] memory _nftCollectionTokenIds,
uint256[] memory _quantities,
bytes memory _data
)
internal returns (uint256[] memory, uint256[] memory)
{
uint256 totalNewTokens = _ids.length;
assetSupply[_assetId] = assetSupply[_assetId].add(totalNewTokens);
_assetAmountByUsers[_assetId][_to] = _assetAmountByUsers[_assetId][_to]
.add(totalNewTokens);
_mintBatch(_to, _nftCollectionTokenIds, _quantities, _data);
emit NFTCollectionMintBatch(_to, _assetId, _ids, _nftCollectionTokenIds);
return (_ids, _nftCollectionTokenIds);
}
function _checkIsAutoIncremental() internal view {
require(_autoIncremental, "Must be autoIncremental");
}
function _checkIsNotAutoIncremental() internal view {
require(!_autoIncremental, "Must not be autoIncremental");
}
function _checkCapNotExceeded(string memory _assetId, uint256 _totalNewTokens) internal view {
require(
totalSupply(_assetId).add(_totalNewTokens) <= assetCap[_assetId],
"Cap exceeded"
);
}
}
文件 22 的 25:Pausable.sol
pragma solidity >=0.6.0 <0.8.0;
import "./Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor () internal {
_paused = false;
}
function paused() public view virtual returns (bool) {
return _paused;
}
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 23 的 25:RoyaltyFee.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/introspection/ERC165.sol";
import "./eips/IERC2981.sol";
import "./IRoyaltyFee.sol";
abstract contract RoyaltyFee is ERC165, IRoyaltyFee, IERC2981 {
using SafeMath for uint256;
bytes4 internal constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
constructor() {
_registerInterface(_INTERFACE_ID_ERC2981);
}
function royaltyInfo(
uint256 _tokenId,
uint256 _salePrice
) external view override returns (address receiver, uint256 royaltyAmount) {
receiver = _getRoyaltyReceiverById(_tokenId);
royaltyAmount = _getRoyaltyFeeById(_tokenId).mul(_salePrice).div(100);
}
function modifyRoyaltyReceiver(string memory _assetId, address _newRoyaltyReceiver) public virtual {
address oldReceiver = getRoyaltyReceiver(_assetId);
require(oldReceiver != _newRoyaltyReceiver, "Receiver has not changed");
_setRoyaltyReceiver(_assetId, _newRoyaltyReceiver);
emit RoyaltyModified(
_assetId,
oldReceiver,
_newRoyaltyReceiver,
getRoyaltyFee(_assetId),
getRoyaltyFee(_assetId)
);
}
function modifyRoyaltyFee(
string memory _assetId,
uint256 _newRoyaltyFee
) public virtual {
uint256 oldFee = getRoyaltyFee(_assetId);
_checkValidRoyaltyFee(_newRoyaltyFee);
require(oldFee != _newRoyaltyFee, "Royalty fee has not changed");
_setRoyaltyFee(_assetId, _newRoyaltyFee);
emit RoyaltyModified(
_assetId,
getRoyaltyReceiver(_assetId),
getRoyaltyReceiver(_assetId),
oldFee,
_newRoyaltyFee
);
}
function _checkValidRoyaltyFee(uint256 _royaltyFee) internal pure {
require(_royaltyFee <= 100, "Royalty fee must not be greater than 100");
}
function _getRoyaltyReceiverById(uint256 _tokenId) internal view virtual returns (address);
function getRoyaltyReceiver(string memory _assetId) public view virtual returns (address);
function _setRoyaltyReceiver(string memory _assetId, address _receiver) internal virtual;
function _getRoyaltyFeeById(uint256 _tokenId) internal view virtual returns (uint256);
function getRoyaltyFee(string memory _assetId) public view virtual returns (uint256);
function _setRoyaltyFee(string memory _assetId, uint256 _fee) internal virtual;
}
文件 24 的 25:SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
文件 25 的 25:Strings.sol
pragma solidity >=0.6.0 <0.8.0;
library Strings {
function toString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
uint256 index = digits - 1;
temp = value;
while (temp != 0) {
buffer[index--] = bytes1(uint8(48 + temp % 10));
temp /= 10;
}
return string(buffer);
}
}
{
"compilationTarget": {
"contracts/NFTCollection/NFTCollection.sol": "NFTCollection"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1
},
"remappings": []
}
[{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseUri","type":"string"},{"internalType":"string","name":"collectionId","type":"string"}],"internalType":"struct INFTCollection.NFTCollectionData","name":"_data","type":"tuple"},{"internalType":"bool","name":"_autoIncrementalCollection","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AssetBurnerAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AssetBurnerRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"id","type":"string"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"indexed":false,"internalType":"struct INFTCollection.NFTCollectionAssetData","name":"assetData","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"},{"indexed":false,"internalType":"address","name":"royaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyFee","type":"uint256"}],"name":"AssetCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseUri","type":"string"},{"indexed":false,"internalType":"string","name":"assetId","type":"string"}],"name":"AssetCustomURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"manager","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AssetManagerAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"manager","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AssetManagerRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AssetMinterAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AssetMinterRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"id","type":"string"},{"indexed":false,"internalType":"uint256","name":"oldWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWeight","type":"uint256"}],"name":"AssetWeightModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseUri","type":"string"}],"name":"BaseAssetCollectionURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"string","name":"assetId","type":"string"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftCollectionTokenId","type":"uint256"}],"name":"NFTCollectionBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"string","name":"assetId","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"nftCollectionTokenIds","type":"uint256[]"}],"name":"NFTCollectionBurnBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"string","name":"assetId","type":"string"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftCollectionTokenId","type":"uint256"}],"name":"NFTCollectionMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"string","name":"assetId","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"nftCollectionTokenIds","type":"uint256[]"}],"name":"NFTCollectionMintBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"string","name":"assetId","type":"string"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftCollectionTokenId","type":"uint256"}],"name":"NFTCollectionTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"string","name":"assetId","type":"string"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"nftCollectionTokenIds","type":"uint256[]"}],"name":"NFTCollectionTransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"assetId","type":"string"},{"indexed":false,"internalType":"address","name":"oldRoyaltyReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"newRoyaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldRoyaltyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyFee","type":"uint256"}],"name":"RoyaltyModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"operationId","type":"string"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"string","name":"assetId","type":"string"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"assetBalanceBatchOf","outputs":[{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"internalType":"struct IDATSNFTCollection.NFTAssetBalance[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"address","name":"_to","type":"address"}],"name":"assetBalanceOf","outputs":[{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"internalType":"struct IDATSNFTCollection.NFTAssetBalance","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"assetCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"assetIds","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"assetRoyaltyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"assetRoyaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"assetSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"assetWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"assets","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetsInCollection","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"assetsOf","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_burner","type":"address"}],"name":"authorizeAssetBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"authorizeAssetManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"authorizeAssetMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"string","name":"_assetId","type":"string"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"}],"name":"calculateAssetNumericalId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"calculateNftCollectionTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_id","type":"string"}],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"uint256","name":"cap","type":"uint256"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct INFTCollection.NFTCollectionAssetData","name":"assetData","type":"tuple"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"uint256","name":"royaltyFee","type":"uint256"}],"internalType":"struct INFTCollection.CreateAssetCommand","name":"_cmd","type":"tuple"}],"name":"createAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_id","type":"string"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"}],"name":"getRoyaltyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"}],"name":"getRoyaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_burner","type":"address"}],"name":"isAssetBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"isAssetManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"isAssetMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAutoIncrementalCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"internalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"internalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256","name":"_totalTokens","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mintBatch","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"internalIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mintBatch","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"internalIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256","name":"_newRoyaltyFee","type":"uint256"}],"name":"modifyRoyaltyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"address","name":"_newRoyaltyReceiver","type":"address"}],"name":"modifyRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_id","type":"string"},{"internalType":"uint256","name":"_newWeight","type":"uint256"}],"name":"modifyWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burner","type":"address"}],"name":"revokeAssetBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"revokeAssetManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"revokeAssetMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_internalId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"},{"internalType":"string","name":"_newURI","type":"string"}],"name":"setAssetCustomUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenAsset","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_defaultAdmin","type":"address"}],"name":"transferDefaultAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_internalId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_assetId","type":"string"}],"name":"uriAsset","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_id","type":"string"}],"name":"weight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"operationId","type":"string"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"assetId","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct IDATSNFTCollection.NFTCollectionWithdrawCommand","name":"withdrawCommand","type":"tuple"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]