编译器
0.8.17+commit.8df45f5f
文件 1 的 6:Auth.sol
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/utils/Context.sol";
contract Auth is Context {
error NotAuthorized(uint16 req, address sender);
mapping(address => uint16) _roles;
modifier requireRole(uint16 req) {
if (!_hasRole(_msgSender(), req)) {
revert NotAuthorized(req, _msgSender());
}
_;
}
function _setRole(address operator, uint16 mask) internal virtual {
_roles[operator] = mask;
}
function _hasRole(
address operator,
uint16 role
) internal view virtual returns (bool) {
return _roles[operator] & role == role;
}
}
文件 2 的 6:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 3 的 6:ERC1155.sol
pragma solidity >=0.8.0;
abstract contract ERC1155 {
event TransferSingle(
address indexed operator,
address indexed from,
address indexed to,
uint256 id,
uint256 amount
);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] amounts
);
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
event URI(string value, uint256 indexed id);
mapping(address => mapping(uint256 => uint256)) public balanceOf;
mapping(address => mapping(address => bool)) public _isApprovedForAll;
function uri(uint256 id) public view virtual returns (string memory);
function isApprovedForAll(
address owner,
address operator
) public view virtual returns (bool) {
return _isApprovedForAll[owner][operator];
}
function setApprovalForAll(address operator, bool approved) public virtual {
_isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) public virtual {
require(
msg.sender == from || _isApprovedForAll[from][msg.sender],
"NOT_AUTHORIZED"
);
balanceOf[from][id] -= amount;
balanceOf[to][id] += amount;
emit TransferSingle(msg.sender, from, to, id, amount);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155Received(
msg.sender,
from,
id,
amount,
data
) == ERC1155TokenReceiver.onERC1155Received.selector,
"UNSAFE_RECIPIENT"
);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) public virtual {
require(ids.length == amounts.length, "LENGTH_MISMATCH");
require(
msg.sender == from || _isApprovedForAll[from][msg.sender],
"NOT_AUTHORIZED"
);
uint256 id;
uint256 amount;
for (uint256 i = 0; i < ids.length; ) {
id = ids[i];
amount = amounts[i];
balanceOf[from][id] -= amount;
balanceOf[to][id] += amount;
unchecked {
++i;
}
}
emit TransferBatch(msg.sender, from, to, ids, amounts);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155BatchReceived(
msg.sender,
from,
ids,
amounts,
data
) == ERC1155TokenReceiver.onERC1155BatchReceived.selector,
"UNSAFE_RECIPIENT"
);
}
function balanceOfBatch(
address[] calldata owners,
uint256[] calldata ids
) public view virtual returns (uint256[] memory balances) {
require(owners.length == ids.length, "LENGTH_MISMATCH");
balances = new uint256[](owners.length);
unchecked {
for (uint256 i = 0; i < owners.length; ++i) {
balances[i] = balanceOf[owners[i]][ids[i]];
}
}
}
function supportsInterface(
bytes4 interfaceId
) public view virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 ||
interfaceId == 0xd9b67a26 ||
interfaceId == 0x0e89341c;
}
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
balanceOf[to][id] += amount;
emit TransferSingle(msg.sender, address(0), to, id, amount);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155Received(
msg.sender,
address(0),
id,
amount,
data
) == ERC1155TokenReceiver.onERC1155Received.selector,
"UNSAFE_RECIPIENT"
);
}
function _batchMint(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
uint256 idsLength = ids.length;
require(idsLength == amounts.length, "LENGTH_MISMATCH");
for (uint256 i = 0; i < idsLength; ) {
balanceOf[to][ids[i]] += amounts[i];
unchecked {
++i;
}
}
emit TransferBatch(msg.sender, address(0), to, ids, amounts);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155BatchReceived(
msg.sender,
address(0),
ids,
amounts,
data
) == ERC1155TokenReceiver.onERC1155BatchReceived.selector,
"UNSAFE_RECIPIENT"
);
}
function _batchBurn(
address from,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
uint256 idsLength = ids.length;
require(idsLength == amounts.length, "LENGTH_MISMATCH");
for (uint256 i = 0; i < idsLength; ) {
balanceOf[from][ids[i]] -= amounts[i];
unchecked {
++i;
}
}
emit TransferBatch(msg.sender, from, address(0), ids, amounts);
}
function _burn(address from, uint256 id, uint256 amount) internal virtual {
balanceOf[from][id] -= amount;
emit TransferSingle(msg.sender, from, address(0), id, amount);
}
}
abstract contract ERC1155TokenReceiver {
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return ERC1155TokenReceiver.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) external virtual returns (bytes4) {
return ERC1155TokenReceiver.onERC1155BatchReceived.selector;
}
}
文件 4 的 6:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 5 的 6:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
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());
}
}
文件 6 的 6:Token.sol
pragma solidity ^0.8.9;
import "./Auth.sol";
import "./ERC1155.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
struct TokenConfig {
bool added;
bool canMint;
bool canBurn;
uint256 supplyLimit;
}
contract Token is ERC1155, Pausable, Ownable, Auth {
string public name;
string public symbol;
string public contractURI;
string private _uri;
mapping(address => bool) private _approvalAllowlist;
uint16 public constant ROLE_ADD_FT = 1 << 0;
uint16 public constant ROLE_MODIFY_FT = 1 << 1;
uint16 public constant ROLE_MINT_FT = 1 << 2;
uint16 public constant ROLE_MINT_NFT = 1 << 3;
uint16 public constant ROLE_BATCH_MINT_NFT = 1 << 4;
uint16 public constant ROLE_BURN_FT = 1 << 5;
uint16 public constant ROLE_BURN_NFT = 1 << 6;
uint16 public constant ROLE_BATCH_BURN_NFT = 1 << 7;
uint16 public constant ROLE_REFRESH_METADATA = 1 << 8;
uint16 public constant ROLE_SET_PAUSED = 1 << 9;
uint16 public constant ROLE_BYPASS_PAUSE = 1 << 10;
uint256 public constant FUNGIBLE_TOKEN_UPPER_BOUND = 10_000;
mapping(uint256 => TokenConfig) private _added;
mapping(uint256 => uint256) private _minted;
mapping(uint256 => uint256) private _burned;
constructor(
string memory name_,
string memory symbol_,
string memory contractURI_,
string memory uri_
) ERC1155() {
setMetadata(name_, symbol_, contractURI_, uri_);
setRole(msg.sender, (1 << 12) - 1);
}
function setMetadata(
string memory name_,
string memory symbol_,
string memory contractURI_,
string memory uri_
) public onlyOwner {
name = name_;
symbol = symbol_;
contractURI = contractURI_;
_uri = uri_;
}
function uri(
uint256
) public view override(ERC1155) returns (string memory) {
return _uri;
}
function setApprovalAllowlist(
address operator,
bool approved
) public onlyOwner {
_approvalAllowlist[operator] = approved;
}
function isApprovedForAll(
address owner,
address operator
) public view override(ERC1155) returns (bool) {
if (_approvalAllowlist[operator] == true) {
return true;
}
return super.isApprovedForAll(owner, operator);
}
function setPaused(bool b) public requireRole(ROLE_SET_PAUSED) {
if (b) {
require(b && !paused(), "Contract is already paused");
_pause();
return;
}
require(!b && paused(), "Contract is not paused");
_unpause();
}
function _isFungible(uint256 id) internal pure returns (bool) {
return id < FUNGIBLE_TOKEN_UPPER_BOUND;
}
function _supplyLimit(uint256 id) internal view returns (uint256) {
if (!_isFungible(id)) {
return 1;
}
return _added[id].supplyLimit;
}
function supplyLimit(uint256 id) public view returns (uint256) {
return _supplyLimit(id);
}
function totalSupply(uint256 id) public view returns (uint256) {
return _minted[id] - _burned[id];
}
function addFT(
uint256 id,
uint256 supplyLimit_,
bool canMint_,
bool canBurn_
) public requireRole(ROLE_ADD_FT) {
require(_added[id].added == false, "Token already added.");
_added[id] = TokenConfig(true, canMint_, canBurn_, supplyLimit_);
emit TransferSingle(_msgSender(), address(0), address(0), id, 0);
}
function modifyFT(
uint256 id,
uint256 supplyLimit_,
bool canMint_,
bool canBurn_
) public requireRole(ROLE_MODIFY_FT) {
require(_added[id].added == true, "Token not added.");
_added[id] = TokenConfig(true, canMint_, canBurn_, supplyLimit_);
}
function mintFT(
address to,
uint256 tokenID,
uint256 quantity
) public requireRole(ROLE_MINT_FT) {
require(_isFungible(tokenID), "Token is not fungible.");
require(_added[tokenID].added, "Token type not added.");
require(_added[tokenID].canMint, "Token cannot be minted.");
require(
supplyLimit(tokenID) == 0 ||
(_minted[tokenID] + quantity <= supplyLimit(tokenID)),
"Mint would exceed supply limit."
);
_mint(to, tokenID, quantity, "");
_minted[tokenID] += quantity;
}
function mintNFT(
address to,
uint256 tokenID
) public requireRole(ROLE_MINT_NFT) {
require(!_isFungible(tokenID), "Token is fungible.");
require(_minted[tokenID] == 0, "Token is already minted.");
_minted[tokenID]++;
_mint(to, tokenID, 1, "");
}
function batchMintNFT(
address to,
uint256[] calldata ids
) public requireRole(ROLE_BATCH_MINT_NFT) {
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
require(!_isFungible(id), "Token is fungible.");
require(_minted[id] == 0, "Token is already minted.");
}
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
_minted[id]++;
_mint(to, id, 1, "");
}
}
function burnFT(
address owner,
uint256 tokenID,
uint256 quantity
) public requireRole(ROLE_BURN_FT) {
require(_isFungible(tokenID), "Token is not fungible.");
require(_added[tokenID].added, "Token type not added.");
require(_added[tokenID].canBurn, "Token cannot be burned.");
_burn(owner, tokenID, quantity);
}
function burnNFT(
address owner,
uint256 tokenID
) public requireRole(ROLE_BURN_NFT) {
require(!_isFungible(tokenID), "Token is fungible.");
require(_minted[tokenID] == 1, "Token is not minted.");
_burned[tokenID]++;
_burn(owner, tokenID, 1);
}
function batchBurnNFT(
address owner,
uint256[] calldata ids
) public requireRole(ROLE_BATCH_BURN_NFT) {
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
require(!_isFungible(id), "Token is fungible.");
require(_minted[id] == 1, "Token is not minted.");
}
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
_burned[id]++;
_burn(owner, id, 1);
}
}
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) public override(ERC1155) {
if (paused()) {
if (!_hasRole(_msgSender(), ROLE_BYPASS_PAUSE)) {
revert("Token is paused");
}
}
return super.safeTransferFrom(from, to, id, amount, data);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) public override(ERC1155) {
if (paused()) {
if (!_hasRole(_msgSender(), ROLE_BYPASS_PAUSE)) {
revert("Token is paused");
}
}
return super.safeBatchTransferFrom(from, to, ids, amounts, data);
}
event MetadataUpdate(uint256 _tokenId);
event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
function updateMetadata(
uint256 id
) public requireRole(ROLE_REFRESH_METADATA) {
emit MetadataUpdate(id);
}
function updateAllMetadata() public requireRole(ROLE_REFRESH_METADATA) {
emit BatchMetadataUpdate(0, type(uint256).max);
}
function setRole(address operator, uint16 mask) public onlyOwner {
_setRole(operator, mask);
}
function hasRole(address operator, uint16 role) public view returns (bool) {
return _hasRole(operator, role);
}
function _repeat(
uint256 value,
uint256 length
) private pure returns (uint256[] memory) {
uint256[] memory array = new uint256[](length);
for (uint256 i = 0; i < length; i++) {
array[i] = value;
}
return array;
}
}
{
"compilationTarget": {
"contracts/Token.sol": "Token"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 20000
},
"remappings": []
}
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"contractURI_","type":"string"},{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint16","name":"req","type":"uint16"},{"internalType":"address","name":"sender","type":"address"}],"name":"NotAuthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"amounts","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":"amount","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"},{"inputs":[],"name":"FUNGIBLE_TOKEN_UPPER_BOUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_ADD_FT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_BATCH_BURN_NFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_BATCH_MINT_NFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_BURN_FT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_BURN_NFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_BYPASS_PAUSE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_MINT_FT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_MINT_NFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_MODIFY_FT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_REFRESH_METADATA","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_SET_PAUSED","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"_isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"supplyLimit_","type":"uint256"},{"internalType":"bool","name":"canMint_","type":"bool"},{"internalType":"bool","name":"canBurn_","type":"bool"}],"name":"addFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"batchBurnNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"batchMintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"burnFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burnNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint16","name":"role","type":"uint16"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"supplyLimit_","type":"uint256"},{"internalType":"bool","name":"canMint_","type":"bool"},{"internalType":"bool","name":"canBurn_","type":"bool"}],"name":"modifyFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"id","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":"setApprovalAllowlist","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":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"contractURI_","type":"string"},{"internalType":"string","name":"uri_","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint16","name":"mask","type":"uint16"}],"name":"setRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateAllMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"updateMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]