编译器
0.8.19+commit.7dd6d404
文件 1 的 4:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 2 的 4:IUXSBT.sol
pragma solidity >=0.8.19;
pragma abicoder v2;
interface IUXSBT {
function register(address owner, string calldata name, bool reverseRecord) external returns (uint tokenId);
function multiRegister(address[] memory to, string[] calldata name) external;
}
文件 3 的 4:TransferHelper.sol
pragma solidity >=0.6.0;
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
library TransferHelper {
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
(bool success, bytes memory data) =
token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF');
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST');
}
function safeApprove(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA');
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'STE');
}
}
文件 4 的 4:UXOdysseySBT.sol
pragma solidity >=0.8.19;
pragma abicoder v2;
import '@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol';
import "./libs/IUXSBT.sol";
contract UXOdysseySBT {
IUXSBT public UXSBT;
address public UXUYNameServiceV2 = 0x6Ef77Af3bEe7A189318317861C0a23B425824a48;
address public UXUYTOKEN = 0xebd792134a53A4B304A8f6A0A9319B99fDC3fd35;
uint256 public price = 80 * 1 ether;
mapping(address => bool) public superOperators;
modifier isSuperOperator() {
require(superOperators[msg.sender], "Not super operator");
_;
}
event MintSuccess(
address sender,
string name,
uint256 price,
uint tokenId
);
constructor() {
superOperators[msg.sender] = true;
UXSBT = IUXSBT(UXUYNameServiceV2);
}
function mint(string calldata name) external returns (uint tokenId) {
uint256 balance = IERC20(UXUYTOKEN).balanceOf(msg.sender);
require(balance >= price, "Token balance is not enough!");
TransferHelper.safeTransferFrom(UXUYTOKEN, msg.sender, address(this), price);
tokenId = UXSBT.register(msg.sender, name, false);
emit MintSuccess(msg.sender,name,price,tokenId);
}
function setPrice(uint256 _price) external isSuperOperator {
price = _price;
}
function setUXUYTokenAndUXSBT(address _uxuytoken, address _sbt) external isSuperOperator {
UXUYTOKEN = _uxuytoken;
UXUYNameServiceV2 = _sbt;
UXSBT = IUXSBT(UXUYNameServiceV2);
}
receive() external payable {}
function withdrawStuckToken(address _token, address _to) external isSuperOperator {
require(_token != address(0), "_token address cannot be 0");
uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
TransferHelper.safeTransfer(_token, _to, _contractBalance);
}
function withdrawStuckEth(address toAddr) external isSuperOperator {
(bool success, ) = toAddr.call{
value: address(this).balance
} ("");
require(success);
}
function authorizeOperator(address _operator) external isSuperOperator {
superOperators[_operator] = true;
}
function revokeOperator(address _operator) external isSuperOperator {
superOperators[_operator] = false;
}
}
{
"compilationTarget": {
"contracts/UXOdysseySBT.sol": "UXOdysseySBT"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintSuccess","type":"event"},{"inputs":[],"name":"UXSBT","outputs":[{"internalType":"contract IUXSBT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UXUYNameServiceV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UXUYTOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uxuytoken","type":"address"},{"internalType":"address","name":"_sbt","type":"address"}],"name":"setUXUYTokenAndUXSBT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"superOperators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAddr","type":"address"}],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]