编译器
0.8.17+commit.8df45f5f
文件 1 的 3:Burn.sol
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/access/Ownable.sol";
interface IToken {
function burnFT(address, uint256, uint256) external;
function mintNFT(address to, uint16 tier, uint256 quantity) external;
}
struct TokenMap {
bool enabled;
uint16 tier;
uint256 quantity;
}
contract Burn is Ownable {
address private _tokenAddress;
bool private _enabled;
mapping(uint256 => TokenMap) _tokenToTier;
function setEnabled(bool b) public onlyOwner {
_enabled = b;
}
function setTokenAddress(address addr) public onlyOwner {
_tokenAddress = addr;
}
function setMapping(
uint256 fungibleID,
bool enabled,
uint16 tier,
uint256 quantity
) public onlyOwner {
_tokenToTier[fungibleID] = TokenMap(enabled, tier, quantity);
}
function breakCrate(address to, uint256 token, uint256 quantity) public {
require(_enabled == true, "Breaking is not enabled.");
require(_tokenToTier[token].enabled, "Token not configured.");
IToken(_tokenAddress).burnFT(_msgSender(), token, quantity);
IToken(_tokenAddress).mintNFT(
to,
_tokenToTier[token].tier,
_tokenToTier[token].quantity * quantity
);
}
}
文件 2 的 3: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 的 3: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);
}
}
{
"compilationTarget": {
"contracts/Burn.sol": "Burn"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 20000
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"breakCrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fungibleID","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint16","name":"tier","type":"uint16"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]