113 lines
3.1 KiB
Solidity
Executable File
113 lines
3.1 KiB
Solidity
Executable File
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity ^0.8.0;
|
|
|
|
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol";
|
|
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol";
|
|
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/ERC1155Pausable.sol";
|
|
|
|
contract MyERC1155 is ERC1155Pausable, Ownable {
|
|
mapping(uint256 => uint256) private _totalSupply;
|
|
|
|
string _name;
|
|
|
|
string _symbol;
|
|
|
|
constructor(string memory name_, string memory symbol_) ERC1155("") {
|
|
_name = name_;
|
|
_symbol = symbol_;
|
|
}
|
|
|
|
function name() public view virtual returns (string memory) {
|
|
return _name;
|
|
}
|
|
|
|
function symbol() public view virtual returns (string memory) {
|
|
return _symbol;
|
|
}
|
|
|
|
function mint(
|
|
address to,
|
|
uint256 id,
|
|
uint256 amount,
|
|
bytes memory data
|
|
) public virtual onlyOwner {
|
|
_mint(to, id, amount, data);
|
|
}
|
|
|
|
function burn(
|
|
address account,
|
|
uint256 id,
|
|
uint256 value
|
|
) public virtual onlyOwner {
|
|
require(
|
|
account == _msgSender() || isApprovedForAll(account, _msgSender()),
|
|
"ERC1155: caller is not token owner or approved"
|
|
);
|
|
|
|
_burn(account, id, value);
|
|
}
|
|
|
|
function burnBatch(
|
|
address account,
|
|
uint256[] memory ids,
|
|
uint256[] memory values
|
|
) public virtual onlyOwner {
|
|
require(
|
|
account == _msgSender() || isApprovedForAll(account, _msgSender()),
|
|
"ERC1155: caller is not token owner or approved"
|
|
);
|
|
|
|
_burnBatch(account, ids, values);
|
|
}
|
|
|
|
/**
|
|
* @dev Total amount of tokens in with a given id.
|
|
*/
|
|
function totalSupply(uint256 id) public view virtual returns (uint256) {
|
|
return _totalSupply[id];
|
|
}
|
|
|
|
/**
|
|
* @dev Indicates whether any token exist with a given id, or not.
|
|
*/
|
|
function exists(uint256 id) public view virtual returns (bool) {
|
|
return totalSupply(id) > 0;
|
|
}
|
|
|
|
/**
|
|
* @dev See {ERC1155-_beforeTokenTransfer}.
|
|
*/
|
|
function _beforeTokenTransfer(
|
|
address operator,
|
|
address from,
|
|
address to,
|
|
uint256[] memory ids,
|
|
uint256[] memory amounts,
|
|
bytes memory data
|
|
) internal virtual override {
|
|
super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
|
|
|
|
if (from == address(0)) {
|
|
for (uint256 i = 0; i < ids.length; ++i) {
|
|
_totalSupply[ids[i]] += amounts[i];
|
|
}
|
|
}
|
|
|
|
if (to == address(0)) {
|
|
for (uint256 i = 0; i < ids.length; ++i) {
|
|
uint256 id = ids[i];
|
|
uint256 amount = amounts[i];
|
|
uint256 supply = _totalSupply[id];
|
|
require(
|
|
supply >= amount,
|
|
"ERC1155: burn amount exceeds totalSupply"
|
|
);
|
|
unchecked {
|
|
_totalSupply[id] = supply - amount;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|