编译器
0.8.25+commit.b61c2a91
文件 1 的 13:Context.sol
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 2 的 13:ELON_MUSCLE.sol
pragma solidity ^0.8.25;
import "./Token.sol";
contract ELON_MUSCLE is Token {
uint public constant max_lvl = 11;
uint[] lvl_pool_share = [
7000,
3000,
2000,
1500,
1100,
800,
600,
400,
200,
42
];
uint constant precesion = 10000;
constructor() Token("ELON MUSCLE", "MUSC") {}
function get_lvl() public view returns (uint) {
if (!this.is_token_started()) return 1;
return get_lvl_internal(balanceOf(_pair));
}
function get_lvl_internal(uint pair_balance) internal view returns (uint) {
uint i;
for (i = 0; i < lvl_pool_share.length; ++i) {
if (
pair_balance >
(_startTotalSupply * lvl_pool_share[i]) / precesion
) return i + 1;
}
return max_lvl;
}
function get_generation_data() public view returns (GenerationData memory) {
return get_generation_data_internal(get_lvl(), balanceOf(_pair));
}
function musk_svg() external view returns (string memory) {
return svg_from_data(get_generation_data());
}
}
文件 3 的 13:ERC20TokenBase.sol
pragma solidity ^0.8.20;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {Context} from "@openzeppelin/contracts/utils/Context.sol";
import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";
abstract contract ERC20TokenBase is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_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 decimals() public view virtual returns (uint8) {
return 9;
}
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
function _transfer(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
_totalSupply -= value;
}
} else {
unchecked {
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
文件 4 的 13:GenerationData.sol
pragma solidity ^0.8.23;
struct GenerationData {
uint lvl;
uint bcground_color;
uint body;
uint boots;
uint cloth;
uint glasses;
uint hat;
uint pants;
}
文件 5 的 13:Generator.sol
pragma solidity ^0.8.25;
import "./GeneratorLib.sol";
import "./RandLib.sol";
import "./Ownable.sol";
import "./GenerationData.sol";
import "./IGenerator.sol";
uint8 constant PIXELS_COUNT = 64;
contract Generator is Ownable, IGenerator {
using PathLib for Path;
using PathLib for Path[];
using RandLib for Rand;
Path[] head;
mapping(uint => mapping(uint => Path[])) body;
mapping(uint => mapping(uint => Path[])) boots;
mapping(uint => mapping(uint => Path[])) clothes;
mapping(uint => mapping(uint => Path[])) glasses;
mapping(uint => mapping(uint => Path[])) hats;
mapping(uint => mapping(uint => Path[])) pants;
mapping(uint => uint8) body_count;
mapping(uint => uint8) boots_count;
mapping(uint => uint8) clothes_count;
mapping(uint => uint8) glasses_count;
mapping(uint => uint8) hats_count;
mapping(uint => uint8) pants_count;
string[] private colors = [
"#ebbf89",
"#47321c",
"#898989",
"#898989",
"#898989",
"#8089a2",
"#4c5570",
"#354e99",
"#3c6cb2",
"#a12621",
"#842637",
"#8a4e6a",
"#cfd2d1",
"#cfd2d1",
"#6e3787",
"#6e3787",
"#454753",
"#847344",
"#614a4a",
"#535a5d",
"#364c52",
"#2c2d33",
"#b79539",
"#b6984d",
"#645540",
"#6c2d27",
"#71422c",
"#817757",
"#2c221f",
"#62a75f"
];
function set_head(Path[] calldata paths) external onlyOwner {
uint i;
for (i = 0; i < paths.length; ++i) head.push(paths[i]);
}
function set_body(uint lvl, FileData[] calldata files) external onlyOwner {
FilesLib.set_files(body, body_count, lvl, files);
}
function set_boots(uint lvl, FileData[] calldata files) external onlyOwner {
FilesLib.set_files(boots, boots_count, lvl, files);
}
function set_clothes(
uint lvl,
FileData[] calldata files
) external onlyOwner {
FilesLib.set_files(clothes, clothes_count, lvl, files);
}
function set_glasses(
uint lvl,
FileData[] calldata files
) external onlyOwner {
FilesLib.set_files(glasses, glasses_count, lvl, files);
}
function set_hats(uint lvl, FileData[] calldata files) external onlyOwner {
FilesLib.set_files(hats, hats_count, lvl, files);
}
function set_pants(uint lvl, FileData[] calldata files) external onlyOwner {
FilesLib.set_files(pants, pants_count, lvl, files);
}
function get_generation_data_internal(
uint lvl,
uint seed
) public view returns (GenerationData memory) {
Rand memory rnd = Rand(uint(keccak256(abi.encodePacked(lvl, seed))), 0);
GenerationData memory data = GenerationData(0, 0, 0, 0, 0, 0, 0, 0);
data.lvl = lvl;
data.bcground_color = 1 + (rnd.next() % colors.length);
data.body = 1 + (rnd.next() % body_count[lvl]);
if (rnd.next() % 2 == 1)
data.boots = 1 + (rnd.next() % boots_count[lvl]);
if (rnd.next() % 2 == 1)
data.cloth = 1 + (rnd.next() % clothes_count[lvl]);
if (rnd.next() % 2 == 1)
data.glasses = 1 + (rnd.next() % glasses_count[lvl]);
if (rnd.next() % 2 == 1) data.hat = 1 + (rnd.next() % hats_count[lvl]);
if (rnd.next() % 2 == 1)
data.pants = 1 + (rnd.next() % pants_count[lvl]);
return data;
}
function svg_from_data(
GenerationData memory data
) public view returns (string memory) {
return _svg_from_data(data);
}
function _svg_from_data(
GenerationData memory data
) private view returns (string memory) {
return
string(
abi.encodePacked(
abi.encodePacked(
"<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0",
" ",
Converter.toString(PIXELS_COUNT),
" ",
Converter.toString(PIXELS_COUNT),
"'>"
),
_background_svg(data),
_elon_svg(data),
"</svg>"
)
);
}
function _background_svg(
GenerationData memory data
) private view returns (bytes memory) {
return
abi.encodePacked(
Path(colors[data.bcground_color - 1], "M 0 0 h64 v64 h-64")
.toSvg()
);
}
function _elon_svg(
GenerationData memory data
) private view returns (bytes memory) {
return
abi.encodePacked(
body[data.lvl][data.body].toSvg(),
head.toSvg(),
data.boots == 0 ? "" : boots[data.lvl][data.boots].toSvg(),
data.cloth == 0 ? "" : clothes[data.lvl][data.cloth].toSvg(),
data.glasses == 0
? ""
: glasses[data.lvl][data.glasses].toSvg(),
data.hat == 0 ? "" : hats[data.lvl][data.hat].toSvg(),
data.pants == 0 ? "" : pants[data.lvl][data.pants].toSvg()
);
}
}
文件 6 的 13:GeneratorLib.sol
pragma solidity ^0.8.23;
import "./RandLib.sol";
struct Path {
string fill;
string data;
}
struct FileData {
uint file;
Path[] paths;
}
library FilesLib {
function set_files(
mapping(uint => mapping(uint => Path[])) storage files,
mapping(uint => uint8) storage counts,
uint lvl,
FileData[] calldata input
) internal {
counts[lvl] = set_files(files[lvl], counts[lvl], input);
}
function set_file(
mapping(uint => Path[]) storage paths,
uint8 count,
FileData calldata input
) internal returns (uint8) {
Path[] storage storageFile = paths[input.file];
if (storageFile.length > 0) delete paths[input.file];
else ++count;
for (uint i = 0; i < input.paths.length; ++i) {
storageFile.push(input.paths[i]);
}
return count;
}
function set_files(
mapping(uint => Path[]) storage paths,
uint8 count,
FileData[] calldata input
) internal returns (uint8) {
if (input.length == 0) return count;
uint i;
for (i = 0; i < input.length; ++i)
count = set_file(paths, count, input[i]);
return count;
}
}
struct ColorsData {
string[] lvl0;
string[] lvl1;
string[] lvl2;
string[] lvl3;
string[] lvl4;
}
library ColorConvert {
function toSvgColor(uint24 value) internal pure returns (string memory) {
return string(abi.encodePacked("#", toHex(value)));
}
function toHex(uint24 value) internal pure returns (bytes memory) {
bytes memory buffer = new bytes(6);
for (uint i = 0; i < 3; ++i) {
buffer[5 - i * 2] = hexChar(uint8(value) & 0x0f);
buffer[4 - i * 2] = hexChar((uint8(value) >> 4) & 0x0f);
value >>= 8;
}
return buffer;
}
function hexChar(uint8 value) internal pure returns (bytes1) {
if (value < 10) return bytes1(uint8(48 + (uint(value) % 10)));
return bytes1(uint8(65 + uint256((value - 10) % 6)));
}
}
library Converter {
function toString(uint value) internal pure returns (string memory) {
if (value == 0) {
return "0";
}
uint temp = value;
uint digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
}
library StringLib {
function equals(
string memory s1,
string memory s2
) internal pure returns (bool) {
return (keccak256(abi.encodePacked((s1))) ==
keccak256(abi.encodePacked((s2))));
}
}
library PathLib {
string constant CONTOUR_COLOR = "#000000";
using PathLib for Path;
using RandLib for Rand;
using RandLib for string[];
using Converter for uint8;
using ColorConvert for uint24;
using StringLib for string;
function toSvg(Path memory p) internal pure returns (string memory) {
return
string(
abi.encodePacked("<path fill='", p.fill, "' d='", p.data, "'/>")
);
}
function toSvg(
Path[] storage paths,
string[] storage colors,
uint color_id
) internal view returns (string memory) {
return
color_id == 0 || color_id > colors.length
? toSvg(paths)
: toSvg(paths, colors[color_id - 1]);
}
function toSvg(
Path memory p,
string[] storage colors,
Rand memory rnd
) internal pure returns (string memory) {
return
string(
abi.encodePacked(
"<path fill='",
(
p.fill.equals(CONTOUR_COLOR)
? p.fill
: (colors.random(rnd))
),
"' d='",
p.data,
"'/>"
)
);
}
function toSvg(
Path memory p,
string memory color
) internal pure returns (string memory) {
return
string(
abi.encodePacked(
"<path fill='",
color,
"' d='",
p.data,
color,
"'/>"
)
);
}
function toSvg(
Path[] storage paths,
string[] storage colors,
Rand memory rnd
) internal view returns (string memory) {
string memory res;
for (uint i = 0; i < paths.length; ++i) {
res = string(abi.encodePacked(res, paths[i].toSvg(colors, rnd)));
}
return res;
}
function toSvg(
Path[] storage paths,
string memory color
) internal view returns (string memory) {
string memory res;
for (uint i = 0; i < paths.length; ++i) {
Path memory p = paths[i];
res = string(
abi.encodePacked(
res,
p.toSvg(p.fill.equals(CONTOUR_COLOR) ? p.fill : color)
)
);
}
return res;
}
function toSvg(Path[] storage paths) internal view returns (string memory) {
string memory res;
for (uint i = 0; i < paths.length; ++i) {
res = string(abi.encodePacked(res, paths[i].toSvg()));
}
return res;
}
}
文件 7 的 13:IERC20.sol
pragma solidity ^0.8.20;
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 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 8 的 13:IERC20Metadata.sol
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 9 的 13:IGenerator.sol
pragma solidity ^0.8.25;
import "./GenerationData.sol";
interface IGenerator {
function get_generation_data_internal(
uint lvl,
uint seed
) external view returns (GenerationData memory);
function svg_from_data(
GenerationData memory data
) external view returns (string memory);
}
文件 10 的 13:Ownable.sol
pragma solidity ^0.8.20;
contract Ownable {
address _owner;
event RenounceOwnership();
constructor() {
_owner = msg.sender;
}
modifier onlyOwner() {
require(_owner == msg.sender, "only owner");
_;
}
function owner() external view virtual returns (address) {
return _owner;
}
function ownerRenounce() public onlyOwner {
_owner = address(0);
emit RenounceOwnership();
}
function transferOwnership(address newOwner) external onlyOwner {
_owner = newOwner;
}
}
文件 11 的 13:RandLib.sol
pragma solidity ^0.8.21;
struct Rand {
uint seed;
uint nonce;
}
library RandLib {
function next(Rand memory rnd) internal pure returns (uint) {
return
uint(
keccak256(
abi.encodePacked(rnd.seed, ++rnd.nonce)
)
);
}
function random_value(uint nonce) internal view returns (uint) {
return
uint256(
keccak256(
abi.encodePacked(
block.timestamp,
msg.sender,
nonce,
block.number
)
)
);
}
function random(
string[] memory data,
Rand memory rnd
) internal pure returns (string memory) {
return data[randomIndex(data, rnd)];
}
function randomIndex(
string[] memory data,
Rand memory rnd
) internal pure returns (uint) {
return next(rnd) % data.length;
}
}
文件 12 的 13:Token.sol
pragma solidity ^0.8.25;
import "./ERC20TokenBase.sol";
import "../generator/Generator.sol";
address constant DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD;
contract Token is ERC20TokenBase, Generator {
uint8 internal constant DECIMALS = 9;
uint256 constant _startTotalSupply = 1e4 * (10 ** DECIMALS);
uint256 constant _startMaxBuyCount = (_startTotalSupply * 5) / 10000;
uint256 constant _addMaxBuyPercentPerSec = 1;
uint256 constant _addMaxBuyPrecesion = 10000;
uint256 constant _taxPrecesion = 1000;
uint256 constant _transferZeroTaxSeconds = 1000;
address internal _pair;
address immutable _deployer;
bool internal _feeLocked;
uint256 internal _startTime;
constructor(
string memory name_,
string memory symbol_
) ERC20TokenBase(name_, symbol_) {
_deployer = msg.sender;
_mint(msg.sender, _startTotalSupply);
}
modifier maxBuyLimit(uint256 amount) {
require(amount <= maxBuy(), "max buy");
_;
}
modifier lockFee() {
_feeLocked = true;
_;
_feeLocked = false;
}
function decimals() public pure override returns (uint8) {
return DECIMALS;
}
function start_token(address pair_address) external onlyOwner {
_startTime = block.timestamp;
_pair = pair_address;
}
function is_token_started() public view returns (bool) {
return _startTime != 0;
}
function maxBuy() public view returns (uint256) {
if (!is_token_started()) return _startTotalSupply;
uint256 count = _startMaxBuyCount +
(_startTotalSupply *
(block.timestamp - _startTime) *
_addMaxBuyPercentPerSec) /
_addMaxBuyPrecesion;
if (count > _startTotalSupply) count = _startTotalSupply;
return count;
}
function _transfer(
address from,
address to,
uint256 amount
) internal override {
if (to == address(0) || to == DEAD_ADDRESS) {
transfer_internal(from, to, amount);
return;
}
if (
!is_token_started() &&
(from == address(0) ||
from == address(this) ||
from == _deployer ||
to == _deployer)
) {
super._transfer(from, to, amount);
return;
}
require(is_token_started(), "token not started");
if (_feeLocked) {
super._transfer(from, to, amount);
return;
} else {
if (from == _pair) {
buy(to, amount);
return;
} else if (to == _pair) {
sell(from, amount);
return;
} else transfer_internal(from, to, amount);
}
}
function buy(
address to,
uint256 amount
) internal virtual maxBuyLimit(amount) lockFee {
super._transfer(_pair, to, amount);
}
function sell(address from, uint256 amount) internal virtual lockFee {
super._transfer(from, _pair, amount);
}
function transfer_internal(
address from,
address to,
uint256 amount
) internal virtual lockFee {
if (to == address(0) || to == DEAD_ADDRESS) {
_burn(from, amount);
return;
}
super._transfer(from, to, amount);
}
}
文件 13 的 13:draft-IERC6093.sol
pragma solidity ^0.8.20;
interface IERC20Errors {
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
}
interface IERC721Errors {
error ERC721InvalidOwner(address owner);
error ERC721NonexistentToken(uint256 tokenId);
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
error ERC721InvalidSender(address sender);
error ERC721InvalidReceiver(address receiver);
error ERC721InsufficientApproval(address operator, uint256 tokenId);
error ERC721InvalidApprover(address approver);
error ERC721InvalidOperator(address operator);
}
interface IERC1155Errors {
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
error ERC1155InvalidSender(address sender);
error ERC1155InvalidReceiver(address receiver);
error ERC1155MissingApprovalForAll(address operator, address owner);
error ERC1155InvalidApprover(address approver);
error ERC1155InvalidOperator(address operator);
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
{
"compilationTarget": {
"contracts/token/ELON_MUSCLE.sol": "ELON_MUSCLE"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"RenounceOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"get_generation_data","outputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"bcground_color","type":"uint256"},{"internalType":"uint256","name":"body","type":"uint256"},{"internalType":"uint256","name":"boots","type":"uint256"},{"internalType":"uint256","name":"cloth","type":"uint256"},{"internalType":"uint256","name":"glasses","type":"uint256"},{"internalType":"uint256","name":"hat","type":"uint256"},{"internalType":"uint256","name":"pants","type":"uint256"}],"internalType":"struct GenerationData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"get_generation_data_internal","outputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"bcground_color","type":"uint256"},{"internalType":"uint256","name":"body","type":"uint256"},{"internalType":"uint256","name":"boots","type":"uint256"},{"internalType":"uint256","name":"cloth","type":"uint256"},{"internalType":"uint256","name":"glasses","type":"uint256"},{"internalType":"uint256","name":"hat","type":"uint256"},{"internalType":"uint256","name":"pants","type":"uint256"}],"internalType":"struct GenerationData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_lvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"is_token_started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_lvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"musk_svg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"ownerRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"components":[{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"string","name":"fill","type":"string"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Path[]","name":"paths","type":"tuple[]"}],"internalType":"struct FileData[]","name":"files","type":"tuple[]"}],"name":"set_body","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"components":[{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"string","name":"fill","type":"string"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Path[]","name":"paths","type":"tuple[]"}],"internalType":"struct FileData[]","name":"files","type":"tuple[]"}],"name":"set_boots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"components":[{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"string","name":"fill","type":"string"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Path[]","name":"paths","type":"tuple[]"}],"internalType":"struct FileData[]","name":"files","type":"tuple[]"}],"name":"set_clothes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"components":[{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"string","name":"fill","type":"string"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Path[]","name":"paths","type":"tuple[]"}],"internalType":"struct FileData[]","name":"files","type":"tuple[]"}],"name":"set_glasses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"components":[{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"string","name":"fill","type":"string"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Path[]","name":"paths","type":"tuple[]"}],"internalType":"struct FileData[]","name":"files","type":"tuple[]"}],"name":"set_hats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"fill","type":"string"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Path[]","name":"paths","type":"tuple[]"}],"name":"set_head","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"components":[{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"string","name":"fill","type":"string"},{"internalType":"string","name":"data","type":"string"}],"internalType":"struct Path[]","name":"paths","type":"tuple[]"}],"internalType":"struct FileData[]","name":"files","type":"tuple[]"}],"name":"set_pants","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair_address","type":"address"}],"name":"start_token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"bcground_color","type":"uint256"},{"internalType":"uint256","name":"body","type":"uint256"},{"internalType":"uint256","name":"boots","type":"uint256"},{"internalType":"uint256","name":"cloth","type":"uint256"},{"internalType":"uint256","name":"glasses","type":"uint256"},{"internalType":"uint256","name":"hat","type":"uint256"},{"internalType":"uint256","name":"pants","type":"uint256"}],"internalType":"struct GenerationData","name":"data","type":"tuple"}],"name":"svg_from_data","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]