文件 1 的 28: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 的 28: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 的 28: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 constant _MANAGER_ROLE = keccak256("MANAGER_ROLE");
bytes32 private constant _MINTER_ROLE = keccak256("MINTER_ROLE");
constructor() {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
}
function transferDefaultAdmin(address defaultAdmin) external returns (bool) {
require(_msgSender() != defaultAdmin, "Must be different admin");
grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);
renounceRole(DEFAULT_ADMIN_ROLE, _msgSender());
return true;
}
function authorizeAssetManager(address manager) external override returns (bool) {
grantRole(_MANAGER_ROLE, manager);
emit AssetManagerAuthorized(manager, _msgSender());
return true;
}
function revokeAssetManager(address manager) external override returns (bool) {
revokeRole(_MANAGER_ROLE, manager);
emit AssetManagerRevoked(manager, _msgSender());
return true;
}
function authorizeAssetMinter(address minter) external override returns (bool) {
grantRole(_MINTER_ROLE, minter);
emit AssetMinterAuthorized(minter, _msgSender());
return true;
}
function revokeAssetMinter(address minter) external override returns (bool) {
revokeRole(_MINTER_ROLE, minter);
emit AssetMinterRevoked(minter, _msgSender());
return true;
}
function isAssetManager(address manager) public override view returns (bool) {
return hasRole(_MANAGER_ROLE, manager);
}
function isAssetMinter(address minter) external override view returns (bool) {
return hasRole(_MINTER_ROLE, minter);
}
function _onlyAdmin() internal view {
require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
"Not admin"
);
}
function _onlyManager() internal view {
require(hasRole(_MANAGER_ROLE, _msgSender()) ||
hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
"0x28: must have manager role"
);
}
function _onlyMinter() internal view {
require(hasRole(_MINTER_ROLE, _msgSender()) ||
hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
"0x28: must have minter role"
);
}
}
文件 4 的 28:BurnerRole.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/access/AccessControl.sol";
abstract contract BurnerRole is AccessControl {
bytes32 private constant _BURNER_ROLE = keccak256("BURNER_ROLE");
event AssetBurnerAuthorized(address burner, address owner);
event AssetBurnerRevoked(address burner, address owner);
function authorizeAssetBurner(address _burner) public virtual returns (bool) {
grantRole(_BURNER_ROLE, _burner);
emit AssetBurnerAuthorized(_burner, _msgSender());
return true;
}
function revokeAssetBurner(address _burner) public virtual returns (bool) {
revokeRole(_BURNER_ROLE, _burner);
emit AssetBurnerRevoked(_burner, _msgSender());
return true;
}
function isAssetBurner(address _burner) public view returns (bool) {
return hasRole(_BURNER_ROLE, _burner);
}
}
文件 5 的 28: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 的 28: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 的 28: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 的 28:IAsset.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
interface IAsset {
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 的 28: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;
function assetIdByInternalTokenId(uint256 _internalTokenId) external view returns(string memory);
}
文件 10 的 28: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 的 28: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 的 28: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 的 28:IERC165.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 14 的 28: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 的 28: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;
uint256 collectionCap;
uint256 collectionMintLimit;
}
struct AssetData {
string name;
string symbol;
string uri;
address royaltyReceiver;
uint256 royaltyFee;
uint256 weight;
uint256 cap;
}
struct NFTCollectionAssetData {
string name;
string symbol;
string uri;
}
struct CreateAssetCommand {
string id;
uint256 cap;
NFTCollectionAssetData assetData;
uint256 weight;
address royaltyReceiver;
uint256 royaltyFee;
}
}
文件 16 的 28: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 的 28:NFTAssetCollection.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "./NFTAssetCollectionBase.sol";
import "./INFTCollection.sol";
import "../../Asset.sol";
import "../../IDATSNFTCollection.sol";
abstract contract NFTAssetCollection is
Asset,
NFTAssetCollectionBase,
INFTCollection,
IDATSNFTCollection
{
mapping(string => bool) private _assetExists;
mapping(string => AssetData) internal _assets;
mapping(uint256 => string) internal _numericalIdAsset;
string public name;
string public symbol;
string public override collectionId;
string[] internal _assetIds;
mapping(string => uint256) internal _assetIdToIndex;
constructor(NFTCollectionData memory _data)
NFTAssetCollectionBase(_data.baseUri)
{
name = _data.name;
symbol = _data.symbol;
collectionId = _data.collectionId;
_registerInterface(type(IDATSNFTCollection).interfaceId);
}
function createAsset(CreateAssetCommand calldata _cmd) public virtual {
_onlyManager();
_checkNotZeroAddress(_cmd.royaltyReceiver);
require(!_assetExists[_cmd.id], "Asset exists");
if (_assetIds.length > 0) {
if (_assets[_assetIds[0]].weight == 0) {
require(_cmd.weight == 0, "No weight");
} else {
require(_cmd.weight > 0, "Needs weight");
}
}
_assets[_cmd.id] = AssetData(
_cmd.assetData.name,
_cmd.assetData.symbol,
_cmd.assetData.uri,
_cmd.royaltyReceiver,
_cmd.royaltyFee,
_cmd.weight,
_cmd.cap
);
_assetExists[_cmd.id] = true;
_numericalIdAsset[calculateAssetNumericalId(_cmd.id)] = _cmd.id;
_assetIdToIndex[_cmd.id] = _assetIds.length;
_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);
uint256 oldWeight = _assets[_id].weight;
require(oldWeight != _newWeight, "Same weight");
_assets[_id].weight = _newWeight;
emit AssetWeightModified(_id, oldWeight, _newWeight);
}
function assetsInCollection()
external
view
override
returns (string[] memory)
{
return _assetIds;
}
function cap(string memory _id) public view virtual returns (uint256) {
return _assets[_id].cap;
}
function weight(string memory _id) public view virtual returns (uint256) {
return _assets[_id].weight;
}
function calculateAssetNumericalId(string memory _assetId)
public
pure
returns (uint256)
{
return uint256(keccak256(abi.encodePacked(_assetId)));
}
function calculateNftCollectionTokenId(
string memory _assetId,
uint256 _tokenId
) public pure returns (uint256) {
return uint256(keccak256(abi.encodePacked(_assetId, _tokenId)));
}
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 uriAsset(string calldata _assetId)
public
view
returns (string memory)
{
_checkAssetExists(_assetId);
string memory assetUri = _assets[_assetId].uri;
if (!_isEmptyString(assetUri)) {
return assetUri;
}
return _uri;
}
function _checkAssetExists(string memory _id) internal view {
require(_assetExists[_id], "Asset not exists");
}
function _isEmptyString(string memory _str) internal pure returns (bool) {
return bytes(_str).length == 0;
}
function _checkTransferIsApproved(address _from) internal view {
require(
_from == _msgSender() ||
isApprovedForAll(_from, _msgSender()) ||
hasRole(DEFAULT_ADMIN_ROLE, _msgSender()) ||
isAssetManager(_msgSender()),
"Not approved"
);
}
function _beforeAssetTokenTransfer(
address from,
address to,
string memory assetId,
uint256 amount
) internal virtual {}
}
文件 18 的 28:NFTAssetCollectionBase.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/introspection/ERC165.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
abstract contract NFTAssetCollectionBase is
Context,
ERC165,
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, "operator must not be sender");
_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 id,
uint256 amount,
bytes memory data
) internal {
_checkNotZeroAddress(to);
address operator = _msgSender();
_balances[id][from] = _balances[id][from].sub(
amount,
_insufficientBalanceErrorMessage()
);
_balances[id][to] = _balances[id][to].add(amount);
emit TransferSingle(operator, from, to, id, amount);
_doSafeTransferAcceptanceCheck(
operator,
from,
to,
id,
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);
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,
_insufficientBalanceErrorMessage()
);
_balances[id][to] = _balances[id][to].add(amount);
}
emit TransferBatch(operator, from, to, ids, amounts);
_doSafeBatchTransferAcceptanceCheck(
operator,
from,
to,
ids,
amounts,
data
);
}
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] = _balances[ids[i]][to].add(amounts[i]);
}
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,
_insufficientBalanceErrorMessage()
);
emit TransferSingle(_msgSender(), account, address(0), id, amount);
}
function _burnBatch(
address account,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
_checkNotZeroAddress(account);
_checkArrayLengths(ids.length, amounts.length);
for (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][account] = _balances[ids[i]][account].sub(
amounts[i],
_insufficientBalanceErrorMessage()
);
}
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
) {
_revertTokenRejected();
}
} catch Error(string memory reason) {
revert(reason);
} catch {
_revertNotERC1155Receiver();
}
}
}
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
) {
_revertTokenRejected();
}
} catch Error(string memory reason) {
revert(reason);
} catch {
_revertNotERC1155Receiver();
}
}
}
function _checkArrayLengths(uint256 _array1Length, uint256 _array2Length)
private
pure
{
require(_array1Length == _array2Length, "Array length mismatch");
}
function _checkNotZeroAddress(address _adr) internal pure {
require(_adr != address(0), "Zero address");
}
function _revertNotERC1155Receiver() internal pure {
revert("Transfer to non ERC1155Receiver");
}
function _revertTokenRejected() internal pure {
revert("ERC1155Receiver rejected tokens");
}
function _insufficientBalanceErrorMessage()
internal
pure
returns (string memory)
{
return "Insufficient balance";
}
}
文件 19 的 28:NFTAssetCollectionBurnable.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "../base/NFTAssetCollection.sol";
import "../../BurnerRole.sol";
abstract contract NFTAssetCollectionBurnable is NFTAssetCollection, BurnerRole {
function burn(
address _account,
string memory _assetId,
uint256 _tokenId
) public virtual override {
_burn(_account, calculateNftCollectionTokenId(_assetId, _tokenId), 1);
}
function burnBatch(
address _account,
string memory _assetId,
uint256[] memory _tokenIds
) public virtual override {
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 authorizeAssetBurner(address _burner)
public
virtual
override(IDATSNFTCollection, BurnerRole)
returns (bool)
{
_onlyAdmin();
return super.authorizeAssetBurner(_burner);
}
function revokeAssetBurner(address _burner) public override returns (bool) {
_onlyAdmin();
return super.revokeAssetBurner(_burner);
}
function _beforeAssetTokenTransfer(
address from,
address to,
string memory assetId,
uint256 amount
) internal virtual override {
super._beforeAssetTokenTransfer(from, to, assetId, amount);
if (to == address(0)) {
address operator = _msgSender();
require(
(operator == from) || isAssetBurner(operator),
"Not approved"
);
}
}
}
文件 20 的 28:NFTAssetCollectionCapped.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "../base/NFTAssetCollection.sol";
abstract contract NFTAssetCollectionCapped is NFTAssetCollection {
using SafeMath for uint256;
uint256 private _collectionCap;
constructor(uint256 collectionCap_) {
_collectionCap = collectionCap_;
}
function collectionCap() public view virtual returns (uint256) {
return _collectionCap;
}
function createAsset(CreateAssetCommand calldata _cmd)
public
virtual
override
{
if(_collectionCap != 0) _checkCollectionCap();
super.createAsset(_cmd);
}
function _checkCollectionCap() internal view {
require(
_assetIds.length.add(1) <= _collectionCap,
"Cap exceeded"
);
}
}
文件 21 的 28:NFTAssetCollectionMintable.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "./NFTAssetCollectionCapped.sol";
abstract contract NFTAssetCollectionMintable is NFTAssetCollectionCapped {
using SafeMath for uint256;
mapping(string => uint256) private _assetSupply;
mapping(uint256 => bool) internal _tokenAssetExists;
mapping(string => mapping(address => uint256)) private _assetAmountByUsers;
mapping(uint256 => uint256) internal _internalTokenIdToAssetIdIndex;
uint256 public collectionMintLimit;
constructor(NFTCollectionData memory _data)
NFTAssetCollectionCapped(_data.collectionCap)
NFTAssetCollection(_data)
{
collectionMintLimit = _data.collectionMintLimit;
}
function assetBalanceOf(string memory _assetId, address _to)
external
view
override
returns (NFTAssetBalance memory)
{
NFTAssetBalance memory assetBalance;
assetBalance.id = _assetId;
assetBalance.weight = _assets[_assetId].weight;
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 = _assets[_assetIds[i]].weight;
}
return assetBalances;
}
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 internalTokenIds = new uint256[](_tokenIds.length);
for (uint256 i = 0; i < _tokenIds.length; i++) {
internalTokenIds[i] = calculateNftCollectionTokenId(
_assetId,
_tokenIds[i]
);
}
return balanceOfBatch(_accounts, internalTokenIds);
}
function totalSupply(string memory _assetId) public view returns (uint256) {
return _assetSupply[_assetId];
}
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 assetIdByInternalTokenId(uint256 _internalTokenId)
external
view
override
returns (string memory)
{
uint256 _assetIdIndex = _internalTokenIdToAssetIdIndex[
_internalTokenId
];
return _assetIds[_assetIdIndex];
}
function _mintAsset(
address _to,
string memory _assetId,
uint256 _tokenId,
bytes memory _data
) internal returns (uint256 id, uint256 internalId) {
uint256 nftCollectionTokenId = calculateNftCollectionTokenId(
_assetId,
_tokenId
);
_checkTokenNotExist(nftCollectionTokenId);
_beforeAssetTokenTransfer(address(0), _to, _assetId, 1);
_internalTokenIdToAssetIdIndex[nftCollectionTokenId] = _assetIdToIndex[
_assetId
];
_tokenAssetExists[nftCollectionTokenId] = true;
_mint(_to, nftCollectionTokenId, 1, _data);
id = _tokenId;
internalId = nftCollectionTokenId;
emit NFTCollectionMint(_to, _assetId, _tokenId, nftCollectionTokenId);
}
function _mintBatchAsset(
address _to,
string memory _assetId,
uint256[] memory _ids,
uint256[] memory _nftCollectionTokenIds,
uint256[] memory _quantities,
bytes memory _data
) internal returns (uint256[] memory, uint256[] memory) {
_mintBatch(_to, _nftCollectionTokenIds, _quantities, _data);
emit NFTCollectionMintBatch(
_to,
_assetId,
_ids,
_nftCollectionTokenIds
);
return (_ids, _nftCollectionTokenIds);
}
function _checkTokenNotExist(uint256 _nftCollectionTokenId) internal view {
require(!_tokenAssetExists[_nftCollectionTokenId], "Already minted");
}
function _checkCapNotExceeded(
string memory _assetId,
uint256 _totalNewTokens
) internal view {
require(
totalSupply(_assetId).add(_totalNewTokens) <= _assets[_assetId].cap,
"Cap exceeded"
);
}
function _beforeAssetTokenTransfer(
address from,
address to,
string memory assetId,
uint256 amount
) internal virtual override {
super._beforeAssetTokenTransfer(from, to, assetId, amount);
if (to == address(0)) {
_decreaseBalances(assetId, from, amount);
}
if (from == address(0)) {
_onlyMinter();
_checkCollectionMintLimit(to, amount);
_increaseBalances(assetId, to, amount);
}
if (from != address(0) && to != address(0)) {
_checkTransferIsApproved(from);
_decreaseBalances(assetId, from, amount);
_increaseBalances(assetId, to, amount);
}
}
function _decreaseBalances(
string memory assetId,
address from,
uint256 amount
) private {
_assetAmountByUsers[assetId][from] = _assetAmountByUsers[assetId][from]
.sub(amount, _insufficientBalanceErrorMessage());
_assetSupply[assetId] = _assetSupply[assetId].sub(
amount,
_insufficientBalanceErrorMessage()
);
}
function _increaseBalances(
string memory assetId,
address to,
uint256 amount
) private {
_checkCapNotExceeded(assetId, amount);
_assetAmountByUsers[assetId][to] = _assetAmountByUsers[assetId][to].add(
amount
);
_assetSupply[assetId] = _assetSupply[assetId].add(amount);
}
function _checkCollectionMintLimit(address _to, uint256 _amount) private view {
if (collectionMintLimit == 0) {
return;
}
uint256 accumulatedBalance;
for (uint256 i = 0; i < _assetIds.length; i++) {
accumulatedBalance = accumulatedBalance.add(
_assetAmountByUsers[_assetIds[i]][_to]
);
}
require(accumulatedBalance.add(_amount) <= collectionMintLimit, "Mint limit reached");
}
}
文件 22 的 28:NFTAssetCollectionPausable.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/utils/Pausable.sol";
import "../base/NFTAssetCollection.sol";
abstract contract NFTAssetCollectionPausable is NFTAssetCollection, Pausable {
function pause() public virtual {
_onlyManager();
_pause();
}
function unpause() public virtual {
_onlyManager();
_unpause();
}
function _beforeAssetTokenTransfer(
address from,
address to,
string memory assetId,
uint256 amount
) internal virtual override {
_checkNotPaused();
super._beforeAssetTokenTransfer(from, to, assetId, amount);
}
function _checkNotPaused() internal view {
if (!hasRole(DEFAULT_ADMIN_ROLE, _msgSender())) {
require(!paused(), "Contract paused");
}
}
}
文件 23 的 28:NFTAssetCollectionRoyaltyFee.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "../base/NFTAssetCollection.sol";
import "../../RoyaltyFee.sol";
abstract contract NFTAssetCollectionRoyaltyFee is
NFTAssetCollection,
RoyaltyFee
{
constructor() {
_registerInterface(_INTERFACE_ID_ERC2981);
}
function createAsset(CreateAssetCommand calldata _cmd) public virtual override {
_checkValidRoyaltyFee(_cmd.royaltyFee);
super.createAsset(_cmd);
}
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 getRoyaltyFee(string memory _assetId)
public
view
override
returns (uint256)
{
return _assets[_assetId].royaltyFee;
}
function getRoyaltyReceiver(string memory _assetId)
public
view
override
returns (address)
{
return _assets[_assetId].royaltyReceiver;
}
function _getRoyaltyReceiverById(uint256 _numericalId)
internal
view
override
returns (address)
{
return getRoyaltyReceiver(_numericalIdAsset[_numericalId]);
}
function _setRoyaltyReceiver(
string memory _assetId,
address _newRoyaltyReceiver
) internal override {
_assets[_assetId].royaltyReceiver = _newRoyaltyReceiver;
}
function _getRoyaltyFeeById(uint256 _numericalId)
internal
view
override
returns (uint256)
{
return getRoyaltyFee(_numericalIdAsset[_numericalId]);
}
function _setRoyaltyFee(string memory _assetId, uint256 _newRoyaltyFee)
internal
override
{
_assets[_assetId].royaltyFee = _newRoyaltyFee;
}
}
文件 24 的 28:NFTCollection.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "./extensions/NFTAssetCollectionPausable.sol";
import "./extensions/NFTAssetCollectionBurnable.sol";
import "./extensions/NFTAssetCollectionRoyaltyFee.sol";
import "./extensions/NFTAssetCollectionMintable.sol";
abstract contract NFTCollection is
NFTAssetCollectionPausable,
NFTAssetCollectionBurnable,
NFTAssetCollectionRoyaltyFee,
NFTAssetCollectionMintable
{
using SafeMath for uint256;
constructor(NFTCollectionData memory _data)
NFTAssetCollectionMintable(_data)
{}
function createAsset(CreateAssetCommand calldata _cmd)
public
override(
NFTAssetCollection,
NFTAssetCollectionRoyaltyFee,
NFTAssetCollectionCapped
)
{
super.createAsset(_cmd);
}
function uri(uint256 nftCollectionId)
public
view
override
returns (string memory)
{
uint256 assetIdIndex = _internalTokenIdToAssetIdIndex[nftCollectionId];
string memory assetId = _assetIds[assetIdIndex];
string memory assetUri = _assets[assetId].uri;
if (!_isEmptyString(assetUri)) {
return assetUri;
}
return string(abi.encodePacked(_uri, "/", assetId));
}
function authorizeAssetBurner(address _burner)
public
virtual
override(IDATSNFTCollection, NFTAssetCollectionBurnable)
returns (bool)
{
return super.authorizeAssetBurner(_burner);
}
function burn(
address _account,
string memory _assetId,
uint256 _tokenId
) public override(NFTAssetCollectionBurnable, IDATSNFTCollection) {
uint256 nftCollectionTokenId = calculateNftCollectionTokenId(
_assetId,
_tokenId
);
_beforeAssetTokenTransfer(_account, address(0), _assetId, 1);
super.burn(_account, _assetId, _tokenId);
emit NFTCollectionBurn(
_account,
_assetId,
_tokenId,
nftCollectionTokenId
);
}
function burnBatch(
address _account,
string memory _assetId,
uint256[] memory _tokenIds
) public override(NFTAssetCollectionBurnable, IDATSNFTCollection) {
uint256[] memory nftCollectionTokenIds = new uint256[](
_tokenIds.length
);
_beforeAssetTokenTransfer(
_account,
address(0),
_assetId,
_tokenIds.length
);
for (uint256 i = 0; i < _tokenIds.length; i++) {
nftCollectionTokenIds[i] = calculateNftCollectionTokenId(
_assetId,
_tokenIds[i]
);
}
super.burnBatch(_account, _assetId, _tokenIds);
emit NFTCollectionBurnBatch(
_account,
_assetId,
_tokenIds,
nftCollectionTokenIds
);
}
function safeTransferFrom(
address _from,
address _to,
uint256 _nftCollectionTokenId,
uint256 _amount,
bytes memory _data
) public override {
require(_amount == 1, "amount not 1");
uint256 _assetIdIndex = _internalTokenIdToAssetIdIndex[
_nftCollectionTokenId
];
_beforeAssetTokenTransfer(_from, _to, _assetIds[_assetIdIndex], 1);
_safeTransferFrom(_from, _to, _nftCollectionTokenId, 1, _data);
}
function safeTransferFrom(
address _from,
address _to,
string memory _assetId,
uint256 _tokenId,
bytes memory _data
) public override {
_beforeAssetTokenTransfer(_from, _to, _assetId, 1);
uint256 nftCollectionTokenId = calculateNftCollectionTokenId(
_assetId,
_tokenId
);
_safeTransferFrom(_from, _to, nftCollectionTokenId, 1, _data);
emit NFTCollectionTransfer(
_from,
_to,
_assetId,
_tokenId,
nftCollectionTokenId
);
}
function safeBatchTransferFrom(
address _from,
address _to,
string memory _assetId,
uint256[] memory _tokenIds,
bytes memory _data
) public override {
_beforeAssetTokenTransfer(_from, _to, _assetId, _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();
_checkTransferIsApproved(from);
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 _beforeAssetTokenTransfer(
address from,
address to,
string memory assetId,
uint256 amount
)
internal
virtual
override(
NFTAssetCollection,
NFTAssetCollectionPausable,
NFTAssetCollectionBurnable,
NFTAssetCollectionMintable
)
{
super._beforeAssetTokenTransfer(from, to, assetId, amount);
}
}
文件 25 的 28:NFTCollectionAutoId.sol
pragma solidity ^0.7.5;
pragma experimental ABIEncoderV2;
import "./NFTCollection.sol";
contract NFTCollectionAutoId is NFTCollection {
using SafeMath for uint256;
mapping(string => uint256) internal _tokenIdsTracker;
constructor(NFTCollectionData memory _data) NFTCollection(_data) {}
function isAutoIncrementalCollection()
external
pure
override
returns (bool)
{
return true;
}
function mint(
address _to,
string memory _assetId,
bytes memory _data
) external virtual override returns (uint256 id, uint256 internalId) {
_checkAssetExists(_assetId);
uint256 tokenId = _tokenIdsTracker[_assetId];
_tokenIdsTracker[_assetId] = _tokenIdsTracker[_assetId].add(1);
return _mintAsset(_to, _assetId, tokenId, _data);
}
function mintBatch(
address _to,
string memory _assetId,
uint256 _totalTokens,
bytes memory _data
)
public
virtual
returns (uint256[] memory ids, uint256[] memory internalIds)
{
_checkAssetExists(_assetId);
_beforeAssetTokenTransfer(address(0), _to, _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++) {
tokenIds[i] = _tokenIdsTracker[_assetId];
nftCollectionTokenIds[i] = calculateNftCollectionTokenId(
_assetId,
tokenIds[i]
);
_tokenAssetExists[nftCollectionTokenIds[i]] = true;
quantities[i] = 1;
_tokenIdsTracker[_assetId] = _tokenIdsTracker[_assetId].add(1);
}
return
_mintBatchAsset(
_to,
_assetId,
tokenIds,
nftCollectionTokenIds,
quantities,
_data
);
}
function mint(
address _to,
string memory _assetId,
uint256 _tokenId,
bytes memory _data
) external override returns (uint256 id, uint256 internalId) {
revert("not supported");
}
function _beforeAssetTokenTransfer(
address from,
address to,
string memory assetId,
uint256 amount
) internal virtual override {
super._beforeAssetTokenTransfer(from, to, assetId, amount);
}
}
文件 26 的 28: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());
}
}
文件 27 的 28: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 = uint256(_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);
uint256 royaltyFee = getRoyaltyFee(_assetId);
emit RoyaltyModified(
_assetId,
oldReceiver,
_newRoyaltyReceiver,
royaltyFee,
royaltyFee
);
}
function modifyRoyaltyFee(string memory _assetId, uint256 _newRoyaltyFee)
public
virtual
{
uint256 oldFee = getRoyaltyFee(_assetId);
_checkValidRoyaltyFee(_newRoyaltyFee);
require(oldFee != _newRoyaltyFee, "Fee has not changed");
_setRoyaltyFee(_assetId, _newRoyaltyFee);
address royaltyReceiver = getRoyaltyReceiver(_assetId);
emit RoyaltyModified(
_assetId,
royaltyReceiver,
royaltyReceiver,
oldFee,
_newRoyaltyFee
);
}
function _checkValidRoyaltyFee(uint256 _royaltyFee) internal pure {
require(_royaltyFee <= 100, "Fee 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;
}
文件 28 的 28: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;
}
}
{
"compilationTarget": {
"contracts/NFTCollection/NFTCollectionAutoId.sol": "NFTCollectionAutoId"
},
"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":"uint256","name":"collectionCap","type":"uint256"},{"internalType":"uint256","name":"collectionMintLimit","type":"uint256"}],"internalType":"struct INFTCollection.NFTCollectionData","name":"_data","type":"tuple"}],"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":"uint256","name":"_internalTokenId","type":"uint256"}],"name":"assetIdByInternalTokenId","outputs":[{"internalType":"string","name":"","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":"collectionCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"pure","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":"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":"_nftCollectionTokenId","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":"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":"nftCollectionId","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"}]