编译器
0.8.17+commit.8df45f5f
文件 1 的 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;
}
}
文件 2 的 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());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
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);
}
}
文件 3 的 3:RTFKTxMurakamiGagosianShirtForging.sol
pragma solidity ^0.8.17;
import "@openzeppelin/contracts@4.4.1/access/Ownable.sol";
interface ERC1155 {
function balanceOf(address account, uint256 id) external view returns (uint256);
function burn(address account, uint256 id, uint256 value) external;
}
contract RTFKTxMurakamiGagosianShirtForging is Ownable {
address public shirtAddress;
uint256 public price;
uint256 public constant SHIRT_TOKEN_ID = 1;
uint256 public constant MINTS_PER_TOKEN = 2;
bool public forgeOpen;
error ForgeNotActive();
error InvalidAmount();
error InvalidPayment();
event newForge(uint256[1] tokenIds, uint256[1] amounts, address owner);
constructor (address shirtAddress_) {
shirtAddress = shirtAddress_;
}
function forgeToken(uint256 amount) public payable {
if (!forgeOpen) revert ForgeNotActive();
ERC1155 preForgeContract = ERC1155(shirtAddress);
uint256 tokensOwned = preForgeContract.balanceOf(msg.sender, SHIRT_TOKEN_ID);
uint256 maxForgeable = tokensOwned * MINTS_PER_TOKEN;
if (amount < 1 || amount > maxForgeable) revert InvalidAmount();
if (amount * price != msg.value) revert InvalidPayment();
uint256 tokensUsed = _getTokensUsed(amount);
preForgeContract.burn(msg.sender, SHIRT_TOKEN_ID, tokensUsed);
emit newForge([uint256(1)], [amount], msg.sender);
}
function _getTokensUsed(uint256 amount) internal pure returns (uint256) {
return amount / MINTS_PER_TOKEN + (amount % MINTS_PER_TOKEN == 0 ? 0 : 1);
}
function toggleForgeActive() public onlyOwner {
forgeOpen = !forgeOpen;
}
function setPrice(uint256 price_) public onlyOwner {
price = price_;
}
function withdrawFunds() public onlyOwner {
payable(msg.sender).transfer(address(this).balance);
}
}
{
"compilationTarget": {
"RTFKTxMurakamiGagosianShirtForging.sol": "RTFKTxMurakamiGagosianShirtForging"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"shirtAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ForgeNotActive","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidPayment","type":"error"},{"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":"uint256[1]","name":"tokenIds","type":"uint256[1]"},{"indexed":false,"internalType":"uint256[1]","name":"amounts","type":"uint256[1]"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"newForge","type":"event"},{"inputs":[],"name":"MINTS_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHIRT_TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forgeOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"forgeToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shirtAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleForgeActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]